[jboss-svn-commits] JBL Code SVN: r21145 - in labs/jbossrules/trunk: drools-compiler and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 21 12:09:45 EDT 2008


Author: tirelli
Date: 2008-07-21 12:09:44 -0400 (Mon, 21 Jul 2008)
New Revision: 21145

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsEditorType.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParaphareseTypes.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParserExceptionFactory.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsSoftKeywords.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsToken.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTreeAdaptor.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/ErrorsParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestDRL.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestTree2TestDRL.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/Tree2TestDRL.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTest.testsuite
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTreeWalkerTest.testsuite
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/not_pluggable_operator.drl
Removed:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java
Modified:
   labs/jbossrules/trunk/drools-compiler/pom.xml
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DroolsParserException.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AccumulateDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FieldBindingDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/rules/ExpressionHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DslTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl
   labs/jbossrules/trunk/pom.xml
Log:
JBRULES-1689: merging new parser into trunk

Modified: labs/jbossrules/trunk/drools-compiler/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-compiler/pom.xml	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/pom.xml	2008-07-21 16:09:44 UTC (rev 21145)
@@ -27,6 +27,10 @@
       <artifactId>antlr-runtime</artifactId>     
     </dependency>
     <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>gunit</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jdt</groupId>
       <artifactId>core</artifactId>
     </dependency>

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DrlParser.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -26,11 +26,15 @@
 import org.antlr.runtime.ANTLRStringStream;
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.RecognitionException;
-import org.drools.lang.DRLLexer;
-import org.drools.lang.DRLParser;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.drools.lang.DescrBuilderTree;
+import org.drools.lang.DroolsTree;
+import org.drools.lang.DroolsTreeAdaptor;
 import org.drools.lang.Expander;
 import org.drools.lang.ExpanderException;
 import org.drools.lang.Location;
+import org.drools.lang.DRLLexer;
+import org.drools.lang.DRLParser;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.dsl.DefaultExpanderResolver;
 
@@ -41,7 +45,7 @@
 public class DrlParser {
 
     private final List results = new ArrayList();
-    private Location location = null;
+    private Location location = new Location( Location.LOCATION_UNKNOWN );
 
     public DrlParser() {
 
@@ -50,18 +54,12 @@
     /** Parse a rule from text */
     public PackageDescr parse(final String text) throws DroolsParserException {
         final DRLParser parser = getParser( text );
-        compile( parser );
-        this.location = parser.getLocation();
-        return parser.getPackageDescr();
-
+        return compile( parser );
     }
 
     public PackageDescr parse(final Reader reader) throws DroolsParserException {
         final DRLParser parser = getParser( reader );
-        compile( parser );
-        this.location = parser.getLocation();
-        return parser.getPackageDescr();
-
+        return compile( parser );
     }
 
     //    /** Parse and build a rule package from a DRL source */
@@ -170,14 +168,22 @@
         return this.results;
     }
 
-    private void compile(final DRLParser parser) throws DroolsParserException {
+    private PackageDescr compile(final DRLParser parser) throws DroolsParserException {
         try {
-            parser.compilation_unit();
-
+            DroolsTree resultTree = (DroolsTree) parser.compilation_unit().getTree();
             makeErrorList( parser );
-        } catch ( final RecognitionException e ) {
-            throw new DroolsParserException( e );
-        } catch ( Exception e ) {
+            if (!this.hasErrors()){
+				CommonTreeNodeStream nodes = new CommonTreeNodeStream(resultTree);
+				// AST nodes have payload that point into token stream
+				nodes.setTokenStream(parser.getTokenStream());
+				// Create a tree walker attached to the nodes stream
+            	DescrBuilderTree walker = new DescrBuilderTree(nodes);
+            	walker.compilation_unit();
+            	return walker.getPackageDescr();            	
+            } else {
+            	return null;
+            }
+        }  catch ( Exception e ) {
             throw new DroolsParserException( "Unknown error while parsing. This is a bug. Please contact the Development team.", e);
         }
     }
@@ -185,10 +191,10 @@
     /** Convert the antlr exceptions to drools parser exceptions */
     private void makeErrorList(final DRLParser parser) {
         for ( final Iterator iter = parser.getErrors().iterator(); iter.hasNext(); ) {
-            final RecognitionException recogErr = (RecognitionException) iter.next();
-            final ParserError err = new ParserError( parser.createErrorMessage( recogErr ),
-                                                     recogErr.line,
-                                                     recogErr.charPositionInLine );
+            final DroolsParserException recogErr = (DroolsParserException) iter.next();
+            final ParserError err = new ParserError( recogErr.getMessage(),
+                                                     recogErr.getLineNumber(),
+                                                     recogErr.getColumn() );
             this.results.add( err );
         }
     }
@@ -197,18 +203,22 @@
      * @return An instance of a RuleParser should you need one (most folks will not).
      */
     private DRLParser getParser(final String text) {
-        return new DRLParser( new CommonTokenStream( new DRLLexer( new ANTLRStringStream( text ) ) ) );
+    	DRLParser parser = new DRLParser( new CommonTokenStream( new DRLLexer( new ANTLRStringStream( text ) ) ) );
+    	parser.setTreeAdaptor(new DroolsTreeAdaptor());
+        return parser;
     }
 
     private DRLParser getParser(final Reader reader) {
-        try {
-            return new DRLParser( new CommonTokenStream( new DRLLexer( new ANTLRReaderStream( reader ) ) ) );
+    	try {
+        	DRLParser parser = new DRLParser( new CommonTokenStream( new DRLLexer( new ANTLRReaderStream( reader ) ) ) );
+        	parser.setTreeAdaptor(new DroolsTreeAdaptor());
+            return parser;
         } catch ( final Exception e ) {
             throw new RuntimeException( "Unable to parser Reader",
                                         e );
         }
     }
-    
+
     public Location getLocation() {
         return this.location; 
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DroolsParserException.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DroolsParserException.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/DroolsParserException.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -19,38 +19,105 @@
 import org.drools.CheckedDroolsException;
 
 public class DroolsParserException extends CheckedDroolsException {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 400L;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 400L;
 
-    /**
-     * @see java.lang.Exception#Exception()
-     */
-    public DroolsParserException() {
-        super();
-    }
+	private String errorCode = null;
+	private int lineNumber;
+	private int column;
+	private int offset;
 
-    /**
-     * @see java.lang.Exception#Exception(String message)
-     */
-    public DroolsParserException(final String message) {
-        super( message );
-    }
+	/**
+	 * @see java.lang.Exception#Exception()
+	 */
+	public DroolsParserException() {
+		super();
+	}
 
-    /**
-     * @see java.lang.Exception#Exception(String message, Throwable cause)
-     */
-    public DroolsParserException(final String message,
-                                 final Throwable cause) {
-        super( message );
-    }
+	/**
+	 * @see java.lang.Exception#Exception(String message)
+	 */
+	public DroolsParserException(final String message) {
+		super(message);
+	}
 
-    /**
-     * @see java.lang.Exception#Exception(Throwable cause)
-     */
-    public DroolsParserException(final Throwable cause) {
-        super( cause );
-    }
+	/**
+	 * @see java.lang.Exception#Exception(String message, Throwable cause)
+	 */
+	public DroolsParserException(final String message, final Throwable cause) {
+		super(message);
+	}
 
+	/**
+	 * @see java.lang.Exception#Exception(Throwable cause)
+	 */
+	public DroolsParserException(final Throwable cause) {
+		super(cause);
+	}
+
+	/**
+	 * DroolsParserException constructor.
+	 * 
+	 * @param errorCode
+	 *            error code
+	 * @param message
+	 *            message
+	 * @param lineNumber
+	 *            line number
+	 * @param column
+	 *            column
+	 * @param offset
+	 *            offset
+	 * @param cause
+	 *            exception cause
+	 */
+	public DroolsParserException(String errorCode, String message, int lineNumber,
+			int column, int offset, Throwable cause) {
+		super(message, cause);
+		this.errorCode = errorCode;
+		this.lineNumber = lineNumber;
+		this.column = column;
+		this.offset = offset;
+	}
+
+	public String getMessage() {
+		if (null == errorCode) {
+			return super.getMessage();
+		}
+		return "[" + errorCode + "] " + super.getMessage();
+	}
+
+	/**
+	 * getter for error code
+	 * 
+	 */
+	public String getErrorCode() {
+		return errorCode;
+	}
+
+	/**
+	 * getter for line number
+	 * 
+	 */
+	public int getLineNumber() {
+		return lineNumber;
+	}
+
+	/**
+	 * getter for column position
+	 * 
+	 */
+	public int getColumn() {
+		return column;
+	}
+
+	/**
+	 * getter for char offset
+	 * 
+	 */
+	public int getOffset() {
+		return offset;
+	}
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -239,7 +239,9 @@
         final DrlParser parser = new DrlParser();
         final PackageDescr pkg = parser.parse( reader );
         this.results.addAll( parser.getErrors() );
-        addPackage( pkg );
+        if (!parser.hasErrors()){
+        	addPackage( pkg );
+        }
     }
 
     /**
@@ -280,7 +282,9 @@
         final PackageDescr pkg = parser.parse( source,
                                                dsl );
         this.results.addAll( parser.getErrors() );
-        addPackage( pkg );
+        if (!parser.hasErrors()){
+        	addPackage( pkg );
+        }
     }
 
     /**

Deleted: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,3631 +0,0 @@
-// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2008-05-25 14:31:57
-
-	package org.drools.lang;
-
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-public class DRLLexer extends Lexer {
-    public static final int EXISTS=45;
-    public static final int COMMA=11;
-    public static final int AUTO_FOCUS=31;
-    public static final int END=14;
-    public static final int HexDigit=74;
-    public static final int FORALL=48;
-    public static final int TEMPLATE=19;
-    public static final int MISC=80;
-    public static final int FLOAT=65;
-    public static final int QUERY=18;
-    public static final int THEN=69;
-    public static final int RULE=20;
-    public static final int T85=85;
-    public static final int INIT=50;
-    public static final int T83=83;
-    public static final int TILDE=63;
-    public static final int IMPORT=5;
-    public static final int PACKAGE=4;
-    public static final int DATE_EFFECTIVE=23;
-    public static final int OR=38;
-    public static final int DOT=8;
-    public static final int DOUBLE_PIPE=39;
-    public static final int AND=40;
-    public static final int T86=86;
-    public static final int FUNCTION=6;
-    public static final int GLOBAL=9;
-    public static final int EscapeSequence=73;
-    public static final int DIALECT=36;
-    public static final int INT=29;
-    public static final int LOCK_ON_ACTIVE=37;
-    public static final int DATE_EXPIRES=25;
-    public static final int T81=81;
-    public static final int LEFT_SQUARE=56;
-    public static final int CONTAINS=58;
-    public static final int SH_STYLE_SINGLE_LINE_COMMENT=77;
-    public static final int ATTRIBUTES=22;
-    public static final int EVENT=70;
-    public static final int DECLARE=13;
-    public static final int LEFT_CURLY=67;
-    public static final int RESULT=53;
-    public static final int AT=15;
-    public static final int FROM=44;
-    public static final int ID=7;
-    public static final int DOUBLE_AMPER=41;
-    public static final int ACTIVATION_GROUP=32;
-    public static final int LEFT_PAREN=10;
-    public static final int RIGHT_CURLY=68;
-    public static final int BOOL=27;
-    public static final int EXCLUDES=59;
-    public static final int SOUNDSLIKE=61;
-    public static final int T84=84;
-    public static final int MEMBEROF=62;
-    public static final int WHEN=21;
-    public static final int RULEFLOW_GROUP=33;
-    public static final int WS=72;
-    public static final int OVER=42;
-    public static final int STRING=24;
-    public static final int ACTION=51;
-    public static final int T88=88;
-    public static final int WINDOW=43;
-    public static final int COLLECT=54;
-    public static final int T87=87;
-    public static final int REVERSE=52;
-    public static final int IN=64;
-    public static final int NO_LOOP=30;
-    public static final int EQUALS=17;
-    public static final int ACCUMULATE=49;
-    public static final int UnicodeEscape=75;
-    public static final int DURATION=35;
-    public static final int EVAL=47;
-    public static final int MATCHES=60;
-    public static final int T89=89;
-    public static final int EOF=-1;
-    public static final int AGENDA_GROUP=34;
-    public static final int NULL=66;
-    public static final int EOL=71;
-    public static final int Tokens=90;
-    public static final int COLON=16;
-    public static final int T82=82;
-    public static final int SALIENCE=28;
-    public static final int OctalEscape=76;
-    public static final int MULTI_LINE_COMMENT=79;
-    public static final int RIGHT_PAREN=12;
-    public static final int NOT=46;
-    public static final int ENABLED=26;
-    public static final int RIGHT_SQUARE=57;
-    public static final int ENTRY_POINT=55;
-    public static final int C_STYLE_SINGLE_LINE_COMMENT=78;
-    public DRLLexer() {;} 
-    public DRLLexer(CharStream input) {
-        super(input);
-        ruleMemo = new HashMap[88+1];
-     }
-    public String getGrammarFileName() { return "/home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g"; }
-
-    // $ANTLR start T81
-    public final void mT81() throws RecognitionException {
-        try {
-            int _type = T81;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:6:5: ( ';' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:6:7: ';'
-            {
-            match(';'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T81
-
-    // $ANTLR start T82
-    public final void mT82() throws RecognitionException {
-        try {
-            int _type = T82;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:7:5: ( '.*' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:7:7: '.*'
-            {
-            match(".*"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T82
-
-    // $ANTLR start T83
-    public final void mT83() throws RecognitionException {
-        try {
-            int _type = T83;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:8:5: ( '->' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:8:7: '->'
-            {
-            match("->"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T83
-
-    // $ANTLR start T84
-    public final void mT84() throws RecognitionException {
-        try {
-            int _type = T84;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:9:5: ( '==' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:9:7: '=='
-            {
-            match("=="); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T84
-
-    // $ANTLR start T85
-    public final void mT85() throws RecognitionException {
-        try {
-            int _type = T85;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:10:5: ( '>' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:10:7: '>'
-            {
-            match('>'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T85
-
-    // $ANTLR start T86
-    public final void mT86() throws RecognitionException {
-        try {
-            int _type = T86;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:11:5: ( '>=' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:11:7: '>='
-            {
-            match(">="); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T86
-
-    // $ANTLR start T87
-    public final void mT87() throws RecognitionException {
-        try {
-            int _type = T87;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:12:5: ( '<' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:12:7: '<'
-            {
-            match('<'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T87
-
-    // $ANTLR start T88
-    public final void mT88() throws RecognitionException {
-        try {
-            int _type = T88;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:13:5: ( '<=' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:13:7: '<='
-            {
-            match("<="); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T88
-
-    // $ANTLR start T89
-    public final void mT89() throws RecognitionException {
-        try {
-            int _type = T89;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:14:5: ( '!=' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:14:7: '!='
-            {
-            match("!="); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end T89
-
-    // $ANTLR start WS
-    public final void mWS() throws RecognitionException {
-        try {
-            int _type = WS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:9: ( ( ' ' | '\\t' | '\\f' | EOL )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:17: ( ' ' | '\\t' | '\\f' | EOL )+
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:17: ( ' ' | '\\t' | '\\f' | EOL )+
-            int cnt1=0;
-            loop1:
-            do {
-                int alt1=5;
-                switch ( input.LA(1) ) {
-                case ' ':
-                    {
-                    alt1=1;
-                    }
-                    break;
-                case '\t':
-                    {
-                    alt1=2;
-                    }
-                    break;
-                case '\f':
-                    {
-                    alt1=3;
-                    }
-                    break;
-                case '\n':
-                case '\r':
-                    {
-                    alt1=4;
-                    }
-                    break;
-
-                }
-
-                switch (alt1) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:19: ' '
-            	    {
-            	    match(' '); if (failed) return ;
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1771:19: '\\t'
-            	    {
-            	    match('\t'); if (failed) return ;
-
-            	    }
-            	    break;
-            	case 3 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1772:19: '\\f'
-            	    {
-            	    match('\f'); if (failed) return ;
-
-            	    }
-            	    break;
-            	case 4 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1773:19: EOL
-            	    {
-            	    mEOL(); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt1 >= 1 ) break loop1;
-            	    if (backtracking>0) {failed=true; return ;}
-                        EarlyExitException eee =
-                            new EarlyExitException(1, input);
-                        throw eee;
-                }
-                cnt1++;
-            } while (true);
-
-            if ( backtracking==0 ) {
-               channel=HIDDEN; 
-            }
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end WS
-
-    // $ANTLR start EOL
-    public final void mEOL() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1779:6: ( ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
-            int alt2=3;
-            int LA2_0 = input.LA(1);
-
-            if ( (LA2_0=='\r') ) {
-                int LA2_1 = input.LA(2);
-
-                if ( (LA2_1=='\n') && (synpred1())) {
-                    alt2=1;
-                }
-                else {
-                    alt2=2;}
-            }
-            else if ( (LA2_0=='\n') ) {
-                alt2=3;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1780:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )", 2, 0, input);
-
-                throw nvae;
-            }
-            switch (alt2) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:14: ( '\\r\\n' )=> '\\r\\n'
-                    {
-                    match("\r\n"); if (failed) return ;
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1781:25: '\\r'
-                    {
-                    match('\r'); if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1782:25: '\\n'
-                    {
-                    match('\n'); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EOL
-
-    // $ANTLR start INT
-    public final void mINT() throws RecognitionException {
-        try {
-            int _type = INT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:2: ( ( '-' )? ( '0' .. '9' )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:4: ( '-' )? ( '0' .. '9' )+
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:4: ( '-' )?
-            int alt3=2;
-            int LA3_0 = input.LA(1);
-
-            if ( (LA3_0=='-') ) {
-                alt3=1;
-            }
-            switch (alt3) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:5: '-'
-                    {
-                    match('-'); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:10: ( '0' .. '9' )+
-            int cnt4=0;
-            loop4:
-            do {
-                int alt4=2;
-                int LA4_0 = input.LA(1);
-
-                if ( ((LA4_0>='0' && LA4_0<='9')) ) {
-                    alt4=1;
-                }
-
-
-                switch (alt4) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1787:11: '0' .. '9'
-            	    {
-            	    matchRange('0','9'); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt4 >= 1 ) break loop4;
-            	    if (backtracking>0) {failed=true; return ;}
-                        EarlyExitException eee =
-                            new EarlyExitException(4, input);
-                        throw eee;
-                }
-                cnt4++;
-            } while (true);
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INT
-
-    // $ANTLR start FLOAT
-    public final void mFLOAT() throws RecognitionException {
-        try {
-            int _type = FLOAT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:2: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:4: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:4: ( '-' )?
-            int alt5=2;
-            int LA5_0 = input.LA(1);
-
-            if ( (LA5_0=='-') ) {
-                alt5=1;
-            }
-            switch (alt5) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:5: '-'
-                    {
-                    match('-'); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:10: ( '0' .. '9' )+
-            int cnt6=0;
-            loop6:
-            do {
-                int alt6=2;
-                int LA6_0 = input.LA(1);
-
-                if ( ((LA6_0>='0' && LA6_0<='9')) ) {
-                    alt6=1;
-                }
-
-
-                switch (alt6) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:11: '0' .. '9'
-            	    {
-            	    matchRange('0','9'); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt6 >= 1 ) break loop6;
-            	    if (backtracking>0) {failed=true; return ;}
-                        EarlyExitException eee =
-                            new EarlyExitException(6, input);
-                        throw eee;
-                }
-                cnt6++;
-            } while (true);
-
-            match('.'); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:26: ( '0' .. '9' )+
-            int cnt7=0;
-            loop7:
-            do {
-                int alt7=2;
-                int LA7_0 = input.LA(1);
-
-                if ( ((LA7_0>='0' && LA7_0<='9')) ) {
-                    alt7=1;
-                }
-
-
-                switch (alt7) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:27: '0' .. '9'
-            	    {
-            	    matchRange('0','9'); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt7 >= 1 ) break loop7;
-            	    if (backtracking>0) {failed=true; return ;}
-                        EarlyExitException eee =
-                            new EarlyExitException(7, input);
-                        throw eee;
-                }
-                cnt7++;
-            } while (true);
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FLOAT
-
-    // $ANTLR start STRING
-    public final void mSTRING() throws RecognitionException {
-        try {
-            int _type = STRING;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:5: ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) )
-            int alt10=2;
-            int LA10_0 = input.LA(1);
-
-            if ( (LA10_0=='\"') ) {
-                alt10=1;
-            }
-            else if ( (LA10_0=='\'') ) {
-                alt10=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1794:1: STRING : ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) );", 10, 0, input);
-
-                throw nvae;
-            }
-            switch (alt10) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:9: '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"'
-                    {
-                    match('\"'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:13: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )*
-                    loop8:
-                    do {
-                        int alt8=3;
-                        int LA8_0 = input.LA(1);
-
-                        if ( (LA8_0=='\\') ) {
-                            alt8=1;
-                        }
-                        else if ( ((LA8_0>='\u0000' && LA8_0<='!')||(LA8_0>='#' && LA8_0<='[')||(LA8_0>=']' && LA8_0<='\uFFFE')) ) {
-                            alt8=2;
-                        }
-
-
-                        switch (alt8) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:15: EscapeSequence
-                    	    {
-                    	    mEscapeSequence(); if (failed) return ;
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:32: ~ ( '\\\\' | '\"' )
-                    	    {
-                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-                    	        input.consume();
-                    	    failed=false;
-                    	    }
-                    	    else {
-                    	        if (backtracking>0) {failed=true; return ;}
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recover(mse);    throw mse;
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop8;
-                        }
-                    } while (true);
-
-                    match('\"'); if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:9: '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\''
-                    {
-                    match('\''); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:14: ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )*
-                    loop9:
-                    do {
-                        int alt9=3;
-                        int LA9_0 = input.LA(1);
-
-                        if ( (LA9_0=='\\') ) {
-                            alt9=1;
-                        }
-                        else if ( ((LA9_0>='\u0000' && LA9_0<='&')||(LA9_0>='(' && LA9_0<='[')||(LA9_0>=']' && LA9_0<='\uFFFE')) ) {
-                            alt9=2;
-                        }
-
-
-                        switch (alt9) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:16: EscapeSequence
-                    	    {
-                    	    mEscapeSequence(); if (failed) return ;
-
-                    	    }
-                    	    break;
-                    	case 2 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:33: ~ ( '\\\\' | '\\'' )
-                    	    {
-                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
-                    	        input.consume();
-                    	    failed=false;
-                    	    }
-                    	    else {
-                    	        if (backtracking>0) {failed=true; return ;}
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recover(mse);    throw mse;
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop9;
-                        }
-                    } while (true);
-
-                    match('\''); if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end STRING
-
-    // $ANTLR start HexDigit
-    public final void mHexDigit() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1800:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1800:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )
-            {
-            if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {
-                input.consume();
-            failed=false;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end HexDigit
-
-    // $ANTLR start EscapeSequence
-    public final void mEscapeSequence() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1804:5: ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape )
-            int alt11=3;
-            int LA11_0 = input.LA(1);
-
-            if ( (LA11_0=='\\') ) {
-                switch ( input.LA(2) ) {
-                case '\"':
-                case '$':
-                case '&':
-                case '\'':
-                case '(':
-                case ')':
-                case '*':
-                case '+':
-                case '-':
-                case '.':
-                case '?':
-                case 'A':
-                case 'B':
-                case 'D':
-                case 'E':
-                case 'G':
-                case 'Q':
-                case 'S':
-                case 'W':
-                case 'Z':
-                case '[':
-                case '\\':
-                case ']':
-                case '^':
-                case 'a':
-                case 'b':
-                case 'c':
-                case 'd':
-                case 'e':
-                case 'f':
-                case 'n':
-                case 'o':
-                case 'p':
-                case 'r':
-                case 's':
-                case 't':
-                case 'w':
-                case 'x':
-                case 'z':
-                case '{':
-                case '|':
-                case '}':
-                    {
-                    alt11=1;
-                    }
-                    break;
-                case 'u':
-                    {
-                    alt11=2;
-                    }
-                    break;
-                case '0':
-                case '1':
-                case '2':
-                case '3':
-                case '4':
-                case '5':
-                case '6':
-                case '7':
-                    {
-                    alt11=3;
-                    }
-                    break;
-                default:
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("1802:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 1, input);
-
-                    throw nvae;
-                }
-
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1802:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 0, input);
-
-                throw nvae;
-            }
-            switch (alt11) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1804:9: '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' )
-                    {
-                    match('\\'); if (failed) return ;
-                    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)>='A' && input.LA(1)<='B')||(input.LA(1)>='D' && input.LA(1)<='E')||input.LA(1)=='G'||input.LA(1)=='Q'||input.LA(1)=='S'||input.LA(1)=='W'||(input.LA(1)>='Z' && input.LA(1)<='^')||(input.LA(1)>='a' && input.LA(1)<='f')||(input.LA(1)>='n' && input.LA(1)<='p')||(input.LA(1)>='r' && input.LA(1)<='t')||(input.LA(1)>='w' && input.LA(1)<='x')||(input.LA(1)>='z' && input.LA(1)<='}') ) {
-                        input.consume();
-                    failed=false;
-                    }
-                    else {
-                        if (backtracking>0) {failed=true; return ;}
-                        MismatchedSetException mse =
-                            new MismatchedSetException(null,input);
-                        recover(mse);    throw mse;
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1808:9: UnicodeEscape
-                    {
-                    mUnicodeEscape(); if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1809:9: OctalEscape
-                    {
-                    mOctalEscape(); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EscapeSequence
-
-    // $ANTLR start OctalEscape
-    public final void mOctalEscape() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) )
-            int alt12=3;
-            int LA12_0 = input.LA(1);
-
-            if ( (LA12_0=='\\') ) {
-                int LA12_1 = input.LA(2);
-
-                if ( ((LA12_1>='0' && LA12_1<='3')) ) {
-                    int LA12_2 = input.LA(3);
-
-                    if ( ((LA12_2>='0' && LA12_2<='7')) ) {
-                        int LA12_4 = input.LA(4);
-
-                        if ( ((LA12_4>='0' && LA12_4<='7')) ) {
-                            alt12=1;
-                        }
-                        else {
-                            alt12=2;}
-                    }
-                    else {
-                        alt12=3;}
-                }
-                else if ( ((LA12_1>='4' && LA12_1<='7')) ) {
-                    int LA12_3 = input.LA(3);
-
-                    if ( ((LA12_3>='0' && LA12_3<='7')) ) {
-                        alt12=2;
-                    }
-                    else {
-                        alt12=3;}
-                }
-                else {
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("1812:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1812:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 0, input);
-
-                throw nvae;
-            }
-            switch (alt12) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' )
-                    {
-                    match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:14: ( '0' .. '3' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:15: '0' .. '3'
-                    {
-                    matchRange('0','3'); if (failed) return ;
-
-                    }
-
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:25: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:26: '0' .. '7'
-                    {
-                    matchRange('0','7'); if (failed) return ;
-
-                    }
-
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:36: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:37: '0' .. '7'
-                    {
-                    matchRange('0','7'); if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' )
-                    {
-                    match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:14: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:15: '0' .. '7'
-                    {
-                    matchRange('0','7'); if (failed) return ;
-
-                    }
-
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:25: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:26: '0' .. '7'
-                    {
-                    matchRange('0','7'); if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1816:9: '\\\\' ( '0' .. '7' )
-                    {
-                    match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1816:14: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1816:15: '0' .. '7'
-                    {
-                    matchRange('0','7'); if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        finally {
-        }
-    }
-    // $ANTLR end OctalEscape
-
-    // $ANTLR start UnicodeEscape
-    public final void mUnicodeEscape() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1821:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1821:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit
-            {
-            match('\\'); if (failed) return ;
-            match('u'); if (failed) return ;
-            mHexDigit(); if (failed) return ;
-            mHexDigit(); if (failed) return ;
-            mHexDigit(); if (failed) return ;
-            mHexDigit(); if (failed) return ;
-
-            }
-
-        }
-        finally {
-        }
-    }
-    // $ANTLR end UnicodeEscape
-
-    // $ANTLR start BOOL
-    public final void mBOOL() throws RecognitionException {
-        try {
-            int _type = BOOL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1825:2: ( ( 'true' | 'false' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1825:4: ( 'true' | 'false' )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1825:4: ( 'true' | 'false' )
-            int alt13=2;
-            int LA13_0 = input.LA(1);
-
-            if ( (LA13_0=='t') ) {
-                alt13=1;
-            }
-            else if ( (LA13_0=='f') ) {
-                alt13=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1825:4: ( 'true' | 'false' )", 13, 0, input);
-
-                throw nvae;
-            }
-            switch (alt13) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1825:5: 'true'
-                    {
-                    match("true"); if (failed) return ;
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1825:12: 'false'
-                    {
-                    match("false"); if (failed) return ;
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end BOOL
-
-    // $ANTLR start PACKAGE
-    public final void mPACKAGE() throws RecognitionException {
-        try {
-            int _type = PACKAGE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:9: ( 'package' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:11: 'package'
-            {
-            match("package"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end PACKAGE
-
-    // $ANTLR start IMPORT
-    public final void mIMPORT() throws RecognitionException {
-        try {
-            int _type = IMPORT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:8: ( 'import' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:10: 'import'
-            {
-            match("import"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IMPORT
-
-    // $ANTLR start FUNCTION
-    public final void mFUNCTION() throws RecognitionException {
-        try {
-            int _type = FUNCTION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:10: ( 'function' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:12: 'function'
-            {
-            match("function"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FUNCTION
-
-    // $ANTLR start EVENT
-    public final void mEVENT() throws RecognitionException {
-        try {
-            int _type = EVENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:7: ( 'event' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:10: 'event'
-            {
-            match("event"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EVENT
-
-    // $ANTLR start GLOBAL
-    public final void mGLOBAL() throws RecognitionException {
-        try {
-            int _type = GLOBAL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:8: ( 'global' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:10: 'global'
-            {
-            match("global"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end GLOBAL
-
-    // $ANTLR start DECLARE
-    public final void mDECLARE() throws RecognitionException {
-        try {
-            int _type = DECLARE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1838:9: ( 'declare' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1838:11: 'declare'
-            {
-            match("declare"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DECLARE
-
-    // $ANTLR start RULE
-    public final void mRULE() throws RecognitionException {
-        try {
-            int _type = RULE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1840:9: ( 'rule' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1840:11: 'rule'
-            {
-            match("rule"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RULE
-
-    // $ANTLR start QUERY
-    public final void mQUERY() throws RecognitionException {
-        try {
-            int _type = QUERY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:7: ( 'query' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:9: 'query'
-            {
-            match("query"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end QUERY
-
-    // $ANTLR start TEMPLATE
-    public final void mTEMPLATE() throws RecognitionException {
-        try {
-            int _type = TEMPLATE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1844:10: ( 'template' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1844:12: 'template'
-            {
-            match("template"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end TEMPLATE
-
-    // $ANTLR start ATTRIBUTES
-    public final void mATTRIBUTES() throws RecognitionException {
-        try {
-            int _type = ATTRIBUTES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1846:12: ( 'attributes' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1846:14: 'attributes'
-            {
-            match("attributes"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ATTRIBUTES
-
-    // $ANTLR start DATE_EFFECTIVE
-    public final void mDATE_EFFECTIVE() throws RecognitionException {
-        try {
-            int _type = DATE_EFFECTIVE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1849:2: ( 'date-effective' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1849:4: 'date-effective'
-            {
-            match("date-effective"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DATE_EFFECTIVE
-
-    // $ANTLR start DATE_EXPIRES
-    public final void mDATE_EXPIRES() throws RecognitionException {
-        try {
-            int _type = DATE_EXPIRES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1852:2: ( 'date-expires' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1852:4: 'date-expires'
-            {
-            match("date-expires"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DATE_EXPIRES
-
-    // $ANTLR start ENABLED
-    public final void mENABLED() throws RecognitionException {
-        try {
-            int _type = ENABLED;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1854:9: ( 'enabled' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1854:11: 'enabled'
-            {
-            match("enabled"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ENABLED
-
-    // $ANTLR start SALIENCE
-    public final void mSALIENCE() throws RecognitionException {
-        try {
-            int _type = SALIENCE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1857:2: ( 'salience' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1857:4: 'salience'
-            {
-            match("salience"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end SALIENCE
-
-    // $ANTLR start NO_LOOP
-    public final void mNO_LOOP() throws RecognitionException {
-        try {
-            int _type = NO_LOOP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:9: ( 'no-loop' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:11: 'no-loop'
-            {
-            match("no-loop"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end NO_LOOP
-
-    // $ANTLR start AUTO_FOCUS
-    public final void mAUTO_FOCUS() throws RecognitionException {
-        try {
-            int _type = AUTO_FOCUS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1862:2: ( 'auto-focus' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1862:4: 'auto-focus'
-            {
-            match("auto-focus"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AUTO_FOCUS
-
-    // $ANTLR start ACTIVATION_GROUP
-    public final void mACTIVATION_GROUP() throws RecognitionException {
-        try {
-            int _type = ACTIVATION_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1865:2: ( 'activation-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1865:4: 'activation-group'
-            {
-            match("activation-group"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ACTIVATION_GROUP
-
-    // $ANTLR start AGENDA_GROUP
-    public final void mAGENDA_GROUP() throws RecognitionException {
-        try {
-            int _type = AGENDA_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1868:2: ( 'agenda-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1868:4: 'agenda-group'
-            {
-            match("agenda-group"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AGENDA_GROUP
-
-    // $ANTLR start DIALECT
-    public final void mDIALECT() throws RecognitionException {
-        try {
-            int _type = DIALECT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1871:2: ( 'dialect' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1871:4: 'dialect'
-            {
-            match("dialect"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DIALECT
-
-    // $ANTLR start RULEFLOW_GROUP
-    public final void mRULEFLOW_GROUP() throws RecognitionException {
-        try {
-            int _type = RULEFLOW_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1874:2: ( 'ruleflow-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1874:4: 'ruleflow-group'
-            {
-            match("ruleflow-group"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RULEFLOW_GROUP
-
-    // $ANTLR start DURATION
-    public final void mDURATION() throws RecognitionException {
-        try {
-            int _type = DURATION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1877:2: ( 'duration' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1877:4: 'duration'
-            {
-            match("duration"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DURATION
-
-    // $ANTLR start LOCK_ON_ACTIVE
-    public final void mLOCK_ON_ACTIVE() throws RecognitionException {
-        try {
-            int _type = LOCK_ON_ACTIVE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1880:2: ( 'lock-on-active' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1880:4: 'lock-on-active'
-            {
-            match("lock-on-active"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LOCK_ON_ACTIVE
-
-    // $ANTLR start FROM
-    public final void mFROM() throws RecognitionException {
-        try {
-            int _type = FROM;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1882:6: ( 'from' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1882:8: 'from'
-            {
-            match("from"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FROM
-
-    // $ANTLR start ACCUMULATE
-    public final void mACCUMULATE() throws RecognitionException {
-        try {
-            int _type = ACCUMULATE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1885:2: ( 'accumulate' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1885:4: 'accumulate'
-            {
-            match("accumulate"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ACCUMULATE
-
-    // $ANTLR start INIT
-    public final void mINIT() throws RecognitionException {
-        try {
-            int _type = INIT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1887:6: ( 'init' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1887:8: 'init'
-            {
-            match("init"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end INIT
-
-    // $ANTLR start ACTION
-    public final void mACTION() throws RecognitionException {
-        try {
-            int _type = ACTION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1889:8: ( 'action' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1889:10: 'action'
-            {
-            match("action"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ACTION
-
-    // $ANTLR start REVERSE
-    public final void mREVERSE() throws RecognitionException {
-        try {
-            int _type = REVERSE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1891:9: ( 'reverse' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1891:11: 'reverse'
-            {
-            match("reverse"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end REVERSE
-
-    // $ANTLR start RESULT
-    public final void mRESULT() throws RecognitionException {
-        try {
-            int _type = RESULT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:8: ( 'result' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:10: 'result'
-            {
-            match("result"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RESULT
-
-    // $ANTLR start COLLECT
-    public final void mCOLLECT() throws RecognitionException {
-        try {
-            int _type = COLLECT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1895:9: ( 'collect' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1895:11: 'collect'
-            {
-            match("collect"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end COLLECT
-
-    // $ANTLR start ENTRY_POINT
-    public final void mENTRY_POINT() throws RecognitionException {
-        try {
-            int _type = ENTRY_POINT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1897:13: ( 'entry-point' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1897:15: 'entry-point'
-            {
-            match("entry-point"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ENTRY_POINT
-
-    // $ANTLR start OR
-    public final void mOR() throws RecognitionException {
-        try {
-            int _type = OR;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:4: ( 'or' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:6: 'or'
-            {
-            match("or"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end OR
-
-    // $ANTLR start AND
-    public final void mAND() throws RecognitionException {
-        try {
-            int _type = AND;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1901:5: ( 'and' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1901:7: 'and'
-            {
-            match("and"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AND
-
-    // $ANTLR start CONTAINS
-    public final void mCONTAINS() throws RecognitionException {
-        try {
-            int _type = CONTAINS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:8: ( 'contains' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:16: 'contains'
-            {
-            match("contains"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end CONTAINS
-
-    // $ANTLR start EXCLUDES
-    public final void mEXCLUDES() throws RecognitionException {
-        try {
-            int _type = EXCLUDES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1907:8: ( 'excludes' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1907:16: 'excludes'
-            {
-            match("excludes"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EXCLUDES
-
-    // $ANTLR start MEMBEROF
-    public final void mMEMBEROF() throws RecognitionException {
-        try {
-            int _type = MEMBEROF;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1910:8: ( 'memberOf' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1910:16: 'memberOf'
-            {
-            match("memberOf"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end MEMBEROF
-
-    // $ANTLR start MATCHES
-    public final void mMATCHES() throws RecognitionException {
-        try {
-            int _type = MATCHES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1912:9: ( 'matches' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1912:16: 'matches'
-            {
-            match("matches"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end MATCHES
-
-    // $ANTLR start SOUNDSLIKE
-    public final void mSOUNDSLIKE() throws RecognitionException {
-        try {
-            int _type = SOUNDSLIKE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:12: ( 'soundslike' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:16: 'soundslike'
-            {
-            match("soundslike"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end SOUNDSLIKE
-
-    // $ANTLR start IN
-    public final void mIN() throws RecognitionException {
-        try {
-            int _type = IN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1916:4: ( 'in' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1916:6: 'in'
-            {
-            match("in"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end IN
-
-    // $ANTLR start NULL
-    public final void mNULL() throws RecognitionException {
-        try {
-            int _type = NULL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1918:6: ( 'null' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1918:8: 'null'
-            {
-            match("null"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end NULL
-
-    // $ANTLR start EXISTS
-    public final void mEXISTS() throws RecognitionException {
-        try {
-            int _type = EXISTS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:8: ( 'exists' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:10: 'exists'
-            {
-            match("exists"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EXISTS
-
-    // $ANTLR start NOT
-    public final void mNOT() throws RecognitionException {
-        try {
-            int _type = NOT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1922:5: ( 'not' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1922:7: 'not'
-            {
-            match("not"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end NOT
-
-    // $ANTLR start EVAL
-    public final void mEVAL() throws RecognitionException {
-        try {
-            int _type = EVAL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1924:6: ( 'eval' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1924:8: 'eval'
-            {
-            match("eval"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EVAL
-
-    // $ANTLR start FORALL
-    public final void mFORALL() throws RecognitionException {
-        try {
-            int _type = FORALL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1926:8: ( 'forall' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1926:10: 'forall'
-            {
-            match("forall"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end FORALL
-
-    // $ANTLR start WHEN
-    public final void mWHEN() throws RecognitionException {
-        try {
-            int _type = WHEN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1928:9: ( 'when' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1928:11: 'when'
-            {
-            match("when"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end WHEN
-
-    // $ANTLR start THEN
-    public final void mTHEN() throws RecognitionException {
-        try {
-            int _type = THEN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1930:6: ( 'then' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1930:12: 'then'
-            {
-            match("then"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end THEN
-
-    // $ANTLR start END
-    public final void mEND() throws RecognitionException {
-        try {
-            int _type = END;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1932:9: ( 'end' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1932:11: 'end'
-            {
-            match("end"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end END
-
-    // $ANTLR start OVER
-    public final void mOVER() throws RecognitionException {
-        try {
-            int _type = OVER;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1934:6: ( 'over' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1934:8: 'over'
-            {
-            match("over"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end OVER
-
-    // $ANTLR start WINDOW
-    public final void mWINDOW() throws RecognitionException {
-        try {
-            int _type = WINDOW;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1936:8: ( 'window' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1936:10: 'window'
-            {
-            match("window"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end WINDOW
-
-    // $ANTLR start ID
-    public final void mID() throws RecognitionException {
-        try {
-            int _type = ID;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1939:2: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1939:4: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
-            {
-            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00FF') ) {
-                input.consume();
-            failed=false;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1939:50: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
-            loop14:
-            do {
-                int alt14=2;
-                int LA14_0 = input.LA(1);
-
-                if ( ((LA14_0>='0' && LA14_0<='9')||(LA14_0>='A' && LA14_0<='Z')||LA14_0=='_'||(LA14_0>='a' && LA14_0<='z')||(LA14_0>='\u00C0' && LA14_0<='\u00FF')) ) {
-                    alt14=1;
-                }
-
-
-                switch (alt14) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
-            	    {
-            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00FF') ) {
-            	        input.consume();
-            	    failed=false;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return ;}
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recover(mse);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop14;
-                }
-            } while (true);
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end ID
-
-    // $ANTLR start LEFT_PAREN
-    public final void mLEFT_PAREN() throws RecognitionException {
-        try {
-            int _type = LEFT_PAREN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1943:9: ( '(' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1943:11: '('
-            {
-            match('('); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LEFT_PAREN
-
-    // $ANTLR start RIGHT_PAREN
-    public final void mRIGHT_PAREN() throws RecognitionException {
-        try {
-            int _type = RIGHT_PAREN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1947:9: ( ')' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1947:11: ')'
-            {
-            match(')'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RIGHT_PAREN
-
-    // $ANTLR start LEFT_SQUARE
-    public final void mLEFT_SQUARE() throws RecognitionException {
-        try {
-            int _type = LEFT_SQUARE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1951:9: ( '[' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1951:11: '['
-            {
-            match('['); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LEFT_SQUARE
-
-    // $ANTLR start RIGHT_SQUARE
-    public final void mRIGHT_SQUARE() throws RecognitionException {
-        try {
-            int _type = RIGHT_SQUARE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1955:9: ( ']' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1955:11: ']'
-            {
-            match(']'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RIGHT_SQUARE
-
-    // $ANTLR start LEFT_CURLY
-    public final void mLEFT_CURLY() throws RecognitionException {
-        try {
-            int _type = LEFT_CURLY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1959:9: ( '{' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1959:11: '{'
-            {
-            match('{'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end LEFT_CURLY
-
-    // $ANTLR start RIGHT_CURLY
-    public final void mRIGHT_CURLY() throws RecognitionException {
-        try {
-            int _type = RIGHT_CURLY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1963:9: ( '}' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1963:11: '}'
-            {
-            match('}'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end RIGHT_CURLY
-
-    // $ANTLR start COMMA
-    public final void mCOMMA() throws RecognitionException {
-        try {
-            int _type = COMMA;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1966:7: ( ',' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1966:9: ','
-            {
-            match(','); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end COMMA
-
-    // $ANTLR start DOT
-    public final void mDOT() throws RecognitionException {
-        try {
-            int _type = DOT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1969:5: ( '.' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1969:7: '.'
-            {
-            match('.'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOT
-
-    // $ANTLR start DOUBLE_AMPER
-    public final void mDOUBLE_AMPER() throws RecognitionException {
-        try {
-            int _type = DOUBLE_AMPER;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1973:2: ( '&&' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1973:4: '&&'
-            {
-            match("&&"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOUBLE_AMPER
-
-    // $ANTLR start DOUBLE_PIPE
-    public final void mDOUBLE_PIPE() throws RecognitionException {
-        try {
-            int _type = DOUBLE_PIPE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1977:2: ( '||' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1977:4: '||'
-            {
-            match("||"); if (failed) return ;
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end DOUBLE_PIPE
-
-    // $ANTLR start TILDE
-    public final void mTILDE() throws RecognitionException {
-        try {
-            int _type = TILDE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1980:7: ( '~' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1980:9: '~'
-            {
-            match('~'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end TILDE
-
-    // $ANTLR start AT
-    public final void mAT() throws RecognitionException {
-        try {
-            int _type = AT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1982:4: ( '@' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1982:12: '@'
-            {
-            match('@'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end AT
-
-    // $ANTLR start EQUALS
-    public final void mEQUALS() throws RecognitionException {
-        try {
-            int _type = EQUALS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1984:9: ( '=' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1984:11: '='
-            {
-            match('='); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end EQUALS
-
-    // $ANTLR start COLON
-    public final void mCOLON() throws RecognitionException {
-        try {
-            int _type = COLON;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1986:9: ( ':' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1986:11: ':'
-            {
-            match(':'); if (failed) return ;
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end COLON
-
-    // $ANTLR start SH_STYLE_SINGLE_LINE_COMMENT
-    public final void mSH_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
-        try {
-            int _type = SH_STYLE_SINGLE_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1989:2: ( '#' ( options {greedy=false; } : . )* EOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1989:4: '#' ( options {greedy=false; } : . )* EOL
-            {
-            match('#'); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1989:8: ( options {greedy=false; } : . )*
-            loop15:
-            do {
-                int alt15=2;
-                int LA15_0 = input.LA(1);
-
-                if ( (LA15_0=='\r') ) {
-                    alt15=2;
-                }
-                else if ( (LA15_0=='\n') ) {
-                    alt15=2;
-                }
-                else if ( ((LA15_0>='\u0000' && LA15_0<='\t')||(LA15_0>='\u000B' && LA15_0<='\f')||(LA15_0>='\u000E' && LA15_0<='\uFFFE')) ) {
-                    alt15=1;
-                }
-
-
-                switch (alt15) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1989:35: .
-            	    {
-            	    matchAny(); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop15;
-                }
-            } while (true);
-
-            mEOL(); if (failed) return ;
-            if ( backtracking==0 ) {
-               channel=HIDDEN; setText("//"+getText().substring(1));
-            }
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end SH_STYLE_SINGLE_LINE_COMMENT
-
-    // $ANTLR start C_STYLE_SINGLE_LINE_COMMENT
-    public final void mC_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
-        try {
-            int _type = C_STYLE_SINGLE_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1995:2: ( '//' ( options {greedy=false; } : . )* EOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1995:4: '//' ( options {greedy=false; } : . )* EOL
-            {
-            match("//"); if (failed) return ;
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1995:9: ( options {greedy=false; } : . )*
-            loop16:
-            do {
-                int alt16=2;
-                int LA16_0 = input.LA(1);
-
-                if ( (LA16_0=='\r') ) {
-                    alt16=2;
-                }
-                else if ( (LA16_0=='\n') ) {
-                    alt16=2;
-                }
-                else if ( ((LA16_0>='\u0000' && LA16_0<='\t')||(LA16_0>='\u000B' && LA16_0<='\f')||(LA16_0>='\u000E' && LA16_0<='\uFFFE')) ) {
-                    alt16=1;
-                }
-
-
-                switch (alt16) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1995:36: .
-            	    {
-            	    matchAny(); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop16;
-                }
-            } while (true);
-
-            mEOL(); if (failed) return ;
-            if ( backtracking==0 ) {
-               channel=HIDDEN; 
-            }
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end C_STYLE_SINGLE_LINE_COMMENT
-
-    // $ANTLR start MULTI_LINE_COMMENT
-    public final void mMULTI_LINE_COMMENT() throws RecognitionException {
-        try {
-            int _type = MULTI_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:2000:2: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:2000:4: '/*' ( options {greedy=false; } : . )* '*/'
-            {
-            match("/*"); if (failed) return ;
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:2000:9: ( options {greedy=false; } : . )*
-            loop17:
-            do {
-                int alt17=2;
-                int LA17_0 = input.LA(1);
-
-                if ( (LA17_0=='*') ) {
-                    int LA17_1 = input.LA(2);
-
-                    if ( (LA17_1=='/') ) {
-                        alt17=2;
-                    }
-                    else if ( ((LA17_1>='\u0000' && LA17_1<='.')||(LA17_1>='0' && LA17_1<='\uFFFE')) ) {
-                        alt17=1;
-                    }
-
-
-                }
-                else if ( ((LA17_0>='\u0000' && LA17_0<=')')||(LA17_0>='+' && LA17_0<='\uFFFE')) ) {
-                    alt17=1;
-                }
-
-
-                switch (alt17) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:2000:35: .
-            	    {
-            	    matchAny(); if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop17;
-                }
-            } while (true);
-
-            match("*/"); if (failed) return ;
-
-            if ( backtracking==0 ) {
-               channel=HIDDEN; 
-            }
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end MULTI_LINE_COMMENT
-
-    // $ANTLR start MISC
-    public final void mMISC() throws RecognitionException {
-        try {
-            int _type = MISC;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:2004:7: ( '!' | '$' | '%' | '^' | '*' | '_' | '-' | '+' | '?' | '/' | '\\'' | '\\\\' | '|' | '&' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.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)=='|' ) {
-                input.consume();
-            failed=false;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recover(mse);    throw mse;
-            }
-
-
-            }
-
-            this.type = _type;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end MISC
-
-    public void mTokens() throws RecognitionException {
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:8: ( T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | EVENT | GLOBAL | DECLARE | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | ENTRY_POINT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | OVER | WINDOW | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | TILDE | AT | EQUALS | COLON | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC )
-        int alt18=81;
-        alt18 = dfa18.predict(input);
-        switch (alt18) {
-            case 1 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:10: T81
-                {
-                mT81(); if (failed) return ;
-
-                }
-                break;
-            case 2 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:14: T82
-                {
-                mT82(); if (failed) return ;
-
-                }
-                break;
-            case 3 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:18: T83
-                {
-                mT83(); if (failed) return ;
-
-                }
-                break;
-            case 4 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:22: T84
-                {
-                mT84(); if (failed) return ;
-
-                }
-                break;
-            case 5 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:26: T85
-                {
-                mT85(); if (failed) return ;
-
-                }
-                break;
-            case 6 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:30: T86
-                {
-                mT86(); if (failed) return ;
-
-                }
-                break;
-            case 7 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:34: T87
-                {
-                mT87(); if (failed) return ;
-
-                }
-                break;
-            case 8 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:38: T88
-                {
-                mT88(); if (failed) return ;
-
-                }
-                break;
-            case 9 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:42: T89
-                {
-                mT89(); if (failed) return ;
-
-                }
-                break;
-            case 10 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:46: WS
-                {
-                mWS(); if (failed) return ;
-
-                }
-                break;
-            case 11 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:49: INT
-                {
-                mINT(); if (failed) return ;
-
-                }
-                break;
-            case 12 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:53: FLOAT
-                {
-                mFLOAT(); if (failed) return ;
-
-                }
-                break;
-            case 13 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:59: STRING
-                {
-                mSTRING(); if (failed) return ;
-
-                }
-                break;
-            case 14 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:66: BOOL
-                {
-                mBOOL(); if (failed) return ;
-
-                }
-                break;
-            case 15 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:71: PACKAGE
-                {
-                mPACKAGE(); if (failed) return ;
-
-                }
-                break;
-            case 16 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:79: IMPORT
-                {
-                mIMPORT(); if (failed) return ;
-
-                }
-                break;
-            case 17 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:86: FUNCTION
-                {
-                mFUNCTION(); if (failed) return ;
-
-                }
-                break;
-            case 18 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:95: EVENT
-                {
-                mEVENT(); if (failed) return ;
-
-                }
-                break;
-            case 19 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:101: GLOBAL
-                {
-                mGLOBAL(); if (failed) return ;
-
-                }
-                break;
-            case 20 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:108: DECLARE
-                {
-                mDECLARE(); if (failed) return ;
-
-                }
-                break;
-            case 21 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:116: RULE
-                {
-                mRULE(); if (failed) return ;
-
-                }
-                break;
-            case 22 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:121: QUERY
-                {
-                mQUERY(); if (failed) return ;
-
-                }
-                break;
-            case 23 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:127: TEMPLATE
-                {
-                mTEMPLATE(); if (failed) return ;
-
-                }
-                break;
-            case 24 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:136: ATTRIBUTES
-                {
-                mATTRIBUTES(); if (failed) return ;
-
-                }
-                break;
-            case 25 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:147: DATE_EFFECTIVE
-                {
-                mDATE_EFFECTIVE(); if (failed) return ;
-
-                }
-                break;
-            case 26 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:162: DATE_EXPIRES
-                {
-                mDATE_EXPIRES(); if (failed) return ;
-
-                }
-                break;
-            case 27 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:175: ENABLED
-                {
-                mENABLED(); if (failed) return ;
-
-                }
-                break;
-            case 28 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:183: SALIENCE
-                {
-                mSALIENCE(); if (failed) return ;
-
-                }
-                break;
-            case 29 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:192: NO_LOOP
-                {
-                mNO_LOOP(); if (failed) return ;
-
-                }
-                break;
-            case 30 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:200: AUTO_FOCUS
-                {
-                mAUTO_FOCUS(); if (failed) return ;
-
-                }
-                break;
-            case 31 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:211: ACTIVATION_GROUP
-                {
-                mACTIVATION_GROUP(); if (failed) return ;
-
-                }
-                break;
-            case 32 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:228: AGENDA_GROUP
-                {
-                mAGENDA_GROUP(); if (failed) return ;
-
-                }
-                break;
-            case 33 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:241: DIALECT
-                {
-                mDIALECT(); if (failed) return ;
-
-                }
-                break;
-            case 34 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:249: RULEFLOW_GROUP
-                {
-                mRULEFLOW_GROUP(); if (failed) return ;
-
-                }
-                break;
-            case 35 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:264: DURATION
-                {
-                mDURATION(); if (failed) return ;
-
-                }
-                break;
-            case 36 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:273: LOCK_ON_ACTIVE
-                {
-                mLOCK_ON_ACTIVE(); if (failed) return ;
-
-                }
-                break;
-            case 37 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:288: FROM
-                {
-                mFROM(); if (failed) return ;
-
-                }
-                break;
-            case 38 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:293: ACCUMULATE
-                {
-                mACCUMULATE(); if (failed) return ;
-
-                }
-                break;
-            case 39 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:304: INIT
-                {
-                mINIT(); if (failed) return ;
-
-                }
-                break;
-            case 40 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:309: ACTION
-                {
-                mACTION(); if (failed) return ;
-
-                }
-                break;
-            case 41 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:316: REVERSE
-                {
-                mREVERSE(); if (failed) return ;
-
-                }
-                break;
-            case 42 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:324: RESULT
-                {
-                mRESULT(); if (failed) return ;
-
-                }
-                break;
-            case 43 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:331: COLLECT
-                {
-                mCOLLECT(); if (failed) return ;
-
-                }
-                break;
-            case 44 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:339: ENTRY_POINT
-                {
-                mENTRY_POINT(); if (failed) return ;
-
-                }
-                break;
-            case 45 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:351: OR
-                {
-                mOR(); if (failed) return ;
-
-                }
-                break;
-            case 46 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:354: AND
-                {
-                mAND(); if (failed) return ;
-
-                }
-                break;
-            case 47 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:358: CONTAINS
-                {
-                mCONTAINS(); if (failed) return ;
-
-                }
-                break;
-            case 48 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:367: EXCLUDES
-                {
-                mEXCLUDES(); if (failed) return ;
-
-                }
-                break;
-            case 49 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:376: MEMBEROF
-                {
-                mMEMBEROF(); if (failed) return ;
-
-                }
-                break;
-            case 50 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:385: MATCHES
-                {
-                mMATCHES(); if (failed) return ;
-
-                }
-                break;
-            case 51 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:393: SOUNDSLIKE
-                {
-                mSOUNDSLIKE(); if (failed) return ;
-
-                }
-                break;
-            case 52 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:404: IN
-                {
-                mIN(); if (failed) return ;
-
-                }
-                break;
-            case 53 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:407: NULL
-                {
-                mNULL(); if (failed) return ;
-
-                }
-                break;
-            case 54 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:412: EXISTS
-                {
-                mEXISTS(); if (failed) return ;
-
-                }
-                break;
-            case 55 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:419: NOT
-                {
-                mNOT(); if (failed) return ;
-
-                }
-                break;
-            case 56 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:423: EVAL
-                {
-                mEVAL(); if (failed) return ;
-
-                }
-                break;
-            case 57 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:428: FORALL
-                {
-                mFORALL(); if (failed) return ;
-
-                }
-                break;
-            case 58 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:435: WHEN
-                {
-                mWHEN(); if (failed) return ;
-
-                }
-                break;
-            case 59 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:440: THEN
-                {
-                mTHEN(); if (failed) return ;
-
-                }
-                break;
-            case 60 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:445: END
-                {
-                mEND(); if (failed) return ;
-
-                }
-                break;
-            case 61 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:449: OVER
-                {
-                mOVER(); if (failed) return ;
-
-                }
-                break;
-            case 62 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:454: WINDOW
-                {
-                mWINDOW(); if (failed) return ;
-
-                }
-                break;
-            case 63 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:461: ID
-                {
-                mID(); if (failed) return ;
-
-                }
-                break;
-            case 64 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:464: LEFT_PAREN
-                {
-                mLEFT_PAREN(); if (failed) return ;
-
-                }
-                break;
-            case 65 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:475: RIGHT_PAREN
-                {
-                mRIGHT_PAREN(); if (failed) return ;
-
-                }
-                break;
-            case 66 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:487: LEFT_SQUARE
-                {
-                mLEFT_SQUARE(); if (failed) return ;
-
-                }
-                break;
-            case 67 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:499: RIGHT_SQUARE
-                {
-                mRIGHT_SQUARE(); if (failed) return ;
-
-                }
-                break;
-            case 68 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:512: LEFT_CURLY
-                {
-                mLEFT_CURLY(); if (failed) return ;
-
-                }
-                break;
-            case 69 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:523: RIGHT_CURLY
-                {
-                mRIGHT_CURLY(); if (failed) return ;
-
-                }
-                break;
-            case 70 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:535: COMMA
-                {
-                mCOMMA(); if (failed) return ;
-
-                }
-                break;
-            case 71 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:541: DOT
-                {
-                mDOT(); if (failed) return ;
-
-                }
-                break;
-            case 72 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:545: DOUBLE_AMPER
-                {
-                mDOUBLE_AMPER(); if (failed) return ;
-
-                }
-                break;
-            case 73 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:558: DOUBLE_PIPE
-                {
-                mDOUBLE_PIPE(); if (failed) return ;
-
-                }
-                break;
-            case 74 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:570: TILDE
-                {
-                mTILDE(); if (failed) return ;
-
-                }
-                break;
-            case 75 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:576: AT
-                {
-                mAT(); if (failed) return ;
-
-                }
-                break;
-            case 76 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:579: EQUALS
-                {
-                mEQUALS(); if (failed) return ;
-
-                }
-                break;
-            case 77 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:586: COLON
-                {
-                mCOLON(); if (failed) return ;
-
-                }
-                break;
-            case 78 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:592: SH_STYLE_SINGLE_LINE_COMMENT
-                {
-                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
-
-                }
-                break;
-            case 79 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:621: C_STYLE_SINGLE_LINE_COMMENT
-                {
-                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
-
-                }
-                break;
-            case 80 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:649: MULTI_LINE_COMMENT
-                {
-                mMULTI_LINE_COMMENT(); if (failed) return ;
-
-                }
-                break;
-            case 81 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:668: MISC
-                {
-                mMISC(); if (failed) return ;
-
-                }
-                break;
-
-        }
-
-    }
-
-    // $ANTLR start synpred1
-    public final void synpred1_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:14: ( '\\r\\n' )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:16: '\\r\\n'
-        {
-        match("\r\n"); if (failed) return ;
-
-
-        }
-    }
-    // $ANTLR end synpred1
-
-    public final boolean synpred1() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred1_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-
-
-    protected DFA18 dfa18 = new DFA18(this);
-    static final String DFA18_eotS =
-        "\2\uffff\1\57\1\55\1\62\1\64\1\66\1\55\1\uffff\1\70\1\uffff\1\55"+
-        "\21\54\10\uffff\2\55\4\uffff\1\55\16\uffff\10\54\1\155\30\54\1\u008e"+
-        "\4\54\4\uffff\11\54\1\uffff\5\54\1\u00a1\13\54\1\u00ad\10\54\1\u00b6"+
-        "\1\uffff\4\54\1\uffff\4\54\1\u00bf\1\u00c0\1\54\1\u00c2\4\54\1\u00c7"+
-        "\3\54\1\u00cb\1\54\1\uffff\11\54\1\u00d7\1\54\1\uffff\7\54\1\u00e1"+
-        "\1\uffff\3\54\1\u00e5\3\54\1\u00e9\2\uffff\1\54\1\uffff\1\u00c0"+
-        "\3\54\1\uffff\3\54\1\uffff\1\u00f1\3\54\1\uffff\6\54\1\uffff\1\u00fc"+
-        "\4\54\1\uffff\3\54\2\uffff\2\54\1\uffff\3\54\1\uffff\1\54\1\u010a"+
-        "\2\54\1\u010d\1\54\1\u010f\2\uffff\1\54\1\u0111\1\uffff\4\54\1\u0118"+
-        "\1\54\1\uffff\2\54\1\u011c\10\54\1\u0125\1\54\1\uffff\1\54\1\u0128"+
-        "\1\uffff\1\54\1\uffff\1\u012a\3\uffff\1\u012b\1\54\1\u012d\1\u012e"+
-        "\1\uffff\1\54\1\uffff\1\54\1\uffff\4\54\1\u0135\1\54\1\u0137\1\54"+
-        "\1\uffff\1\u0139\1\u013a\1\uffff\1\u013b\2\uffff\1\u013c\2\uffff"+
-        "\5\54\1\u0142\1\uffff\1\u0143\1\uffff\1\u0144\5\uffff\4\54\3\uffff"+
-        "\1\54\1\u014a\1\u014b\1\u014c\4\uffff";
-    static final String DFA18_eofS =
-        "\u014d\uffff";
-    static final String DFA18_minS =
-        "\1\11\1\uffff\1\52\1\60\4\75\1\uffff\1\56\1\uffff\1\0\1\145\2\141"+
-        "\1\155\1\156\1\154\1\141\1\145\1\165\1\143\1\141\3\157\1\162\1\141"+
-        "\1\150\10\uffff\1\46\1\174\4\uffff\1\52\16\uffff\1\145\1\165\1\155"+
-        "\1\157\1\154\1\162\1\156\1\143\1\60\1\160\1\143\2\141\1\157\1\164"+
-        "\1\143\1\162\1\141\1\163\1\154\1\145\1\144\1\145\1\143\2\164\1\165"+
-        "\2\154\1\55\1\143\1\154\1\145\1\60\1\164\1\155\1\156\1\145\4\uffff"+
-        "\1\156\1\145\1\160\1\155\1\163\1\141\1\143\1\153\1\164\1\uffff\1"+
-        "\157\1\154\1\163\1\154\1\156\1\60\1\162\2\142\1\145\1\154\1\141"+
-        "\1\154\1\145\1\165\1\145\1\162\1\60\1\156\1\151\1\165\1\157\1\162"+
-        "\1\156\1\151\1\154\1\60\1\uffff\1\153\1\154\1\164\1\162\1\uffff"+
-        "\1\143\1\142\1\144\1\156\2\60\1\154\1\60\1\145\1\154\1\164\1\141"+
-        "\1\60\1\162\1\165\1\164\1\60\1\164\1\uffff\1\171\1\154\1\141\1\55"+
-        "\1\141\1\164\1\145\1\162\1\154\1\60\1\171\1\uffff\1\144\1\157\1"+
-        "\155\1\55\1\151\1\144\1\145\1\60\1\uffff\1\55\1\145\1\141\1\60\1"+
-        "\150\1\145\1\157\1\60\2\uffff\1\141\1\uffff\1\60\1\154\1\151\1\147"+
-        "\1\uffff\1\164\1\144\1\163\1\uffff\1\60\1\55\1\145\1\154\1\145\1"+
-        "\162\1\151\1\143\1\163\1\164\1\154\1\uffff\1\60\2\141\1\156\1\165"+
-        "\1\uffff\1\142\1\163\1\156\2\uffff\1\143\1\151\1\uffff\1\145\1\162"+
-        "\1\167\1\uffff\1\164\1\60\1\157\1\145\1\60\1\145\1\60\2\uffff\1"+
-        "\144\1\60\1\146\1\145\1\157\1\164\1\145\1\60\1\157\1\uffff\1\55"+
-        "\1\164\1\60\1\154\1\165\1\154\1\143\1\164\1\156\1\163\1\117\1\60"+
-        "\1\145\1\uffff\1\156\1\60\1\uffff\1\163\1\uffff\1\60\3\uffff\1\60"+
-        "\1\156\2\60\1\uffff\1\167\1\uffff\1\151\1\uffff\1\141\1\164\1\151"+
-        "\1\145\1\60\1\163\1\60\1\146\1\uffff\2\60\1\uffff\1\60\2\uffff\1"+
-        "\60\2\uffff\1\55\1\157\1\164\1\145\1\153\1\60\1\uffff\1\60\1\uffff"+
-        "\1\60\5\uffff\1\156\1\145\1\163\1\145\3\uffff\1\55\3\60\4\uffff";
-    static final String DFA18_maxS =
-        "\1\u00ff\1\uffff\1\52\1\76\4\75\1\uffff\1\71\1\uffff\1\ufffe\1\162"+
-        "\1\165\1\141\1\156\1\170\1\154\4\165\1\157\1\165\2\157\1\166\1\145"+
-        "\1\151\10\uffff\1\46\1\174\4\uffff\1\57\16\uffff\1\145\1\165\1\155"+
-        "\1\157\1\154\1\162\1\156\1\143\1\u00ff\1\160\1\151\1\145\1\164\1"+
-        "\157\1\164\1\143\1\162\1\141\1\166\1\154\1\145\1\144\1\145\3\164"+
-        "\1\165\2\154\1\164\1\143\1\156\1\145\1\u00ff\1\164\1\155\1\156\1"+
-        "\145\4\uffff\1\156\1\145\1\160\1\155\1\163\1\141\1\143\1\153\1\164"+
-        "\1\uffff\1\157\1\154\1\163\1\154\1\156\1\u00ff\1\162\2\142\1\145"+
-        "\1\154\1\141\1\154\1\145\1\165\1\145\1\162\1\u00ff\1\156\1\151\1"+
-        "\165\1\157\1\162\1\156\1\151\1\154\1\u00ff\1\uffff\1\153\1\154\1"+
-        "\164\1\162\1\uffff\1\143\1\142\1\144\1\156\2\u00ff\1\154\1\u00ff"+
-        "\1\145\1\154\1\164\1\141\1\u00ff\1\162\1\165\1\164\1\u00ff\1\164"+
-        "\1\uffff\1\171\1\154\1\141\1\55\1\141\1\164\1\145\1\162\1\154\1"+
-        "\u00ff\1\171\1\uffff\1\144\1\166\1\155\1\55\1\151\1\144\1\145\1"+
-        "\u00ff\1\uffff\1\55\1\145\1\141\1\u00ff\1\150\1\145\1\157\1\u00ff"+
-        "\2\uffff\1\141\1\uffff\1\u00ff\1\154\1\151\1\147\1\uffff\1\164\1"+
-        "\144\1\163\1\uffff\1\u00ff\1\55\1\145\1\154\1\145\1\162\1\151\1"+
-        "\143\1\163\1\164\1\154\1\uffff\1\u00ff\2\141\1\156\1\165\1\uffff"+
-        "\1\142\1\163\1\156\2\uffff\1\143\1\151\1\uffff\1\145\1\162\1\167"+
-        "\1\uffff\1\164\1\u00ff\1\157\1\145\1\u00ff\1\145\1\u00ff\2\uffff"+
-        "\1\144\1\u00ff\1\170\1\145\1\157\1\164\1\145\1\u00ff\1\157\1\uffff"+
-        "\1\55\1\164\1\u00ff\1\154\1\165\1\154\1\143\1\164\1\156\1\163\1"+
-        "\117\1\u00ff\1\145\1\uffff\1\156\1\u00ff\1\uffff\1\163\1\uffff\1"+
-        "\u00ff\3\uffff\1\u00ff\1\156\2\u00ff\1\uffff\1\167\1\uffff\1\151"+
-        "\1\uffff\1\141\1\164\1\151\1\145\1\u00ff\1\163\1\u00ff\1\146\1\uffff"+
-        "\2\u00ff\1\uffff\1\u00ff\2\uffff\1\u00ff\2\uffff\1\55\1\157\1\164"+
-        "\1\145\1\153\1\u00ff\1\uffff\1\u00ff\1\uffff\1\u00ff\5\uffff\1\156"+
-        "\1\145\1\163\1\145\3\uffff\1\55\3\u00ff\4\uffff";
-    static final String DFA18_acceptS =
-        "\1\uffff\1\1\6\uffff\1\12\1\uffff\1\15\22\uffff\1\77\1\100\1\101"+
-        "\1\102\1\103\1\104\1\105\1\106\2\uffff\1\112\1\113\1\115\1\116\1"+
-        "\uffff\1\77\1\121\1\2\1\107\1\3\1\4\1\114\1\6\1\5\1\10\1\7\1\11"+
-        "\1\13\1\14\46\uffff\1\110\1\111\1\117\1\120\11\uffff\1\64\33\uffff"+
-        "\1\35\4\uffff\1\55\22\uffff\1\74\13\uffff\1\56\10\uffff\1\67\10"+
-        "\uffff\1\73\1\16\1\uffff\1\45\4\uffff\1\47\3\uffff\1\70\13\uffff"+
-        "\1\25\5\uffff\1\36\3\uffff\1\65\1\44\2\uffff\1\75\3\uffff\1\72\7"+
-        "\uffff\1\22\1\54\11\uffff\1\26\15\uffff\1\71\2\uffff\1\20\1\uffff"+
-        "\1\66\1\uffff\1\23\1\31\1\32\4\uffff\1\52\1\uffff\1\40\1\uffff\1"+
-        "\50\10\uffff\1\76\2\uffff\1\17\1\uffff\1\33\1\24\1\uffff\1\41\1"+
-        "\51\6\uffff\1\53\1\uffff\1\62\1\uffff\1\27\1\21\1\60\1\43\1\42\4"+
-        "\uffff\1\34\1\57\1\61\4\uffff\1\37\1\46\1\30\1\63";
-    static final String DFA18_specialS =
-        "\u014d\uffff}>";
-    static final String[] DFA18_transitionS = {
-            "\2\10\1\uffff\2\10\22\uffff\1\10\1\7\1\12\1\52\1\35\1\55\1\45"+
-            "\1\13\1\36\1\37\2\55\1\44\1\3\1\2\1\53\12\11\1\51\1\1\1\6\1"+
-            "\4\1\5\1\55\1\50\32\54\1\40\1\55\1\41\1\55\1\35\1\uffff\1\25"+
-            "\1\54\1\31\1\22\1\20\1\15\1\21\1\54\1\17\2\54\1\30\1\33\1\27"+
-            "\1\32\1\16\1\24\1\23\1\26\1\14\2\54\1\34\3\54\1\42\1\46\1\43"+
-            "\1\47\101\uffff\100\54",
-            "",
-            "\1\56",
-            "\12\11\4\uffff\1\60",
-            "\1\61",
-            "\1\63",
-            "\1\65",
-            "\1\67",
-            "",
-            "\1\71\1\uffff\12\11",
-            "",
-            "\uffff\12",
-            "\1\74\2\uffff\1\72\11\uffff\1\73",
-            "\1\76\15\uffff\1\77\2\uffff\1\75\2\uffff\1\100",
-            "\1\101",
-            "\1\103\1\102",
-            "\1\106\7\uffff\1\105\1\uffff\1\104",
-            "\1\107",
-            "\1\110\3\uffff\1\111\3\uffff\1\113\13\uffff\1\112",
-            "\1\114\17\uffff\1\115",
-            "\1\116",
-            "\1\121\3\uffff\1\120\6\uffff\1\117\5\uffff\1\123\1\122",
-            "\1\125\15\uffff\1\124",
-            "\1\127\5\uffff\1\126",
-            "\1\130",
-            "\1\131",
-            "\1\133\3\uffff\1\132",
-            "\1\134\3\uffff\1\135",
-            "\1\137\1\136",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\140",
-            "\1\141",
-            "",
-            "",
-            "",
-            "",
-            "\1\143\4\uffff\1\142",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\144",
-            "\1\145",
-            "\1\146",
-            "\1\147",
-            "\1\150",
-            "\1\151",
-            "\1\152",
-            "\1\153",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\10\54\1\154\21\54"+
-            "\105\uffff\100\54",
-            "\1\156",
-            "\1\157\5\uffff\1\160",
-            "\1\161\3\uffff\1\162",
-            "\1\165\2\uffff\1\163\17\uffff\1\164",
-            "\1\166",
-            "\1\167",
-            "\1\170",
-            "\1\171",
-            "\1\172",
-            "\1\174\2\uffff\1\173",
-            "\1\175",
-            "\1\176",
-            "\1\177",
-            "\1\u0080",
-            "\1\u0082\20\uffff\1\u0081",
-            "\1\u0083",
-            "\1\u0084",
-            "\1\u0085",
-            "\1\u0086",
-            "\1\u0087",
-            "\1\u0089\106\uffff\1\u0088",
-            "\1\u008a",
-            "\1\u008b\1\uffff\1\u008c",
-            "\1\u008d",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u008f",
-            "\1\u0090",
-            "\1\u0091",
-            "\1\u0092",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0093",
-            "\1\u0094",
-            "\1\u0095",
-            "\1\u0096",
-            "\1\u0097",
-            "\1\u0098",
-            "\1\u0099",
-            "\1\u009a",
-            "\1\u009b",
-            "",
-            "\1\u009c",
-            "\1\u009d",
-            "\1\u009e",
-            "\1\u009f",
-            "\1\u00a0",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00a2",
-            "\1\u00a3",
-            "\1\u00a4",
-            "\1\u00a5",
-            "\1\u00a6",
-            "\1\u00a7",
-            "\1\u00a8",
-            "\1\u00a9",
-            "\1\u00aa",
-            "\1\u00ab",
-            "\1\u00ac",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00ae",
-            "\1\u00af",
-            "\1\u00b0",
-            "\1\u00b1",
-            "\1\u00b2",
-            "\1\u00b3",
-            "\1\u00b4",
-            "\1\u00b5",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\1\u00b7",
-            "\1\u00b8",
-            "\1\u00b9",
-            "\1\u00ba",
-            "",
-            "\1\u00bb",
-            "\1\u00bc",
-            "\1\u00bd",
-            "\1\u00be",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00c1",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00c3",
-            "\1\u00c4",
-            "\1\u00c5",
-            "\1\u00c6",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00c8",
-            "\1\u00c9",
-            "\1\u00ca",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00cc",
-            "",
-            "\1\u00cd",
-            "\1\u00ce",
-            "\1\u00cf",
-            "\1\u00d0",
-            "\1\u00d1",
-            "\1\u00d2",
-            "\1\u00d3",
-            "\1\u00d4",
-            "\1\u00d5",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\5\54\1\u00d6\24\54"+
-            "\105\uffff\100\54",
-            "\1\u00d8",
-            "",
-            "\1\u00d9",
-            "\1\u00db\6\uffff\1\u00da",
-            "\1\u00dc",
-            "\1\u00dd",
-            "\1\u00de",
-            "\1\u00df",
-            "\1\u00e0",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\1\u00e2",
-            "\1\u00e3",
-            "\1\u00e4",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00e6",
-            "\1\u00e7",
-            "\1\u00e8",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "\1\u00ea",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00eb",
-            "\1\u00ec",
-            "\1\u00ed",
-            "",
-            "\1\u00ee",
-            "\1\u00ef",
-            "\1\u00f0",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00f2",
-            "\1\u00f3",
-            "\1\u00f4",
-            "\1\u00f5",
-            "\1\u00f6",
-            "\1\u00f7",
-            "\1\u00f8",
-            "\1\u00f9",
-            "\1\u00fa",
-            "\1\u00fb",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u00fd",
-            "\1\u00fe",
-            "\1\u00ff",
-            "\1\u0100",
-            "",
-            "\1\u0101",
-            "\1\u0102",
-            "\1\u0103",
-            "",
-            "",
-            "\1\u0104",
-            "\1\u0105",
-            "",
-            "\1\u0106",
-            "\1\u0107",
-            "\1\u0108",
-            "",
-            "\1\u0109",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u010b",
-            "\1\u010c",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u010e",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "\1\u0110",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u0112\21\uffff\1\u0113",
-            "\1\u0114",
-            "\1\u0115",
-            "\1\u0116",
-            "\1\u0117",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u0119",
-            "",
-            "\1\u011a",
-            "\1\u011b",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u011d",
-            "\1\u011e",
-            "\1\u011f",
-            "\1\u0120",
-            "\1\u0121",
-            "\1\u0122",
-            "\1\u0123",
-            "\1\u0124",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u0126",
-            "",
-            "\1\u0127",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\1\u0129",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u012c",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\1\u012f",
-            "",
-            "\1\u0130",
-            "",
-            "\1\u0131",
-            "\1\u0132",
-            "\1\u0133",
-            "\1\u0134",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u0136",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\1\u0138",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "\1\u013d",
-            "\1\u013e",
-            "\1\u013f",
-            "\1\u0140",
-            "\1\u0141",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u0145",
-            "\1\u0146",
-            "\1\u0147",
-            "\1\u0148",
-            "",
-            "",
-            "",
-            "\1\u0149",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54\105\uffff\100"+
-            "\54",
-            "",
-            "",
-            "",
-            ""
-    };
-
-    static final short[] DFA18_eot = DFA.unpackEncodedString(DFA18_eotS);
-    static final short[] DFA18_eof = DFA.unpackEncodedString(DFA18_eofS);
-    static final char[] DFA18_min = DFA.unpackEncodedStringToUnsignedChars(DFA18_minS);
-    static final char[] DFA18_max = DFA.unpackEncodedStringToUnsignedChars(DFA18_maxS);
-    static final short[] DFA18_accept = DFA.unpackEncodedString(DFA18_acceptS);
-    static final short[] DFA18_special = DFA.unpackEncodedString(DFA18_specialS);
-    static final short[][] DFA18_transition;
-
-    static {
-        int numStates = DFA18_transitionS.length;
-        DFA18_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA18_transition[i] = DFA.unpackEncodedString(DFA18_transitionS[i]);
-        }
-    }
-
-    class DFA18 extends DFA {
-
-        public DFA18(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 18;
-            this.eot = DFA18_eot;
-            this.eof = DFA18_eof;
-            this.min = DFA18_min;
-            this.max = DFA18_max;
-            this.accept = DFA18_accept;
-            this.special = DFA18_special;
-            this.transition = DFA18_transition;
-        }
-        public String getDescription() {
-            return "1:1: Tokens : ( T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | EVENT | GLOBAL | DECLARE | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | ENTRY_POINT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | OVER | WINDOW | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | TILDE | AT | EQUALS | COLON | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC );";
-        }
-    }
- 
-
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,2090 @@
+// $ANTLR 3.0.1 /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2008-06-05 22:50:44
+
+	package org.drools.lang;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+public class DRLLexer extends Lexer {
+    public static final int COMMA=92;
+    public static final int VT_PATTERN_TYPE=37;
+    public static final int VT_ACCUMULATE_ID_CLAUSE=26;
+    public static final int VK_DIALECT=52;
+    public static final int VK_FUNCTION=63;
+    public static final int END=89;
+    public static final int HexDigit=118;
+    public static final int VK_ATTRIBUTES=55;
+    public static final int VT_EXPRESSION_CHAIN=28;
+    public static final int VK_ACCUMULATE=79;
+    public static final int MISC=114;
+    public static final int VT_AND_PREFIX=21;
+    public static final int VK_QUERY=61;
+    public static final int THEN=111;
+    public static final int VK_AUTO_FOCUS=47;
+    public static final int DOT=87;
+    public static final int VK_IMPORT=58;
+    public static final int VT_SLOT=14;
+    public static final int VT_PACKAGE_ID=38;
+    public static final int LEFT_SQUARE=109;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=121;
+    public static final int VT_DATA_TYPE=36;
+    public static final int VK_MATCHES=67;
+    public static final int VT_FACT=6;
+    public static final int LEFT_CURLY=112;
+    public static final int LEFT_PAREN=91;
+    public static final int DOUBLE_AMPER=98;
+    public static final int VT_QUERY_ID=9;
+    public static final int VT_ACCESSOR_PATH=34;
+    public static final int VT_LABEL=8;
+    public static final int VT_ENTRYPOINT_ID=12;
+    public static final int VK_SOUNDSLIKE=69;
+    public static final int VK_SALIENCE=53;
+    public static final int VT_FIELD=33;
+    public static final int WS=116;
+    public static final int STRING=90;
+    public static final int VK_AND=75;
+    public static final int VT_ACCESSOR_ELEMENT=35;
+    public static final int VK_GLOBAL=64;
+    public static final int VT_ACCUMULATE_INIT_CLAUSE=25;
+    public static final int VK_REVERSE=82;
+    public static final int GRAVE_ACCENT=106;
+    public static final int VK_DURATION=51;
+    public static final int VT_SQUARE_CHUNK=18;
+    public static final int VK_FORALL=77;
+    public static final int VT_COMPILATION_UNIT=4;
+    public static final int VT_PAREN_CHUNK=19;
+    public static final int VK_ENABLED=54;
+    public static final int VK_RESULT=83;
+    public static final int UnicodeEscape=119;
+    public static final int VK_PACKAGE=59;
+    public static final int VT_RULE_ID=11;
+    public static final int EQUAL=100;
+    public static final int VK_NO_LOOP=46;
+    public static final int SEMICOLON=85;
+    public static final int VK_TEMPLATE=60;
+    public static final int VT_AND_IMPLICIT=20;
+    public static final int NULL=108;
+    public static final int COLON=94;
+    public static final int MULTI_LINE_COMMENT=123;
+    public static final int VT_RULE_ATTRIBUTES=15;
+    public static final int RIGHT_SQUARE=110;
+    public static final int VK_AGENDA_GROUP=49;
+    public static final int VT_FACT_OR=31;
+    public static final int VK_NOT=72;
+    public static final int VK_DATE_EXPIRES=44;
+    public static final int ARROW=99;
+    public static final int FLOAT=107;
+    public static final int VT_SLOT_ID=13;
+    public static final int VT_CURLY_CHUNK=17;
+    public static final int VT_OR_PREFIX=22;
+    public static final int DOUBLE_PIPE=97;
+    public static final int LESS=103;
+    public static final int VT_PATTERN=29;
+    public static final int VK_DATE_EFFECTIVE=43;
+    public static final int EscapeSequence=117;
+    public static final int VK_EXISTS=76;
+    public static final int INT=96;
+    public static final int VT_BIND_FIELD=32;
+    public static final int VK_RULE=57;
+    public static final int VK_EVAL=65;
+    public static final int VK_COLLECT=84;
+    public static final int GREATER=101;
+    public static final int VT_FACT_BINDING=30;
+    public static final int ID=86;
+    public static final int NOT_EQUAL=105;
+    public static final int RIGHT_CURLY=113;
+    public static final int VK_ENTRY_POINT=71;
+    public static final int VT_AND_INFIX=23;
+    public static final int VT_PARAM_LIST=42;
+    public static final int BOOL=95;
+    public static final int VT_FROM_SOURCE=27;
+    public static final int VK_CONTAINS=66;
+    public static final int VK_LOCK_ON_ACTIVE=45;
+    public static final int VT_FUNCTION_IMPORT=5;
+    public static final int VK_IN=73;
+    public static final int VT_RHS_CHUNK=16;
+    public static final int VK_MEMBEROF=70;
+    public static final int GREATER_EQUAL=102;
+    public static final int VT_OR_INFIX=24;
+    public static final int DOT_STAR=88;
+    public static final int VK_OR=74;
+    public static final int VT_GLOBAL_ID=40;
+    public static final int LESS_EQUAL=104;
+    public static final int VK_WHEN=56;
+    public static final int VK_RULEFLOW_GROUP=50;
+    public static final int VT_FUNCTION_ID=41;
+    public static final int EOF=-1;
+    public static final int VT_CONSTRAINTS=7;
+    public static final int VT_IMPORT_ID=39;
+    public static final int EOL=115;
+    public static final int VK_INIT=80;
+    public static final int VK_ACTIVATION_GROUP=48;
+    public static final int Tokens=124;
+    public static final int OctalEscape=120;
+    public static final int VK_ACTION=81;
+    public static final int VK_FROM=78;
+    public static final int VK_EXCLUDES=68;
+    public static final int RIGHT_PAREN=93;
+    public static final int VT_TEMPLATE_ID=10;
+    public static final int VK_DECLARE=62;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=122;
+
+    	/** The standard method called to automatically emit a token at the
+    	 *  outermost lexical rule.  The token object should point into the
+    	 *  char buffer start..stop.  If there is a text override in 'text',
+    	 *  use that to set the token's text.  Override this method to emit
+    	 *  custom Token objects.
+    	 */
+    	public Token emit() {
+    		Token t = new DroolsToken(input, type, channel, tokenStartCharIndex, getCharIndex()-1);
+    		t.setLine(tokenStartLine);
+    		t.setText(text);
+    		t.setCharPositionInLine(tokenStartCharPositionInLine);
+    		emit(t);
+    		return t;
+    	}
+
+    public DRLLexer() {;} 
+    public DRLLexer(CharStream input) {
+        super(input);
+        ruleMemo = new HashMap[41+1];
+     }
+    public String getGrammarFileName() { return "/Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g"; }
+
+    // $ANTLR start WS
+    public final void mWS() throws RecognitionException {
+        try {
+            int _type = WS;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:9: ( ( ' ' | '\\t' | '\\f' | EOL )+ )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:17: ( ' ' | '\\t' | '\\f' | EOL )+
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:17: ( ' ' | '\\t' | '\\f' | EOL )+
+            int cnt1=0;
+            loop1:
+            do {
+                int alt1=5;
+                switch ( input.LA(1) ) {
+                case ' ':
+                    {
+                    alt1=1;
+                    }
+                    break;
+                case '\t':
+                    {
+                    alt1=2;
+                    }
+                    break;
+                case '\f':
+                    {
+                    alt1=3;
+                    }
+                    break;
+                case '\n':
+                case '\r':
+                    {
+                    alt1=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt1) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:19: ' '
+            	    {
+            	    match(' '); if (failed) return ;
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:994:19: '\\t'
+            	    {
+            	    match('\t'); if (failed) return ;
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:995:19: '\\f'
+            	    {
+            	    match('\f'); if (failed) return ;
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:996:19: EOL
+            	    {
+            	    mEOL(); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt1 >= 1 ) break loop1;
+            	    if (backtracking>0) {failed=true; return ;}
+                        EarlyExitException eee =
+                            new EarlyExitException(1, input);
+                        throw eee;
+                }
+                cnt1++;
+            } while (true);
+
+            if ( backtracking==0 ) {
+               channel=HIDDEN; 
+            }
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end WS
+
+    // $ANTLR start EOL
+    public final void mEOL() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1002:6: ( ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1003:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1003:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
+            int alt2=3;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0=='\r') ) {
+                int LA2_1 = input.LA(2);
+
+                if ( (LA2_1=='\n') && (synpred1())) {
+                    alt2=1;
+                }
+                else {
+                    alt2=2;}
+            }
+            else if ( (LA2_0=='\n') ) {
+                alt2=3;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("1003:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )", 2, 0, input);
+
+                throw nvae;
+            }
+            switch (alt2) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1003:14: ( '\\r\\n' )=> '\\r\\n'
+                    {
+                    match("\r\n"); if (failed) return ;
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1004:25: '\\r'
+                    {
+                    match('\r'); if (failed) return ;
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1005:25: '\\n'
+                    {
+                    match('\n'); if (failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EOL
+
+    // $ANTLR start INT
+    public final void mINT() throws RecognitionException {
+        try {
+            int _type = INT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:2: ( ( '-' )? ( '0' .. '9' )+ )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:4: ( '-' )? ( '0' .. '9' )+
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:4: ( '-' )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0=='-') ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:5: '-'
+                    {
+                    match('-'); if (failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:10: ( '0' .. '9' )+
+            int cnt4=0;
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='0' && LA4_0<='9')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:11: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt4 >= 1 ) break loop4;
+            	    if (backtracking>0) {failed=true; return ;}
+                        EarlyExitException eee =
+                            new EarlyExitException(4, input);
+                        throw eee;
+                }
+                cnt4++;
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end INT
+
+    // $ANTLR start FLOAT
+    public final void mFLOAT() throws RecognitionException {
+        try {
+            int _type = FLOAT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:2: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:4: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:4: ( '-' )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0=='-') ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:5: '-'
+                    {
+                    match('-'); if (failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:10: ( '0' .. '9' )+
+            int cnt6=0;
+            loop6:
+            do {
+                int alt6=2;
+                int LA6_0 = input.LA(1);
+
+                if ( ((LA6_0>='0' && LA6_0<='9')) ) {
+                    alt6=1;
+                }
+
+
+                switch (alt6) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:11: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt6 >= 1 ) break loop6;
+            	    if (backtracking>0) {failed=true; return ;}
+                        EarlyExitException eee =
+                            new EarlyExitException(6, input);
+                        throw eee;
+                }
+                cnt6++;
+            } while (true);
+
+            match('.'); if (failed) return ;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:26: ( '0' .. '9' )+
+            int cnt7=0;
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( ((LA7_0>='0' && LA7_0<='9')) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1014:27: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt7 >= 1 ) break loop7;
+            	    if (backtracking>0) {failed=true; return ;}
+                        EarlyExitException eee =
+                            new EarlyExitException(7, input);
+                        throw eee;
+                }
+                cnt7++;
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end FLOAT
+
+    // $ANTLR start STRING
+    public final void mSTRING() throws RecognitionException {
+        try {
+            int _type = STRING;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:5: ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) )
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0=='\"') ) {
+                alt10=1;
+            }
+            else if ( (LA10_0=='\'') ) {
+                alt10=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("1017:1: STRING : ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) );", 10, 0, input);
+
+                throw nvae;
+            }
+            switch (alt10) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
+                    {
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:9: '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"'
+                    {
+                    match('\"'); if (failed) return ;
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:13: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )*
+                    loop8:
+                    do {
+                        int alt8=3;
+                        int LA8_0 = input.LA(1);
+
+                        if ( (LA8_0=='\\') ) {
+                            alt8=1;
+                        }
+                        else if ( ((LA8_0>='\u0000' && LA8_0<='!')||(LA8_0>='#' && LA8_0<='[')||(LA8_0>=']' && LA8_0<='\uFFFE')) ) {
+                            alt8=2;
+                        }
+
+
+                        switch (alt8) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:15: EscapeSequence
+                    	    {
+                    	    mEscapeSequence(); if (failed) return ;
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:32: ~ ( '\\\\' | '\"' )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+                    	        input.consume();
+                    	    failed=false;
+                    	    }
+                    	    else {
+                    	        if (backtracking>0) {failed=true; return ;}
+                    	        MismatchedSetException mse =
+                    	            new MismatchedSetException(null,input);
+                    	        recover(mse);    throw mse;
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop8;
+                        }
+                    } while (true);
+
+                    match('\"'); if (failed) return ;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
+                    {
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:9: '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\''
+                    {
+                    match('\''); if (failed) return ;
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:14: ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )*
+                    loop9:
+                    do {
+                        int alt9=3;
+                        int LA9_0 = input.LA(1);
+
+                        if ( (LA9_0=='\\') ) {
+                            alt9=1;
+                        }
+                        else if ( ((LA9_0>='\u0000' && LA9_0<='&')||(LA9_0>='(' && LA9_0<='[')||(LA9_0>=']' && LA9_0<='\uFFFE')) ) {
+                            alt9=2;
+                        }
+
+
+                        switch (alt9) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:16: EscapeSequence
+                    	    {
+                    	    mEscapeSequence(); if (failed) return ;
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1019:33: ~ ( '\\\\' | '\\'' )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
+                    	        input.consume();
+                    	    failed=false;
+                    	    }
+                    	    else {
+                    	        if (backtracking>0) {failed=true; return ;}
+                    	        MismatchedSetException mse =
+                    	            new MismatchedSetException(null,input);
+                    	        recover(mse);    throw mse;
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop9;
+                        }
+                    } while (true);
+
+                    match('\''); if (failed) return ;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end STRING
+
+    // $ANTLR start HexDigit
+    public final void mHexDigit() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1023:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1023:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )
+            {
+            if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {
+                input.consume();
+            failed=false;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end HexDigit
+
+    // $ANTLR start EscapeSequence
+    public final void mEscapeSequence() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1027:5: ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape )
+            int alt11=3;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\\') ) {
+                switch ( input.LA(2) ) {
+                case '\"':
+                case '$':
+                case '&':
+                case '\'':
+                case '(':
+                case ')':
+                case '*':
+                case '+':
+                case '-':
+                case '.':
+                case '?':
+                case 'A':
+                case 'B':
+                case 'D':
+                case 'E':
+                case 'G':
+                case 'Q':
+                case 'S':
+                case 'W':
+                case 'Z':
+                case '[':
+                case '\\':
+                case ']':
+                case '^':
+                case 'a':
+                case 'b':
+                case 'c':
+                case 'd':
+                case 'e':
+                case 'f':
+                case 'n':
+                case 'o':
+                case 'p':
+                case 'r':
+                case 's':
+                case 't':
+                case 'w':
+                case 'x':
+                case 'z':
+                case '{':
+                case '|':
+                case '}':
+                    {
+                    alt11=1;
+                    }
+                    break;
+                case 'u':
+                    {
+                    alt11=2;
+                    }
+                    break;
+                case '0':
+                case '1':
+                case '2':
+                case '3':
+                case '4':
+                case '5':
+                case '6':
+                case '7':
+                    {
+                    alt11=3;
+                    }
+                    break;
+                default:
+                    if (backtracking>0) {failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("1025:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 1, input);
+
+                    throw nvae;
+                }
+
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("1025:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 0, input);
+
+                throw nvae;
+            }
+            switch (alt11) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1027:9: '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' )
+                    {
+                    match('\\'); if (failed) return ;
+                    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)>='A' && input.LA(1)<='B')||(input.LA(1)>='D' && input.LA(1)<='E')||input.LA(1)=='G'||input.LA(1)=='Q'||input.LA(1)=='S'||input.LA(1)=='W'||(input.LA(1)>='Z' && input.LA(1)<='^')||(input.LA(1)>='a' && input.LA(1)<='f')||(input.LA(1)>='n' && input.LA(1)<='p')||(input.LA(1)>='r' && input.LA(1)<='t')||(input.LA(1)>='w' && input.LA(1)<='x')||(input.LA(1)>='z' && input.LA(1)<='}') ) {
+                        input.consume();
+                    failed=false;
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return ;}
+                        MismatchedSetException mse =
+                            new MismatchedSetException(null,input);
+                        recover(mse);    throw mse;
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1031:9: UnicodeEscape
+                    {
+                    mUnicodeEscape(); if (failed) return ;
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1032:9: OctalEscape
+                    {
+                    mOctalEscape(); if (failed) return ;
+
+                    }
+                    break;
+
+            }
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EscapeSequence
+
+    // $ANTLR start OctalEscape
+    public final void mOctalEscape() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) )
+            int alt12=3;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0=='\\') ) {
+                int LA12_1 = input.LA(2);
+
+                if ( ((LA12_1>='0' && LA12_1<='3')) ) {
+                    int LA12_2 = input.LA(3);
+
+                    if ( ((LA12_2>='0' && LA12_2<='7')) ) {
+                        int LA12_4 = input.LA(4);
+
+                        if ( ((LA12_4>='0' && LA12_4<='7')) ) {
+                            alt12=1;
+                        }
+                        else {
+                            alt12=2;}
+                    }
+                    else {
+                        alt12=3;}
+                }
+                else if ( ((LA12_1>='4' && LA12_1<='7')) ) {
+                    int LA12_3 = input.LA(3);
+
+                    if ( ((LA12_3>='0' && LA12_3<='7')) ) {
+                        alt12=2;
+                    }
+                    else {
+                        alt12=3;}
+                }
+                else {
+                    if (backtracking>0) {failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("1035:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("1035:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 0, input);
+
+                throw nvae;
+            }
+            switch (alt12) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' )
+                    {
+                    match('\\'); if (failed) return ;
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:14: ( '0' .. '3' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:15: '0' .. '3'
+                    {
+                    matchRange('0','3'); if (failed) return ;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:25: ( '0' .. '7' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:26: '0' .. '7'
+                    {
+                    matchRange('0','7'); if (failed) return ;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:36: ( '0' .. '7' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1037:37: '0' .. '7'
+                    {
+                    matchRange('0','7'); if (failed) return ;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1038:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' )
+                    {
+                    match('\\'); if (failed) return ;
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1038:14: ( '0' .. '7' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1038:15: '0' .. '7'
+                    {
+                    matchRange('0','7'); if (failed) return ;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1038:25: ( '0' .. '7' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1038:26: '0' .. '7'
+                    {
+                    matchRange('0','7'); if (failed) return ;
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1039:9: '\\\\' ( '0' .. '7' )
+                    {
+                    match('\\'); if (failed) return ;
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1039:14: ( '0' .. '7' )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1039:15: '0' .. '7'
+                    {
+                    matchRange('0','7'); if (failed) return ;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        finally {
+        }
+    }
+    // $ANTLR end OctalEscape
+
+    // $ANTLR start UnicodeEscape
+    public final void mUnicodeEscape() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1044:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1044:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit
+            {
+            match('\\'); if (failed) return ;
+            match('u'); if (failed) return ;
+            mHexDigit(); if (failed) return ;
+            mHexDigit(); if (failed) return ;
+            mHexDigit(); if (failed) return ;
+            mHexDigit(); if (failed) return ;
+
+            }
+
+        }
+        finally {
+        }
+    }
+    // $ANTLR end UnicodeEscape
+
+    // $ANTLR start BOOL
+    public final void mBOOL() throws RecognitionException {
+        try {
+            int _type = BOOL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1048:2: ( ( 'true' | 'false' ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1048:4: ( 'true' | 'false' )
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1048:4: ( 'true' | 'false' )
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0=='t') ) {
+                alt13=1;
+            }
+            else if ( (LA13_0=='f') ) {
+                alt13=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("1048:4: ( 'true' | 'false' )", 13, 0, input);
+
+                throw nvae;
+            }
+            switch (alt13) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1048:5: 'true'
+                    {
+                    match("true"); if (failed) return ;
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1048:12: 'false'
+                    {
+                    match("false"); if (failed) return ;
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end BOOL
+
+    // $ANTLR start NULL
+    public final void mNULL() throws RecognitionException {
+        try {
+            int _type = NULL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1051:6: ( 'null' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1051:8: 'null'
+            {
+            match("null"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end NULL
+
+    // $ANTLR start THEN
+    public final void mTHEN() throws RecognitionException {
+        try {
+            int _type = THEN;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1055:2: ( 'then' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1055:4: 'then'
+            {
+            match("then"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end THEN
+
+    // $ANTLR start END
+    public final void mEND() throws RecognitionException {
+        try {
+            int _type = END;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1058:5: ( 'end' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1058:7: 'end'
+            {
+            match("end"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end END
+
+    // $ANTLR start GRAVE_ACCENT
+    public final void mGRAVE_ACCENT() throws RecognitionException {
+        try {
+            int _type = GRAVE_ACCENT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1062:2: ( '`' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1062:4: '`'
+            {
+            match('`'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end GRAVE_ACCENT
+
+    // $ANTLR start SEMICOLON
+    public final void mSEMICOLON() throws RecognitionException {
+        try {
+            int _type = SEMICOLON;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1066:2: ( ';' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1066:4: ';'
+            {
+            match(';'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end SEMICOLON
+
+    // $ANTLR start DOT_STAR
+    public final void mDOT_STAR() throws RecognitionException {
+        try {
+            int _type = DOT_STAR;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1070:2: ( '.*' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1070:4: '.*'
+            {
+            match(".*"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOT_STAR
+
+    // $ANTLR start COLON
+    public final void mCOLON() throws RecognitionException {
+        try {
+            int _type = COLON;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1074:2: ( ':' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1074:4: ':'
+            {
+            match(':'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end COLON
+
+    // $ANTLR start EQUAL
+    public final void mEQUAL() throws RecognitionException {
+        try {
+            int _type = EQUAL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1078:2: ( '==' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1078:4: '=='
+            {
+            match("=="); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EQUAL
+
+    // $ANTLR start NOT_EQUAL
+    public final void mNOT_EQUAL() throws RecognitionException {
+        try {
+            int _type = NOT_EQUAL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1082:2: ( '!=' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1082:4: '!='
+            {
+            match("!="); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end NOT_EQUAL
+
+    // $ANTLR start GREATER
+    public final void mGREATER() throws RecognitionException {
+        try {
+            int _type = GREATER;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1086:2: ( '>' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1086:4: '>'
+            {
+            match('>'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end GREATER
+
+    // $ANTLR start GREATER_EQUAL
+    public final void mGREATER_EQUAL() throws RecognitionException {
+        try {
+            int _type = GREATER_EQUAL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1090:2: ( '>=' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1090:4: '>='
+            {
+            match(">="); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end GREATER_EQUAL
+
+    // $ANTLR start LESS
+    public final void mLESS() throws RecognitionException {
+        try {
+            int _type = LESS;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1094:2: ( '<' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1094:4: '<'
+            {
+            match('<'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LESS
+
+    // $ANTLR start LESS_EQUAL
+    public final void mLESS_EQUAL() throws RecognitionException {
+        try {
+            int _type = LESS_EQUAL;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1098:2: ( '<=' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1098:4: '<='
+            {
+            match("<="); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LESS_EQUAL
+
+    // $ANTLR start ARROW
+    public final void mARROW() throws RecognitionException {
+        try {
+            int _type = ARROW;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1102:2: ( '->' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1102:4: '->'
+            {
+            match("->"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end ARROW
+
+    // $ANTLR start ID
+    public final void mID() throws RecognitionException {
+        try {
+            int _type = ID;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1106:2: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1106:4: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
+            {
+            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00FF') ) {
+                input.consume();
+            failed=false;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1106:50: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
+            loop14:
+            do {
+                int alt14=2;
+                int LA14_0 = input.LA(1);
+
+                if ( ((LA14_0>='0' && LA14_0<='9')||(LA14_0>='A' && LA14_0<='Z')||LA14_0=='_'||(LA14_0>='a' && LA14_0<='z')||(LA14_0>='\u00C0' && LA14_0<='\u00FF')) ) {
+                    alt14=1;
+                }
+
+
+                switch (alt14) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00FF') ) {
+            	        input.consume();
+            	    failed=false;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return ;}
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop14;
+                }
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end ID
+
+    // $ANTLR start LEFT_PAREN
+    public final void mLEFT_PAREN() throws RecognitionException {
+        try {
+            int _type = LEFT_PAREN;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:9: ( '(' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:11: '('
+            {
+            match('('); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LEFT_PAREN
+
+    // $ANTLR start RIGHT_PAREN
+    public final void mRIGHT_PAREN() throws RecognitionException {
+        try {
+            int _type = RIGHT_PAREN;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1114:9: ( ')' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1114:11: ')'
+            {
+            match(')'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RIGHT_PAREN
+
+    // $ANTLR start LEFT_SQUARE
+    public final void mLEFT_SQUARE() throws RecognitionException {
+        try {
+            int _type = LEFT_SQUARE;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1118:9: ( '[' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1118:11: '['
+            {
+            match('['); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LEFT_SQUARE
+
+    // $ANTLR start RIGHT_SQUARE
+    public final void mRIGHT_SQUARE() throws RecognitionException {
+        try {
+            int _type = RIGHT_SQUARE;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1122:9: ( ']' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1122:11: ']'
+            {
+            match(']'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RIGHT_SQUARE
+
+    // $ANTLR start LEFT_CURLY
+    public final void mLEFT_CURLY() throws RecognitionException {
+        try {
+            int _type = LEFT_CURLY;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1126:9: ( '{' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1126:11: '{'
+            {
+            match('{'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LEFT_CURLY
+
+    // $ANTLR start RIGHT_CURLY
+    public final void mRIGHT_CURLY() throws RecognitionException {
+        try {
+            int _type = RIGHT_CURLY;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1130:9: ( '}' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1130:11: '}'
+            {
+            match('}'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RIGHT_CURLY
+
+    // $ANTLR start COMMA
+    public final void mCOMMA() throws RecognitionException {
+        try {
+            int _type = COMMA;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1133:7: ( ',' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1133:9: ','
+            {
+            match(','); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end COMMA
+
+    // $ANTLR start DOT
+    public final void mDOT() throws RecognitionException {
+        try {
+            int _type = DOT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1136:5: ( '.' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1136:7: '.'
+            {
+            match('.'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOT
+
+    // $ANTLR start DOUBLE_AMPER
+    public final void mDOUBLE_AMPER() throws RecognitionException {
+        try {
+            int _type = DOUBLE_AMPER;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1140:2: ( '&&' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1140:4: '&&'
+            {
+            match("&&"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOUBLE_AMPER
+
+    // $ANTLR start DOUBLE_PIPE
+    public final void mDOUBLE_PIPE() throws RecognitionException {
+        try {
+            int _type = DOUBLE_PIPE;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1144:2: ( '||' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1144:4: '||'
+            {
+            match("||"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end DOUBLE_PIPE
+
+    // $ANTLR start SH_STYLE_SINGLE_LINE_COMMENT
+    public final void mSH_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
+        try {
+            int _type = SH_STYLE_SINGLE_LINE_COMMENT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1148:2: ( '#' ( options {greedy=false; } : . )* EOL )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1148:4: '#' ( options {greedy=false; } : . )* EOL
+            {
+            match('#'); if (failed) return ;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1148:8: ( options {greedy=false; } : . )*
+            loop15:
+            do {
+                int alt15=2;
+                int LA15_0 = input.LA(1);
+
+                if ( (LA15_0=='\r') ) {
+                    alt15=2;
+                }
+                else if ( (LA15_0=='\n') ) {
+                    alt15=2;
+                }
+                else if ( ((LA15_0>='\u0000' && LA15_0<='\t')||(LA15_0>='\u000B' && LA15_0<='\f')||(LA15_0>='\u000E' && LA15_0<='\uFFFE')) ) {
+                    alt15=1;
+                }
+
+
+                switch (alt15) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1148:35: .
+            	    {
+            	    matchAny(); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop15;
+                }
+            } while (true);
+
+            mEOL(); if (failed) return ;
+            if ( backtracking==0 ) {
+               channel=HIDDEN; setText("//"+getText().substring(1));
+            }
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end SH_STYLE_SINGLE_LINE_COMMENT
+
+    // $ANTLR start C_STYLE_SINGLE_LINE_COMMENT
+    public final void mC_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
+        try {
+            int _type = C_STYLE_SINGLE_LINE_COMMENT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1154:2: ( '//' ( options {greedy=false; } : . )* EOL )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1154:4: '//' ( options {greedy=false; } : . )* EOL
+            {
+            match("//"); if (failed) return ;
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1154:9: ( options {greedy=false; } : . )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( (LA16_0=='\r') ) {
+                    alt16=2;
+                }
+                else if ( (LA16_0=='\n') ) {
+                    alt16=2;
+                }
+                else if ( ((LA16_0>='\u0000' && LA16_0<='\t')||(LA16_0>='\u000B' && LA16_0<='\f')||(LA16_0>='\u000E' && LA16_0<='\uFFFE')) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1154:36: .
+            	    {
+            	    matchAny(); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+            mEOL(); if (failed) return ;
+            if ( backtracking==0 ) {
+               channel=HIDDEN; 
+            }
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end C_STYLE_SINGLE_LINE_COMMENT
+
+    // $ANTLR start MULTI_LINE_COMMENT
+    public final void mMULTI_LINE_COMMENT() throws RecognitionException {
+        try {
+            int _type = MULTI_LINE_COMMENT;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1159:2: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1159:4: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); if (failed) return ;
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1159:9: ( options {greedy=false; } : . )*
+            loop17:
+            do {
+                int alt17=2;
+                int LA17_0 = input.LA(1);
+
+                if ( (LA17_0=='*') ) {
+                    int LA17_1 = input.LA(2);
+
+                    if ( (LA17_1=='/') ) {
+                        alt17=2;
+                    }
+                    else if ( ((LA17_1>='\u0000' && LA17_1<='.')||(LA17_1>='0' && LA17_1<='\uFFFE')) ) {
+                        alt17=1;
+                    }
+
+
+                }
+                else if ( ((LA17_0>='\u0000' && LA17_0<=')')||(LA17_0>='+' && LA17_0<='\uFFFE')) ) {
+                    alt17=1;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1159:35: .
+            	    {
+            	    matchAny(); if (failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+            match("*/"); if (failed) return ;
+
+            if ( backtracking==0 ) {
+               channel=HIDDEN; 
+            }
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end MULTI_LINE_COMMENT
+
+    // $ANTLR start MISC
+    public final void mMISC() throws RecognitionException {
+        try {
+            int _type = MISC;
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1163:7: ( '!' | '@' | '$' | '%' | '^' | '*' | '_' | '-' | '+' | '?' | '=' | '/' | '\\'' | '\\\\' | '|' | '&' )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.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)>='^' && input.LA(1)<='_')||input.LA(1)=='|' ) {
+                input.consume();
+            failed=false;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end MISC
+
+    public void mTokens() throws RecognitionException {
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:8: ( WS | INT | FLOAT | STRING | BOOL | NULL | THEN | END | GRAVE_ACCENT | SEMICOLON | DOT_STAR | COLON | EQUAL | NOT_EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | ARROW | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC )
+        int alt18=34;
+        alt18 = dfa18.predict(input);
+        switch (alt18) {
+            case 1 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:10: WS
+                {
+                mWS(); if (failed) return ;
+
+                }
+                break;
+            case 2 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:13: INT
+                {
+                mINT(); if (failed) return ;
+
+                }
+                break;
+            case 3 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:17: FLOAT
+                {
+                mFLOAT(); if (failed) return ;
+
+                }
+                break;
+            case 4 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:23: STRING
+                {
+                mSTRING(); if (failed) return ;
+
+                }
+                break;
+            case 5 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:30: BOOL
+                {
+                mBOOL(); if (failed) return ;
+
+                }
+                break;
+            case 6 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:35: NULL
+                {
+                mNULL(); if (failed) return ;
+
+                }
+                break;
+            case 7 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:40: THEN
+                {
+                mTHEN(); if (failed) return ;
+
+                }
+                break;
+            case 8 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:45: END
+                {
+                mEND(); if (failed) return ;
+
+                }
+                break;
+            case 9 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:49: GRAVE_ACCENT
+                {
+                mGRAVE_ACCENT(); if (failed) return ;
+
+                }
+                break;
+            case 10 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:62: SEMICOLON
+                {
+                mSEMICOLON(); if (failed) return ;
+
+                }
+                break;
+            case 11 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:72: DOT_STAR
+                {
+                mDOT_STAR(); if (failed) return ;
+
+                }
+                break;
+            case 12 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:81: COLON
+                {
+                mCOLON(); if (failed) return ;
+
+                }
+                break;
+            case 13 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:87: EQUAL
+                {
+                mEQUAL(); if (failed) return ;
+
+                }
+                break;
+            case 14 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:93: NOT_EQUAL
+                {
+                mNOT_EQUAL(); if (failed) return ;
+
+                }
+                break;
+            case 15 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:103: GREATER
+                {
+                mGREATER(); if (failed) return ;
+
+                }
+                break;
+            case 16 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:111: GREATER_EQUAL
+                {
+                mGREATER_EQUAL(); if (failed) return ;
+
+                }
+                break;
+            case 17 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:125: LESS
+                {
+                mLESS(); if (failed) return ;
+
+                }
+                break;
+            case 18 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:130: LESS_EQUAL
+                {
+                mLESS_EQUAL(); if (failed) return ;
+
+                }
+                break;
+            case 19 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:141: ARROW
+                {
+                mARROW(); if (failed) return ;
+
+                }
+                break;
+            case 20 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:147: ID
+                {
+                mID(); if (failed) return ;
+
+                }
+                break;
+            case 21 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:150: LEFT_PAREN
+                {
+                mLEFT_PAREN(); if (failed) return ;
+
+                }
+                break;
+            case 22 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:161: RIGHT_PAREN
+                {
+                mRIGHT_PAREN(); if (failed) return ;
+
+                }
+                break;
+            case 23 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:173: LEFT_SQUARE
+                {
+                mLEFT_SQUARE(); if (failed) return ;
+
+                }
+                break;
+            case 24 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:185: RIGHT_SQUARE
+                {
+                mRIGHT_SQUARE(); if (failed) return ;
+
+                }
+                break;
+            case 25 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:198: LEFT_CURLY
+                {
+                mLEFT_CURLY(); if (failed) return ;
+
+                }
+                break;
+            case 26 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:209: RIGHT_CURLY
+                {
+                mRIGHT_CURLY(); if (failed) return ;
+
+                }
+                break;
+            case 27 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:221: COMMA
+                {
+                mCOMMA(); if (failed) return ;
+
+                }
+                break;
+            case 28 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:227: DOT
+                {
+                mDOT(); if (failed) return ;
+
+                }
+                break;
+            case 29 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:231: DOUBLE_AMPER
+                {
+                mDOUBLE_AMPER(); if (failed) return ;
+
+                }
+                break;
+            case 30 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:244: DOUBLE_PIPE
+                {
+                mDOUBLE_PIPE(); if (failed) return ;
+
+                }
+                break;
+            case 31 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:256: SH_STYLE_SINGLE_LINE_COMMENT
+                {
+                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 32 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:285: C_STYLE_SINGLE_LINE_COMMENT
+                {
+                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 33 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:313: MULTI_LINE_COMMENT
+                {
+                mMULTI_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 34 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:332: MISC
+                {
+                mMISC(); if (failed) return ;
+
+                }
+                break;
+
+        }
+
+    }
+
+    // $ANTLR start synpred1
+    public final void synpred1_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1003:14: ( '\\r\\n' )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1003:16: '\\r\\n'
+        {
+        match("\r\n"); if (failed) return ;
+
+
+        }
+    }
+    // $ANTLR end synpred1
+
+    public final boolean synpred1() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+
+
+    protected DFA18 dfa18 = new DFA18(this);
+    static final String DFA18_eotS =
+        "\2\uffff\1\37\1\41\1\uffff\1\37\4\36\2\uffff\1\51\1\uffff\2\37\1"+
+        "\55\1\57\10\uffff\2\37\1\uffff\1\37\5\uffff\5\36\14\uffff\4\36\1"+
+        "\75\1\76\1\77\1\36\1\101\3\uffff\1\77\1\uffff";
+    static final String DFA18_eofS =
+        "\102\uffff";
+    static final String DFA18_minS =
+        "\1\11\1\uffff\1\60\1\56\1\uffff\1\0\1\150\1\141\1\165\1\156\2\uffff"+
+        "\1\52\1\uffff\4\75\10\uffff\1\46\1\174\1\uffff\1\52\5\uffff\1\145"+
+        "\1\165\2\154\1\144\14\uffff\1\156\1\145\1\163\1\154\3\60\1\145\1"+
+        "\60\3\uffff\1\60\1\uffff";
+    static final String DFA18_maxS =
+        "\1\u00ff\1\uffff\1\76\1\71\1\uffff\1\ufffe\1\162\1\141\1\165\1\156"+
+        "\2\uffff\1\52\1\uffff\4\75\10\uffff\1\46\1\174\1\uffff\1\57\5\uffff"+
+        "\1\145\1\165\2\154\1\144\14\uffff\1\156\1\145\1\163\1\154\3\u00ff"+
+        "\1\145\1\u00ff\3\uffff\1\u00ff\1\uffff";
+    static final String DFA18_acceptS =
+        "\1\uffff\1\1\2\uffff\1\4\5\uffff\1\11\1\12\1\uffff\1\14\4\uffff"+
+        "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\2\uffff\1\37\1\uffff\1"+
+        "\24\1\42\1\23\1\2\1\3\5\uffff\1\13\1\34\1\15\1\16\1\20\1\17\1\22"+
+        "\1\21\1\35\1\36\1\40\1\41\11\uffff\1\10\1\7\1\5\1\uffff\1\6";
+    static final String DFA18_specialS =
+        "\102\uffff}>";
+    static final String[] DFA18_transitionS = {
+            "\2\1\1\uffff\2\1\22\uffff\1\1\1\17\1\4\1\34\1\22\1\37\1\32\1"+
+            "\5\1\23\1\24\2\37\1\31\1\2\1\14\1\35\12\3\1\15\1\13\1\21\1\16"+
+            "\1\20\2\37\32\36\1\25\1\37\1\26\1\37\1\22\1\12\4\36\1\11\1\7"+
+            "\7\36\1\10\5\36\1\6\6\36\1\27\1\33\1\30\102\uffff\100\36",
+            "",
+            "\12\3\4\uffff\1\40",
+            "\1\42\1\uffff\12\3",
+            "",
+            "\uffff\4",
+            "\1\43\11\uffff\1\44",
+            "\1\45",
+            "\1\46",
+            "\1\47",
+            "",
+            "",
+            "\1\50",
+            "",
+            "\1\52",
+            "\1\53",
+            "\1\54",
+            "\1\56",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\60",
+            "\1\61",
+            "",
+            "\1\63\4\uffff\1\62",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\64",
+            "\1\65",
+            "\1\66",
+            "\1\67",
+            "\1\70",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\71",
+            "\1\72",
+            "\1\73",
+            "\1\74",
+            "\12\36\7\uffff\32\36\4\uffff\1\36\1\uffff\32\36\105\uffff\100"+
+            "\36",
+            "\12\36\7\uffff\32\36\4\uffff\1\36\1\uffff\32\36\105\uffff\100"+
+            "\36",
+            "\12\36\7\uffff\32\36\4\uffff\1\36\1\uffff\32\36\105\uffff\100"+
+            "\36",
+            "\1\100",
+            "\12\36\7\uffff\32\36\4\uffff\1\36\1\uffff\32\36\105\uffff\100"+
+            "\36",
+            "",
+            "",
+            "",
+            "\12\36\7\uffff\32\36\4\uffff\1\36\1\uffff\32\36\105\uffff\100"+
+            "\36",
+            ""
+    };
+
+    static final short[] DFA18_eot = DFA.unpackEncodedString(DFA18_eotS);
+    static final short[] DFA18_eof = DFA.unpackEncodedString(DFA18_eofS);
+    static final char[] DFA18_min = DFA.unpackEncodedStringToUnsignedChars(DFA18_minS);
+    static final char[] DFA18_max = DFA.unpackEncodedStringToUnsignedChars(DFA18_maxS);
+    static final short[] DFA18_accept = DFA.unpackEncodedString(DFA18_acceptS);
+    static final short[] DFA18_special = DFA.unpackEncodedString(DFA18_specialS);
+    static final short[][] DFA18_transition;
+
+    static {
+        int numStates = DFA18_transitionS.length;
+        DFA18_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA18_transition[i] = DFA.unpackEncodedString(DFA18_transitionS[i]);
+        }
+    }
+
+    class DFA18 extends DFA {
+
+        public DFA18(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 18;
+            this.eot = DFA18_eot;
+            this.eof = DFA18_eof;
+            this.min = DFA18_min;
+            this.max = DFA18_max;
+            this.accept = DFA18_accept;
+            this.special = DFA18_special;
+            this.transition = DFA18_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( WS | INT | FLOAT | STRING | BOOL | NULL | THEN | END | GRAVE_ACCENT | SEMICOLON | DOT_STAR | COLON | EQUAL | NOT_EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | ARROW | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC );";
+        }
+    }
+ 
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,10146 +0,0 @@
-// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2008-05-25 14:31:55
-
-	package org.drools.lang;
-	import java.util.List;
-	import java.util.ArrayList;
-	import java.util.Iterator;
-	import java.util.HashMap;	
-	import java.util.StringTokenizer;
-	import org.drools.lang.descr.*;
-
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-public class DRLParser extends Parser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "PACKAGE", "IMPORT", "FUNCTION", "ID", "DOT", "GLOBAL", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "DECLARE", "END", "AT", "COLON", "EQUALS", "QUERY", "TEMPLATE", "RULE", "WHEN", "ATTRIBUTES", "DATE_EFFECTIVE", "STRING", "DATE_EXPIRES", "ENABLED", "BOOL", "SALIENCE", "INT", "NO_LOOP", "AUTO_FOCUS", "ACTIVATION_GROUP", "RULEFLOW_GROUP", "AGENDA_GROUP", "DURATION", "DIALECT", "LOCK_ON_ACTIVE", "OR", "DOUBLE_PIPE", "AND", "DOUBLE_AMPER", "OVER", "WINDOW", "FROM", "EXISTS", "NOT", "EVAL", "FORALL", "ACCUMULATE", "INIT", "ACTION", "REVERSE", "RESULT", "COLLECT", "ENTRY_POINT", "LEFT_SQUARE", "RIGHT_SQUARE", "CONTAINS", "EXCLUDES", "MATCHES", "SOUNDSLIKE", "MEMBEROF", "TILDE", "IN", "FLOAT", "NULL", "LEFT_CURLY", "RIGHT_CURLY", "THEN", "EVENT", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT", "MISC", "';'", "'.*'", "'->'", "'=='!
 ", "'>'", "'>='", "'<'", "'<='", "'!='"
-    };
-    public static final int EXISTS=45;
-    public static final int COMMA=11;
-    public static final int AUTO_FOCUS=31;
-    public static final int END=14;
-    public static final int HexDigit=74;
-    public static final int FORALL=48;
-    public static final int TEMPLATE=19;
-    public static final int MISC=80;
-    public static final int FLOAT=65;
-    public static final int QUERY=18;
-    public static final int THEN=69;
-    public static final int RULE=20;
-    public static final int INIT=50;
-    public static final int TILDE=63;
-    public static final int IMPORT=5;
-    public static final int PACKAGE=4;
-    public static final int DATE_EFFECTIVE=23;
-    public static final int OR=38;
-    public static final int DOT=8;
-    public static final int DOUBLE_PIPE=39;
-    public static final int AND=40;
-    public static final int FUNCTION=6;
-    public static final int GLOBAL=9;
-    public static final int EscapeSequence=73;
-    public static final int DIALECT=36;
-    public static final int INT=29;
-    public static final int LOCK_ON_ACTIVE=37;
-    public static final int DATE_EXPIRES=25;
-    public static final int LEFT_SQUARE=56;
-    public static final int CONTAINS=58;
-    public static final int SH_STYLE_SINGLE_LINE_COMMENT=77;
-    public static final int ATTRIBUTES=22;
-    public static final int EVENT=70;
-    public static final int DECLARE=13;
-    public static final int LEFT_CURLY=67;
-    public static final int RESULT=53;
-    public static final int AT=15;
-    public static final int FROM=44;
-    public static final int ID=7;
-    public static final int LEFT_PAREN=10;
-    public static final int ACTIVATION_GROUP=32;
-    public static final int DOUBLE_AMPER=41;
-    public static final int RIGHT_CURLY=68;
-    public static final int SOUNDSLIKE=61;
-    public static final int EXCLUDES=59;
-    public static final int BOOL=27;
-    public static final int MEMBEROF=62;
-    public static final int WHEN=21;
-    public static final int RULEFLOW_GROUP=33;
-    public static final int WS=72;
-    public static final int OVER=42;
-    public static final int STRING=24;
-    public static final int ACTION=51;
-    public static final int WINDOW=43;
-    public static final int COLLECT=54;
-    public static final int IN=64;
-    public static final int REVERSE=52;
-    public static final int ACCUMULATE=49;
-    public static final int EQUALS=17;
-    public static final int NO_LOOP=30;
-    public static final int UnicodeEscape=75;
-    public static final int DURATION=35;
-    public static final int EVAL=47;
-    public static final int MATCHES=60;
-    public static final int EOF=-1;
-    public static final int EOL=71;
-    public static final int NULL=66;
-    public static final int AGENDA_GROUP=34;
-    public static final int COLON=16;
-    public static final int OctalEscape=76;
-    public static final int SALIENCE=28;
-    public static final int MULTI_LINE_COMMENT=79;
-    public static final int NOT=46;
-    public static final int RIGHT_PAREN=12;
-    public static final int ENABLED=26;
-    public static final int RIGHT_SQUARE=57;
-    public static final int C_STYLE_SINGLE_LINE_COMMENT=78;
-    public static final int ENTRY_POINT=55;
-
-        public DRLParser(TokenStream input) {
-            super(input);
-            ruleMemo = new HashMap[90+1];
-         }
-        
-
-    public String[] getTokenNames() { return tokenNames; }
-    public String getGrammarFileName() { return "/home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g"; }
-
-
-    	private PackageDescr packageDescr;
-    	private List errors = new ArrayList();
-    	private String source = "unknown";
-    	private int lineOffset = 0;
-    	private DescrFactory factory = new DescrFactory();
-    	private boolean parserDebug = false;
-    	private Location location = new Location( Location.LOCATION_UNKNOWN );
-    	
-    	// THE FOLLOWING LINES ARE DUMMY ATTRIBUTES TO WORK AROUND AN ANTLR BUG
-    	private BaseDescr from = null;
-    	private FieldConstraintDescr fc = null;
-    	private RestrictionConnectiveDescr and = null;
-    	private RestrictionConnectiveDescr or = null;
-    	private ConditionalElementDescr base = null;
-    	
-    	public void setParserDebug(boolean parserDebug) {
-    		this.parserDebug = parserDebug;
-    	}
-    	
-    	public void debug(String message) {
-    		if ( parserDebug ) 
-    			System.err.println( "drl parser: " + message );
-    	}
-    	
-    	public void setSource(String source) {
-    		this.source = source;
-    	}
-    	public DescrFactory getFactory() {
-    		return factory;
-    	}	
-
-    	public String getSource() {
-    		return this.source;
-    	}
-    	
-    	public PackageDescr getPackageDescr() {
-    		return packageDescr;
-    	}
-    	
-    	private int offset(int line) {
-    		return line + lineOffset;
-    	}
-    	
-    	/**
-    	 * This will set the offset to record when reparsing. Normally is zero of course 
-    	 */
-    	public void setLineOffset(int i) {
-    	 	this.lineOffset = i;
-    	}
-    	
-    	private String getString(String token) {
-    		return safeSubstring( token, 1, token.length() -1 );
-    	}
-    	
-    	private String cleanupSpaces( String input ) {
-                    return input.replaceAll( "\\s", "" );
-            }
-    	
-    	
-    	public void reportError(RecognitionException ex) {
-    	        // if we've already reported an error and have not matched a token
-                    // yet successfully, don't report any errors.
-                    if ( errorRecovery ) {
-                            return;
-                    }
-                    errorRecovery = true;
-
-    		ex.line = offset(ex.line); //add the offset if there is one
-    		errors.add( ex ); 
-    	}
-         	
-         	/** return the raw RecognitionException errors */
-         	public List getErrors() {
-         		return errors;
-         	}
-         	
-         	/** Return a list of pretty strings summarising the errors */
-         	public List getErrorMessages() {
-         		List messages = new ArrayList();
-     		for ( Iterator errorIter = errors.iterator() ; errorIter.hasNext() ; ) {
-         	     		messages.add( createErrorMessage( (RecognitionException) errorIter.next() ) );
-         	     	}
-         	     	return messages;
-         	}
-         	
-         	/** return true if any parser errors were accumulated */
-         	public boolean hasErrors() {
-      		return ! errors.isEmpty();
-         	}
-         	
-         	/** This will take a RecognitionException, and create a sensible error message out of it */
-         	public String createErrorMessage(RecognitionException e)
-            {
-    		StringBuffer message = new StringBuffer();		
-                    message.append( source + ":"+e.line+":"+e.charPositionInLine+" ");
-                    if ( e instanceof MismatchedTokenException ) {
-                            MismatchedTokenException mte = (MismatchedTokenException)e;
-                            if( mte.expecting >=0 && mte.expecting < tokenNames.length ) {
-    	                        message.append("mismatched token: "+
-                                                               e.token+
-                                                               "; expecting type "+
-                                                               tokenNames[mte.expecting]);
-                            } else {
-    	                        message.append("mismatched token: "+
-                                                               e.token+
-                                                               ";");
-                            }
-                    }
-                    else if ( e instanceof MismatchedTreeNodeException ) {
-                            MismatchedTreeNodeException mtne = (MismatchedTreeNodeException)e;
-                            if( mtne.expecting >=0 && mtne.expecting < tokenNames.length ) {
-    	                        message.append("mismatched tree node: "+
-                                                               mtne.toString() +
-                                                               "; expecting type "+
-                                                               tokenNames[mtne.expecting]);
-                            } else {
-    	                        message.append("mismatched tree node: "+
-                                                               mtne.toString() +
-                                                               ";");
-                            }
-                    }
-                    else if ( e instanceof NoViableAltException ) {
-                            NoViableAltException nvae = (NoViableAltException)e;
-    			message.append( "Unexpected token '" + e.token.getText() + "'" );
-                            /*
-                            message.append("decision=<<"+nvae.grammarDecisionDescription+">>"+
-                                                               " state "+nvae.stateNumber+
-                                                               " (decision="+nvae.decisionNumber+
-                                                               ") no viable alt; token="+
-                                                               e.token);
-                                                               */
-                    }
-                    else if ( e instanceof EarlyExitException ) {
-                            EarlyExitException eee = (EarlyExitException)e;
-                            message.append("required (...)+ loop (decision="+
-                                                               eee.decisionNumber+
-                                                               ") did not match anything; token="+
-                                                               e.token);
-                    }
-                    else if ( e instanceof MismatchedSetException ) {
-                            MismatchedSetException mse = (MismatchedSetException)e;
-                            message.append("mismatched token '"+
-                                                               e.token+
-                                                               "' expecting set "+mse.expecting);
-                    }
-                    else if ( e instanceof MismatchedNotSetException ) {
-                            MismatchedNotSetException mse = (MismatchedNotSetException)e;
-                            message.append("mismatched token '"+
-                                                               e.token+
-                                                               "' expecting set "+mse.expecting);
-                    }
-                    else if ( e instanceof FailedPredicateException ) {
-                            FailedPredicateException fpe = (FailedPredicateException)e;
-                            message.append("rule "+fpe.ruleName+" failed predicate: {"+
-                                                               fpe.predicateText+"}?");
-                    } else if (e instanceof GeneralParseException) {
-    			message.append(" " + e.getMessage());
-    		}
-                   	return message.toString();
-            }   
-            
-            void checkTrailingSemicolon(String text, int line) {
-            	if (text.trim().endsWith( ";" ) ) {
-            		this.errors.add( new GeneralParseException( "Trailing semi-colon not allowed", offset(line) ) );
-            	}
-            }
-            
-            public Location getLocation() {
-                    return this.location;
-            }
-            
-            private String safeSubstring( String text, int start, int end ) {
-                	return text.substring( Math.min( start, text.length() ), Math.min( Math.max( start, end ), text.length() ) );
-            }
-          
-
-
-
-    // $ANTLR start opt_semicolon
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:195:1: opt_semicolon : ( ';' )? ;
-    public final void opt_semicolon() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:196:2: ( ( ';' )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:196:4: ( ';' )?
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:196:4: ( ';' )?
-            int alt1=2;
-            int LA1_0 = input.LA(1);
-
-            if ( (LA1_0==81) ) {
-                alt1=1;
-            }
-            switch (alt1) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:196:4: ';'
-                    {
-                    match(input,81,FOLLOW_81_in_opt_semicolon39); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end opt_semicolon
-
-
-    // $ANTLR start compilation_unit
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:199:1: compilation_unit : prolog ( statement )* EOF ;
-    public final void compilation_unit() throws RecognitionException {
-
-        		// reset Location information
-        		this.location = new Location( Location.LOCATION_UNKNOWN );
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:204:2: ( prolog ( statement )* EOF )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:204:4: prolog ( statement )* EOF
-            {
-            pushFollow(FOLLOW_prolog_in_compilation_unit57);
-            prolog();
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:205:3: ( statement )*
-            loop2:
-            do {
-                int alt2=2;
-                int LA2_0 = input.LA(1);
-
-                if ( ((LA2_0>=IMPORT && LA2_0<=FUNCTION)||LA2_0==GLOBAL||LA2_0==DECLARE||(LA2_0>=QUERY && LA2_0<=RULE)||LA2_0==DATE_EFFECTIVE||(LA2_0>=DATE_EXPIRES && LA2_0<=ENABLED)||LA2_0==SALIENCE||(LA2_0>=NO_LOOP && LA2_0<=LOCK_ON_ACTIVE)) ) {
-                    alt2=1;
-                }
-
-
-                switch (alt2) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:205:3: statement
-            	    {
-            	    pushFollow(FOLLOW_statement_in_compilation_unit62);
-            	    statement();
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop2;
-                }
-            } while (true);
-
-            match(input,EOF,FOLLOW_EOF_in_compilation_unit67); if (failed) return ;
-
-            }
-
-        }
-        catch ( RecognitionException e ) {
-
-            		reportError( e );
-            	
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end compilation_unit
-
-
-    // $ANTLR start prolog
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:212:1: prolog : (pkgstmt= package_statement )? ;
-    public final void prolog() throws RecognitionException {
-        String pkgstmt = null;
-
-
-
-        		String packageName = "";
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:216:2: ( (pkgstmt= package_statement )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:216:4: (pkgstmt= package_statement )?
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:216:4: (pkgstmt= package_statement )?
-            int alt3=2;
-            int LA3_0 = input.LA(1);
-
-            if ( (LA3_0==PACKAGE) ) {
-                alt3=1;
-            }
-            switch (alt3) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:216:6: pkgstmt= package_statement
-                    {
-                    pushFollow(FOLLOW_package_statement_in_prolog96);
-                    pkgstmt=package_statement();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       packageName = pkgstmt; 
-                    }
-
-                    }
-                    break;
-
-            }
-
-            if ( backtracking==0 ) {
-               
-              			this.packageDescr = factory.createPackage( packageName ); 
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end prolog
-
-
-    // $ANTLR start statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query | d= type_declaration );
-    public final void statement() throws RecognitionException {
-        AttributeDescr a = null;
-
-        FactTemplateDescr t = null;
-
-        RuleDescr r = null;
-
-        QueryDescr q = null;
-
-        TypeDeclarationDescr d = null;
-
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:224:2: (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query | d= type_declaration )
-            int alt4=9;
-            switch ( input.LA(1) ) {
-            case DATE_EFFECTIVE:
-            case DATE_EXPIRES:
-            case ENABLED:
-            case SALIENCE:
-            case NO_LOOP:
-            case AUTO_FOCUS:
-            case ACTIVATION_GROUP:
-            case RULEFLOW_GROUP:
-            case AGENDA_GROUP:
-            case DURATION:
-            case DIALECT:
-            case LOCK_ON_ACTIVE:
-                {
-                alt4=1;
-                }
-                break;
-            case IMPORT:
-                {
-                int LA4_2 = input.LA(2);
-
-                if ( (LA4_2==FUNCTION) ) {
-                    alt4=2;
-                }
-                else if ( (LA4_2==ID) ) {
-                    alt4=3;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query | d= type_declaration );", 4, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case GLOBAL:
-                {
-                alt4=4;
-                }
-                break;
-            case FUNCTION:
-                {
-                alt4=5;
-                }
-                break;
-            case TEMPLATE:
-                {
-                alt4=6;
-                }
-                break;
-            case RULE:
-                {
-                alt4=7;
-                }
-                break;
-            case QUERY:
-                {
-                alt4=8;
-                }
-                break;
-            case DECLARE:
-                {
-                alt4=9;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query | d= type_declaration );", 4, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt4) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:224:4: a= rule_attribute
-                    {
-                    pushFollow(FOLLOW_rule_attribute_in_statement121);
-                    a=rule_attribute();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       this.packageDescr.addAttribute( a ); 
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:225:4: function_import_statement
-                    {
-                    pushFollow(FOLLOW_function_import_statement_in_statement128);
-                    function_import_statement();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:226:4: import_statement
-                    {
-                    pushFollow(FOLLOW_import_statement_in_statement134);
-                    import_statement();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:227:4: global
-                    {
-                    pushFollow(FOLLOW_global_in_statement140);
-                    global();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:228:4: function
-                    {
-                    pushFollow(FOLLOW_function_in_statement146);
-                    function();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:229:10: t= template
-                    {
-                    pushFollow(FOLLOW_template_in_statement160);
-                    t=template();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       this.packageDescr.addFactTemplate( t ); 
-                    }
-
-                    }
-                    break;
-                case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:230:4: r= rule
-                    {
-                    pushFollow(FOLLOW_rule_in_statement169);
-                    r=rule();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       this.packageDescr.addRule( r ); 
-                    }
-
-                    }
-                    break;
-                case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:231:4: q= query
-                    {
-                    pushFollow(FOLLOW_query_in_statement181);
-                    q=query();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       this.packageDescr.addRule( q ); 
-                    }
-
-                    }
-                    break;
-                case 9 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:232:10: d= type_declaration
-                    {
-                    pushFollow(FOLLOW_type_declaration_in_statement196);
-                    d=type_declaration();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-                       this.packageDescr.addTypeDeclaration( d ); 
-                    }
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end statement
-
-
-    // $ANTLR start package_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:235:1: package_statement returns [String packageName] : PACKAGE n= dotted_name opt_semicolon ;
-    public final String package_statement() throws RecognitionException {
-        String packageName = null;
-
-        String n = null;
-
-
-
-        		packageName = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:239:2: ( PACKAGE n= dotted_name opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:240:3: PACKAGE n= dotted_name opt_semicolon
-            {
-            match(input,PACKAGE,FOLLOW_PACKAGE_in_package_statement222); if (failed) return packageName;
-            pushFollow(FOLLOW_dotted_name_in_package_statement226);
-            n=dotted_name();
-            _fsp--;
-            if (failed) return packageName;
-            pushFollow(FOLLOW_opt_semicolon_in_package_statement228);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return packageName;
-            if ( backtracking==0 ) {
-
-              			packageName = n;
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return packageName;
-    }
-    // $ANTLR end package_statement
-
-
-    // $ANTLR start import_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:248:1: import_statement : IMPORT import_name[importDecl] opt_semicolon ;
-    public final void import_statement() throws RecognitionException {
-        Token IMPORT1=null;
-
-
-                	ImportDescr importDecl = null;
-                
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:252:2: ( IMPORT import_name[importDecl] opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:252:4: IMPORT import_name[importDecl] opt_semicolon
-            {
-            IMPORT1=(Token)input.LT(1);
-            match(input,IMPORT,FOLLOW_IMPORT_in_import_statement259); if (failed) return ;
-            if ( backtracking==0 ) {
-
-              	            importDecl = factory.createImport( );
-              	            importDecl.setStartCharacter( ((CommonToken)IMPORT1).getStartIndex() );
-              		    if (packageDescr != null) {
-              			packageDescr.addImport( importDecl );
-              		    }
-              	        
-            }
-            pushFollow(FOLLOW_import_name_in_import_statement282);
-            import_name(importDecl);
-            _fsp--;
-            if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_import_statement285);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end import_statement
-
-
-    // $ANTLR start function_import_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:263:1: function_import_statement : IMPORT FUNCTION import_name[importDecl] opt_semicolon ;
-    public final void function_import_statement() throws RecognitionException {
-        Token IMPORT2=null;
-
-
-                	FunctionImportDescr importDecl = null;
-                
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:267:2: ( IMPORT FUNCTION import_name[importDecl] opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:267:4: IMPORT FUNCTION import_name[importDecl] opt_semicolon
-            {
-            IMPORT2=(Token)input.LT(1);
-            match(input,IMPORT,FOLLOW_IMPORT_in_function_import_statement309); if (failed) return ;
-            match(input,FUNCTION,FOLLOW_FUNCTION_in_function_import_statement311); if (failed) return ;
-            if ( backtracking==0 ) {
-
-              	            importDecl = factory.createFunctionImport();
-              	            importDecl.setStartCharacter( ((CommonToken)IMPORT2).getStartIndex() );
-              		    if (packageDescr != null) {
-              			packageDescr.addFunctionImport( importDecl );
-              		    }
-              	        
-            }
-            pushFollow(FOLLOW_import_name_in_function_import_statement334);
-            import_name(importDecl);
-            _fsp--;
-            if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_function_import_statement337);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end function_import_statement
-
-
-    // $ANTLR start import_name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:278:1: import_name[ImportDescr importDecl] returns [String name] : ID ( DOT id= identifier )* (star= '.*' )? ;
-    public final String import_name(ImportDescr importDecl) throws RecognitionException {
-        String name = null;
-
-        Token star=null;
-        Token ID3=null;
-        Token DOT4=null;
-        identifier_return id = null;
-
-
-
-        		name = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:282:2: ( ID ( DOT id= identifier )* (star= '.*' )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:283:3: ID ( DOT id= identifier )* (star= '.*' )?
-            {
-            ID3=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_import_name362); if (failed) return name;
-            if ( backtracking==0 ) {
-               
-              		    name =ID3.getText(); 
-              		    importDecl.setTarget( name );
-              		    importDecl.setEndCharacter( ((CommonToken)ID3).getStopIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:289:3: ( DOT id= identifier )*
-            loop5:
-            do {
-                int alt5=2;
-                int LA5_0 = input.LA(1);
-
-                if ( (LA5_0==DOT) ) {
-                    alt5=1;
-                }
-
-
-                switch (alt5) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:289:5: DOT id= identifier
-            	    {
-            	    DOT4=(Token)input.LT(1);
-            	    match(input,DOT,FOLLOW_DOT_in_import_name374); if (failed) return name;
-            	    pushFollow(FOLLOW_identifier_in_import_name378);
-            	    id=identifier();
-            	    _fsp--;
-            	    if (failed) return name;
-            	    if ( backtracking==0 ) {
-            	       
-            	      		        name = name + DOT4.getText() + input.toString(id.start,id.stop); 
-            	      			importDecl.setTarget( name );
-            	      		        importDecl.setEndCharacter( ((CommonToken)((Token)id.start)).getStopIndex() );
-            	      		    
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop5;
-                }
-            } while (true);
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:296:3: (star= '.*' )?
-            int alt6=2;
-            int LA6_0 = input.LA(1);
-
-            if ( (LA6_0==82) ) {
-                alt6=1;
-            }
-            switch (alt6) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:296:5: star= '.*'
-                    {
-                    star=(Token)input.LT(1);
-                    match(input,82,FOLLOW_82_in_import_name402); if (failed) return name;
-                    if ( backtracking==0 ) {
-                       
-                      		        name = name + star.getText(); 
-                      			importDecl.setTarget( name );
-                      		        importDecl.setEndCharacter( ((CommonToken)star).getStopIndex() );
-                      		    
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return name;
-    }
-    // $ANTLR end import_name
-
-
-    // $ANTLR start global
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:306:1: global : GLOBAL type= dotted_name id= identifier opt_semicolon ;
-    public final void global() throws RecognitionException {
-        Token GLOBAL5=null;
-        String type = null;
-
-        identifier_return id = null;
-
-
-
-        	    GlobalDescr global = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:310:2: ( GLOBAL type= dotted_name id= identifier opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:311:3: GLOBAL type= dotted_name id= identifier opt_semicolon
-            {
-            GLOBAL5=(Token)input.LT(1);
-            match(input,GLOBAL,FOLLOW_GLOBAL_in_global436); if (failed) return ;
-            if ( backtracking==0 ) {
-
-              		    global = factory.createGlobal();
-              	            global.setStartCharacter( ((CommonToken)GLOBAL5).getStartIndex() );
-              		    packageDescr.addGlobal( global );
-              		
-            }
-            pushFollow(FOLLOW_dotted_name_in_global447);
-            type=dotted_name();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              		    global.setType( type );
-              		
-            }
-            pushFollow(FOLLOW_identifier_in_global458);
-            id=identifier();
-            _fsp--;
-            if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_global460);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              		    global.setIdentifier( input.toString(id.start,id.stop) );
-              		    global.setEndCharacter( ((CommonToken)((Token)id.start)).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end global
-
-
-    // $ANTLR start function
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:329:1: function : FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk ;
-    public final void function() throws RecognitionException {
-        Token FUNCTION6=null;
-        String retType = null;
-
-        identifier_return id = null;
-
-        String paramType = null;
-
-        String paramName = null;
-
-        curly_chunk_return body = null;
-
-
-
-        		FunctionDescr f = null;
-        		String type = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:334:2: ( FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:335:3: FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk
-            {
-            FUNCTION6=(Token)input.LT(1);
-            match(input,FUNCTION,FOLLOW_FUNCTION_in_function485); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:335:19: (retType= dotted_name )?
-            int alt7=2;
-            int LA7_0 = input.LA(1);
-
-            if ( ((LA7_0>=PACKAGE && LA7_0<=ID)||LA7_0==GLOBAL||LA7_0==END||(LA7_0>=QUERY && LA7_0<=ATTRIBUTES)||LA7_0==ENABLED||LA7_0==SALIENCE||(LA7_0>=DURATION && LA7_0<=DIALECT)||LA7_0==FROM||(LA7_0>=INIT && LA7_0<=RESULT)||LA7_0==IN||(LA7_0>=THEN && LA7_0<=EVENT)) ) {
-                int LA7_1 = input.LA(2);
-
-                if ( ((LA7_1>=PACKAGE && LA7_1<=GLOBAL)||LA7_1==END||(LA7_1>=QUERY && LA7_1<=ATTRIBUTES)||LA7_1==ENABLED||LA7_1==SALIENCE||(LA7_1>=DURATION && LA7_1<=DIALECT)||LA7_1==FROM||(LA7_1>=INIT && LA7_1<=RESULT)||LA7_1==LEFT_SQUARE||LA7_1==IN||(LA7_1>=THEN && LA7_1<=EVENT)) ) {
-                    alt7=1;
-                }
-            }
-            switch (alt7) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:335:19: retType= dotted_name
-                    {
-                    pushFollow(FOLLOW_dotted_name_in_function489);
-                    retType=dotted_name();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            pushFollow(FOLLOW_identifier_in_function494);
-            id=identifier();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              			//System.err.println( "function :: " + n.getText() );
-              			type = retType != null ? retType : null;
-              			f = factory.createFunction( input.toString(id.start,id.stop), type );
-              			f.setLocation(offset(FUNCTION6.getLine()), FUNCTION6.getCharPositionInLine());
-              	        	f.setStartCharacter( ((CommonToken)FUNCTION6).getStartIndex() );
-              			packageDescr.addFunction( f );
-              		
-            }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_function503); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:4: ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )?
-            int alt11=2;
-            int LA11_0 = input.LA(1);
-
-            if ( ((LA11_0>=PACKAGE && LA11_0<=ID)||LA11_0==GLOBAL||LA11_0==END||(LA11_0>=QUERY && LA11_0<=ATTRIBUTES)||LA11_0==ENABLED||LA11_0==SALIENCE||(LA11_0>=DURATION && LA11_0<=DIALECT)||LA11_0==FROM||(LA11_0>=INIT && LA11_0<=RESULT)||LA11_0==IN||(LA11_0>=THEN && LA11_0<=EVENT)) ) {
-                alt11=1;
-            }
-            switch (alt11) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:6: (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )*
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:15: (paramType= dotted_name )?
-                    int alt8=2;
-                    alt8 = dfa8.predict(input);
-                    switch (alt8) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:15: paramType= dotted_name
-                            {
-                            pushFollow(FOLLOW_dotted_name_in_function512);
-                            paramType=dotted_name();
-                            _fsp--;
-                            if (failed) return ;
-
-                            }
-                            break;
-
-                    }
-
-                    pushFollow(FOLLOW_argument_in_function517);
-                    paramName=argument();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      					type = paramType != null ? paramType : null;
-                      					f.addParameter( type, paramName );
-                      				
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:5: ( COMMA (paramType= dotted_name )? paramName= argument )*
-                    loop10:
-                    do {
-                        int alt10=2;
-                        int LA10_0 = input.LA(1);
-
-                        if ( (LA10_0==COMMA) ) {
-                            alt10=1;
-                        }
-
-
-                        switch (alt10) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:7: COMMA (paramType= dotted_name )? paramName= argument
-                    	    {
-                    	    match(input,COMMA,FOLLOW_COMMA_in_function531); if (failed) return ;
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:22: (paramType= dotted_name )?
-                    	    int alt9=2;
-                    	    alt9 = dfa9.predict(input);
-                    	    switch (alt9) {
-                    	        case 1 :
-                    	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:22: paramType= dotted_name
-                    	            {
-                    	            pushFollow(FOLLOW_dotted_name_in_function535);
-                    	            paramType=dotted_name();
-                    	            _fsp--;
-                    	            if (failed) return ;
-
-                    	            }
-                    	            break;
-
-                    	    }
-
-                    	    pushFollow(FOLLOW_argument_in_function540);
-                    	    paramName=argument();
-                    	    _fsp--;
-                    	    if (failed) return ;
-                    	    if ( backtracking==0 ) {
-
-                    	      						type = paramType != null ? paramType : null;
-                    	      						f.addParameter( type, paramName );
-                    	      					
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop10;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_function564); if (failed) return ;
-            pushFollow(FOLLOW_curly_chunk_in_function570);
-            body=curly_chunk();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              			//strip out '{','}'
-              			f.setText( safeSubstring( input.toString(body.start,body.stop), 1, input.toString(body.start,body.stop).length()-1 ) );
-              			f.setEndCharacter( ((CommonToken)((Token)body.stop)).getStopIndex() );
-              			f.setEndLocation(offset(((Token)body.stop).getLine()), ((Token)body.stop).getCharPositionInLine());
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end function
-
-
-    // $ANTLR start argument
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:367:1: argument returns [String name] : id= identifier ( '[' ']' )* ;
-    public final String argument() throws RecognitionException {
-        String name = null;
-
-        identifier_return id = null;
-
-
-
-        		name = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:2: (id= identifier ( '[' ']' )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:4: id= identifier ( '[' ']' )*
-            {
-            pushFollow(FOLLOW_identifier_in_argument597);
-            id=identifier();
-            _fsp--;
-            if (failed) return name;
-            if ( backtracking==0 ) {
-               name =input.toString(id.start,id.stop); 
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:38: ( '[' ']' )*
-            loop12:
-            do {
-                int alt12=2;
-                int LA12_0 = input.LA(1);
-
-                if ( (LA12_0==LEFT_SQUARE) ) {
-                    alt12=1;
-                }
-
-
-                switch (alt12) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:40: '[' ']'
-            	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_argument603); if (failed) return name;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_argument605); if (failed) return name;
-            	    if ( backtracking==0 ) {
-            	       name += "[]";
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop12;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return name;
-    }
-    // $ANTLR end argument
-
-
-    // $ANTLR start type_declaration
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:374:1: type_declaration returns [TypeDeclarationDescr declaration] : DECLARE id= identifier ( decl_metadata[$declaration] )* ( decl_field[$declaration] )* END ;
-    public final TypeDeclarationDescr type_declaration() throws RecognitionException {
-        TypeDeclarationDescr declaration = null;
-
-        identifier_return id = null;
-
-
-
-                        declaration = factory.createTypeDeclaration();
-                
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:378:9: ( DECLARE id= identifier ( decl_metadata[$declaration] )* ( decl_field[$declaration] )* END )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:378:11: DECLARE id= identifier ( decl_metadata[$declaration] )* ( decl_field[$declaration] )* END
-            {
-            match(input,DECLARE,FOLLOW_DECLARE_in_type_declaration645); if (failed) return declaration;
-            pushFollow(FOLLOW_identifier_in_type_declaration649);
-            id=identifier();
-            _fsp--;
-            if (failed) return declaration;
-            if ( backtracking==0 ) {
-
-                                          declaration.setTypeName( input.toString(id.start,id.stop) );
-                                      
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:25: ( decl_metadata[$declaration] )*
-            loop13:
-            do {
-                int alt13=2;
-                int LA13_0 = input.LA(1);
-
-                if ( (LA13_0==AT) ) {
-                    alt13=1;
-                }
-
-
-                switch (alt13) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:25: decl_metadata[$declaration]
-            	    {
-            	    pushFollow(FOLLOW_decl_metadata_in_type_declaration702);
-            	    decl_metadata(declaration);
-            	    _fsp--;
-            	    if (failed) return declaration;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop13;
-                }
-            } while (true);
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:25: ( decl_field[$declaration] )*
-            loop14:
-            do {
-                int alt14=2;
-                int LA14_0 = input.LA(1);
-
-                if ( (LA14_0==END) ) {
-                    int LA14_1 = input.LA(2);
-
-                    if ( ((LA14_1>=COLON && LA14_1<=EQUALS)) ) {
-                        alt14=1;
-                    }
-
-
-                }
-                else if ( ((LA14_0>=PACKAGE && LA14_0<=ID)||LA14_0==GLOBAL||(LA14_0>=QUERY && LA14_0<=ATTRIBUTES)||LA14_0==ENABLED||LA14_0==SALIENCE||(LA14_0>=DURATION && LA14_0<=DIALECT)||LA14_0==FROM||(LA14_0>=INIT && LA14_0<=RESULT)||LA14_0==IN||(LA14_0>=THEN && LA14_0<=EVENT)) ) {
-                    alt14=1;
-                }
-
-
-                switch (alt14) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:25: decl_field[$declaration]
-            	    {
-            	    pushFollow(FOLLOW_decl_field_in_type_declaration730);
-            	    decl_field(declaration);
-            	    _fsp--;
-            	    if (failed) return declaration;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop14;
-                }
-            } while (true);
-
-            match(input,END,FOLLOW_END_in_type_declaration750); if (failed) return declaration;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return declaration;
-    }
-    // $ANTLR end type_declaration
-
-
-    // $ANTLR start decl_metadata
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:1: decl_metadata[BaseDescr declaration] : AT att= identifier val= paren_chunk ;
-    public final void decl_metadata(BaseDescr declaration) throws RecognitionException {
-        identifier_return att = null;
-
-        paren_chunk_return val = null;
-
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:388:9: ( AT att= identifier val= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:388:11: AT att= identifier val= paren_chunk
-            {
-            match(input,AT,FOLLOW_AT_in_decl_metadata784); if (failed) return ;
-            pushFollow(FOLLOW_identifier_in_decl_metadata788);
-            att=identifier();
-            _fsp--;
-            if (failed) return ;
-            pushFollow(FOLLOW_paren_chunk_in_decl_metadata792);
-            val=paren_chunk();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-                                  if( declaration instanceof TypeDeclarationDescr )
-                                      ((TypeDeclarationDescr)declaration).addMetaAttribute( input.toString(att.start,att.stop), getString( input.toString(val.start,val.stop) ).trim() );
-                                  else
-                                      ((TypeFieldDescr)declaration).addMetaAttribute( input.toString(att.start,att.stop), getString( input.toString(val.start,val.stop) ).trim() );
-                              
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end decl_metadata
-
-
-    // $ANTLR start decl_field
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:397:1: decl_field[TypeDeclarationDescr declaration] : id= identifier (init= initialization )? COLON type= qualified_id ( decl_metadata[field] )* ;
-    public final void decl_field(TypeDeclarationDescr declaration) throws RecognitionException {
-        identifier_return id = null;
-
-        String init = null;
-
-        qualified_id_return type = null;
-
-
-
-                TypeFieldDescr field = null;
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:401:2: (id= identifier (init= initialization )? COLON type= qualified_id ( decl_metadata[field] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:401:9: id= identifier (init= initialization )? COLON type= qualified_id ( decl_metadata[field] )*
-            {
-            pushFollow(FOLLOW_identifier_in_decl_field853);
-            id=identifier();
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:401:27: (init= initialization )?
-            int alt15=2;
-            int LA15_0 = input.LA(1);
-
-            if ( (LA15_0==EQUALS) ) {
-                alt15=1;
-            }
-            switch (alt15) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:401:27: init= initialization
-                    {
-                    pushFollow(FOLLOW_initialization_in_decl_field857);
-                    init=initialization();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            match(input,COLON,FOLLOW_COLON_in_decl_field860); if (failed) return ;
-            pushFollow(FOLLOW_qualified_id_in_decl_field864);
-            type=qualified_id();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              		    field = new TypeFieldDescr( input.toString(id.start,id.stop) );
-              		    if( init != null )
-              		        field.setInitExpr( init );
-              		    field.setPattern( new PatternDescr(type.text) );
-              		    declaration.addField( field );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:409:3: ( decl_metadata[field] )*
-            loop16:
-            do {
-                int alt16=2;
-                int LA16_0 = input.LA(1);
-
-                if ( (LA16_0==AT) ) {
-                    alt16=1;
-                }
-
-
-                switch (alt16) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:409:3: decl_metadata[field]
-            	    {
-            	    pushFollow(FOLLOW_decl_metadata_in_decl_field873);
-            	    decl_metadata(field);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop16;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end decl_field
-
-
-    // $ANTLR start initialization
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:412:1: initialization returns [String expr] : EQUALS val= paren_chunk ;
-    public final String initialization() throws RecognitionException {
-        String expr = null;
-
-        paren_chunk_return val = null;
-
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:2: ( EQUALS val= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:9: EQUALS val= paren_chunk
-            {
-            match(input,EQUALS,FOLLOW_EQUALS_in_initialization900); if (failed) return expr;
-            pushFollow(FOLLOW_paren_chunk_in_initialization904);
-            val=paren_chunk();
-            _fsp--;
-            if (failed) return expr;
-            if ( backtracking==0 ) {
-
-              	           expr = getString( input.toString(val.start,val.stop) ).trim();
-              	       
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return expr;
-    }
-    // $ANTLR end initialization
-
-
-    // $ANTLR start query
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:419:1: query returns [QueryDescr query] : QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon ;
-    public final QueryDescr query() throws RecognitionException {
-        QueryDescr query = null;
-
-        Token paramName=null;
-        Token QUERY7=null;
-        Token END8=null;
-        name_return queryName = null;
-
-        qualified_id_return paramType = null;
-
-
-
-        		query = null;
-        		AndDescr lhs = null;
-        		List params = null;
-        		List types = null;		
-         
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:427:2: ( QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:428:3: QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon
-            {
-            QUERY7=(Token)input.LT(1);
-            match(input,QUERY,FOLLOW_QUERY_in_query938); if (failed) return query;
-            pushFollow(FOLLOW_name_in_query942);
-            queryName=name();
-            _fsp--;
-            if (failed) return query;
-            if ( backtracking==0 ) {
-               
-              			query = factory.createQuery( queryName.name ); 
-              			query.setLocation( offset(QUERY7.getLine()), QUERY7.getCharPositionInLine() );
-              			query.setStartCharacter( ((CommonToken)QUERY7).getStartIndex() );
-              			lhs = new AndDescr(); query.setLhs( lhs ); 
-              			lhs.setLocation( offset(QUERY7.getLine()), QUERY7.getCharPositionInLine() );
-                                      location.setType( Location.LOCATION_RULE_HEADER );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:437:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?
-            int alt21=2;
-            alt21 = dfa21.predict(input);
-            switch (alt21) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:437:5: LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_query952); if (failed) return query;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:438:11: ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )?
-                    int alt20=2;
-                    int LA20_0 = input.LA(1);
-
-                    if ( (LA20_0==ID) ) {
-                        alt20=1;
-                    }
-                    switch (alt20) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:438:13: ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )*
-                            {
-                            if ( backtracking==0 ) {
-                               params = new ArrayList(); types = new ArrayList();
-                            }
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:15: ( (paramType= qualified_id )? paramName= ID )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:16: (paramType= qualified_id )? paramName= ID
-                            {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:25: (paramType= qualified_id )?
-                            int alt17=2;
-                            int LA17_0 = input.LA(1);
-
-                            if ( (LA17_0==ID) ) {
-                                int LA17_1 = input.LA(2);
-
-                                if ( ((LA17_1>=ID && LA17_1<=DOT)||LA17_1==LEFT_SQUARE) ) {
-                                    alt17=1;
-                                }
-                            }
-                            switch (alt17) {
-                                case 1 :
-                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:25: paramType= qualified_id
-                                    {
-                                    pushFollow(FOLLOW_qualified_id_in_query987);
-                                    paramType=qualified_id();
-                                    _fsp--;
-                                    if (failed) return query;
-
-                                    }
-                                    break;
-
-                            }
-
-                            paramName=(Token)input.LT(1);
-                            match(input,ID,FOLLOW_ID_in_query992); if (failed) return query;
-                            if ( backtracking==0 ) {
-                               params.add( paramName.getText() ); String type = (paramType != null) ? paramType.text : "Object"; types.add( type ); 
-                            }
-
-                            }
-
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:441:15: ( COMMA (paramType= qualified_id )? paramName= ID )*
-                            loop19:
-                            do {
-                                int alt19=2;
-                                int LA19_0 = input.LA(1);
-
-                                if ( (LA19_0==COMMA) ) {
-                                    alt19=1;
-                                }
-
-
-                                switch (alt19) {
-                            	case 1 :
-                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:441:16: COMMA (paramType= qualified_id )? paramName= ID
-                            	    {
-                            	    match(input,COMMA,FOLLOW_COMMA_in_query1013); if (failed) return query;
-                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:441:31: (paramType= qualified_id )?
-                            	    int alt18=2;
-                            	    int LA18_0 = input.LA(1);
-
-                            	    if ( (LA18_0==ID) ) {
-                            	        int LA18_1 = input.LA(2);
-
-                            	        if ( ((LA18_1>=ID && LA18_1<=DOT)||LA18_1==LEFT_SQUARE) ) {
-                            	            alt18=1;
-                            	        }
-                            	    }
-                            	    switch (alt18) {
-                            	        case 1 :
-                            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:441:31: paramType= qualified_id
-                            	            {
-                            	            pushFollow(FOLLOW_qualified_id_in_query1017);
-                            	            paramType=qualified_id();
-                            	            _fsp--;
-                            	            if (failed) return query;
-
-                            	            }
-                            	            break;
-
-                            	    }
-
-                            	    paramName=(Token)input.LT(1);
-                            	    match(input,ID,FOLLOW_ID_in_query1022); if (failed) return query;
-                            	    if ( backtracking==0 ) {
-                            	       params.add( paramName.getText() );  String type = (paramType != null) ? paramType.text : "Object"; types.add( type );  
-                            	    }
-
-                            	    }
-                            	    break;
-
-                            	default :
-                            	    break loop19;
-                                }
-                            } while (true);
-
-                            if ( backtracking==0 ) {
-                              	query.setParameters( (String[]) params.toArray( new String[params.size()] ) ); 
-                              		            	query.setParameterTypes( (String[]) types.toArray( new String[types.size()] ) ); 
-                              		            
-                            }
-
-                            }
-                            break;
-
-                    }
-
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_query1072); if (failed) return query;
-
-                    }
-                    break;
-
-            }
-
-            if ( backtracking==0 ) {
-
-                                      location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              	        
-            }
-            pushFollow(FOLLOW_normal_lhs_block_in_query1101);
-            normal_lhs_block(lhs);
-            _fsp--;
-            if (failed) return query;
-            END8=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_query1106); if (failed) return query;
-            pushFollow(FOLLOW_opt_semicolon_in_query1108);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return query;
-            if ( backtracking==0 ) {
-
-              			query.setEndCharacter( ((CommonToken)END8).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return query;
-    }
-    // $ANTLR end query
-
-
-    // $ANTLR start template
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:459:1: template returns [FactTemplateDescr template] : TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon ;
-    public final FactTemplateDescr template() throws RecognitionException {
-        FactTemplateDescr template = null;
-
-        Token TEMPLATE9=null;
-        Token END10=null;
-        name_return templateName = null;
-
-        FieldTemplateDescr slot = null;
-
-
-
-        		template = null;		
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:463:2: ( TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:464:3: TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon
-            {
-            TEMPLATE9=(Token)input.LT(1);
-            match(input,TEMPLATE,FOLLOW_TEMPLATE_in_template1136); if (failed) return template;
-            pushFollow(FOLLOW_name_in_template1140);
-            templateName=name();
-            _fsp--;
-            if (failed) return template;
-            pushFollow(FOLLOW_opt_semicolon_in_template1142);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return template;
-            if ( backtracking==0 ) {
-
-              			template = new FactTemplateDescr(templateName.name);
-              			template.setLocation( offset(TEMPLATE9.getLine()), TEMPLATE9.getCharPositionInLine() );			
-              			template.setStartCharacter( ((CommonToken)TEMPLATE9).getStartIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:470:3: (slot= template_slot )+
-            int cnt22=0;
-            loop22:
-            do {
-                int alt22=2;
-                int LA22_0 = input.LA(1);
-
-                if ( (LA22_0==ID) ) {
-                    alt22=1;
-                }
-
-
-                switch (alt22) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:471:4: slot= template_slot
-            	    {
-            	    pushFollow(FOLLOW_template_slot_in_template1157);
-            	    slot=template_slot();
-            	    _fsp--;
-            	    if (failed) return template;
-            	    if ( backtracking==0 ) {
-
-            	      				template.addFieldTemplate( slot );
-            	      			
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt22 >= 1 ) break loop22;
-            	    if (backtracking>0) {failed=true; return template;}
-                        EarlyExitException eee =
-                            new EarlyExitException(22, input);
-                        throw eee;
-                }
-                cnt22++;
-            } while (true);
-
-            END10=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_template1172); if (failed) return template;
-            pushFollow(FOLLOW_opt_semicolon_in_template1174);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return template;
-            if ( backtracking==0 ) {
-
-              			template.setEndCharacter( ((CommonToken)END10).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return template;
-    }
-    // $ANTLR end template
-
-
-    // $ANTLR start template_slot
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:1: template_slot returns [FieldTemplateDescr field] : fieldType= qualified_id id= identifier opt_semicolon ;
-    public final FieldTemplateDescr template_slot() throws RecognitionException {
-        FieldTemplateDescr field = null;
-
-        qualified_id_return fieldType = null;
-
-        identifier_return id = null;
-
-
-
-        		field = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:486:2: (fieldType= qualified_id id= identifier opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:487:11: fieldType= qualified_id id= identifier opt_semicolon
-            {
-            if ( backtracking==0 ) {
-
-              			field = factory.createFieldTemplate();
-              	         
-            }
-            pushFollow(FOLLOW_qualified_id_in_template_slot1220);
-            fieldType=qualified_id();
-            _fsp--;
-            if (failed) return field;
-            if ( backtracking==0 ) {
-
-              		        field.setClassType( fieldType.text );
-              			field.setStartCharacter( ((CommonToken)((Token)fieldType.start)).getStartIndex() );
-              			field.setEndCharacter( ((CommonToken)((Token)fieldType.stop)).getStopIndex() );
-              		 
-            }
-            pushFollow(FOLLOW_identifier_in_template_slot1236);
-            id=identifier();
-            _fsp--;
-            if (failed) return field;
-            pushFollow(FOLLOW_opt_semicolon_in_template_slot1238);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return field;
-            if ( backtracking==0 ) {
-
-              		        field.setName( input.toString(id.start,id.stop) );
-              			field.setLocation( offset(((Token)id.start).getLine()), ((Token)id.start).getCharPositionInLine() );
-              			field.setEndCharacter( ((CommonToken)((Token)id.start)).getStopIndex() );
-              		 
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return field;
-    }
-    // $ANTLR end template_slot
-
-
-    // $ANTLR start rule
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:505:1: rule returns [RuleDescr rule] : RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( COLON )? normal_lhs_block[lhs] )? rhs_chunk[$rule] ;
-    public final RuleDescr rule() throws RecognitionException {
-        RuleDescr rule = null;
-
-        Token RULE11=null;
-        Token WHEN12=null;
-        name_return ruleName = null;
-
-
-
-        		rule = null;
-        		AndDescr lhs = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:510:2: ( RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( COLON )? normal_lhs_block[lhs] )? rhs_chunk[$rule] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:3: RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( COLON )? normal_lhs_block[lhs] )? rhs_chunk[$rule]
-            {
-            RULE11=(Token)input.LT(1);
-            match(input,RULE,FOLLOW_RULE_in_rule1269); if (failed) return rule;
-            pushFollow(FOLLOW_name_in_rule1273);
-            ruleName=name();
-            _fsp--;
-            if (failed) return rule;
-            if ( backtracking==0 ) {
-               
-              			location.setType( Location.LOCATION_RULE_HEADER );
-              			debug( "start rule: " + ruleName.name );
-              			rule = new RuleDescr( ruleName.name, null ); 
-              			rule.setLocation( offset(RULE11.getLine()), RULE11.getCharPositionInLine() );
-              			rule.setStartCharacter( ((CommonToken)RULE11).getStartIndex() );
-              			lhs = new AndDescr(); 
-              			rule.setLhs( lhs ); 
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:3: ( rule_attributes[$rule] )?
-            int alt23=2;
-            int LA23_0 = input.LA(1);
-
-            if ( ((LA23_0>=ATTRIBUTES && LA23_0<=DATE_EFFECTIVE)||(LA23_0>=DATE_EXPIRES && LA23_0<=ENABLED)||LA23_0==SALIENCE||(LA23_0>=NO_LOOP && LA23_0<=LOCK_ON_ACTIVE)) ) {
-                alt23=1;
-            }
-            switch (alt23) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:3: rule_attributes[$rule]
-                    {
-                    pushFollow(FOLLOW_rule_attributes_in_rule1282);
-                    rule_attributes(rule);
-                    _fsp--;
-                    if (failed) return rule;
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:522:3: ( WHEN ( COLON )? normal_lhs_block[lhs] )?
-            int alt25=2;
-            int LA25_0 = input.LA(1);
-
-            if ( (LA25_0==WHEN) ) {
-                alt25=1;
-            }
-            switch (alt25) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:523:4: WHEN ( COLON )? normal_lhs_block[lhs]
-                    {
-                    WHEN12=(Token)input.LT(1);
-                    match(input,WHEN,FOLLOW_WHEN_in_rule1294); if (failed) return rule;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:523:9: ( COLON )?
-                    int alt24=2;
-                    int LA24_0 = input.LA(1);
-
-                    if ( (LA24_0==COLON) ) {
-                        alt24=1;
-                    }
-                    switch (alt24) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:523:9: COLON
-                            {
-                            match(input,COLON,FOLLOW_COLON_in_rule1296); if (failed) return rule;
-
-                            }
-                            break;
-
-                    }
-
-                    if ( backtracking==0 ) {
-                       
-                      				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-                      				lhs.setLocation( offset(WHEN12.getLine()), WHEN12.getCharPositionInLine() );
-                      				lhs.setStartCharacter( ((CommonToken)WHEN12).getStartIndex() );
-                      			
-                    }
-                    pushFollow(FOLLOW_normal_lhs_block_in_rule1307);
-                    normal_lhs_block(lhs);
-                    _fsp--;
-                    if (failed) return rule;
-
-                    }
-                    break;
-
-            }
-
-            pushFollow(FOLLOW_rhs_chunk_in_rule1317);
-            rhs_chunk(rule);
-            _fsp--;
-            if (failed) return rule;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return rule;
-    }
-    // $ANTLR end rule
-
-
-    // $ANTLR start rule_attributes
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:536:1: rule_attributes[RuleDescr rule] : ( ATTRIBUTES COLON )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* ;
-    public final void rule_attributes(RuleDescr rule) throws RecognitionException {
-        AttributeDescr attr = null;
-
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:537:2: ( ( ATTRIBUTES COLON )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:538:2: ( ATTRIBUTES COLON )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )*
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:538:2: ( ATTRIBUTES COLON )?
-            int alt26=2;
-            int LA26_0 = input.LA(1);
-
-            if ( (LA26_0==ATTRIBUTES) ) {
-                alt26=1;
-            }
-            switch (alt26) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:538:4: ATTRIBUTES COLON
-                    {
-                    match(input,ATTRIBUTES,FOLLOW_ATTRIBUTES_in_rule_attributes1337); if (failed) return ;
-                    match(input,COLON,FOLLOW_COLON_in_rule_attributes1339); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            pushFollow(FOLLOW_rule_attribute_in_rule_attributes1347);
-            attr=rule_attribute();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-               rule.addAttribute( attr ); 
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:540:2: ( ( ',' )? attr= rule_attribute )*
-            loop28:
-            do {
-                int alt28=2;
-                int LA28_0 = input.LA(1);
-
-                if ( (LA28_0==COMMA||LA28_0==DATE_EFFECTIVE||(LA28_0>=DATE_EXPIRES && LA28_0<=ENABLED)||LA28_0==SALIENCE||(LA28_0>=NO_LOOP && LA28_0<=LOCK_ON_ACTIVE)) ) {
-                    alt28=1;
-                }
-
-
-                switch (alt28) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:540:4: ( ',' )? attr= rule_attribute
-            	    {
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:540:4: ( ',' )?
-            	    int alt27=2;
-            	    int LA27_0 = input.LA(1);
-
-            	    if ( (LA27_0==COMMA) ) {
-            	        alt27=1;
-            	    }
-            	    switch (alt27) {
-            	        case 1 :
-            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:540:4: ','
-            	            {
-            	            match(input,COMMA,FOLLOW_COMMA_in_rule_attributes1354); if (failed) return ;
-
-            	            }
-            	            break;
-
-            	    }
-
-            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes1359);
-            	    attr=rule_attribute();
-            	    _fsp--;
-            	    if (failed) return ;
-            	    if ( backtracking==0 ) {
-            	       rule.addAttribute( attr ); 
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop28;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end rule_attributes
-
-
-    // $ANTLR start rule_attribute
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:545:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );
-    public final AttributeDescr rule_attribute() throws RecognitionException {
-        AttributeDescr attr = null;
-
-        AttributeDescr a = null;
-
-
-
-        		attr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:552:2: (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect )
-            int alt29=12;
-            switch ( input.LA(1) ) {
-            case SALIENCE:
-                {
-                alt29=1;
-                }
-                break;
-            case NO_LOOP:
-                {
-                alt29=2;
-                }
-                break;
-            case AGENDA_GROUP:
-                {
-                alt29=3;
-                }
-                break;
-            case DURATION:
-                {
-                alt29=4;
-                }
-                break;
-            case ACTIVATION_GROUP:
-                {
-                alt29=5;
-                }
-                break;
-            case AUTO_FOCUS:
-                {
-                alt29=6;
-                }
-                break;
-            case DATE_EFFECTIVE:
-                {
-                alt29=7;
-                }
-                break;
-            case DATE_EXPIRES:
-                {
-                alt29=8;
-                }
-                break;
-            case ENABLED:
-                {
-                alt29=9;
-                }
-                break;
-            case RULEFLOW_GROUP:
-                {
-                alt29=10;
-                }
-                break;
-            case LOCK_ON_ACTIVE:
-                {
-                alt29=11;
-                }
-                break;
-            case DIALECT:
-                {
-                alt29=12;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return attr;}
-                NoViableAltException nvae =
-                    new NoViableAltException("545:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );", 29, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt29) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:552:4: a= salience
-                    {
-                    pushFollow(FOLLOW_salience_in_rule_attribute1396);
-                    a=salience();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:553:4: a= no_loop
-                    {
-                    pushFollow(FOLLOW_no_loop_in_rule_attribute1404);
-                    a=no_loop();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:4: a= agenda_group
-                    {
-                    pushFollow(FOLLOW_agenda_group_in_rule_attribute1413);
-                    a=agenda_group();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:555:4: a= duration
-                    {
-                    pushFollow(FOLLOW_duration_in_rule_attribute1422);
-                    a=duration();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:556:4: a= activation_group
-                    {
-                    pushFollow(FOLLOW_activation_group_in_rule_attribute1431);
-                    a=activation_group();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:557:4: a= auto_focus
-                    {
-                    pushFollow(FOLLOW_auto_focus_in_rule_attribute1439);
-                    a=auto_focus();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:558:4: a= date_effective
-                    {
-                    pushFollow(FOLLOW_date_effective_in_rule_attribute1447);
-                    a=date_effective();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:559:4: a= date_expires
-                    {
-                    pushFollow(FOLLOW_date_expires_in_rule_attribute1455);
-                    a=date_expires();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 9 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:560:4: a= enabled
-                    {
-                    pushFollow(FOLLOW_enabled_in_rule_attribute1463);
-                    a=enabled();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 10 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:561:4: a= ruleflow_group
-                    {
-                    pushFollow(FOLLOW_ruleflow_group_in_rule_attribute1471);
-                    a=ruleflow_group();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 11 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:562:4: a= lock_on_active
-                    {
-                    pushFollow(FOLLOW_lock_on_active_in_rule_attribute1479);
-                    a=lock_on_active();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-                case 12 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:563:4: a= dialect
-                    {
-                    pushFollow(FOLLOW_dialect_in_rule_attribute1486);
-                    a=dialect();
-                    _fsp--;
-                    if (failed) return attr;
-
-                    }
-                    break;
-
-            }
-            if ( backtracking==0 ) {
-
-              		attr = a;
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return attr;
-    }
-    // $ANTLR end rule_attribute
-
-
-    // $ANTLR start date_effective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:566:1: date_effective returns [AttributeDescr descr] : DATE_EFFECTIVE STRING ;
-    public final AttributeDescr date_effective() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING13=null;
-        Token DATE_EFFECTIVE14=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:570:2: ( DATE_EFFECTIVE STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:571:3: DATE_EFFECTIVE STRING
-            {
-            DATE_EFFECTIVE14=(Token)input.LT(1);
-            match(input,DATE_EFFECTIVE,FOLLOW_DATE_EFFECTIVE_in_date_effective1512); if (failed) return descr;
-            STRING13=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_date_effective1514); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "date-effective", getString( STRING13.getText() ) );
-              			descr.setLocation( offset( DATE_EFFECTIVE14.getLine() ), DATE_EFFECTIVE14.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DATE_EFFECTIVE14).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING13).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end date_effective
-
-
-    // $ANTLR start date_expires
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:581:1: date_expires returns [AttributeDescr descr] : DATE_EXPIRES STRING ;
-    public final AttributeDescr date_expires() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING15=null;
-        Token DATE_EXPIRES16=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:585:2: ( DATE_EXPIRES STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:585:4: DATE_EXPIRES STRING
-            {
-            DATE_EXPIRES16=(Token)input.LT(1);
-            match(input,DATE_EXPIRES,FOLLOW_DATE_EXPIRES_in_date_expires1543); if (failed) return descr;
-            STRING15=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_date_expires1545); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "date-expires", getString( STRING15.getText() ) );
-              			descr.setLocation( offset(DATE_EXPIRES16.getLine()), DATE_EXPIRES16.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DATE_EXPIRES16).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING15).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end date_expires
-
-
-    // $ANTLR start enabled
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:594:1: enabled returns [AttributeDescr descr] : ENABLED BOOL ;
-    public final AttributeDescr enabled() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token BOOL17=null;
-        Token ENABLED18=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:598:2: ( ENABLED BOOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:598:5: ENABLED BOOL
-            {
-            ENABLED18=(Token)input.LT(1);
-            match(input,ENABLED,FOLLOW_ENABLED_in_enabled1574); if (failed) return descr;
-            BOOL17=(Token)input.LT(1);
-            match(input,BOOL,FOLLOW_BOOL_in_enabled1576); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              				descr = new AttributeDescr( "enabled", BOOL17.getText() );
-              				descr.setLocation( offset(ENABLED18.getLine()), ENABLED18.getCharPositionInLine() );
-              				descr.setStartCharacter( ((CommonToken)ENABLED18).getStartIndex() );
-              				descr.setEndCharacter( ((CommonToken)BOOL17).getStopIndex() );
-              			
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end enabled
-
-
-    // $ANTLR start salience
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:607:1: salience returns [AttributeDescr descr] : SALIENCE ( INT | txt= paren_chunk ) ;
-    public final AttributeDescr salience() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token SALIENCE19=null;
-        Token INT20=null;
-        paren_chunk_return txt = null;
-
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:611:2: ( SALIENCE ( INT | txt= paren_chunk ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:612:3: SALIENCE ( INT | txt= paren_chunk )
-            {
-            SALIENCE19=(Token)input.LT(1);
-            match(input,SALIENCE,FOLLOW_SALIENCE_in_salience1609); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "salience" );
-              			descr.setLocation( offset(SALIENCE19.getLine()), SALIENCE19.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)SALIENCE19).getStartIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:618:3: ( INT | txt= paren_chunk )
-            int alt30=2;
-            int LA30_0 = input.LA(1);
-
-            if ( (LA30_0==INT) ) {
-                alt30=1;
-            }
-            else if ( (LA30_0==LEFT_PAREN) ) {
-                alt30=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return descr;}
-                NoViableAltException nvae =
-                    new NoViableAltException("618:3: ( INT | txt= paren_chunk )", 30, 0, input);
-
-                throw nvae;
-            }
-            switch (alt30) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:618:5: INT
-                    {
-                    INT20=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_salience1620); if (failed) return descr;
-                    if ( backtracking==0 ) {
-
-                      			descr.setValue( INT20.getText() );
-                      			descr.setEndCharacter( ((CommonToken)INT20).getStopIndex() );
-                      		
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:623:5: txt= paren_chunk
-                    {
-                    pushFollow(FOLLOW_paren_chunk_in_salience1635);
-                    txt=paren_chunk();
-                    _fsp--;
-                    if (failed) return descr;
-                    if ( backtracking==0 ) {
-
-                      			descr.setValue( input.toString(txt.start,txt.stop) );
-                      			descr.setEndCharacter( ((CommonToken)((Token)txt.stop)).getStopIndex() );
-                      		
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end salience
-
-
-    // $ANTLR start no_loop
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:631:1: no_loop returns [AttributeDescr descr] : NO_LOOP ( BOOL )? ;
-    public final AttributeDescr no_loop() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token NO_LOOP21=null;
-        Token BOOL22=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:635:2: ( NO_LOOP ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:635:4: NO_LOOP ( BOOL )?
-            {
-            NO_LOOP21=(Token)input.LT(1);
-            match(input,NO_LOOP,FOLLOW_NO_LOOP_in_no_loop1665); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "no-loop", "true" );
-              			descr.setLocation( offset(NO_LOOP21.getLine()), NO_LOOP21.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)NO_LOOP21).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)NO_LOOP21).getStopIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:3: ( BOOL )?
-            int alt31=2;
-            int LA31_0 = input.LA(1);
-
-            if ( (LA31_0==BOOL) ) {
-                alt31=1;
-            }
-            switch (alt31) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:5: BOOL
-                    {
-                    BOOL22=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_no_loop1678); if (failed) return descr;
-                    if ( backtracking==0 ) {
-
-                      				descr.setValue( BOOL22.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL22).getStopIndex() );
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end no_loop
-
-
-    // $ANTLR start auto_focus
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:650:1: auto_focus returns [AttributeDescr descr] : AUTO_FOCUS ( BOOL )? ;
-    public final AttributeDescr auto_focus() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token AUTO_FOCUS23=null;
-        Token BOOL24=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:654:2: ( AUTO_FOCUS ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:654:4: AUTO_FOCUS ( BOOL )?
-            {
-            AUTO_FOCUS23=(Token)input.LT(1);
-            match(input,AUTO_FOCUS,FOLLOW_AUTO_FOCUS_in_auto_focus1713); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "auto-focus", "true" );
-              			descr.setLocation( offset(AUTO_FOCUS23.getLine()), AUTO_FOCUS23.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)AUTO_FOCUS23).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)AUTO_FOCUS23).getStopIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:661:3: ( BOOL )?
-            int alt32=2;
-            int LA32_0 = input.LA(1);
-
-            if ( (LA32_0==BOOL) ) {
-                alt32=1;
-            }
-            switch (alt32) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:661:5: BOOL
-                    {
-                    BOOL24=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_auto_focus1726); if (failed) return descr;
-                    if ( backtracking==0 ) {
-
-                      				descr.setValue( BOOL24.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL24).getStopIndex() );
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end auto_focus
-
-
-    // $ANTLR start activation_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:669:1: activation_group returns [AttributeDescr descr] : ACTIVATION_GROUP STRING ;
-    public final AttributeDescr activation_group() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING25=null;
-        Token ACTIVATION_GROUP26=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:673:2: ( ACTIVATION_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:673:4: ACTIVATION_GROUP STRING
-            {
-            ACTIVATION_GROUP26=(Token)input.LT(1);
-            match(input,ACTIVATION_GROUP,FOLLOW_ACTIVATION_GROUP_in_activation_group1762); if (failed) return descr;
-            STRING25=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_activation_group1764); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "activation-group", getString( STRING25.getText() ) );
-              			descr.setLocation( offset(ACTIVATION_GROUP26.getLine()), ACTIVATION_GROUP26.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)ACTIVATION_GROUP26).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING25).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end activation_group
-
-
-    // $ANTLR start ruleflow_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:682:1: ruleflow_group returns [AttributeDescr descr] : RULEFLOW_GROUP STRING ;
-    public final AttributeDescr ruleflow_group() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING27=null;
-        Token RULEFLOW_GROUP28=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:686:2: ( RULEFLOW_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:686:4: RULEFLOW_GROUP STRING
-            {
-            RULEFLOW_GROUP28=(Token)input.LT(1);
-            match(input,RULEFLOW_GROUP,FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1792); if (failed) return descr;
-            STRING27=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_ruleflow_group1794); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "ruleflow-group", getString( STRING27.getText() ) );
-              			descr.setLocation( offset(RULEFLOW_GROUP28.getLine()), RULEFLOW_GROUP28.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)RULEFLOW_GROUP28).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING27).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end ruleflow_group
-
-
-    // $ANTLR start agenda_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:695:1: agenda_group returns [AttributeDescr descr] : AGENDA_GROUP STRING ;
-    public final AttributeDescr agenda_group() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING29=null;
-        Token AGENDA_GROUP30=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:699:2: ( AGENDA_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:699:4: AGENDA_GROUP STRING
-            {
-            AGENDA_GROUP30=(Token)input.LT(1);
-            match(input,AGENDA_GROUP,FOLLOW_AGENDA_GROUP_in_agenda_group1822); if (failed) return descr;
-            STRING29=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_agenda_group1824); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "agenda-group", getString( STRING29.getText() ) );
-              			descr.setLocation( offset(AGENDA_GROUP30.getLine()), AGENDA_GROUP30.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)AGENDA_GROUP30).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING29).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end agenda_group
-
-
-    // $ANTLR start duration
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:708:1: duration returns [AttributeDescr descr] : DURATION INT ;
-    public final AttributeDescr duration() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token INT31=null;
-        Token DURATION32=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:712:2: ( DURATION INT )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:712:4: DURATION INT
-            {
-            DURATION32=(Token)input.LT(1);
-            match(input,DURATION,FOLLOW_DURATION_in_duration1852); if (failed) return descr;
-            INT31=(Token)input.LT(1);
-            match(input,INT,FOLLOW_INT_in_duration1854); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "duration", INT31.getText() );
-              			descr.setLocation( offset(DURATION32.getLine()), DURATION32.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DURATION32).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)INT31).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end duration
-
-
-    // $ANTLR start dialect
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:721:1: dialect returns [AttributeDescr descr] : DIALECT STRING ;
-    public final AttributeDescr dialect() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token STRING33=null;
-        Token DIALECT34=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:725:2: ( DIALECT STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:725:4: DIALECT STRING
-            {
-            DIALECT34=(Token)input.LT(1);
-            match(input,DIALECT,FOLLOW_DIALECT_in_dialect1882); if (failed) return descr;
-            STRING33=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_dialect1884); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "dialect", getString( STRING33.getText() ) );
-              			descr.setLocation( offset(DIALECT34.getLine()), DIALECT34.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DIALECT34).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING33).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end dialect
-
-
-    // $ANTLR start lock_on_active
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:734:1: lock_on_active returns [AttributeDescr descr] : LOCK_ON_ACTIVE ( BOOL )? ;
-    public final AttributeDescr lock_on_active() throws RecognitionException {
-        AttributeDescr descr = null;
-
-        Token LOCK_ON_ACTIVE35=null;
-        Token BOOL36=null;
-
-
-        		descr = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:738:2: ( LOCK_ON_ACTIVE ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:738:4: LOCK_ON_ACTIVE ( BOOL )?
-            {
-            LOCK_ON_ACTIVE35=(Token)input.LT(1);
-            match(input,LOCK_ON_ACTIVE,FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1916); if (failed) return descr;
-            if ( backtracking==0 ) {
-
-              			descr = new AttributeDescr( "lock-on-active", "true" );
-              			descr.setLocation( offset(LOCK_ON_ACTIVE35.getLine()), LOCK_ON_ACTIVE35.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)LOCK_ON_ACTIVE35).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)LOCK_ON_ACTIVE35).getStopIndex() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:745:3: ( BOOL )?
-            int alt33=2;
-            int LA33_0 = input.LA(1);
-
-            if ( (LA33_0==BOOL) ) {
-                alt33=1;
-            }
-            switch (alt33) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:745:5: BOOL
-                    {
-                    BOOL36=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_lock_on_active1929); if (failed) return descr;
-                    if ( backtracking==0 ) {
-
-                      				descr.setValue( BOOL36.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL36).getStopIndex() );
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return descr;
-    }
-    // $ANTLR end lock_on_active
-
-
-    // $ANTLR start normal_lhs_block
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:753:1: normal_lhs_block[AndDescr descr] : (d= lhs[$descr] )* ;
-    public final void normal_lhs_block(AndDescr descr) throws RecognitionException {
-        BaseDescr d = null;
-
-
-
-        		location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:757:2: ( (d= lhs[$descr] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:758:3: (d= lhs[$descr] )*
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:758:3: (d= lhs[$descr] )*
-            loop34:
-            do {
-                int alt34=2;
-                int LA34_0 = input.LA(1);
-
-                if ( (LA34_0==ID||LA34_0==LEFT_PAREN||(LA34_0>=EXISTS && LA34_0<=FORALL)) ) {
-                    alt34=1;
-                }
-
-
-                switch (alt34) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:758:5: d= lhs[$descr]
-            	    {
-            	    pushFollow(FOLLOW_lhs_in_normal_lhs_block1968);
-            	    d=lhs(descr);
-            	    _fsp--;
-            	    if (failed) return ;
-            	    if ( backtracking==0 ) {
-            	       if( d != null) descr.addDescr( d ); 
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop34;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end normal_lhs_block
-
-
-    // $ANTLR start lhs
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:764:1: lhs[ConditionalElementDescr ce] returns [BaseDescr d] : l= lhs_or ;
-    public final BaseDescr lhs(ConditionalElementDescr ce) throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr l = null;
-
-
-
-        		d =null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:768:2: (l= lhs_or )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:768:4: l= lhs_or
-            {
-            pushFollow(FOLLOW_lhs_or_in_lhs2005);
-            l=lhs_or();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-               d = l; 
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs
-
-
-    // $ANTLR start lhs_or
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );
-    public final BaseDescr lhs_or() throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr lhsand = null;
-
-        BaseDescr left = null;
-
-        BaseDescr right = null;
-
-
-
-        		d = null;
-        		OrDescr or = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:777:2: ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* )
-            int alt37=2;
-            int LA37_0 = input.LA(1);
-
-            if ( (LA37_0==LEFT_PAREN) ) {
-                int LA37_1 = input.LA(2);
-
-                if ( (LA37_1==ID||LA37_1==LEFT_PAREN||LA37_1==AND||(LA37_1>=EXISTS && LA37_1<=FORALL)) ) {
-                    alt37=2;
-                }
-                else if ( (LA37_1==OR) ) {
-                    alt37=1;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return d;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("772:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 37, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else if ( (LA37_0==ID||(LA37_0>=EXISTS && LA37_0<=FORALL)) ) {
-                alt37=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("772:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 37, 0, input);
-
-                throw nvae;
-            }
-            switch (alt37) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:777:4: LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_or2030); if (failed) return d;
-                    match(input,OR,FOLLOW_OR_in_lhs_or2032); if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      			or = new OrDescr();
-                      			d = or;
-                      			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-                      		
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:3: (lhsand= lhs_and )+
-                    int cnt35=0;
-                    loop35:
-                    do {
-                        int alt35=2;
-                        int LA35_0 = input.LA(1);
-
-                        if ( (LA35_0==ID||LA35_0==LEFT_PAREN||(LA35_0>=EXISTS && LA35_0<=FORALL)) ) {
-                            alt35=1;
-                        }
-
-
-                        switch (alt35) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:5: lhsand= lhs_and
-                    	    {
-                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or2045);
-                    	    lhsand=lhs_and();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      			or.addDescr( lhsand );
-                    	      		
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt35 >= 1 ) break loop35;
-                    	    if (backtracking>0) {failed=true; return d;}
-                                EarlyExitException eee =
-                                    new EarlyExitException(35, input);
-                                throw eee;
-                        }
-                        cnt35++;
-                    } while (true);
-
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_or2056); if (failed) return d;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:789:10: left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
-                    {
-                    pushFollow(FOLLOW_lhs_and_in_lhs_or2074);
-                    left=lhs_and();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = left; 
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:790:3: ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
-                    loop36:
-                    do {
-                        int alt36=2;
-                        int LA36_0 = input.LA(1);
-
-                        if ( ((LA36_0>=OR && LA36_0<=DOUBLE_PIPE)) ) {
-                            alt36=1;
-                        }
-
-
-                        switch (alt36) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:790:5: ( OR | DOUBLE_PIPE ) right= lhs_and
-                    	    {
-                    	    if ( (input.LA(1)>=OR && input.LA(1)<=DOUBLE_PIPE) ) {
-                    	        input.consume();
-                    	        errorRecovery=false;failed=false;
-                    	    }
-                    	    else {
-                    	        if (backtracking>0) {failed=true; return d;}
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_or2082);    throw mse;
-                    	    }
-
-                    	    if ( backtracking==0 ) {
-
-                    	      				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-                    	      			
-                    	    }
-                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or2098);
-                    	    right=lhs_and();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      				if ( or == null ) {
-                    	      					or = new OrDescr();
-                    	      					or.addDescr( left );
-                    	      					d = or;
-                    	      				}
-                    	      				
-                    	      				or.addDescr( right );
-                    	      			
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop36;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_or
-
-
-    // $ANTLR start lhs_and
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:807:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );
-    public final BaseDescr lhs_and() throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr lhsunary = null;
-
-        BaseDescr left = null;
-
-        BaseDescr right = null;
-
-
-
-        		d = null;
-        		AndDescr and = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:812:2: ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* )
-            int alt40=2;
-            int LA40_0 = input.LA(1);
-
-            if ( (LA40_0==LEFT_PAREN) ) {
-                int LA40_1 = input.LA(2);
-
-                if ( (LA40_1==AND) ) {
-                    alt40=1;
-                }
-                else if ( (LA40_1==ID||LA40_1==LEFT_PAREN||(LA40_1>=EXISTS && LA40_1<=FORALL)) ) {
-                    alt40=2;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return d;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("807:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 40, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else if ( (LA40_0==ID||(LA40_0>=EXISTS && LA40_0<=FORALL)) ) {
-                alt40=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("807:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 40, 0, input);
-
-                throw nvae;
-            }
-            switch (alt40) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:812:4: LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_and2129); if (failed) return d;
-                    match(input,AND,FOLLOW_AND_in_lhs_and2131); if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      			and = new AndDescr();
-                      			d = and;
-                      			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-                      		
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:818:3: (lhsunary= lhs_unary )+
-                    int cnt38=0;
-                    loop38:
-                    do {
-                        int alt38=2;
-                        int LA38_0 = input.LA(1);
-
-                        if ( (LA38_0==ID||LA38_0==LEFT_PAREN||(LA38_0>=EXISTS && LA38_0<=FORALL)) ) {
-                            alt38=1;
-                        }
-
-
-                        switch (alt38) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:818:4: lhsunary= lhs_unary
-                    	    {
-                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and2143);
-                    	    lhsunary=lhs_unary();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      			and.addDescr( lhsunary );
-                    	      		
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt38 >= 1 ) break loop38;
-                    	    if (backtracking>0) {failed=true; return d;}
-                                EarlyExitException eee =
-                                    new EarlyExitException(38, input);
-                                throw eee;
-                        }
-                        cnt38++;
-                    } while (true);
-
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_and2153); if (failed) return d;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:824:10: left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
-                    {
-                    pushFollow(FOLLOW_lhs_unary_in_lhs_and2171);
-                    left=lhs_unary();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = left; 
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:825:3: ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
-                    loop39:
-                    do {
-                        int alt39=2;
-                        int LA39_0 = input.LA(1);
-
-                        if ( ((LA39_0>=AND && LA39_0<=DOUBLE_AMPER)) ) {
-                            alt39=1;
-                        }
-
-
-                        switch (alt39) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:825:5: ( AND | DOUBLE_AMPER ) right= lhs_unary
-                    	    {
-                    	    if ( (input.LA(1)>=AND && input.LA(1)<=DOUBLE_AMPER) ) {
-                    	        input.consume();
-                    	        errorRecovery=false;failed=false;
-                    	    }
-                    	    else {
-                    	        if (backtracking>0) {failed=true; return d;}
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_and2179);    throw mse;
-                    	    }
-
-                    	    if ( backtracking==0 ) {
-
-                    	      				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-                    	      			
-                    	    }
-                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and2195);
-                    	    right=lhs_unary();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      				if ( and == null ) {
-                    	      					and = new AndDescr();
-                    	      					and.addDescr( left );
-                    	      					d = and;
-                    	      				}
-                    	      				
-                    	      				and.addDescr( right );
-                    	      			
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop39;
-                        }
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_and
-
-
-    // $ANTLR start lhs_unary
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:842:1: lhs_unary returns [BaseDescr d] : ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon ;
-    public final BaseDescr lhs_unary() throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr u = null;
-
-        BaseDescr ps = null;
-
-
-
-        		d = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:2: ( ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )
-            int alt41=6;
-            int LA41_0 = input.LA(1);
-
-            if ( (LA41_0==EXISTS) && (synpred1())) {
-                alt41=1;
-            }
-            else if ( (LA41_0==NOT) && (synpred2())) {
-                alt41=2;
-            }
-            else if ( (LA41_0==EVAL) && (synpred3())) {
-                alt41=3;
-            }
-            else if ( (LA41_0==FORALL) && (synpred4())) {
-                alt41=4;
-            }
-            else if ( (LA41_0==LEFT_PAREN) && (synpred5())) {
-                alt41=5;
-            }
-            else if ( (LA41_0==ID) ) {
-                alt41=6;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("846:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )", 41, 0, input);
-
-                throw nvae;
-            }
-            switch (alt41) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:6: ( EXISTS )=>u= lhs_exist
-                    {
-                    pushFollow(FOLLOW_lhs_exist_in_lhs_unary2240);
-                    u=lhs_exist();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = u; 
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:847:5: ( NOT )=>u= lhs_not
-                    {
-                    pushFollow(FOLLOW_lhs_not_in_lhs_unary2258);
-                    u=lhs_not();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = u; 
-                    }
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:848:5: ( EVAL )=>u= lhs_eval
-                    {
-                    pushFollow(FOLLOW_lhs_eval_in_lhs_unary2277);
-                    u=lhs_eval();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = u; 
-                    }
-
-                    }
-                    break;
-                case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:849:5: ( FORALL )=>u= lhs_forall
-                    {
-                    pushFollow(FOLLOW_lhs_forall_in_lhs_unary2296);
-                    u=lhs_forall();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = u; 
-                    }
-
-                    }
-                    break;
-                case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:850:5: ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_unary2313); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_unary2317);
-                    u=lhs_or();
-                    _fsp--;
-                    if (failed) return d;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_unary2319); if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = u; 
-                    }
-
-                    }
-                    break;
-                case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:851:5: ps= pattern_source
-                    {
-                    pushFollow(FOLLOW_pattern_source_in_lhs_unary2330);
-                    ps=pattern_source();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d = (BaseDescr) ps; 
-                    }
-
-                    }
-                    break;
-
-            }
-
-            pushFollow(FOLLOW_opt_semicolon_in_lhs_unary2342);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return d;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_unary
-
-
-    // $ANTLR start pattern_source
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:856:1: pattern_source returns [BaseDescr d] : u= lhs_pattern ( OVER ( WINDOW COLON type= identifier param= paren_chunk )+ )? ( ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement ) | FROM ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? ;
-    public final BaseDescr pattern_source() throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr u = null;
-
-        identifier_return type = null;
-
-        paren_chunk_return param = null;
-
-        EntryPointDescr ep = null;
-
-        AccumulateDescr ac = null;
-
-        CollectDescr cs = null;
-
-        FromDescr fm = null;
-
-
-
-        		d = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:860:2: (u= lhs_pattern ( OVER ( WINDOW COLON type= identifier param= paren_chunk )+ )? ( ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement ) | FROM ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:861:3: u= lhs_pattern ( OVER ( WINDOW COLON type= identifier param= paren_chunk )+ )? ( ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement ) | FROM ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
-            {
-            pushFollow(FOLLOW_lhs_pattern_in_pattern_source2369);
-            u=lhs_pattern();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-               d = u; 
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:862:3: ( OVER ( WINDOW COLON type= identifier param= paren_chunk )+ )?
-            int alt43=2;
-            int LA43_0 = input.LA(1);
-
-            if ( (LA43_0==OVER) ) {
-                alt43=1;
-            }
-            switch (alt43) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:862:11: OVER ( WINDOW COLON type= identifier param= paren_chunk )+
-                    {
-                    match(input,OVER,FOLLOW_OVER_in_pattern_source2384); if (failed) return d;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:863:3: ( WINDOW COLON type= identifier param= paren_chunk )+
-                    int cnt42=0;
-                    loop42:
-                    do {
-                        int alt42=2;
-                        int LA42_0 = input.LA(1);
-
-                        if ( (LA42_0==WINDOW) ) {
-                            alt42=1;
-                        }
-
-
-                        switch (alt42) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:863:4: WINDOW COLON type= identifier param= paren_chunk
-                    	    {
-                    	    match(input,WINDOW,FOLLOW_WINDOW_in_pattern_source2390); if (failed) return d;
-                    	    match(input,COLON,FOLLOW_COLON_in_pattern_source2392); if (failed) return d;
-                    	    pushFollow(FOLLOW_identifier_in_pattern_source2396);
-                    	    type=identifier();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    pushFollow(FOLLOW_paren_chunk_in_pattern_source2400);
-                    	    param=paren_chunk();
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      		                SlidingWindowDescr window = new SlidingWindowDescr( input.toString(type.start,type.stop), getString( input.toString(param.start,param.stop) ).trim() );
-                    	      		                ((PatternDescr)d).addBehavior( window );
-                    	      		        
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    if ( cnt42 >= 1 ) break loop42;
-                    	    if (backtracking>0) {failed=true; return d;}
-                                EarlyExitException eee =
-                                    new EarlyExitException(42, input);
-                                throw eee;
-                        }
-                        cnt42++;
-                    } while (true);
-
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:870:3: ( ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement ) | FROM ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
-            int alt45=3;
-            int LA45_0 = input.LA(1);
-
-            if ( (LA45_0==FROM) ) {
-                int LA45_1 = input.LA(2);
-
-                if ( (LA45_1==ENTRY_POINT) && (synpred6())) {
-                    alt45=1;
-                }
-                else if ( ((LA45_1>=PACKAGE && LA45_1<=ID)||LA45_1==GLOBAL||LA45_1==END||(LA45_1>=QUERY && LA45_1<=ATTRIBUTES)||LA45_1==ENABLED||LA45_1==SALIENCE||(LA45_1>=DURATION && LA45_1<=DIALECT)||LA45_1==FROM||(LA45_1>=ACCUMULATE && LA45_1<=COLLECT)||LA45_1==IN||(LA45_1>=THEN && LA45_1<=EVENT)) ) {
-                    alt45=2;
-                }
-            }
-            switch (alt45) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:873:11: ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:873:11: ( ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:873:13: ( FROM ENTRY_POINT )=> FROM ep= entrypoint_statement
-                    {
-                    match(input,FROM,FOLLOW_FROM_in_pattern_source2471); if (failed) return d;
-                    pushFollow(FOLLOW_entrypoint_statement_in_pattern_source2475);
-                    ep=entrypoint_statement();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       if( d != null ) ((PatternDescr)d).setSource((PatternSourceDescr) ep); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:875:4: FROM ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
-                    {
-                    match(input,FROM,FOLLOW_FROM_in_pattern_source2495); if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      				location.setType(Location.LOCATION_LHS_FROM);
-                      				location.setProperty(Location.LOCATION_FROM_CONTENT, "");
-                      		        
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:880:11: ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
-                    int alt44=3;
-                    switch ( input.LA(1) ) {
-                    case ACCUMULATE:
-                        {
-                        alt44=1;
-                        }
-                        break;
-                    case COLLECT:
-                        {
-                        alt44=2;
-                        }
-                        break;
-                    case PACKAGE:
-                    case IMPORT:
-                    case FUNCTION:
-                    case ID:
-                    case GLOBAL:
-                    case END:
-                    case QUERY:
-                    case TEMPLATE:
-                    case RULE:
-                    case WHEN:
-                    case ATTRIBUTES:
-                    case ENABLED:
-                    case SALIENCE:
-                    case DURATION:
-                    case DIALECT:
-                    case FROM:
-                    case INIT:
-                    case ACTION:
-                    case REVERSE:
-                    case RESULT:
-                    case IN:
-                    case THEN:
-                    case EVENT:
-                        {
-                        alt44=3;
-                        }
-                        break;
-                    default:
-                        if (backtracking>0) {failed=true; return d;}
-                        NoViableAltException nvae =
-                            new NoViableAltException("880:11: ( options {k=1; backtrack=true; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )", 44, 0, input);
-
-                        throw nvae;
-                    }
-
-                    switch (alt44) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:881:13: (ac= accumulate_statement )
-                            {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:881:13: (ac= accumulate_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:881:15: ac= accumulate_statement
-                            {
-                            pushFollow(FOLLOW_accumulate_statement_in_pattern_source2553);
-                            ac=accumulate_statement();
-                            _fsp--;
-                            if (failed) return d;
-                            if ( backtracking==0 ) {
-                               if( d != null ) ((PatternDescr)d).setSource((PatternSourceDescr) ac); 
-                            }
-
-                            }
-
-
-                            }
-                            break;
-                        case 2 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:882:15: (cs= collect_statement )
-                            {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:882:15: (cs= collect_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:882:17: cs= collect_statement
-                            {
-                            pushFollow(FOLLOW_collect_statement_in_pattern_source2576);
-                            cs=collect_statement();
-                            _fsp--;
-                            if (failed) return d;
-                            if ( backtracking==0 ) {
-                               if( d != null ) ((PatternDescr)d).setSource((PatternSourceDescr) cs); 
-                            }
-
-                            }
-
-
-                            }
-                            break;
-                        case 3 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:884:15: (fm= from_statement )
-                            {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:884:15: (fm= from_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:884:17: fm= from_statement
-                            {
-                            pushFollow(FOLLOW_from_statement_in_pattern_source2613);
-                            fm=from_statement();
-                            _fsp--;
-                            if (failed) return d;
-                            if ( backtracking==0 ) {
-                               if( d != null ) ((PatternDescr)d).setSource((PatternSourceDescr) fm); 
-                            }
-
-                            }
-
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end pattern_source
-
-
-    // $ANTLR start lhs_exist
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:889:1: lhs_exist returns [BaseDescr d] : EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
-    public final BaseDescr lhs_exist() throws RecognitionException {
-        BaseDescr d = null;
-
-        Token EXISTS37=null;
-        Token RIGHT_PAREN38=null;
-        BaseDescr or = null;
-
-        BaseDescr pattern = null;
-
-
-
-        		d = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:893:2: ( EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:893:4: EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
-            {
-            EXISTS37=(Token)input.LT(1);
-            match(input,EXISTS,FOLLOW_EXISTS_in_lhs_exist2656); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              			d = new ExistsDescr( ); 
-              			d.setLocation( offset(EXISTS37.getLine()), EXISTS37.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)EXISTS37).getStartIndex() );
-              			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_EXISTS );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:900:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
-            int alt46=2;
-            int LA46_0 = input.LA(1);
-
-            if ( (LA46_0==LEFT_PAREN) ) {
-                alt46=1;
-            }
-            else if ( (LA46_0==ID) ) {
-                alt46=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("900:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 46, 0, input);
-
-                throw nvae;
-            }
-            switch (alt46) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:900:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:900:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:900:14: LEFT_PAREN or= lhs_or RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_exist2676); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_exist2680);
-                    or=lhs_or();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       if ( or != null ) ((ExistsDescr)d).addDescr( or ); 
-                    }
-                    RIGHT_PAREN38=(Token)input.LT(1);
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_exist2710); if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN38).getStopIndex() ); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:905:12: pattern= lhs_pattern
-                    {
-                    pushFollow(FOLLOW_lhs_pattern_in_lhs_exist2760);
-                    pattern=lhs_pattern();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      	                	if ( pattern != null ) {
-                      	                		((ExistsDescr)d).addDescr( pattern );
-                      	                		d.setEndCharacter( pattern.getEndCharacter() );
-                      	                	}
-                      	                
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_exist
-
-
-    // $ANTLR start lhs_not
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:915:1: lhs_not returns [NotDescr d] : NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
-    public final NotDescr lhs_not() throws RecognitionException {
-        NotDescr d = null;
-
-        Token NOT39=null;
-        Token RIGHT_PAREN40=null;
-        BaseDescr or = null;
-
-        BaseDescr pattern = null;
-
-
-
-        		d = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:919:2: ( NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:919:4: NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
-            {
-            NOT39=(Token)input.LT(1);
-            match(input,NOT,FOLLOW_NOT_in_lhs_not2812); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              			d = new NotDescr( ); 
-              			d.setLocation( offset(NOT39.getLine()), NOT39.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)NOT39).getStartIndex() );
-              			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_NOT );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:926:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
-            int alt47=2;
-            int LA47_0 = input.LA(1);
-
-            if ( (LA47_0==LEFT_PAREN) ) {
-                alt47=1;
-            }
-            else if ( (LA47_0==ID) ) {
-                alt47=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("926:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 47, 0, input);
-
-                throw nvae;
-            }
-            switch (alt47) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:926:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:926:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:926:7: LEFT_PAREN or= lhs_or RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_not2825); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_not2829);
-                    or=lhs_or();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-                       if ( or != null ) d.addDescr( or ); 
-                    }
-                    RIGHT_PAREN40=(Token)input.LT(1);
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_not2860); if (failed) return d;
-                    if ( backtracking==0 ) {
-                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN40).getStopIndex() ); 
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:932:3: pattern= lhs_pattern
-                    {
-                    pushFollow(FOLLOW_lhs_pattern_in_lhs_not2897);
-                    pattern=lhs_pattern();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      	                	if ( pattern != null ) {
-                      	                		d.addDescr( pattern );
-                      	                		d.setEndCharacter( pattern.getEndCharacter() );
-                      	                	}
-                      	                
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_not
-
-
-    // $ANTLR start lhs_eval
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:942:1: lhs_eval returns [BaseDescr d] : EVAL c= paren_chunk ;
-    public final BaseDescr lhs_eval() throws RecognitionException {
-        BaseDescr d = null;
-
-        Token EVAL41=null;
-        paren_chunk_return c = null;
-
-
-
-        		d = new EvalDescr( );
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:946:2: ( EVAL c= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:947:3: EVAL c= paren_chunk
-            {
-            EVAL41=(Token)input.LT(1);
-            match(input,EVAL,FOLLOW_EVAL_in_lhs_eval2943); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              			location.setType( Location.LOCATION_LHS_INSIDE_EVAL );
-              		
-            }
-            pushFollow(FOLLOW_paren_chunk_in_lhs_eval2954);
-            c=paren_chunk();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-               
-              			d.setStartCharacter( ((CommonToken)EVAL41).getStartIndex() );
-              		        if( input.toString(c.start,c.stop) != null ) {
-              	  		    this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              		            String body = safeSubstring( input.toString(c.start,c.stop), 1, input.toString(c.start,c.stop).length()-1 );
-              			    checkTrailingSemicolon( body, offset(EVAL41.getLine()) );
-              			    ((EvalDescr) d).setContent( body );
-              			    location.setProperty(Location.LOCATION_EVAL_CONTENT, body);
-              			}
-              			if( ((Token)c.stop) != null ) {
-              			    d.setEndCharacter( ((CommonToken)((Token)c.stop)).getStopIndex() );
-              			}
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_eval
-
-
-    // $ANTLR start lhs_forall
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:967:1: lhs_forall returns [ForallDescr d] : FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN ;
-    public final ForallDescr lhs_forall() throws RecognitionException {
-        ForallDescr d = null;
-
-        Token FORALL42=null;
-        Token RIGHT_PAREN43=null;
-        BaseDescr base = null;
-
-        BaseDescr pattern = null;
-
-
-
-        		d = factory.createForall();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:971:2: ( FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:971:4: FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN
-            {
-            FORALL42=(Token)input.LT(1);
-            match(input,FORALL,FOLLOW_FORALL_in_lhs_forall2980); if (failed) return d;
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_forall2982); if (failed) return d;
-            pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2986);
-            base=lhs_pattern();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-
-              			d.setStartCharacter( ((CommonToken)FORALL42).getStartIndex() );
-              		        // adding the base pattern
-              		        d.addDescr( base );
-              			d.setLocation( offset(FORALL42.getLine()), FORALL42.getCharPositionInLine() );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:978:3: (pattern= lhs_pattern )*
-            loop48:
-            do {
-                int alt48=2;
-                int LA48_0 = input.LA(1);
-
-                if ( (LA48_0==ID) ) {
-                    alt48=1;
-                }
-
-
-                switch (alt48) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:978:5: pattern= lhs_pattern
-            	    {
-            	    pushFollow(FOLLOW_lhs_pattern_in_lhs_forall3001);
-            	    pattern=lhs_pattern();
-            	    _fsp--;
-            	    if (failed) return d;
-            	    if ( backtracking==0 ) {
-
-            	      		        // adding additional patterns
-            	      			d.addDescr( pattern );
-            	      		   
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop48;
-                }
-            } while (true);
-
-            RIGHT_PAREN43=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_forall3017); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		        d.setEndCharacter( ((CommonToken)RIGHT_PAREN43).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_forall
-
-
-    // $ANTLR start lhs_pattern
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:990:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );
-    public final BaseDescr lhs_pattern() throws RecognitionException {
-        BaseDescr d = null;
-
-        BaseDescr f = null;
-
-
-
-        		d =null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:997:2: (f= fact_binding | f= fact[null] )
-            int alt49=2;
-            int LA49_0 = input.LA(1);
-
-            if ( (LA49_0==ID) ) {
-                int LA49_1 = input.LA(2);
-
-                if ( (LA49_1==COLON) ) {
-                    alt49=1;
-                }
-                else if ( (LA49_1==DOT||LA49_1==LEFT_PAREN||LA49_1==LEFT_SQUARE) ) {
-                    alt49=2;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return d;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("990:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 49, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("990:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 49, 0, input);
-
-                throw nvae;
-            }
-            switch (alt49) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:997:4: f= fact_binding
-                    {
-                    pushFollow(FOLLOW_fact_binding_in_lhs_pattern3050);
-                    f=fact_binding();
-                    _fsp--;
-                    if (failed) return d;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:998:4: f= fact[null]
-                    {
-                    pushFollow(FOLLOW_fact_in_lhs_pattern3058);
-                    f=fact(null);
-                    _fsp--;
-                    if (failed) return d;
-
-                    }
-                    break;
-
-            }
-            if ( backtracking==0 ) {
-
-              		d =f;
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end lhs_pattern
-
-
-    // $ANTLR start from_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1001:1: from_statement returns [FromDescr d] : ds= from_source[$d] ;
-    public final FromDescr from_statement() throws RecognitionException {
-        FromDescr d = null;
-
-        DeclarativeInvokerDescr ds = null;
-
-
-
-        		d =factory.createFrom();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1005:2: (ds= from_source[$d] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1006:2: ds= from_source[$d]
-            {
-            pushFollow(FOLLOW_from_source_in_from_statement3085);
-            ds=from_source(d);
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		d.setDataSource( ds );
-              	
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end from_statement
-
-
-    // $ANTLR start accumulate_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1013:1: accumulate_statement returns [AccumulateDescr d] : ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN ;
-    public final AccumulateDescr accumulate_statement() throws RecognitionException {
-        AccumulateDescr d = null;
-
-        Token id=null;
-        Token ACCUMULATE44=null;
-        Token RIGHT_PAREN45=null;
-        BaseDescr inputCE = null;
-
-        paren_chunk_return text = null;
-
-
-
-        		d = factory.createAccumulate();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1017:2: ( ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1018:10: ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN
-            {
-            ACCUMULATE44=(Token)input.LT(1);
-            match(input,ACCUMULATE,FOLLOW_ACCUMULATE_in_accumulate_statement3122); if (failed) return d;
-            if ( backtracking==0 ) {
-               
-              			d.setLocation( offset(ACCUMULATE44.getLine()), ACCUMULATE44.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)ACCUMULATE44).getStartIndex() );
-              			location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE );
-              		
-            }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_accumulate_statement3132); if (failed) return d;
-            pushFollow(FOLLOW_lhs_or_in_accumulate_statement3136);
-            inputCE=lhs_or();
-            _fsp--;
-            if (failed) return d;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1024:29: ( COMMA )?
-            int alt50=2;
-            int LA50_0 = input.LA(1);
-
-            if ( (LA50_0==COMMA) ) {
-                alt50=1;
-            }
-            switch (alt50) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1024:29: COMMA
-                    {
-                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement3138); if (failed) return d;
-
-                    }
-                    break;
-
-            }
-
-            if ( backtracking==0 ) {
-
-              		        d.setInput( inputCE );
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1028:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )
-            int alt55=2;
-            int LA55_0 = input.LA(1);
-
-            if ( (LA55_0==INIT) ) {
-                alt55=1;
-            }
-            else if ( (LA55_0==ID) ) {
-                alt55=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1028:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )", 55, 0, input);
-
-                throw nvae;
-            }
-            switch (alt55) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1028:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1028:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1029:4: INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk
-                    {
-                    match(input,INIT,FOLLOW_INIT_in_accumulate_statement3156); if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      				location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_INIT );
-                      			
-                    }
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement3169);
-                    text=paren_chunk();
-                    _fsp--;
-                    if (failed) return d;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1033:21: ( COMMA )?
-                    int alt51=2;
-                    int LA51_0 = input.LA(1);
-
-                    if ( (LA51_0==COMMA) ) {
-                        alt51=1;
-                    }
-                    switch (alt51) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1033:21: COMMA
-                            {
-                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement3171); if (failed) return d;
-
-                            }
-                            break;
-
-                    }
-
-                    if ( backtracking==0 ) {
-
-                      				if( input.toString(text.start,text.stop) != null ) {
-                      				        d.setInitCode( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-                      					location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT, d.getInitCode());
-                      					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION );
-                      				}
-                      			
-                    }
-                    match(input,ACTION,FOLLOW_ACTION_in_accumulate_statement3182); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement3186);
-                    text=paren_chunk();
-                    _fsp--;
-                    if (failed) return d;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1041:28: ( COMMA )?
-                    int alt52=2;
-                    int LA52_0 = input.LA(1);
-
-                    if ( (LA52_0==COMMA) ) {
-                        alt52=1;
-                    }
-                    switch (alt52) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1041:28: COMMA
-                            {
-                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement3188); if (failed) return d;
-
-                            }
-                            break;
-
-                    }
-
-                    if ( backtracking==0 ) {
-
-                      				if( input.toString(text.start,text.stop) != null ) {
-                      				        d.setActionCode( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-                      	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT, d.getActionCode());
-                      					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE );
-                      				}
-                      			
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1049:4: ( REVERSE text= paren_chunk ( COMMA )? )?
-                    int alt54=2;
-                    int LA54_0 = input.LA(1);
-
-                    if ( (LA54_0==REVERSE) ) {
-                        alt54=1;
-                    }
-                    switch (alt54) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1049:6: REVERSE text= paren_chunk ( COMMA )?
-                            {
-                            match(input,REVERSE,FOLLOW_REVERSE_in_accumulate_statement3201); if (failed) return d;
-                            pushFollow(FOLLOW_paren_chunk_in_accumulate_statement3205);
-                            text=paren_chunk();
-                            _fsp--;
-                            if (failed) return d;
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1049:31: ( COMMA )?
-                            int alt53=2;
-                            int LA53_0 = input.LA(1);
-
-                            if ( (LA53_0==COMMA) ) {
-                                alt53=1;
-                            }
-                            switch (alt53) {
-                                case 1 :
-                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1049:31: COMMA
-                                    {
-                                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement3207); if (failed) return d;
-
-                                    }
-                                    break;
-
-                            }
-
-                            if ( backtracking==0 ) {
-
-                              				if( input.toString(text.start,text.stop) != null ) {
-                              				        d.setReverseCode( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-                              	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_REVERSE_CONTENT, d.getReverseCode());
-                              					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT );
-                              				}
-                              			
-                            }
-
-                            }
-                            break;
-
-                    }
-
-                    match(input,RESULT,FOLLOW_RESULT_in_accumulate_statement3224); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement3228);
-                    text=paren_chunk();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      				if( input.toString(text.start,text.stop) != null ) {
-                      				        d.setResultCode( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-                      					location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT, d.getResultCode());
-                      				}
-                      			
-                    }
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1067:3: (id= ID text= paren_chunk )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1067:3: (id= ID text= paren_chunk )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1068:4: id= ID text= paren_chunk
-                    {
-                    id=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_accumulate_statement3254); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement3258);
-                    text=paren_chunk();
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                      				if( id.getText() != null ) {
-                      				        d.setExternalFunction( true );
-                      					d.setFunctionIdentifier( id.getText() );
-                      				}
-                      				if( input.toString(text.start,text.stop) != null ) {
-                      				        d.setExpression( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-                      	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_EXPRESSION_CONTENT, d.getExpression());
-                      				}
-                      			
-                    }
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            RIGHT_PAREN45=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_accumulate_statement3275); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN45).getStopIndex() );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end accumulate_statement
-
-
-    // $ANTLR start from_source
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1088:1: from_source[FromDescr from] returns [DeclarativeInvokerDescr ds] : ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? ;
-    public final DeclarativeInvokerDescr from_source(FromDescr from) throws RecognitionException {
-        DeclarativeInvokerDescr ds = null;
-
-        identifier_return ident = null;
-
-        paren_chunk_return args = null;
-
-
-
-        		ds = null;
-        		AccessorDescr ad = null;
-        		FunctionCallDescr fc = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1094:2: (ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1094:4: ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )?
-            {
-            pushFollow(FOLLOW_identifier_in_from_source3306);
-            ident=identifier();
-            _fsp--;
-            if (failed) return ds;
-            if ( backtracking==0 ) {
-
-              			ad = new AccessorDescr(ident.start.getText());	
-              			ad.setLocation( offset(ident.start.getLine()), ident.start.getCharPositionInLine() );
-              			ad.setStartCharacter( ((CommonToken)ident.start).getStartIndex() );
-              			ad.setEndCharacter( ((CommonToken)ident.start).getStopIndex() );
-              			ds = ad;
-              			location.setProperty(Location.LOCATION_FROM_CONTENT, ident.start.getText());
-              		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1103:3: ( options {k=1; } : args= paren_chunk )?
-            int alt56=2;
-            int LA56_0 = input.LA(1);
-
-            if ( (LA56_0==LEFT_PAREN) ) {
-                alt56=1;
-            }
-            switch (alt56) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:5: args= paren_chunk
-                    {
-                    pushFollow(FOLLOW_paren_chunk_in_from_source3334);
-                    args=paren_chunk();
-                    _fsp--;
-                    if (failed) return ds;
-                    if ( backtracking==0 ) {
-
-                      			if( input.toString(args.start,args.stop) != null ) {
-                      				ad.setVariableName( null );
-                      				fc = new FunctionCallDescr(((Token)ident.start).getText());
-                      				fc.setLocation( offset(((Token)ident.start).getLine()), ((Token)ident.start).getCharPositionInLine() );			
-                      				fc.setArguments(input.toString(args.start,args.stop));
-                      				fc.setStartCharacter( ((CommonToken)((Token)ident.start)).getStartIndex() );
-                      				fc.setEndCharacter( ((CommonToken)((Token)ident.start)).getStopIndex() );
-                      				location.setProperty(Location.LOCATION_FROM_CONTENT, input.toString(args.start,args.stop));
-                      				from.setEndCharacter( ((CommonToken)((Token)args.stop)).getStopIndex() );
-                      			}
-                      		
-                    }
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1124:3: ( expression_chain[$from, ad] )?
-            int alt57=2;
-            int LA57_0 = input.LA(1);
-
-            if ( (LA57_0==DOT) ) {
-                alt57=1;
-            }
-            switch (alt57) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1124:3: expression_chain[$from, ad]
-                    {
-                    pushFollow(FOLLOW_expression_chain_in_from_source3347);
-                    expression_chain(from,  ad);
-                    _fsp--;
-                    if (failed) return ds;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            		if( ad != null ) {
-            			if( fc != null ) {
-            				ad.addFirstInvoker( fc );
-            			}
-            			location.setProperty(Location.LOCATION_FROM_CONTENT, ad.toString() );
-            		}
-            	
-        }
-        return ds;
-    }
-    // $ANTLR end from_source
-
-
-    // $ANTLR start expression_chain
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1135:1: expression_chain[FromDescr from, AccessorDescr as] : ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) ;
-    public final void expression_chain(FromDescr from, AccessorDescr as) throws RecognitionException {
-        identifier_return field = null;
-
-        square_chunk_return sqarg = null;
-
-        paren_chunk_return paarg = null;
-
-
-
-          		FieldAccessDescr fa = null;
-        	    	MethodAccessDescr ma = null;	
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1140:2: ( ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1141:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1141:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1141:4: DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )?
-            {
-            match(input,DOT,FOLLOW_DOT_in_expression_chain3378); if (failed) return ;
-            pushFollow(FOLLOW_identifier_in_expression_chain3382);
-            field=identifier();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              	        fa = new FieldAccessDescr(((Token)field.start).getText());	
-              		fa.setLocation( offset(((Token)field.start).getLine()), ((Token)field.start).getCharPositionInLine() );
-              		fa.setStartCharacter( ((CommonToken)((Token)field.start)).getStartIndex() );
-              		fa.setEndCharacter( ((CommonToken)((Token)field.start)).getStopIndex() );
-              	    
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1148:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?
-            int alt58=3;
-            alt58 = dfa58.predict(input);
-            switch (alt58) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1149:6: ( LEFT_SQUARE )=>sqarg= square_chunk
-                    {
-                    pushFollow(FOLLOW_square_chunk_in_expression_chain3413);
-                    sqarg=square_chunk();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      	          fa.setArgument( input.toString(sqarg.start,sqarg.stop) );	
-                      		  from.setEndCharacter( ((CommonToken)((Token)sqarg.stop)).getStopIndex() );
-                      	      
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1155:6: ( LEFT_PAREN )=>paarg= paren_chunk
-                    {
-                    pushFollow(FOLLOW_paren_chunk_in_expression_chain3446);
-                    paarg=paren_chunk();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      	    	  ma = new MethodAccessDescr( ((Token)field.start).getText(), input.toString(paarg.start,paarg.stop) );	
-                      		  ma.setLocation( offset(((Token)field.start).getLine()), ((Token)field.start).getCharPositionInLine() );
-                      		  ma.setStartCharacter( ((CommonToken)((Token)field.start)).getStartIndex() );
-                      		  from.setEndCharacter( ((CommonToken)((Token)paarg.stop)).getStopIndex() );
-                      		
-                    }
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1163:4: ( expression_chain[from, as] )?
-            int alt59=2;
-            int LA59_0 = input.LA(1);
-
-            if ( (LA59_0==DOT) ) {
-                alt59=1;
-            }
-            switch (alt59) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1163:4: expression_chain[from, as]
-                    {
-                    pushFollow(FOLLOW_expression_chain_in_expression_chain3461);
-                    expression_chain(from,  as);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            		// must be added to the start, since it is a recursive rule
-            		if( ma != null ) {
-            			as.addFirstInvoker( ma );
-            		} else {
-            			as.addFirstInvoker( fa );
-            		}
-            	
-        }
-        return ;
-    }
-    // $ANTLR end expression_chain
-
-
-    // $ANTLR start collect_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1177:1: collect_statement returns [CollectDescr d] : COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN ;
-    public final CollectDescr collect_statement() throws RecognitionException {
-        CollectDescr d = null;
-
-        Token COLLECT46=null;
-        Token RIGHT_PAREN47=null;
-        BaseDescr pattern = null;
-
-
-
-        		d = factory.createCollect();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1181:2: ( COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1182:10: COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN
-            {
-            COLLECT46=(Token)input.LT(1);
-            match(input,COLLECT,FOLLOW_COLLECT_in_collect_statement3512); if (failed) return d;
-            if ( backtracking==0 ) {
-               
-              			d.setLocation( offset(COLLECT46.getLine()), COLLECT46.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)COLLECT46).getStartIndex() );
-              			location.setType( Location.LOCATION_LHS_FROM_COLLECT );
-              		
-            }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_collect_statement3522); if (failed) return d;
-            pushFollow(FOLLOW_pattern_source_in_collect_statement3526);
-            pattern=pattern_source();
-            _fsp--;
-            if (failed) return d;
-            RIGHT_PAREN47=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_collect_statement3528); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		        d.setInputPattern( (PatternDescr) pattern );
-              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN47).getStopIndex() );
-              			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end collect_statement
-
-
-    // $ANTLR start entrypoint_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1196:1: entrypoint_statement returns [EntryPointDescr d] : ENTRY_POINT id= name ;
-    public final EntryPointDescr entrypoint_statement() throws RecognitionException {
-        EntryPointDescr d = null;
-
-        Token ENTRY_POINT48=null;
-        name_return id = null;
-
-
-
-        		d = factory.createEntryPoint();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1200:2: ( ENTRY_POINT id= name )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1201:10: ENTRY_POINT id= name
-            {
-            ENTRY_POINT48=(Token)input.LT(1);
-            match(input,ENTRY_POINT,FOLLOW_ENTRY_POINT_in_entrypoint_statement3565); if (failed) return d;
-            if ( backtracking==0 ) {
-               
-              			d.setLocation( offset(ENTRY_POINT48.getLine()), ENTRY_POINT48.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)ENTRY_POINT48).getStartIndex() );
-              			location.setType( Location.LOCATION_LHS_FROM_ENTRY_POINT );
-              		
-            }
-            pushFollow(FOLLOW_name_in_entrypoint_statement3577);
-            id=name();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		        d.setEntryId( id.name );
-              			d.setEndCharacter( ((CommonToken)((Token)id.stop)).getStopIndex() );
-              			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end entrypoint_statement
-
-
-    // $ANTLR start fact_binding
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1215:1: fact_binding returns [BaseDescr d] : ID COLON (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) ;
-    public final BaseDescr fact_binding() throws RecognitionException {
-        BaseDescr d = null;
-
-        Token ID49=null;
-        BaseDescr fe = null;
-
-        BaseDescr left = null;
-
-        BaseDescr right = null;
-
-
-
-        		d =null;
-        		OrDescr or = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1220:3: ( ID COLON (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1221:4: ID COLON (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
-            {
-            ID49=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_fact_binding3609); if (failed) return d;
-            match(input,COLON,FOLLOW_COLON_in_fact_binding3611); if (failed) return d;
-            if ( backtracking==0 ) {
-
-               		        // handling incomplete parsing
-               		        d = new PatternDescr( );
-               		        ((PatternDescr) d).setIdentifier( ID49.getText() );
-               		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1227:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
-            int alt61=2;
-            int LA61_0 = input.LA(1);
-
-            if ( (LA61_0==ID) ) {
-                alt61=1;
-            }
-            else if ( (LA61_0==LEFT_PAREN) ) {
-                alt61=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return d;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1227:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )", 61, 0, input);
-
-                throw nvae;
-            }
-            switch (alt61) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1227:5: fe= fact[$ID.text]
-                    {
-                    pushFollow(FOLLOW_fact_in_fact_binding3625);
-                    fe=fact(ID49.getText());
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                       		        // override previously instantiated pattern
-                       			d =fe;
-                       			if( d != null ) {
-                         			    d.setStartCharacter( ((CommonToken)ID49).getStartIndex() );
-                         			}
-                       		
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1236:4: LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact_binding3641); if (failed) return d;
-                    pushFollow(FOLLOW_fact_in_fact_binding3645);
-                    left=fact(ID49.getText());
-                    _fsp--;
-                    if (failed) return d;
-                    if ( backtracking==0 ) {
-
-                       		        // override previously instantiated pattern
-                       			d =left;
-                       			if( d != null ) {
-                         			    d.setStartCharacter( ((CommonToken)ID49).getStartIndex() );
-                         			}
-                       		
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1244:4: ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )*
-                    loop60:
-                    do {
-                        int alt60=2;
-                        int LA60_0 = input.LA(1);
-
-                        if ( ((LA60_0>=OR && LA60_0<=DOUBLE_PIPE)) ) {
-                            alt60=1;
-                        }
-
-
-                        switch (alt60) {
-                    	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1244:6: ( OR | DOUBLE_PIPE ) right= fact[$ID.text]
-                    	    {
-                    	    if ( (input.LA(1)>=OR && input.LA(1)<=DOUBLE_PIPE) ) {
-                    	        input.consume();
-                    	        errorRecovery=false;failed=false;
-                    	    }
-                    	    else {
-                    	        if (backtracking>0) {failed=true; return d;}
-                    	        MismatchedSetException mse =
-                    	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_fact_binding3658);    throw mse;
-                    	    }
-
-                    	    pushFollow(FOLLOW_fact_in_fact_binding3670);
-                    	    right=fact(ID49.getText());
-                    	    _fsp--;
-                    	    if (failed) return d;
-                    	    if ( backtracking==0 ) {
-
-                    	      				if ( or == null ) {
-                    	      					or = new OrDescr();
-                    	      					or.addDescr( left );
-                    	      					d = or;
-                    	      				}
-                    	      				or.addDescr( right );
-                    	       			
-                    	    }
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop60;
-                        }
-                    } while (true);
-
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact_binding3688); if (failed) return d;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end fact_binding
-
-
-    // $ANTLR start fact
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1259:1: fact[String ident] returns [BaseDescr d] : id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? ;
-    public final BaseDescr fact(String ident) throws RecognitionException {
-        BaseDescr d = null;
-
-        Token LEFT_PAREN50=null;
-        Token RIGHT_PAREN51=null;
-        qualified_id_return id = null;
-
-
-
-        		d =null;
-        		PatternDescr pattern = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1264:3: (id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1265:11: id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )?
-            {
-            if ( backtracking==0 ) {
-
-               			pattern = new PatternDescr( );
-               			if( ident != null ) {
-               				pattern.setIdentifier( ident );
-               			}
-               			d = pattern; 
-               	        
-            }
-            pushFollow(FOLLOW_qualified_id_in_fact3743);
-            id=qualified_id();
-            _fsp--;
-            if (failed) return d;
-            if ( backtracking==0 ) {
-               
-               			if( id != null ) {
-              	 		        pattern.setObjectType( id.text );
-               			        pattern.setEndCharacter( -1 );
-              				pattern.setStartCharacter( ((CommonToken)((Token)id.start)).getStartIndex() );
-               			}
-               		
-            }
-            LEFT_PAREN50=(Token)input.LT(1);
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact3753); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		        location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START );
-                          		location.setProperty( Location.LOCATION_PROPERTY_CLASS_NAME, id.text );
-               				
-               			pattern.setLocation( offset(LEFT_PAREN50.getLine()), LEFT_PAREN50.getCharPositionInLine() );
-               			pattern.setLeftParentCharacter( ((CommonToken)LEFT_PAREN50).getStartIndex() );
-               		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1288:4: ( constraints[pattern] )?
-            int alt62=2;
-            int LA62_0 = input.LA(1);
-
-            if ( ((LA62_0>=PACKAGE && LA62_0<=ID)||(LA62_0>=GLOBAL && LA62_0<=LEFT_PAREN)||LA62_0==END||(LA62_0>=QUERY && LA62_0<=ATTRIBUTES)||LA62_0==ENABLED||LA62_0==SALIENCE||(LA62_0>=DURATION && LA62_0<=DIALECT)||LA62_0==FROM||LA62_0==EVAL||(LA62_0>=INIT && LA62_0<=RESULT)||LA62_0==LEFT_SQUARE||LA62_0==IN||(LA62_0>=THEN && LA62_0<=EVENT)) ) {
-                alt62=1;
-            }
-            switch (alt62) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1288:4: constraints[pattern]
-                    {
-                    pushFollow(FOLLOW_constraints_in_fact3765);
-                    constraints(pattern);
-                    _fsp--;
-                    if (failed) return d;
-
-                    }
-                    break;
-
-            }
-
-            RIGHT_PAREN51=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact3772); if (failed) return d;
-            if ( backtracking==0 ) {
-
-              		        if( ")".equals( RIGHT_PAREN51.getText() ) ) {
-              				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              				pattern.setEndLocation( offset(RIGHT_PAREN51.getLine()), RIGHT_PAREN51.getCharPositionInLine() );	
-              				pattern.setEndCharacter( ((CommonToken)RIGHT_PAREN51).getStopIndex() );
-              		        	pattern.setRightParentCharacter( ((CommonToken)RIGHT_PAREN51).getStartIndex() );
-              		        }
-               		
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1298:4: ( EOF )?
-            int alt63=2;
-            int LA63_0 = input.LA(1);
-
-            if ( (LA63_0==EOF) ) {
-                alt63=1;
-            }
-            switch (alt63) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1298:4: EOF
-                    {
-                    match(input,EOF,FOLLOW_EOF_in_fact3781); if (failed) return d;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return d;
-    }
-    // $ANTLR end fact
-
-
-    // $ANTLR start constraints
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1302:1: constraints[PatternDescr pattern] : ( constraint[$pattern] | behaviors ) ( COMMA ( constraint[$pattern] | behaviors ) )* ;
-    public final void constraints(PatternDescr pattern) throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:2: ( ( constraint[$pattern] | behaviors ) ( COMMA ( constraint[$pattern] | behaviors ) )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:4: ( constraint[$pattern] | behaviors ) ( COMMA ( constraint[$pattern] | behaviors ) )*
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:4: ( constraint[$pattern] | behaviors )
-            int alt64=2;
-            int LA64_0 = input.LA(1);
-
-            if ( ((LA64_0>=PACKAGE && LA64_0<=ID)||(LA64_0>=GLOBAL && LA64_0<=LEFT_PAREN)||LA64_0==END||(LA64_0>=QUERY && LA64_0<=ATTRIBUTES)||LA64_0==ENABLED||LA64_0==SALIENCE||(LA64_0>=DURATION && LA64_0<=DIALECT)||LA64_0==FROM||LA64_0==EVAL||(LA64_0>=INIT && LA64_0<=RESULT)||LA64_0==IN||(LA64_0>=THEN && LA64_0<=EVENT)) ) {
-                alt64=1;
-            }
-            else if ( (LA64_0==LEFT_SQUARE) ) {
-                alt64=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1303:4: ( constraint[$pattern] | behaviors )", 64, 0, input);
-
-                throw nvae;
-            }
-            switch (alt64) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:5: constraint[$pattern]
-                    {
-                    pushFollow(FOLLOW_constraint_in_constraints3800);
-                    constraint(pattern);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:26: behaviors
-                    {
-                    pushFollow(FOLLOW_behaviors_in_constraints3803);
-                    behaviors();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1304:3: ( COMMA ( constraint[$pattern] | behaviors ) )*
-            loop66:
-            do {
-                int alt66=2;
-                int LA66_0 = input.LA(1);
-
-                if ( (LA66_0==COMMA) ) {
-                    alt66=1;
-                }
-
-
-                switch (alt66) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1304:5: COMMA ( constraint[$pattern] | behaviors )
-            	    {
-            	    match(input,COMMA,FOLLOW_COMMA_in_constraints3810); if (failed) return ;
-            	    if ( backtracking==0 ) {
-            	       location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START ); 
-            	    }
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1305:5: ( constraint[$pattern] | behaviors )
-            	    int alt65=2;
-            	    int LA65_0 = input.LA(1);
-
-            	    if ( ((LA65_0>=PACKAGE && LA65_0<=ID)||(LA65_0>=GLOBAL && LA65_0<=LEFT_PAREN)||LA65_0==END||(LA65_0>=QUERY && LA65_0<=ATTRIBUTES)||LA65_0==ENABLED||LA65_0==SALIENCE||(LA65_0>=DURATION && LA65_0<=DIALECT)||LA65_0==FROM||LA65_0==EVAL||(LA65_0>=INIT && LA65_0<=RESULT)||LA65_0==IN||(LA65_0>=THEN && LA65_0<=EVENT)) ) {
-            	        alt65=1;
-            	    }
-            	    else if ( (LA65_0==LEFT_SQUARE) ) {
-            	        alt65=2;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return ;}
-            	        NoViableAltException nvae =
-            	            new NoViableAltException("1305:5: ( constraint[$pattern] | behaviors )", 65, 0, input);
-
-            	        throw nvae;
-            	    }
-            	    switch (alt65) {
-            	        case 1 :
-            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1305:6: constraint[$pattern]
-            	            {
-            	            pushFollow(FOLLOW_constraint_in_constraints3820);
-            	            constraint(pattern);
-            	            _fsp--;
-            	            if (failed) return ;
-
-            	            }
-            	            break;
-            	        case 2 :
-            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1305:27: behaviors
-            	            {
-            	            pushFollow(FOLLOW_behaviors_in_constraints3823);
-            	            behaviors();
-            	            _fsp--;
-            	            if (failed) return ;
-
-            	            }
-            	            break;
-
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop66;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end constraints
-
-
-    // $ANTLR start constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1309:1: constraint[PatternDescr pattern] : or_constr[top] ;
-    public final void constraint(PatternDescr pattern) throws RecognitionException {
-
-        		ConditionalElementDescr top = null;
-        		location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-        		location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, input.LT(1).getText() );
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1315:2: ( or_constr[top] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1316:3: or_constr[top]
-            {
-            if ( backtracking==0 ) {
-
-              			top = pattern.getConstraint();
-              		
-            }
-            pushFollow(FOLLOW_or_constr_in_constraint3856);
-            or_constr(top);
-            _fsp--;
-            if (failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end constraint
-
-
-    // $ANTLR start behaviors
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1322:1: behaviors : LEFT_SQUARE behavior ( COMMA behavior )* RIGHT_SQUARE ;
-    public final void behaviors() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1323:2: ( LEFT_SQUARE behavior ( COMMA behavior )* RIGHT_SQUARE )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1323:4: LEFT_SQUARE behavior ( COMMA behavior )* RIGHT_SQUARE
-            {
-            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_behaviors3871); if (failed) return ;
-            pushFollow(FOLLOW_behavior_in_behaviors3873);
-            behavior();
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1323:25: ( COMMA behavior )*
-            loop67:
-            do {
-                int alt67=2;
-                int LA67_0 = input.LA(1);
-
-                if ( (LA67_0==COMMA) ) {
-                    alt67=1;
-                }
-
-
-                switch (alt67) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1323:27: COMMA behavior
-            	    {
-            	    match(input,COMMA,FOLLOW_COMMA_in_behaviors3877); if (failed) return ;
-            	    pushFollow(FOLLOW_behavior_in_behaviors3879);
-            	    behavior();
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop67;
-                }
-            } while (true);
-
-            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_behaviors3884); if (failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end behaviors
-
-
-    // $ANTLR start behavior
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1326:1: behavior : ID ( COLON ID )? ( paren_chunk )? ;
-    public final void behavior() throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:2: ( ID ( COLON ID )? ( paren_chunk )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:4: ID ( COLON ID )? ( paren_chunk )?
-            {
-            match(input,ID,FOLLOW_ID_in_behavior3898); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:7: ( COLON ID )?
-            int alt68=2;
-            int LA68_0 = input.LA(1);
-
-            if ( (LA68_0==COLON) ) {
-                alt68=1;
-            }
-            switch (alt68) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:8: COLON ID
-                    {
-                    match(input,COLON,FOLLOW_COLON_in_behavior3901); if (failed) return ;
-                    match(input,ID,FOLLOW_ID_in_behavior3903); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:19: ( paren_chunk )?
-            int alt69=2;
-            int LA69_0 = input.LA(1);
-
-            if ( (LA69_0==LEFT_PAREN) ) {
-                alt69=1;
-            }
-            switch (alt69) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1327:19: paren_chunk
-                    {
-                    pushFollow(FOLLOW_paren_chunk_in_behavior3907);
-                    paren_chunk();
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end behavior
-
-
-    // $ANTLR start or_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1330:1: or_constr[ConditionalElementDescr base] : and_constr[or] ( DOUBLE_PIPE and_constr[or] )* ;
-    public final void or_constr(ConditionalElementDescr base) throws RecognitionException {
-
-        		OrDescr or = new OrDescr();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1334:2: ( and_constr[or] ( DOUBLE_PIPE and_constr[or] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1335:3: and_constr[or] ( DOUBLE_PIPE and_constr[or] )*
-            {
-            pushFollow(FOLLOW_and_constr_in_or_constr3929);
-            and_constr(or);
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1336:3: ( DOUBLE_PIPE and_constr[or] )*
-            loop70:
-            do {
-                int alt70=2;
-                int LA70_0 = input.LA(1);
-
-                if ( (LA70_0==DOUBLE_PIPE) ) {
-                    alt70=1;
-                }
-
-
-                switch (alt70) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1336:5: DOUBLE_PIPE and_constr[or]
-            	    {
-            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_constr3937); if (failed) return ;
-            	    if ( backtracking==0 ) {
-
-            	      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-            	      		
-            	    }
-            	    pushFollow(FOLLOW_and_constr_in_or_constr3946);
-            	    and_constr(or);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop70;
-                }
-            } while (true);
-
-            if ( backtracking==0 ) {
-
-              		        if( or.getDescrs().size() == 1 ) {
-              		                base.addOrMerge( (BaseDescr) or.getDescrs().get(0) );
-              		        } else if ( or.getDescrs().size() > 1 ) {
-              		        	base.addDescr( or );
-              		        }
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end or_constr
-
-
-    // $ANTLR start and_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1351:1: and_constr[ConditionalElementDescr base] : unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* ;
-    public final void and_constr(ConditionalElementDescr base) throws RecognitionException {
-
-        		AndDescr and = new AndDescr();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1355:2: ( unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1356:3: unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )*
-            {
-            pushFollow(FOLLOW_unary_constr_in_and_constr3978);
-            unary_constr(and);
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1357:3: ( DOUBLE_AMPER unary_constr[and] )*
-            loop71:
-            do {
-                int alt71=2;
-                int LA71_0 = input.LA(1);
-
-                if ( (LA71_0==DOUBLE_AMPER) ) {
-                    alt71=1;
-                }
-
-
-                switch (alt71) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1357:5: DOUBLE_AMPER unary_constr[and]
-            	    {
-            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_constr3986); if (failed) return ;
-            	    if ( backtracking==0 ) {
-
-            	      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-            	      		
-            	    }
-            	    pushFollow(FOLLOW_unary_constr_in_and_constr3995);
-            	    unary_constr(and);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop71;
-                }
-            } while (true);
-
-            if ( backtracking==0 ) {
-
-              		        if( and.getDescrs().size() == 1) {
-              		                base.addOrMerge( (BaseDescr) and.getDescrs().get(0) );
-              		        } else if( and.getDescrs().size() > 1) {
-              		        	base.addDescr( and );
-              		        }
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end and_constr
-
-
-    // $ANTLR start unary_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1372:1: unary_constr[ConditionalElementDescr base] : ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) ;
-    public final void unary_constr(ConditionalElementDescr base) throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1373:2: ( ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1374:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1374:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
-            int alt72=3;
-            switch ( input.LA(1) ) {
-            case PACKAGE:
-            case IMPORT:
-            case FUNCTION:
-            case ID:
-            case GLOBAL:
-            case END:
-            case QUERY:
-            case TEMPLATE:
-            case RULE:
-            case WHEN:
-            case ATTRIBUTES:
-            case ENABLED:
-            case SALIENCE:
-            case DURATION:
-            case DIALECT:
-            case FROM:
-            case INIT:
-            case ACTION:
-            case REVERSE:
-            case RESULT:
-            case IN:
-            case THEN:
-            case EVENT:
-                {
-                alt72=1;
-                }
-                break;
-            case LEFT_PAREN:
-                {
-                alt72=2;
-                }
-                break;
-            case EVAL:
-                {
-                alt72=3;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1374:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )", 72, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt72) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1374:5: field_constraint[$base]
-                    {
-                    pushFollow(FOLLOW_field_constraint_in_unary_constr4023);
-                    field_constraint(base);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1375:5: LEFT_PAREN or_constr[$base] RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unary_constr4031); if (failed) return ;
-                    pushFollow(FOLLOW_or_constr_in_unary_constr4033);
-                    or_constr(base);
-                    _fsp--;
-                    if (failed) return ;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unary_constr4036); if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1376:5: EVAL predicate[$base]
-                    {
-                    match(input,EVAL,FOLLOW_EVAL_in_unary_constr4042); if (failed) return ;
-                    pushFollow(FOLLOW_predicate_in_unary_constr4044);
-                    predicate(base);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end unary_constr
-
-
-    // $ANTLR start field_constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1380:1: field_constraint[ConditionalElementDescr base] : ( ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );
-    public final void field_constraint(ConditionalElementDescr base) throws RecognitionException {
-        Token ID52=null;
-        accessor_path_return f = null;
-
-
-
-        		FieldBindingDescr fbd = null;
-        		FieldConstraintDescr fc = null;
-        		RestrictionConnectiveDescr top = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1386:2: ( ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) )
-            int alt74=2;
-            int LA74_0 = input.LA(1);
-
-            if ( (LA74_0==ID) ) {
-                int LA74_1 = input.LA(2);
-
-                if ( (LA74_1==COLON) ) {
-                    alt74=1;
-                }
-                else if ( (LA74_1==DOT||LA74_1==LEFT_PAREN||LA74_1==NOT||LA74_1==LEFT_SQUARE||(LA74_1>=CONTAINS && LA74_1<=IN)||(LA74_1>=84 && LA74_1<=89)) ) {
-                    alt74=2;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("1380:1: field_constraint[ConditionalElementDescr base] : ( ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );", 74, 1, input);
-
-                    throw nvae;
-                }
-            }
-            else if ( ((LA74_0>=PACKAGE && LA74_0<=FUNCTION)||LA74_0==GLOBAL||LA74_0==END||(LA74_0>=QUERY && LA74_0<=ATTRIBUTES)||LA74_0==ENABLED||LA74_0==SALIENCE||(LA74_0>=DURATION && LA74_0<=DIALECT)||LA74_0==FROM||(LA74_0>=INIT && LA74_0<=RESULT)||LA74_0==IN||(LA74_0>=THEN && LA74_0<=EVENT)) ) {
-                alt74=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1380:1: field_constraint[ConditionalElementDescr base] : ( ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );", 74, 0, input);
-
-                throw nvae;
-            }
-            switch (alt74) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1387:10: ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1387:10: ( ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1388:3: ID COLON f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )?
-                    {
-                    ID52=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_field_constraint4083); if (failed) return ;
-                    match(input,COLON,FOLLOW_COLON_in_field_constraint4085); if (failed) return ;
-                    if ( backtracking==0 ) {
-                       
-                      			fbd = new FieldBindingDescr();
-                      			fbd.setIdentifier( ID52.getText() );
-                      			fbd.setLocation( offset(ID52.getLine()), ID52.getCharPositionInLine() );
-                      			fbd.setStartCharacter( ((CommonToken)ID52).getStartIndex() );
-                      			base.addDescr( fbd );
-
-                      		    
-                    }
-                    pushFollow(FOLLOW_accessor_path_in_field_constraint4104);
-                    f=accessor_path();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      		    // use ((Token)f.start) to get token matched in identifier
-                      		    // or use f.text to get text.
-                      		    if( f.text != null ) {
-                      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-                      			location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, f.text);
-                      		    
-                      			if ( fbd != null ) {
-                      			    fbd.setFieldName( f.text );
-                      			    // may have been overwritten
-                      			    fbd.setStartCharacter( ((CommonToken)ID52).getStartIndex() );
-                      			} 
-                      			fc = new FieldConstraintDescr(f.text);
-                      			fc.setLocation( offset(((Token)f.start).getLine()), ((Token)f.start).getCharPositionInLine() );
-                      			fc.setStartCharacter( ((CommonToken)((Token)f.start)).getStartIndex() );
-                      			top = fc.getRestriction();
-                      			
-                      			// it must be a field constraint, as it is not a binding
-                      			if( ID52 == null ) {
-                      			    base.addDescr( fc );
-                      			}
-                      		    }
-                      		
-                    }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1422:3: ( or_restr_connective[top] | '->' predicate[$base] )?
-                    int alt73=3;
-                    int LA73_0 = input.LA(1);
-
-                    if ( (LA73_0==LEFT_PAREN||LA73_0==NOT||(LA73_0>=CONTAINS && LA73_0<=IN)||(LA73_0>=84 && LA73_0<=89)) ) {
-                        alt73=1;
-                    }
-                    else if ( (LA73_0==83) ) {
-                        alt73=2;
-                    }
-                    switch (alt73) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1423:4: or_restr_connective[top]
-                            {
-                            pushFollow(FOLLOW_or_restr_connective_in_field_constraint4118);
-                            or_restr_connective(top);
-                            _fsp--;
-                            if (failed) return ;
-                            if ( backtracking==0 ) {
-
-                              				// we must add now as we didn't before
-                              				if( ID52 != null) {
-                              				    base.addDescr( fc );
-                              				}
-                              			
-                            }
-
-                            }
-                            break;
-                        case 2 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1431:4: '->' predicate[$base]
-                            {
-                            match(input,83,FOLLOW_83_in_field_constraint4133); if (failed) return ;
-                            pushFollow(FOLLOW_predicate_in_field_constraint4135);
-                            predicate(base);
-                            _fsp--;
-                            if (failed) return ;
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1435:3: (f= accessor_path or_restr_connective[top] )
-                    {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1435:3: (f= accessor_path or_restr_connective[top] )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1436:3: f= accessor_path or_restr_connective[top]
-                    {
-                    pushFollow(FOLLOW_accessor_path_in_field_constraint4161);
-                    f=accessor_path();
-                    _fsp--;
-                    if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      		    // use ((Token)f.start) to get token matched in identifier
-                      		    // or use f.text to get text.
-                      		    if( f.text != null ) {
-                      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-                      			location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, f.text);
-                      		    
-                      			fc = new FieldConstraintDescr(f.text);
-                      			fc.setLocation( offset(((Token)f.start).getLine()), ((Token)f.start).getCharPositionInLine() );
-                      			fc.setStartCharacter( ((CommonToken)((Token)f.start)).getStartIndex() );
-                      			top = fc.getRestriction();
-                      			
-                      			base.addDescr( fc );
-                      		    }
-                      		
-                    }
-                    pushFollow(FOLLOW_or_restr_connective_in_field_constraint4170);
-                    or_restr_connective(top);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch ( NoViableAltException nvae ) {
-
-            	    if( input.LT(1) != null ) {
-            	                // in case of incomplete parsing, build as much as possible of the AST
-            	                // so that IDE requirements can be met
-            			fc = new FieldConstraintDescr( input.LT(1).getText() );
-            			fc.setLocation( offset(input.LT(1).getLine()), input.LT(1).getCharPositionInLine() );
-            			fc.setStartCharacter( ((CommonToken)input.LT(1)).getStartIndex() );
-            			base.addDescr( fc );
-            	    }
-            	    throw nvae;
-            	
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end field_constraint
-
-
-    // $ANTLR start or_restr_connective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1468:1: or_restr_connective[ RestrictionConnectiveDescr base ] options {backtrack=true; } : and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* ;
-    public final void or_restr_connective(RestrictionConnectiveDescr base) throws RecognitionException {
-
-        		RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1475:2: ( and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1476:3: and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
-            {
-            pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective4217);
-            and_restr_connective(or);
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1477:3: ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
-            loop75:
-            do {
-                int alt75=2;
-                int LA75_0 = input.LA(1);
-
-                if ( (LA75_0==DOUBLE_PIPE) ) {
-                    switch ( input.LA(2) ) {
-                    case IN:
-                        {
-                        int LA75_3 = input.LA(3);
-
-                        if ( (LA75_3==LEFT_PAREN) ) {
-                            int LA75_6 = input.LA(4);
-
-                            if ( (synpred11()) ) {
-                                alt75=1;
-                            }
-
-
-                        }
-
-
-                        }
-                        break;
-                    case NOT:
-                    case CONTAINS:
-                    case EXCLUDES:
-                    case MATCHES:
-                    case SOUNDSLIKE:
-                    case MEMBEROF:
-                    case TILDE:
-                    case 84:
-                    case 85:
-                    case 86:
-                    case 87:
-                    case 88:
-                    case 89:
-                        {
-                        alt75=1;
-                        }
-                        break;
-                    case LEFT_PAREN:
-                        {
-                        int LA75_5 = input.LA(3);
-
-                        if ( (synpred11()) ) {
-                            alt75=1;
-                        }
-
-
-                        }
-                        break;
-
-                    }
-
-                }
-
-
-                switch (alt75) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1479:4: DOUBLE_PIPE and_restr_connective[or]
-            	    {
-            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_restr_connective4241); if (failed) return ;
-            	    if ( backtracking==0 ) {
-
-            	      				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-            	      			
-            	    }
-            	    pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective4252);
-            	    and_restr_connective(or);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop75;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	        if( or.getRestrictions().size() == 1 ) {
-            	                base.addOrMerge( (RestrictionDescr) or.getRestrictions().get( 0 ) );
-            	        } else if ( or.getRestrictions().size() > 1 ) {
-            	        	base.addRestriction( or );
-            	        }
-            	
-        }
-        return ;
-    }
-    // $ANTLR end or_restr_connective
-
-
-    // $ANTLR start and_restr_connective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1494:1: and_restr_connective[ RestrictionConnectiveDescr base ] : constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* ;
-    public final void and_restr_connective(RestrictionConnectiveDescr base) throws RecognitionException {
-        Token t=null;
-
-
-        		RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1498:2: ( constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1499:3: constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
-            {
-            pushFollow(FOLLOW_constraint_expression_in_and_restr_connective4284);
-            constraint_expression(and);
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1500:3: ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
-            loop76:
-            do {
-                int alt76=2;
-                int LA76_0 = input.LA(1);
-
-                if ( (LA76_0==DOUBLE_AMPER) ) {
-                    switch ( input.LA(2) ) {
-                    case IN:
-                        {
-                        int LA76_3 = input.LA(3);
-
-                        if ( (LA76_3==LEFT_PAREN) ) {
-                            switch ( input.LA(4) ) {
-                            case IN:
-                                {
-                                int LA76_9 = input.LA(5);
-
-                                if ( (LA76_9==DOT||(LA76_9>=COMMA && LA76_9<=RIGHT_PAREN)||LA76_9==LEFT_SQUARE) ) {
-                                    alt76=1;
-                                }
-
-
-                                }
-                                break;
-                            case PACKAGE:
-                            case IMPORT:
-                            case FUNCTION:
-                            case ID:
-                            case GLOBAL:
-                            case END:
-                            case QUERY:
-                            case TEMPLATE:
-                            case RULE:
-                            case WHEN:
-                            case ATTRIBUTES:
-                            case STRING:
-                            case ENABLED:
-                            case BOOL:
-                            case SALIENCE:
-                            case INT:
-                            case DURATION:
-                            case DIALECT:
-                            case FROM:
-                            case INIT:
-                            case ACTION:
-                            case REVERSE:
-                            case RESULT:
-                            case FLOAT:
-                            case NULL:
-                            case THEN:
-                            case EVENT:
-                                {
-                                alt76=1;
-                                }
-                                break;
-                            case LEFT_PAREN:
-                                {
-                                int LA76_10 = input.LA(5);
-
-                                if ( (synpred12()) ) {
-                                    alt76=1;
-                                }
-
-
-                                }
-                                break;
-
-                            }
-
-                        }
-
-
-                        }
-                        break;
-                    case LEFT_PAREN:
-                        {
-                        switch ( input.LA(3) ) {
-                        case IN:
-                            {
-                            int LA76_7 = input.LA(4);
-
-                            if ( (LA76_7==LEFT_PAREN) ) {
-                                int LA76_11 = input.LA(5);
-
-                                if ( (synpred12()) ) {
-                                    alt76=1;
-                                }
-
-
-                            }
-
-
-                            }
-                            break;
-                        case LEFT_PAREN:
-                            {
-                            int LA76_8 = input.LA(4);
-
-                            if ( (synpred12()) ) {
-                                alt76=1;
-                            }
-
-
-                            }
-                            break;
-                        case NOT:
-                        case CONTAINS:
-                        case EXCLUDES:
-                        case MATCHES:
-                        case SOUNDSLIKE:
-                        case MEMBEROF:
-                        case TILDE:
-                        case 84:
-                        case 85:
-                        case 86:
-                        case 87:
-                        case 88:
-                        case 89:
-                            {
-                            alt76=1;
-                            }
-                            break;
-
-                        }
-
-                        }
-                        break;
-                    case NOT:
-                    case CONTAINS:
-                    case EXCLUDES:
-                    case MATCHES:
-                    case SOUNDSLIKE:
-                    case MEMBEROF:
-                    case TILDE:
-                    case 84:
-                    case 85:
-                    case 86:
-                    case 87:
-                    case 88:
-                    case 89:
-                        {
-                        alt76=1;
-                        }
-                        break;
-
-                    }
-
-                }
-
-
-                switch (alt76) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1501:5: t= DOUBLE_AMPER constraint_expression[and]
-            	    {
-            	    t=(Token)input.LT(1);
-            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_restr_connective4304); if (failed) return ;
-            	    if ( backtracking==0 ) {
-
-            	      				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-            	      			
-            	    }
-            	    pushFollow(FOLLOW_constraint_expression_in_and_restr_connective4315);
-            	    constraint_expression(and);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop76;
-                }
-            } while (true);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	        if( and.getRestrictions().size() == 1) {
-            	                base.addOrMerge( (RestrictionDescr) and.getRestrictions().get( 0 ) );
-            	        } else if ( and.getRestrictions().size() > 1 ) {
-            	        	base.addRestriction( and );
-            	        }
-            	
-        }
-        return ;
-    }
-    // $ANTLR end and_restr_connective
-
-
-    // $ANTLR start constraint_expression
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1516:1: constraint_expression[RestrictionConnectiveDescr base] : ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) ;
-    public final void constraint_expression(RestrictionConnectiveDescr base) throws RecognitionException {
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1517:9: ( ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1518:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1518:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
-            int alt77=3;
-            switch ( input.LA(1) ) {
-            case IN:
-                {
-                alt77=1;
-                }
-                break;
-            case NOT:
-                {
-                int LA77_2 = input.LA(2);
-
-                if ( (LA77_2==IN) ) {
-                    alt77=1;
-                }
-                else if ( (LA77_2==CONTAINS||LA77_2==MATCHES||(LA77_2>=MEMBEROF && LA77_2<=TILDE)) ) {
-                    alt77=2;
-                }
-                else {
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("1518:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 77, 2, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case CONTAINS:
-            case EXCLUDES:
-            case MATCHES:
-            case SOUNDSLIKE:
-            case MEMBEROF:
-            case TILDE:
-            case 84:
-            case 85:
-            case 86:
-            case 87:
-            case 88:
-            case 89:
-                {
-                alt77=2;
-                }
-                break;
-            case LEFT_PAREN:
-                {
-                alt77=3;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1518:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 77, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt77) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1518:5: compound_operator[$base]
-                    {
-                    pushFollow(FOLLOW_compound_operator_in_constraint_expression4352);
-                    compound_operator(base);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1519:5: simple_operator[$base]
-                    {
-                    pushFollow(FOLLOW_simple_operator_in_constraint_expression4359);
-                    simple_operator(base);
-                    _fsp--;
-                    if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1520:5: LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN
-                    {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_constraint_expression4367); if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-                      		
-                    }
-                    pushFollow(FOLLOW_or_restr_connective_in_constraint_expression4376);
-                    or_restr_connective(base);
-                    _fsp--;
-                    if (failed) return ;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_constraint_expression4381); if (failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end constraint_expression
-
-
-    // $ANTLR start simple_operator
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1529:1: simple_operator[RestrictionConnectiveDescr base] : (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText] ;
-    public final void simple_operator(RestrictionConnectiveDescr base) throws RecognitionException {
-        Token t=null;
-        Token n=null;
-        square_chunk_return param = null;
-
-        RestrictionDescr rd = null;
-
-
-
-        		String op = null;
-        		String paramText = null;
-        		boolean isNegated = false;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1535:2: ( (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1536:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText]
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1536:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )
-            int alt80=16;
-            switch ( input.LA(1) ) {
-            case 84:
-                {
-                alt80=1;
-                }
-                break;
-            case 85:
-                {
-                alt80=2;
-                }
-                break;
-            case 86:
-                {
-                alt80=3;
-                }
-                break;
-            case 87:
-                {
-                alt80=4;
-                }
-                break;
-            case 88:
-                {
-                alt80=5;
-                }
-                break;
-            case 89:
-                {
-                alt80=6;
-                }
-                break;
-            case CONTAINS:
-                {
-                alt80=7;
-                }
-                break;
-            case NOT:
-                {
-                switch ( input.LA(2) ) {
-                case MEMBEROF:
-                    {
-                    alt80=14;
-                    }
-                    break;
-                case MATCHES:
-                    {
-                    alt80=12;
-                    }
-                    break;
-                case TILDE:
-                    {
-                    alt80=16;
-                    }
-                    break;
-                case CONTAINS:
-                    {
-                    alt80=8;
-                    }
-                    break;
-                default:
-                    if (backtracking>0) {failed=true; return ;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("1536:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )", 80, 8, input);
-
-                    throw nvae;
-                }
-
-                }
-                break;
-            case EXCLUDES:
-                {
-                alt80=9;
-                }
-                break;
-            case MATCHES:
-                {
-                alt80=10;
-                }
-                break;
-            case SOUNDSLIKE:
-                {
-                alt80=11;
-                }
-                break;
-            case MEMBEROF:
-                {
-                alt80=13;
-                }
-                break;
-            case TILDE:
-                {
-                alt80=15;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1536:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )", 80, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt80) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1536:5: t= '=='
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,84,FOLLOW_84_in_simple_operator4412); if (failed) return ;
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1537:5: t= '>'
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,85,FOLLOW_85_in_simple_operator4420); if (failed) return ;
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1538:5: t= '>='
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,86,FOLLOW_86_in_simple_operator4428); if (failed) return ;
-
-                    }
-                    break;
-                case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1539:5: t= '<'
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,87,FOLLOW_87_in_simple_operator4436); if (failed) return ;
-
-                    }
-                    break;
-                case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1540:5: t= '<='
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,88,FOLLOW_88_in_simple_operator4444); if (failed) return ;
-
-                    }
-                    break;
-                case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1541:5: t= '!='
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,89,FOLLOW_89_in_simple_operator4452); if (failed) return ;
-
-                    }
-                    break;
-                case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1542:25: t= CONTAINS
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator4480); if (failed) return ;
-
-                    }
-                    break;
-                case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1543:25: n= NOT t= CONTAINS
-                    {
-                    n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator4508); if (failed) return ;
-                    t=(Token)input.LT(1);
-                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator4512); if (failed) return ;
-
-                    }
-                    break;
-                case 9 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1544:25: t= EXCLUDES
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,EXCLUDES,FOLLOW_EXCLUDES_in_simple_operator4540); if (failed) return ;
-
-                    }
-                    break;
-                case 10 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1545:25: t= MATCHES
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator4568); if (failed) return ;
-
-                    }
-                    break;
-                case 11 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1546:25: t= SOUNDSLIKE
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,SOUNDSLIKE,FOLLOW_SOUNDSLIKE_in_simple_operator4596); if (failed) return ;
-
-                    }
-                    break;
-                case 12 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1547:25: n= NOT t= MATCHES
-                    {
-                    n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator4624); if (failed) return ;
-                    t=(Token)input.LT(1);
-                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator4628); if (failed) return ;
-
-                    }
-                    break;
-                case 13 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1548:25: t= MEMBEROF
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator4656); if (failed) return ;
-
-                    }
-                    break;
-                case 14 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1549:25: n= NOT t= MEMBEROF
-                    {
-                    n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator4684); if (failed) return ;
-                    t=(Token)input.LT(1);
-                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator4688); if (failed) return ;
-
-                    }
-                    break;
-                case 15 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1550:5: TILDE t= ID (param= square_chunk )?
-                    {
-                    match(input,TILDE,FOLLOW_TILDE_in_simple_operator4694); if (failed) return ;
-                    t=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_simple_operator4698); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1550:21: (param= square_chunk )?
-                    int alt78=2;
-                    int LA78_0 = input.LA(1);
-
-                    if ( (LA78_0==LEFT_SQUARE) ) {
-                        alt78=1;
-                    }
-                    switch (alt78) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1550:21: param= square_chunk
-                            {
-                            pushFollow(FOLLOW_square_chunk_in_simple_operator4702);
-                            param=square_chunk();
-                            _fsp--;
-                            if (failed) return ;
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-                case 16 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1551:5: n= NOT TILDE t= ID (param= square_chunk )?
-                    {
-                    n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator4711); if (failed) return ;
-                    match(input,TILDE,FOLLOW_TILDE_in_simple_operator4713); if (failed) return ;
-                    t=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_simple_operator4717); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1551:27: (param= square_chunk )?
-                    int alt79=2;
-                    int LA79_0 = input.LA(1);
-
-                    if ( (LA79_0==LEFT_SQUARE) ) {
-                        alt79=1;
-                    }
-                    switch (alt79) {
-                        case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1551:27: param= square_chunk
-                            {
-                            pushFollow(FOLLOW_square_chunk_in_simple_operator4721);
-                            param=square_chunk();
-                            _fsp--;
-                            if (failed) return ;
-
-                            }
-                            break;
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            if ( backtracking==0 ) {
-
-                		    location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                                  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, t.getText());
-               	            op = t.getText();
-               	            isNegated = n != null;
-               	            if( param != null ) {
-                                      paramText = safeSubstring( input.toString(param.start,param.stop), 1, input.toString(param.start,param.stop).length()-1 );
-               	            } 
-              		
-            }
-            pushFollow(FOLLOW_expression_value_in_simple_operator4736);
-            rd=expression_value(base,  op,  isNegated,  paramText);
-            _fsp--;
-            if (failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            		if ( rd == null && op != null ) {
-            		        base.addRestriction( new LiteralRestrictionDescr(op, false, null) );
-            		}
-            	
-        }
-        return ;
-    }
-    // $ANTLR end simple_operator
-
-
-    // $ANTLR start compound_operator
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1570:1: compound_operator[RestrictionConnectiveDescr base] : ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN ;
-    public final void compound_operator(RestrictionConnectiveDescr base) throws RecognitionException {
-        RestrictionDescr rd = null;
-
-
-
-        		String op = null;
-        		RestrictionConnectiveDescr group = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1575:2: ( ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1576:3: ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1576:3: ( IN | NOT IN )
-            int alt81=2;
-            int LA81_0 = input.LA(1);
-
-            if ( (LA81_0==IN) ) {
-                alt81=1;
-            }
-            else if ( (LA81_0==NOT) ) {
-                alt81=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return ;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1576:3: ( IN | NOT IN )", 81, 0, input);
-
-                throw nvae;
-            }
-            switch (alt81) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1576:5: IN
-                    {
-                    match(input,IN,FOLLOW_IN_in_compound_operator4766); if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      			  op = "==";
-                      			  group = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
-                      			  base.addRestriction( group );
-                        		    	  location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                                          	  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, "in");
-                      			
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1584:5: NOT IN
-                    {
-                    match(input,NOT,FOLLOW_NOT_in_compound_operator4778); if (failed) return ;
-                    match(input,IN,FOLLOW_IN_in_compound_operator4780); if (failed) return ;
-                    if ( backtracking==0 ) {
-
-                      			  op = "!=";
-                      			  group = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
-                      			  base.addRestriction( group );
-                        		    	  location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                                          	  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, "in");
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_compound_operator4795); if (failed) return ;
-            pushFollow(FOLLOW_expression_value_in_compound_operator4799);
-            rd=expression_value(group,  op,  false,  null);
-            _fsp--;
-            if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1594:3: ( COMMA rd= expression_value[group, op, false, null] )*
-            loop82:
-            do {
-                int alt82=2;
-                int LA82_0 = input.LA(1);
-
-                if ( (LA82_0==COMMA) ) {
-                    alt82=1;
-                }
-
-
-                switch (alt82) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1594:5: COMMA rd= expression_value[group, op, false, null]
-            	    {
-            	    match(input,COMMA,FOLLOW_COMMA_in_compound_operator4806); if (failed) return ;
-            	    pushFollow(FOLLOW_expression_value_in_compound_operator4810);
-            	    rd=expression_value(group,  op,  false,  null);
-            	    _fsp--;
-            	    if (failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop82;
-                }
-            } while (true);
-
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_compound_operator4819); if (failed) return ;
-            if ( backtracking==0 ) {
-
-              			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end compound_operator
-
-
-    // $ANTLR start expression_value
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1601:1: expression_value[RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText] returns [RestrictionDescr rd] : (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) ;
-    public final RestrictionDescr expression_value(RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText) throws RecognitionException {
-        RestrictionDescr rd = null;
-
-        accessor_path_return ap = null;
-
-        literal_constraint_return lc = null;
-
-        paren_chunk_return rvc = null;
-
-
-
-        		rd = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1605:2: ( (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
-            int alt83=3;
-            switch ( input.LA(1) ) {
-            case PACKAGE:
-            case IMPORT:
-            case FUNCTION:
-            case ID:
-            case GLOBAL:
-            case END:
-            case QUERY:
-            case TEMPLATE:
-            case RULE:
-            case WHEN:
-            case ATTRIBUTES:
-            case ENABLED:
-            case SALIENCE:
-            case DURATION:
-            case DIALECT:
-            case FROM:
-            case INIT:
-            case ACTION:
-            case REVERSE:
-            case RESULT:
-            case IN:
-            case THEN:
-            case EVENT:
-                {
-                alt83=1;
-                }
-                break;
-            case STRING:
-            case BOOL:
-            case INT:
-            case FLOAT:
-            case NULL:
-                {
-                alt83=2;
-                }
-                break;
-            case LEFT_PAREN:
-                {
-                alt83=3;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return rd;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1606:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )", 83, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt83) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:5: ap= accessor_path
-                    {
-                    pushFollow(FOLLOW_accessor_path_in_expression_value4853);
-                    ap=accessor_path();
-                    _fsp--;
-                    if (failed) return rd;
-                    if ( backtracking==0 ) {
-                       
-                      			        if( ap.text.indexOf( '.' ) > -1 || ap.text.indexOf( '[' ) > -1) {
-                      					rd = new QualifiedIdentifierRestrictionDescr(op, isNegated, paramText, ap.text);
-                      				} else {
-                      					rd = new VariableRestrictionDescr(op, isNegated, paramText, ap.text);
-                      				}
-                      			
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1614:5: lc= literal_constraint
-                    {
-                    pushFollow(FOLLOW_literal_constraint_in_expression_value4873);
-                    lc=literal_constraint();
-                    _fsp--;
-                    if (failed) return rd;
-                    if ( backtracking==0 ) {
-                       
-                      				rd = new LiteralRestrictionDescr(op, isNegated, paramText, lc.text, lc.type );
-                      			
-                    }
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1618:5: rvc= paren_chunk
-                    {
-                    pushFollow(FOLLOW_paren_chunk_in_expression_value4887);
-                    rvc=paren_chunk();
-                    _fsp--;
-                    if (failed) return rd;
-                    if ( backtracking==0 ) {
-                       
-                      				rd = new ReturnValueRestrictionDescr(op, isNegated, paramText, safeSubstring( input.toString(rvc.start,rvc.stop), 1, input.toString(rvc.start,rvc.stop).length()-1) );							
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-            if ( backtracking==0 ) {
-
-              			if( rd != null ) {
-              				base.addRestriction( rd );
-              			}
-              			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return rd;
-    }
-    // $ANTLR end expression_value
-
-    public static class literal_constraint_return extends ParserRuleReturnScope {
-        public String text;
-        public int type;
-    };
-
-    // $ANTLR start literal_constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1631:1: literal_constraint returns [String text, int type] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) ;
-    public final literal_constraint_return literal_constraint() throws RecognitionException {
-        literal_constraint_return retval = new literal_constraint_return();
-        retval.start = input.LT(1);
-
-        Token t=null;
-
-
-        		retval.text = null;
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1635:2: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1635:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
-            {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1635:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
-            int alt84=5;
-            switch ( input.LA(1) ) {
-            case STRING:
-                {
-                alt84=1;
-                }
-                break;
-            case INT:
-                {
-                alt84=2;
-                }
-                break;
-            case FLOAT:
-                {
-                alt84=3;
-                }
-                break;
-            case BOOL:
-                {
-                alt84=4;
-                }
-                break;
-            case NULL:
-                {
-                alt84=5;
-                }
-                break;
-            default:
-                if (backtracking>0) {failed=true; return retval;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1635:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )", 84, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt84) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1635:6: t= STRING
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_literal_constraint4930); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.text = getString( t.getText() ); retval.type = LiteralRestrictionDescr.TYPE_STRING; 
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:5: t= INT
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_literal_constraint4941); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_NUMBER; 
-                    }
-
-                    }
-                    break;
-                case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1637:5: t= FLOAT
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,FLOAT,FOLLOW_FLOAT_in_literal_constraint4954); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_NUMBER; 
-                    }
-
-                    }
-                    break;
-                case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1638:5: t= BOOL
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_literal_constraint4965); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_BOOLEAN; 
-                    }
-
-                    }
-                    break;
-                case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1639:5: t= NULL
-                    {
-                    t=(Token)input.LT(1);
-                    match(input,NULL,FOLLOW_NULL_in_literal_constraint4977); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.text = null; retval.type = LiteralRestrictionDescr.TYPE_NULL; 
-                    }
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end literal_constraint
-
-
-    // $ANTLR start predicate
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1643:1: predicate[ConditionalElementDescr base] : text= paren_chunk ;
-    public final void predicate(ConditionalElementDescr base) throws RecognitionException {
-        paren_chunk_return text = null;
-
-
-
-        		PredicateDescr d = null;
-                
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1647:2: (text= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1648:3: text= paren_chunk
-            {
-            pushFollow(FOLLOW_paren_chunk_in_predicate5015);
-            text=paren_chunk();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-              		        if( input.toString(text.start,text.stop) != null ) {
-              				d = new PredicateDescr( );
-              			        d.setContent( safeSubstring( input.toString(text.start,text.stop), 1, input.toString(text.start,text.stop).length()-1 ) );
-              				d.setEndCharacter( ((CommonToken)((Token)text.stop)).getStopIndex() );
-              				base.addDescr( d );
-              		        }
-              		
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end predicate
-
-    public static class curly_chunk_return extends ParserRuleReturnScope {
-    };
-
-    // $ANTLR start curly_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1660:1: curly_chunk : LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY ;
-    public final curly_chunk_return curly_chunk() throws RecognitionException {
-        curly_chunk_return retval = new curly_chunk_return();
-        retval.start = input.LT(1);
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1661:2: ( LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1662:3: LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY
-            {
-            match(input,LEFT_CURLY,FOLLOW_LEFT_CURLY_in_curly_chunk5033); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1662:14: (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )*
-            loop85:
-            do {
-                int alt85=3;
-                int LA85_0 = input.LA(1);
-
-                if ( ((LA85_0>=PACKAGE && LA85_0<=NULL)||(LA85_0>=THEN && LA85_0<=89)) ) {
-                    alt85=1;
-                }
-                else if ( (LA85_0==LEFT_CURLY) ) {
-                    alt85=2;
-                }
-
-
-                switch (alt85) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1662:16: ~ ( LEFT_CURLY | RIGHT_CURLY )
-            	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=NULL)||(input.LA(1)>=THEN && input.LA(1)<=89) ) {
-            	        input.consume();
-            	        errorRecovery=false;failed=false;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return retval;}
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_curly_chunk5037);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1662:44: curly_chunk
-            	    {
-            	    pushFollow(FOLLOW_curly_chunk_in_curly_chunk5046);
-            	    curly_chunk();
-            	    _fsp--;
-            	    if (failed) return retval;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop85;
-                }
-            } while (true);
-
-            match(input,RIGHT_CURLY,FOLLOW_RIGHT_CURLY_in_curly_chunk5051); if (failed) return retval;
-
-            }
-
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end curly_chunk
-
-    public static class paren_chunk_return extends ParserRuleReturnScope {
-    };
-
-    // $ANTLR start paren_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1665:1: paren_chunk : LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN ;
-    public final paren_chunk_return paren_chunk() throws RecognitionException {
-        paren_chunk_return retval = new paren_chunk_return();
-        retval.start = input.LT(1);
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1666:2: ( LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1667:3: LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN
-            {
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_paren_chunk5065); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1667:14: (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )*
-            loop86:
-            do {
-                int alt86=3;
-                int LA86_0 = input.LA(1);
-
-                if ( ((LA86_0>=PACKAGE && LA86_0<=GLOBAL)||LA86_0==COMMA||(LA86_0>=DECLARE && LA86_0<=89)) ) {
-                    alt86=1;
-                }
-                else if ( (LA86_0==LEFT_PAREN) ) {
-                    alt86=2;
-                }
-
-
-                switch (alt86) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1667:16: ~ ( LEFT_PAREN | RIGHT_PAREN )
-            	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=GLOBAL)||input.LA(1)==COMMA||(input.LA(1)>=DECLARE && input.LA(1)<=89) ) {
-            	        input.consume();
-            	        errorRecovery=false;failed=false;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return retval;}
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_paren_chunk5069);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1667:44: paren_chunk
-            	    {
-            	    pushFollow(FOLLOW_paren_chunk_in_paren_chunk5078);
-            	    paren_chunk();
-            	    _fsp--;
-            	    if (failed) return retval;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop86;
-                }
-            } while (true);
-
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_paren_chunk5083); if (failed) return retval;
-
-            }
-
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end paren_chunk
-
-    public static class square_chunk_return extends ParserRuleReturnScope {
-    };
-
-    // $ANTLR start square_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1670:1: square_chunk : LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE ;
-    public final square_chunk_return square_chunk() throws RecognitionException {
-        square_chunk_return retval = new square_chunk_return();
-        retval.start = input.LT(1);
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1671:2: ( LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1672:3: LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE
-            {
-            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_square_chunk5096); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1672:15: (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )*
-            loop87:
-            do {
-                int alt87=3;
-                int LA87_0 = input.LA(1);
-
-                if ( ((LA87_0>=PACKAGE && LA87_0<=ENTRY_POINT)||(LA87_0>=CONTAINS && LA87_0<=89)) ) {
-                    alt87=1;
-                }
-                else if ( (LA87_0==LEFT_SQUARE) ) {
-                    alt87=2;
-                }
-
-
-                switch (alt87) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1672:17: ~ ( LEFT_SQUARE | RIGHT_SQUARE )
-            	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=ENTRY_POINT)||(input.LA(1)>=CONTAINS && input.LA(1)<=89) ) {
-            	        input.consume();
-            	        errorRecovery=false;failed=false;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return retval;}
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_square_chunk5100);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-            	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1672:47: square_chunk
-            	    {
-            	    pushFollow(FOLLOW_square_chunk_in_square_chunk5109);
-            	    square_chunk();
-            	    _fsp--;
-            	    if (failed) return retval;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop87;
-                }
-            } while (true);
-
-            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_square_chunk5114); if (failed) return retval;
-
-            }
-
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end square_chunk
-
-    public static class qualified_id_return extends ParserRuleReturnScope {
-        public String text;
-    };
-
-    // $ANTLR start qualified_id
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1675:1: qualified_id returns [ String text ] : ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
-    public final qualified_id_return qualified_id() throws RecognitionException {
-        qualified_id_return retval = new qualified_id_return();
-        retval.start = input.LT(1);
-
-        Token ID53=null;
-        identifier_return identifier54 = null;
-
-
-
-        	        StringBuffer buf = new StringBuffer();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:2: ( ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:5: ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
-            {
-            ID53=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_qualified_id5143); if (failed) return retval;
-            if ( backtracking==0 ) {
-              buf.append(ID53.getText());
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:32: ( DOT identifier )*
-            loop88:
-            do {
-                int alt88=2;
-                int LA88_0 = input.LA(1);
-
-                if ( (LA88_0==DOT) ) {
-                    alt88=1;
-                }
-
-
-                switch (alt88) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:34: DOT identifier
-            	    {
-            	    match(input,DOT,FOLLOW_DOT_in_qualified_id5149); if (failed) return retval;
-            	    pushFollow(FOLLOW_identifier_in_qualified_id5151);
-            	    identifier54=identifier();
-            	    _fsp--;
-            	    if (failed) return retval;
-            	    if ( backtracking==0 ) {
-            	      buf.append("."+input.toString(identifier54.start,identifier54.stop));
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop88;
-                }
-            } while (true);
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:88: ( LEFT_SQUARE RIGHT_SQUARE )*
-            loop89:
-            do {
-                int alt89=2;
-                int LA89_0 = input.LA(1);
-
-                if ( (LA89_0==LEFT_SQUARE) ) {
-                    alt89=1;
-                }
-
-
-                switch (alt89) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1682:90: LEFT_SQUARE RIGHT_SQUARE
-            	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_qualified_id5160); if (failed) return retval;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_qualified_id5162); if (failed) return retval;
-            	    if ( backtracking==0 ) {
-            	      buf.append("[]");
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop89;
-                }
-            } while (true);
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            if ( backtracking==0 ) {
-
-              	        retval.text = buf != null ? buf.toString() : "";
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end qualified_id
-
-
-    // $ANTLR start dotted_name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1685:1: dotted_name returns [ String text ] : i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
-    public final String dotted_name() throws RecognitionException {
-        String text = null;
-
-        identifier_return i = null;
-
-
-
-        	        StringBuffer buf = new StringBuffer();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:2: (i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:4: i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
-            {
-            pushFollow(FOLLOW_identifier_in_dotted_name5196);
-            i=identifier();
-            _fsp--;
-            if (failed) return text;
-            if ( backtracking==0 ) {
-              buf.append(input.toString(i.start,i.stop));
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:40: ( DOT i= identifier )*
-            loop90:
-            do {
-                int alt90=2;
-                int LA90_0 = input.LA(1);
-
-                if ( (LA90_0==DOT) ) {
-                    alt90=1;
-                }
-
-
-                switch (alt90) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:42: DOT i= identifier
-            	    {
-            	    match(input,DOT,FOLLOW_DOT_in_dotted_name5202); if (failed) return text;
-            	    pushFollow(FOLLOW_identifier_in_dotted_name5206);
-            	    i=identifier();
-            	    _fsp--;
-            	    if (failed) return text;
-            	    if ( backtracking==0 ) {
-            	      buf.append("."+input.toString(i.start,i.stop));
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop90;
-                }
-            } while (true);
-
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:89: ( LEFT_SQUARE RIGHT_SQUARE )*
-            loop91:
-            do {
-                int alt91=2;
-                int LA91_0 = input.LA(1);
-
-                if ( (LA91_0==LEFT_SQUARE) ) {
-                    alt91=1;
-                }
-
-
-                switch (alt91) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:91: LEFT_SQUARE RIGHT_SQUARE
-            	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_dotted_name5215); if (failed) return text;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_dotted_name5217); if (failed) return text;
-            	    if ( backtracking==0 ) {
-            	      buf.append("[]");
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop91;
-                }
-            } while (true);
-
-
-            }
-
-            if ( backtracking==0 ) {
-
-              	        text = buf != null ? buf.toString() : "";
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return text;
-    }
-    // $ANTLR end dotted_name
-
-    public static class accessor_path_return extends ParserRuleReturnScope {
-        public String text;
-    };
-
-    // $ANTLR start accessor_path
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1695:1: accessor_path returns [ String text ] : a= accessor_element ( DOT a= accessor_element )* ;
-    public final accessor_path_return accessor_path() throws RecognitionException {
-        accessor_path_return retval = new accessor_path_return();
-        retval.start = input.LT(1);
-
-        String a = null;
-
-
-
-        	        StringBuffer buf = new StringBuffer();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:2: (a= accessor_element ( DOT a= accessor_element )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:4: a= accessor_element ( DOT a= accessor_element )*
-            {
-            pushFollow(FOLLOW_accessor_element_in_accessor_path5251);
-            a=accessor_element();
-            _fsp--;
-            if (failed) return retval;
-            if ( backtracking==0 ) {
-              buf.append(a);
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:46: ( DOT a= accessor_element )*
-            loop92:
-            do {
-                int alt92=2;
-                int LA92_0 = input.LA(1);
-
-                if ( (LA92_0==DOT) ) {
-                    alt92=1;
-                }
-
-
-                switch (alt92) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:48: DOT a= accessor_element
-            	    {
-            	    match(input,DOT,FOLLOW_DOT_in_accessor_path5257); if (failed) return retval;
-            	    pushFollow(FOLLOW_accessor_element_in_accessor_path5261);
-            	    a=accessor_element();
-            	    _fsp--;
-            	    if (failed) return retval;
-            	    if ( backtracking==0 ) {
-            	      buf.append("."+a);
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop92;
-                }
-            } while (true);
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-            if ( backtracking==0 ) {
-
-              	        retval.text = buf != null ? buf.toString() : "";
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end accessor_path
-
-
-    // $ANTLR start accessor_element
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1705:1: accessor_element returns [ String text ] : i= identifier (s= square_chunk )* ;
-    public final String accessor_element() throws RecognitionException {
-        String text = null;
-
-        identifier_return i = null;
-
-        square_chunk_return s = null;
-
-
-
-        	        StringBuffer buf = new StringBuffer();
-        	
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1712:2: (i= identifier (s= square_chunk )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:3: i= identifier (s= square_chunk )*
-            {
-            pushFollow(FOLLOW_identifier_in_accessor_element5299);
-            i=identifier();
-            _fsp--;
-            if (failed) return text;
-            if ( backtracking==0 ) {
-              buf.append(input.toString(i.start,i.stop));
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:39: (s= square_chunk )*
-            loop93:
-            do {
-                int alt93=2;
-                int LA93_0 = input.LA(1);
-
-                if ( (LA93_0==LEFT_SQUARE) ) {
-                    alt93=1;
-                }
-
-
-                switch (alt93) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:40: s= square_chunk
-            	    {
-            	    pushFollow(FOLLOW_square_chunk_in_accessor_element5306);
-            	    s=square_chunk();
-            	    _fsp--;
-            	    if (failed) return text;
-            	    if ( backtracking==0 ) {
-            	      buf.append(input.toString(s.start,s.stop));
-            	    }
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop93;
-                }
-            } while (true);
-
-
-            }
-
-            if ( backtracking==0 ) {
-
-              	        text = buf != null ? buf.toString() : "";
-              	
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return text;
-    }
-    // $ANTLR end accessor_element
-
-
-    // $ANTLR start rhs_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1716:1: rhs_chunk[RuleDescr rule] : THEN (~ END )* loc= END opt_semicolon ;
-    public final void rhs_chunk(RuleDescr rule) throws RecognitionException {
-        Token loc=null;
-        Token THEN55=null;
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:2: ( THEN (~ END )* loc= END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:3: THEN (~ END )* loc= END opt_semicolon
-            {
-            THEN55=(Token)input.LT(1);
-            match(input,THEN,FOLLOW_THEN_in_rhs_chunk5327); if (failed) return ;
-            if ( backtracking==0 ) {
-               location.setType( Location.LOCATION_RHS ); 
-            }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:3: (~ END )*
-            loop94:
-            do {
-                int alt94=2;
-                int LA94_0 = input.LA(1);
-
-                if ( ((LA94_0>=PACKAGE && LA94_0<=DECLARE)||(LA94_0>=AT && LA94_0<=89)) ) {
-                    alt94=1;
-                }
-
-
-                switch (alt94) {
-            	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:5: ~ END
-            	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=DECLARE)||(input.LA(1)>=AT && input.LA(1)<=89) ) {
-            	        input.consume();
-            	        errorRecovery=false;failed=false;
-            	    }
-            	    else {
-            	        if (backtracking>0) {failed=true; return ;}
-            	        MismatchedSetException mse =
-            	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_rhs_chunk5335);    throw mse;
-            	    }
-
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop94;
-                }
-            } while (true);
-
-            loc=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_rhs_chunk5359); if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_rhs_chunk5361);
-            opt_semicolon();
-            _fsp--;
-            if (failed) return ;
-            if ( backtracking==0 ) {
-
-                                  // ignoring first line in the consequence
-                                  String buf = input.toString( THEN55, loc );
-                                  // removing final END keyword
-                                  int idx=4;
-                                  while( idx < buf.length()-3 && (buf.charAt(idx) == ' ' || buf.charAt(idx) == '\t') ) {
-                                      idx++;
-                                  }
-                                  if( idx < buf.length()-3 && buf.charAt(idx) == '\r' ) idx++;
-                                  if( idx < buf.length()-3 && buf.charAt(idx) == '\n' ) idx++;
-                                  buf = safeSubstring( buf, idx, buf.length()-3 );
-              		    rule.setConsequence( buf );
-                   		    rule.setConsequenceLocation(offset(THEN55.getLine()), THEN55.getCharPositionInLine());
-               		    rule.setEndCharacter( ((CommonToken)loc).getStopIndex() );
-               		    location.setProperty( Location.LOCATION_RHS_CONTENT, rule.getConsequence() );
-                              
-            }
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return ;
-    }
-    // $ANTLR end rhs_chunk
-
-    public static class name_return extends ParserRuleReturnScope {
-        public String name;
-    };
-
-    // $ANTLR start name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1739:1: name returns [String name] : ( ID | STRING );
-    public final name_return name() throws RecognitionException {
-        name_return retval = new name_return();
-        retval.start = input.LT(1);
-
-        Token ID56=null;
-        Token STRING57=null;
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1740:2: ( ID | STRING )
-            int alt95=2;
-            int LA95_0 = input.LA(1);
-
-            if ( (LA95_0==ID) ) {
-                alt95=1;
-            }
-            else if ( (LA95_0==STRING) ) {
-                alt95=2;
-            }
-            else {
-                if (backtracking>0) {failed=true; return retval;}
-                NoViableAltException nvae =
-                    new NoViableAltException("1739:1: name returns [String name] : ( ID | STRING );", 95, 0, input);
-
-                throw nvae;
-            }
-            switch (alt95) {
-                case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1740:5: ID
-                    {
-                    ID56=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_name5395); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.name = ID56.getText(); 
-                    }
-
-                    }
-                    break;
-                case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1741:5: STRING
-                    {
-                    STRING57=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_name5403); if (failed) return retval;
-                    if ( backtracking==0 ) {
-                       retval.name = getString( STRING57.getText() ); 
-                    }
-
-                    }
-                    break;
-
-            }
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end name
-
-    public static class identifier_return extends ParserRuleReturnScope {
-    };
-
-    // $ANTLR start identifier
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1744:1: identifier : ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | EVENT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | WHEN | THEN | END | IN );
-    public final identifier_return identifier() throws RecognitionException {
-        identifier_return retval = new identifier_return();
-        retval.start = input.LT(1);
-
-        try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1745:2: ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | EVENT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | WHEN | THEN | END | IN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
-            {
-            if ( (input.LA(1)>=PACKAGE && input.LA(1)<=ID)||input.LA(1)==GLOBAL||input.LA(1)==END||(input.LA(1)>=QUERY && input.LA(1)<=ATTRIBUTES)||input.LA(1)==ENABLED||input.LA(1)==SALIENCE||(input.LA(1)>=DURATION && input.LA(1)<=DIALECT)||input.LA(1)==FROM||(input.LA(1)>=INIT && input.LA(1)<=RESULT)||input.LA(1)==IN||(input.LA(1)>=THEN && input.LA(1)<=EVENT) ) {
-                input.consume();
-                errorRecovery=false;failed=false;
-            }
-            else {
-                if (backtracking>0) {failed=true; return retval;}
-                MismatchedSetException mse =
-                    new MismatchedSetException(null,input);
-                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_identifier0);    throw mse;
-            }
-
-
-            }
-
-            retval.stop = input.LT(-1);
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-        }
-        return retval;
-    }
-    // $ANTLR end identifier
-
-    // $ANTLR start synpred1
-    public final void synpred1_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:6: ( EXISTS )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:846:8: EXISTS
-        {
-        match(input,EXISTS,FOLLOW_EXISTS_in_synpred12232); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred1
-
-    // $ANTLR start synpred2
-    public final void synpred2_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:847:5: ( NOT )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:847:7: NOT
-        {
-        match(input,NOT,FOLLOW_NOT_in_synpred22250); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred2
-
-    // $ANTLR start synpred3
-    public final void synpred3_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:848:5: ( EVAL )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:848:7: EVAL
-        {
-        match(input,EVAL,FOLLOW_EVAL_in_synpred32269); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred3
-
-    // $ANTLR start synpred4
-    public final void synpred4_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:849:5: ( FORALL )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:849:7: FORALL
-        {
-        match(input,FORALL,FOLLOW_FORALL_in_synpred42288); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred4
-
-    // $ANTLR start synpred5
-    public final void synpred5_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:850:5: ( LEFT_PAREN )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:850:7: LEFT_PAREN
-        {
-        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred52307); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred5
-
-    // $ANTLR start synpred6
-    public final void synpred6_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:873:13: ( FROM ENTRY_POINT )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:873:14: FROM ENTRY_POINT
-        {
-        match(input,FROM,FOLLOW_FROM_in_synpred62464); if (failed) return ;
-        match(input,ENTRY_POINT,FOLLOW_ENTRY_POINT_in_synpred62466); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred6
-
-    // $ANTLR start synpred9
-    public final void synpred9_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1149:6: ( LEFT_SQUARE )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1149:8: LEFT_SQUARE
-        {
-        match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_synpred93405); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred9
-
-    // $ANTLR start synpred10
-    public final void synpred10_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1155:6: ( LEFT_PAREN )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1155:8: LEFT_PAREN
-        {
-        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred103438); if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred10
-
-    // $ANTLR start synpred11
-    public final void synpred11_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1479:4: ( DOUBLE_PIPE and_restr_connective[or] )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1479:4: DOUBLE_PIPE and_restr_connective[or]
-        {
-        match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_synpred114241); if (failed) return ;
-        pushFollow(FOLLOW_and_restr_connective_in_synpred114252);
-        and_restr_connective(or);
-        _fsp--;
-        if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred11
-
-    // $ANTLR start synpred12
-    public final void synpred12_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1501:5: ( DOUBLE_AMPER constraint_expression[and] )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1501:5: DOUBLE_AMPER constraint_expression[and]
-        {
-        match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_synpred124304); if (failed) return ;
-        pushFollow(FOLLOW_constraint_expression_in_synpred124315);
-        constraint_expression(and);
-        _fsp--;
-        if (failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred12
-
-    public final boolean synpred12() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred12_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred4() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred4_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred9() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred9_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred2() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred2_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred3() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred3_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred1() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred1_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred11() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred11_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred5() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred5_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred6() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred6_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-    public final boolean synpred10() {
-        backtracking++;
-        int start = input.mark();
-        try {
-            synpred10_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !failed;
-        input.rewind(start);
-        backtracking--;
-        failed=false;
-        return success;
-    }
-
-
-    protected DFA8 dfa8 = new DFA8(this);
-    protected DFA9 dfa9 = new DFA9(this);
-    protected DFA21 dfa21 = new DFA21(this);
-    protected DFA58 dfa58 = new DFA58(this);
-    static final String DFA8_eotS =
-        "\6\uffff";
-    static final String DFA8_eofS =
-        "\6\uffff";
-    static final String DFA8_minS =
-        "\2\4\1\71\2\uffff\1\4";
-    static final String DFA8_maxS =
-        "\2\106\1\71\2\uffff\1\106";
-    static final String DFA8_acceptS =
-        "\3\uffff\1\2\1\1\1\uffff";
-    static final String DFA8_specialS =
-        "\6\uffff}>";
-    static final String[] DFA8_transitionS = {
-            "\4\1\1\uffff\1\1\4\uffff\1\1\3\uffff\5\1\3\uffff\1\1\1\uffff"+
-            "\1\1\6\uffff\2\1\7\uffff\1\1\5\uffff\4\1\12\uffff\1\1\4\uffff"+
-            "\2\1",
-            "\6\4\1\uffff\2\3\1\uffff\1\4\3\uffff\5\4\3\uffff\1\4\1\uffff"+
-            "\1\4\6\uffff\2\4\7\uffff\1\4\5\uffff\4\4\2\uffff\1\2\7\uffff"+
-            "\1\4\4\uffff\2\4",
-            "\1\5",
-            "",
-            "",
-            "\4\4\1\uffff\1\4\1\uffff\2\3\1\uffff\1\4\3\uffff\5\4\3\uffff"+
-            "\1\4\1\uffff\1\4\6\uffff\2\4\7\uffff\1\4\5\uffff\4\4\2\uffff"+
-            "\1\2\7\uffff\1\4\4\uffff\2\4"
-    };
-
-    static final short[] DFA8_eot = DFA.unpackEncodedString(DFA8_eotS);
-    static final short[] DFA8_eof = DFA.unpackEncodedString(DFA8_eofS);
-    static final char[] DFA8_min = DFA.unpackEncodedStringToUnsignedChars(DFA8_minS);
-    static final char[] DFA8_max = DFA.unpackEncodedStringToUnsignedChars(DFA8_maxS);
-    static final short[] DFA8_accept = DFA.unpackEncodedString(DFA8_acceptS);
-    static final short[] DFA8_special = DFA.unpackEncodedString(DFA8_specialS);
-    static final short[][] DFA8_transition;
-
-    static {
-        int numStates = DFA8_transitionS.length;
-        DFA8_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA8_transition[i] = DFA.unpackEncodedString(DFA8_transitionS[i]);
-        }
-    }
-
-    class DFA8 extends DFA {
-
-        public DFA8(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 8;
-            this.eot = DFA8_eot;
-            this.eof = DFA8_eof;
-            this.min = DFA8_min;
-            this.max = DFA8_max;
-            this.accept = DFA8_accept;
-            this.special = DFA8_special;
-            this.transition = DFA8_transition;
-        }
-        public String getDescription() {
-            return "345:15: (paramType= dotted_name )?";
-        }
-    }
-    static final String DFA9_eotS =
-        "\6\uffff";
-    static final String DFA9_eofS =
-        "\6\uffff";
-    static final String DFA9_minS =
-        "\2\4\1\71\2\uffff\1\4";
-    static final String DFA9_maxS =
-        "\2\106\1\71\2\uffff\1\106";
-    static final String DFA9_acceptS =
-        "\3\uffff\1\2\1\1\1\uffff";
-    static final String DFA9_specialS =
-        "\6\uffff}>";
-    static final String[] DFA9_transitionS = {
-            "\4\1\1\uffff\1\1\4\uffff\1\1\3\uffff\5\1\3\uffff\1\1\1\uffff"+
-            "\1\1\6\uffff\2\1\7\uffff\1\1\5\uffff\4\1\12\uffff\1\1\4\uffff"+
-            "\2\1",
-            "\6\4\1\uffff\2\3\1\uffff\1\4\3\uffff\5\4\3\uffff\1\4\1\uffff"+
-            "\1\4\6\uffff\2\4\7\uffff\1\4\5\uffff\4\4\2\uffff\1\2\7\uffff"+
-            "\1\4\4\uffff\2\4",
-            "\1\5",
-            "",
-            "",
-            "\4\4\1\uffff\1\4\1\uffff\2\3\1\uffff\1\4\3\uffff\5\4\3\uffff"+
-            "\1\4\1\uffff\1\4\6\uffff\2\4\7\uffff\1\4\5\uffff\4\4\2\uffff"+
-            "\1\2\7\uffff\1\4\4\uffff\2\4"
-    };
-
-    static final short[] DFA9_eot = DFA.unpackEncodedString(DFA9_eotS);
-    static final short[] DFA9_eof = DFA.unpackEncodedString(DFA9_eofS);
-    static final char[] DFA9_min = DFA.unpackEncodedStringToUnsignedChars(DFA9_minS);
-    static final char[] DFA9_max = DFA.unpackEncodedStringToUnsignedChars(DFA9_maxS);
-    static final short[] DFA9_accept = DFA.unpackEncodedString(DFA9_acceptS);
-    static final short[] DFA9_special = DFA.unpackEncodedString(DFA9_specialS);
-    static final short[][] DFA9_transition;
-
-    static {
-        int numStates = DFA9_transitionS.length;
-        DFA9_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA9_transition[i] = DFA.unpackEncodedString(DFA9_transitionS[i]);
-        }
-    }
-
-    class DFA9 extends DFA {
-
-        public DFA9(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 9;
-            this.eot = DFA9_eot;
-            this.eof = DFA9_eof;
-            this.min = DFA9_min;
-            this.max = DFA9_max;
-            this.accept = DFA9_accept;
-            this.special = DFA9_special;
-            this.transition = DFA9_transition;
-        }
-        public String getDescription() {
-            return "350:22: (paramType= dotted_name )?";
-        }
-    }
-    static final String DFA21_eotS =
-        "\11\uffff";
-    static final String DFA21_eofS =
-        "\11\uffff";
-    static final String DFA21_minS =
-        "\2\7\1\uffff\1\7\1\uffff\1\4\1\71\2\7";
-    static final String DFA21_maxS =
-        "\2\60\1\uffff\1\70\1\uffff\1\106\1\71\2\70";
-    static final String DFA21_acceptS =
-        "\2\uffff\1\2\1\uffff\1\1\4\uffff";
-    static final String DFA21_specialS =
-        "\11\uffff}>";
-    static final String[] DFA21_transitionS = {
-            "\1\2\2\uffff\1\1\3\uffff\1\2\36\uffff\4\2",
-            "\1\3\2\uffff\1\2\1\uffff\1\4\31\uffff\1\2\1\uffff\1\2\4\uffff"+
-            "\4\2",
-            "",
-            "\1\4\1\5\1\uffff\1\2\2\4\3\uffff\1\2\47\uffff\1\6",
-            "",
-            "\4\7\1\uffff\1\7\4\uffff\1\7\3\uffff\5\7\3\uffff\1\7\1\uffff"+
-            "\1\7\6\uffff\2\7\7\uffff\1\7\5\uffff\4\7\12\uffff\1\7\4\uffff"+
-            "\2\7",
-            "\1\10",
-            "\1\4\1\5\1\uffff\1\2\55\uffff\1\6",
-            "\1\4\2\uffff\1\2\55\uffff\1\6"
-    };
-
-    static final short[] DFA21_eot = DFA.unpackEncodedString(DFA21_eotS);
-    static final short[] DFA21_eof = DFA.unpackEncodedString(DFA21_eofS);
-    static final char[] DFA21_min = DFA.unpackEncodedStringToUnsignedChars(DFA21_minS);
-    static final char[] DFA21_max = DFA.unpackEncodedStringToUnsignedChars(DFA21_maxS);
-    static final short[] DFA21_accept = DFA.unpackEncodedString(DFA21_acceptS);
-    static final short[] DFA21_special = DFA.unpackEncodedString(DFA21_specialS);
-    static final short[][] DFA21_transition;
-
-    static {
-        int numStates = DFA21_transitionS.length;
-        DFA21_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA21_transition[i] = DFA.unpackEncodedString(DFA21_transitionS[i]);
-        }
-    }
-
-    class DFA21 extends DFA {
-
-        public DFA21(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 21;
-            this.eot = DFA21_eot;
-            this.eof = DFA21_eof;
-            this.min = DFA21_min;
-            this.max = DFA21_max;
-            this.accept = DFA21_accept;
-            this.special = DFA21_special;
-            this.transition = DFA21_transition;
-        }
-        public String getDescription() {
-            return "437:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?";
-        }
-    }
-    static final String DFA58_eotS =
-        "\150\uffff";
-    static final String DFA58_eofS =
-        "\150\uffff";
-    static final String DFA58_minS =
-        "\1\7\1\uffff\1\4\1\uffff\2\4\1\0\5\4\2\uffff\4\4\1\0\1\4\1\0\5\4"+
-        "\1\0\1\4\1\0\1\4\2\0\3\4\2\0\1\4\1\0\1\4\2\0\3\4\2\0\1\4\1\0\1\4"+
-        "\2\0\3\4\1\0\3\4\1\0\3\4\1\0\1\4\1\0\1\4\1\uffff\44\0";
-    static final String DFA58_maxS =
-        "\1\121\1\uffff\1\131\1\uffff\2\131\1\0\5\131\2\uffff\4\131\1\0\1"+
-        "\131\1\0\5\131\1\0\1\131\1\0\1\131\2\0\3\131\2\0\1\131\1\0\1\131"+
-        "\2\0\3\131\2\0\1\131\1\0\1\131\2\0\3\131\1\0\3\131\1\0\3\131\1\0"+
-        "\1\131\1\0\1\131\1\uffff\44\0";
-    static final String DFA58_acceptS =
-        "\1\uffff\1\1\1\uffff\1\3\10\uffff\2\2\65\uffff\1\2\44\uffff";
-    static final String DFA58_specialS =
-        "\1\60\1\uffff\1\40\1\uffff\1\61\1\1\1\63\1\0\1\67\1\51\1\4\1\23"+
-        "\2\uffff\1\5\1\16\1\27\1\24\1\66\1\56\1\17\1\3\1\2\1\7\1\76\1\36"+
-        "\1\26\1\22\1\10\1\21\1\52\1\30\1\70\1\43\1\31\1\62\1\14\1\55\1\12"+
-        "\1\54\1\20\1\65\1\50\1\53\1\57\1\47\1\11\1\35\1\41\1\37\1\25\1\42"+
-        "\1\46\1\34\1\75\1\15\1\71\1\44\1\32\1\64\1\72\1\45\1\33\1\74\1\6"+
-        "\1\13\1\73\45\uffff}>";
-    static final String[] DFA58_transitionS = {
-            "\2\3\1\uffff\1\2\2\3\1\uffff\1\3\27\uffff\4\3\3\uffff\4\3\1"+
-            "\uffff\1\3\5\uffff\1\1\14\uffff\1\3\13\uffff\1\3",
-            "",
-            "\3\14\1\13\2\14\1\6\1\14\1\15\31\14\1\5\1\14\1\4\4\14\1\7\1"+
-            "\10\1\11\1\12\51\14",
-            "",
-            "\3\14\1\23\2\14\1\22\1\14\1\15\40\14\1\16\1\17\1\20\1\21\51"+
-            "\14",
-            "\3\14\1\31\2\14\1\24\1\14\1\15\40\14\1\25\1\26\1\27\1\30\51"+
-            "\14",
-            "\1\uffff",
-            "\3\14\1\33\2\14\1\32\1\14\1\15\115\14",
-            "\3\14\1\35\2\14\1\34\1\14\1\15\115\14",
-            "\6\14\1\36\1\14\1\15\115\14",
-            "\6\14\1\37\1\14\1\15\115\14",
-            "\4\14\1\41\1\14\1\43\1\14\1\15\3\14\1\40\47\14\1\42\41\14",
-            "",
-            "",
-            "\3\14\1\45\2\14\1\44\1\14\1\15\115\14",
-            "\3\14\1\47\2\14\1\46\1\14\1\15\115\14",
-            "\6\14\1\50\1\14\1\15\115\14",
-            "\6\14\1\51\1\14\1\15\115\14",
-            "\1\uffff",
-            "\4\14\1\53\1\14\1\55\1\14\1\15\3\14\1\52\47\14\1\54\41\14",
-            "\1\uffff",
-            "\3\14\1\57\2\14\1\56\1\14\1\15\115\14",
-            "\3\14\1\61\2\14\1\60\1\14\1\15\115\14",
-            "\6\14\1\62\1\14\1\15\115\14",
-            "\6\14\1\63\1\14\1\15\115\14",
-            "\4\14\1\65\1\14\1\67\1\14\1\15\3\14\1\64\47\14\1\66\41\14",
-            "\1\uffff",
-            "\4\14\1\71\1\14\1\73\1\14\1\15\3\14\1\70\47\14\1\72\41\14",
-            "\1\uffff",
-            "\4\14\1\75\1\14\1\77\1\14\1\15\3\14\1\74\47\14\1\76\41\14",
-            "\1\uffff",
-            "\1\uffff",
-            "\3\14\1\100\2\14\1\101\1\14\1\15\115\14",
-            "\4\102\1\14\1\102\1\103\1\14\1\15\1\14\1\102\3\14\5\102\3\14"+
-            "\1\102\1\14\1\102\6\14\2\102\7\14\1\102\5\14\4\102\12\14\1\102"+
-            "\4\14\2\102\23\14",
-            "\6\14\1\103\1\14\1\15\54\14\1\104\40\14",
-            "\1\uffff",
-            "\1\uffff",
-            "\4\14\1\106\1\14\1\110\1\14\1\15\3\14\1\105\47\14\1\107\41\14",
-            "\1\uffff",
-            "\4\14\1\112\1\14\1\114\1\14\1\15\3\14\1\111\47\14\1\113\41\14",
-            "\1\uffff",
-            "\1\uffff",
-            "\3\14\1\115\2\14\1\116\1\14\1\15\115\14",
-            "\4\117\1\14\1\117\1\103\1\14\1\15\1\14\1\117\3\14\5\117\3\14"+
-            "\1\117\1\14\1\117\6\14\2\117\7\14\1\117\5\14\4\117\12\14\1\117"+
-            "\4\14\2\117\23\14",
-            "\6\14\1\103\1\14\1\15\54\14\1\120\40\14",
-            "\1\uffff",
-            "\1\uffff",
-            "\4\14\1\122\1\14\1\124\1\14\1\15\3\14\1\121\47\14\1\123\41\14",
-            "\1\uffff",
-            "\4\14\1\126\1\14\1\130\1\14\1\15\3\14\1\125\47\14\1\127\41\14",
-            "\1\uffff",
-            "\1\uffff",
-            "\3\14\1\131\2\14\1\132\1\14\1\15\115\14",
-            "\4\133\1\14\1\133\1\103\1\14\1\15\1\14\1\133\3\14\5\133\3\14"+
-            "\1\133\1\14\1\133\6\14\2\133\7\14\1\133\5\14\4\133\12\14\1\133"+
-            "\4\14\2\133\23\14",
-            "\6\14\1\103\1\14\1\15\54\14\1\134\40\14",
-            "\1\uffff",
-            "\3\14\1\135\2\14\1\136\1\14\1\15\115\14",
-            "\4\137\1\14\1\137\1\103\1\14\1\15\1\14\1\137\3\14\5\137\3\14"+
-            "\1\137\1\14\1\137\6\14\2\137\7\14\1\137\5\14\4\137\12\14\1\137"+
-            "\4\14\2\137\23\14",
-            "\6\14\1\103\1\14\1\15\54\14\1\140\40\14",
-            "\1\uffff",
-            "\3\14\1\141\2\14\1\142\1\14\1\15\115\14",
-            "\4\143\1\14\1\143\1\103\1\14\1\15\1\14\1\143\3\14\5\143\3\14"+
-            "\1\143\1\14\1\143\6\14\2\143\7\14\1\143\5\14\4\143\12\14\1\143"+
-            "\4\14\2\143\23\14",
-            "\6\14\1\103\1\14\1\15\54\14\1\144\40\14",
-            "\1\uffff",
-            "\4\14\1\145\1\14\1\147\1\14\1\15\53\14\1\146\41\14",
-            "\1\uffff",
-            "\4\14\1\41\1\14\1\43\1\14\1\15\53\14\1\42\41\14",
-            "",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff",
-            "\1\uffff"
-    };
-
-    static final short[] DFA58_eot = DFA.unpackEncodedString(DFA58_eotS);
-    static final short[] DFA58_eof = DFA.unpackEncodedString(DFA58_eofS);
-    static final char[] DFA58_min = DFA.unpackEncodedStringToUnsignedChars(DFA58_minS);
-    static final char[] DFA58_max = DFA.unpackEncodedStringToUnsignedChars(DFA58_maxS);
-    static final short[] DFA58_accept = DFA.unpackEncodedString(DFA58_acceptS);
-    static final short[] DFA58_special = DFA.unpackEncodedString(DFA58_specialS);
-    static final short[][] DFA58_transition;
-
-    static {
-        int numStates = DFA58_transitionS.length;
-        DFA58_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA58_transition[i] = DFA.unpackEncodedString(DFA58_transitionS[i]);
-        }
-    }
-
-    class DFA58 extends DFA {
-
-        public DFA58(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 58;
-            this.eot = DFA58_eot;
-            this.eof = DFA58_eof;
-            this.min = DFA58_min;
-            this.max = DFA58_max;
-            this.accept = DFA58_accept;
-            this.special = DFA58_special;
-            this.transition = DFA58_transition;
-        }
-        public String getDescription() {
-            return "1148:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?";
-        }
-        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
-        	int _s = s;
-            switch ( s ) {
-                    case 0 : 
-                        int LA58_7 = input.LA(1);
-
-                         
-                        int index58_7 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_7==LEFT_PAREN) ) {s = 26;}
-
-                        else if ( (LA58_7==ID) ) {s = 27;}
-
-                        else if ( (LA58_7==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_7>=PACKAGE && LA58_7<=FUNCTION)||(LA58_7>=DOT && LA58_7<=GLOBAL)||LA58_7==COMMA||(LA58_7>=DECLARE && LA58_7<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_7);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 1 : 
-                        int LA58_5 = input.LA(1);
-
-                         
-                        int index58_5 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_5==LEFT_PAREN) ) {s = 20;}
-
-                        else if ( (LA58_5==EXISTS) ) {s = 21;}
-
-                        else if ( (LA58_5==NOT) ) {s = 22;}
-
-                        else if ( (LA58_5==EVAL) ) {s = 23;}
-
-                        else if ( (LA58_5==FORALL) ) {s = 24;}
-
-                        else if ( (LA58_5==ID) ) {s = 25;}
-
-                        else if ( (LA58_5==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_5>=PACKAGE && LA58_5<=FUNCTION)||(LA58_5>=DOT && LA58_5<=GLOBAL)||LA58_5==COMMA||(LA58_5>=DECLARE && LA58_5<=FROM)||(LA58_5>=ACCUMULATE && LA58_5<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_5);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 2 : 
-                        int LA58_22 = input.LA(1);
-
-                         
-                        int index58_22 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_22==LEFT_PAREN) ) {s = 48;}
-
-                        else if ( (LA58_22==ID) ) {s = 49;}
-
-                        else if ( (LA58_22==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_22>=PACKAGE && LA58_22<=FUNCTION)||(LA58_22>=DOT && LA58_22<=GLOBAL)||LA58_22==COMMA||(LA58_22>=DECLARE && LA58_22<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_22);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 3 : 
-                        int LA58_21 = input.LA(1);
-
-                         
-                        int index58_21 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_21==LEFT_PAREN) ) {s = 46;}
-
-                        else if ( (LA58_21==ID) ) {s = 47;}
-
-                        else if ( (LA58_21==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_21>=PACKAGE && LA58_21<=FUNCTION)||(LA58_21>=DOT && LA58_21<=GLOBAL)||LA58_21==COMMA||(LA58_21>=DECLARE && LA58_21<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_21);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 4 : 
-                        int LA58_10 = input.LA(1);
-
-                         
-                        int index58_10 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_10==LEFT_PAREN) ) {s = 31;}
-
-                        else if ( (LA58_10==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_10>=PACKAGE && LA58_10<=GLOBAL)||LA58_10==COMMA||(LA58_10>=DECLARE && LA58_10<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_10);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 5 : 
-                        int LA58_14 = input.LA(1);
-
-                         
-                        int index58_14 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_14==LEFT_PAREN) ) {s = 36;}
-
-                        else if ( (LA58_14==ID) ) {s = 37;}
-
-                        else if ( (LA58_14==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_14>=PACKAGE && LA58_14<=FUNCTION)||(LA58_14>=DOT && LA58_14<=GLOBAL)||LA58_14==COMMA||(LA58_14>=DECLARE && LA58_14<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_14);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 6 : 
-                        int LA58_64 = input.LA(1);
-
-                         
-                        int index58_64 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_64==DOT) ) {s = 101;}
-
-                        else if ( (LA58_64==LEFT_SQUARE) ) {s = 102;}
-
-                        else if ( (LA58_64==LEFT_PAREN) ) {s = 103;}
-
-                        else if ( (LA58_64==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_64>=PACKAGE && LA58_64<=ID)||LA58_64==GLOBAL||LA58_64==COMMA||(LA58_64>=DECLARE && LA58_64<=ENTRY_POINT)||(LA58_64>=RIGHT_SQUARE && LA58_64<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_64);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 7 : 
-                        int LA58_23 = input.LA(1);
-
-                         
-                        int index58_23 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_23==LEFT_PAREN) ) {s = 50;}
-
-                        else if ( (LA58_23==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_23>=PACKAGE && LA58_23<=GLOBAL)||LA58_23==COMMA||(LA58_23>=DECLARE && LA58_23<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_23);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 8 : 
-                        int LA58_28 = input.LA(1);
-
-                         
-                        int index58_28 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_28);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 9 : 
-                        int LA58_46 = input.LA(1);
-
-                         
-                        int index58_46 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_46);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 10 : 
-                        int LA58_38 = input.LA(1);
-
-                         
-                        int index58_38 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_38);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 11 : 
-                        int LA58_65 = input.LA(1);
-
-                         
-                        int index58_65 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_65);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 12 : 
-                        int LA58_36 = input.LA(1);
-
-                         
-                        int index58_36 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_36);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 13 : 
-                        int LA58_55 = input.LA(1);
-
-                         
-                        int index58_55 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_55);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 14 : 
-                        int LA58_15 = input.LA(1);
-
-                         
-                        int index58_15 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_15==LEFT_PAREN) ) {s = 38;}
-
-                        else if ( (LA58_15==ID) ) {s = 39;}
-
-                        else if ( (LA58_15==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_15>=PACKAGE && LA58_15<=FUNCTION)||(LA58_15>=DOT && LA58_15<=GLOBAL)||LA58_15==COMMA||(LA58_15>=DECLARE && LA58_15<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_15);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 15 : 
-                        int LA58_20 = input.LA(1);
-
-                         
-                        int index58_20 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_20);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 16 : 
-                        int LA58_40 = input.LA(1);
-
-                         
-                        int index58_40 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_40);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 17 : 
-                        int LA58_29 = input.LA(1);
-
-                         
-                        int index58_29 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_29==COLON) ) {s = 60;}
-
-                        else if ( (LA58_29==DOT) ) {s = 61;}
-
-                        else if ( (LA58_29==LEFT_SQUARE) ) {s = 62;}
-
-                        else if ( (LA58_29==LEFT_PAREN) ) {s = 63;}
-
-                        else if ( (LA58_29==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_29>=PACKAGE && LA58_29<=ID)||LA58_29==GLOBAL||LA58_29==COMMA||(LA58_29>=DECLARE && LA58_29<=AT)||(LA58_29>=EQUALS && LA58_29<=ENTRY_POINT)||(LA58_29>=RIGHT_SQUARE && LA58_29<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_29);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 18 : 
-                        int LA58_27 = input.LA(1);
-
-                         
-                        int index58_27 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_27==COLON) ) {s = 56;}
-
-                        else if ( (LA58_27==DOT) ) {s = 57;}
-
-                        else if ( (LA58_27==LEFT_SQUARE) ) {s = 58;}
-
-                        else if ( (LA58_27==LEFT_PAREN) ) {s = 59;}
-
-                        else if ( (LA58_27==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_27>=PACKAGE && LA58_27<=ID)||LA58_27==GLOBAL||LA58_27==COMMA||(LA58_27>=DECLARE && LA58_27<=AT)||(LA58_27>=EQUALS && LA58_27<=ENTRY_POINT)||(LA58_27>=RIGHT_SQUARE && LA58_27<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_27);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 19 : 
-                        int LA58_11 = input.LA(1);
-
-                         
-                        int index58_11 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_11==COLON) ) {s = 32;}
-
-                        else if ( (LA58_11==DOT) ) {s = 33;}
-
-                        else if ( (LA58_11==LEFT_SQUARE) ) {s = 34;}
-
-                        else if ( (LA58_11==LEFT_PAREN) ) {s = 35;}
-
-                        else if ( (LA58_11==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_11>=PACKAGE && LA58_11<=ID)||LA58_11==GLOBAL||LA58_11==COMMA||(LA58_11>=DECLARE && LA58_11<=AT)||(LA58_11>=EQUALS && LA58_11<=ENTRY_POINT)||(LA58_11>=RIGHT_SQUARE && LA58_11<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_11);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 20 : 
-                        int LA58_17 = input.LA(1);
-
-                         
-                        int index58_17 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_17==LEFT_PAREN) ) {s = 41;}
-
-                        else if ( (LA58_17==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_17>=PACKAGE && LA58_17<=GLOBAL)||LA58_17==COMMA||(LA58_17>=DECLARE && LA58_17<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_17);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 21 : 
-                        int LA58_50 = input.LA(1);
-
-                         
-                        int index58_50 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_50);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 22 : 
-                        int LA58_26 = input.LA(1);
-
-                         
-                        int index58_26 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_26);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 23 : 
-                        int LA58_16 = input.LA(1);
-
-                         
-                        int index58_16 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_16==LEFT_PAREN) ) {s = 40;}
-
-                        else if ( (LA58_16==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_16>=PACKAGE && LA58_16<=GLOBAL)||LA58_16==COMMA||(LA58_16>=DECLARE && LA58_16<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_16);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 24 : 
-                        int LA58_31 = input.LA(1);
-
-                         
-                        int index58_31 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_31);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 25 : 
-                        int LA58_34 = input.LA(1);
-
-                         
-                        int index58_34 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_34==RIGHT_SQUARE) ) {s = 68;}
-
-                        else if ( (LA58_34==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_34>=PACKAGE && LA58_34<=GLOBAL)||LA58_34==COMMA||(LA58_34>=DECLARE && LA58_34<=LEFT_SQUARE)||(LA58_34>=CONTAINS && LA58_34<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_34==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_34);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 26 : 
-                        int LA58_58 = input.LA(1);
-
-                         
-                        int index58_58 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_58==RIGHT_SQUARE) ) {s = 96;}
-
-                        else if ( (LA58_58==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_58>=PACKAGE && LA58_58<=GLOBAL)||LA58_58==COMMA||(LA58_58>=DECLARE && LA58_58<=LEFT_SQUARE)||(LA58_58>=CONTAINS && LA58_58<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_58==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_58);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 27 : 
-                        int LA58_62 = input.LA(1);
-
-                         
-                        int index58_62 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_62==RIGHT_SQUARE) ) {s = 100;}
-
-                        else if ( (LA58_62==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_62>=PACKAGE && LA58_62<=GLOBAL)||LA58_62==COMMA||(LA58_62>=DECLARE && LA58_62<=LEFT_SQUARE)||(LA58_62>=CONTAINS && LA58_62<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_62==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_62);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 28 : 
-                        int LA58_53 = input.LA(1);
-
-                         
-                        int index58_53 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( ((LA58_53>=PACKAGE && LA58_53<=ID)||LA58_53==GLOBAL||LA58_53==END||(LA58_53>=QUERY && LA58_53<=ATTRIBUTES)||LA58_53==ENABLED||LA58_53==SALIENCE||(LA58_53>=DURATION && LA58_53<=DIALECT)||LA58_53==FROM||(LA58_53>=INIT && LA58_53<=RESULT)||LA58_53==IN||(LA58_53>=THEN && LA58_53<=EVENT)) ) {s = 91;}
-
-                        else if ( (LA58_53==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( (LA58_53==DOT||LA58_53==COMMA||LA58_53==DECLARE||(LA58_53>=AT && LA58_53<=EQUALS)||(LA58_53>=DATE_EFFECTIVE && LA58_53<=DATE_EXPIRES)||LA58_53==BOOL||(LA58_53>=INT && LA58_53<=AGENDA_GROUP)||(LA58_53>=LOCK_ON_ACTIVE && LA58_53<=WINDOW)||(LA58_53>=EXISTS && LA58_53<=ACCUMULATE)||(LA58_53>=COLLECT && LA58_53<=TILDE)||(LA58_53>=FLOAT && LA58_53<=RIGHT_CURLY)||(LA58_53>=EOL && LA58_53<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_53==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_53);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 29 : 
-                        int LA58_47 = input.LA(1);
-
-                         
-                        int index58_47 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_47==COLON) ) {s = 81;}
-
-                        else if ( (LA58_47==DOT) ) {s = 82;}
-
-                        else if ( (LA58_47==LEFT_SQUARE) ) {s = 83;}
-
-                        else if ( (LA58_47==LEFT_PAREN) ) {s = 84;}
-
-                        else if ( (LA58_47==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_47>=PACKAGE && LA58_47<=ID)||LA58_47==GLOBAL||LA58_47==COMMA||(LA58_47>=DECLARE && LA58_47<=AT)||(LA58_47>=EQUALS && LA58_47<=ENTRY_POINT)||(LA58_47>=RIGHT_SQUARE && LA58_47<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_47);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 30 : 
-                        int LA58_25 = input.LA(1);
-
-                         
-                        int index58_25 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_25==COLON) ) {s = 52;}
-
-                        else if ( (LA58_25==DOT) ) {s = 53;}
-
-                        else if ( (LA58_25==LEFT_SQUARE) ) {s = 54;}
-
-                        else if ( (LA58_25==LEFT_PAREN) ) {s = 55;}
-
-                        else if ( (LA58_25==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_25>=PACKAGE && LA58_25<=ID)||LA58_25==GLOBAL||LA58_25==COMMA||(LA58_25>=DECLARE && LA58_25<=AT)||(LA58_25>=EQUALS && LA58_25<=ENTRY_POINT)||(LA58_25>=RIGHT_SQUARE && LA58_25<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_25);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 31 : 
-                        int LA58_49 = input.LA(1);
-
-                         
-                        int index58_49 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_49==COLON) ) {s = 85;}
-
-                        else if ( (LA58_49==DOT) ) {s = 86;}
-
-                        else if ( (LA58_49==LEFT_SQUARE) ) {s = 87;}
-
-                        else if ( (LA58_49==LEFT_PAREN) ) {s = 88;}
-
-                        else if ( (LA58_49==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_49>=PACKAGE && LA58_49<=ID)||LA58_49==GLOBAL||LA58_49==COMMA||(LA58_49>=DECLARE && LA58_49<=AT)||(LA58_49>=EQUALS && LA58_49<=ENTRY_POINT)||(LA58_49>=RIGHT_SQUARE && LA58_49<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_49);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 32 : 
-                        int LA58_2 = input.LA(1);
-
-                         
-                        int index58_2 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_2==AND) ) {s = 4;}
-
-                        else if ( (LA58_2==OR) ) {s = 5;}
-
-                        else if ( (LA58_2==LEFT_PAREN) ) {s = 6;}
-
-                        else if ( (LA58_2==EXISTS) ) {s = 7;}
-
-                        else if ( (LA58_2==NOT) ) {s = 8;}
-
-                        else if ( (LA58_2==EVAL) ) {s = 9;}
-
-                        else if ( (LA58_2==FORALL) ) {s = 10;}
-
-                        else if ( (LA58_2==ID) ) {s = 11;}
-
-                        else if ( ((LA58_2>=PACKAGE && LA58_2<=FUNCTION)||(LA58_2>=DOT && LA58_2<=GLOBAL)||LA58_2==COMMA||(LA58_2>=DECLARE && LA58_2<=LOCK_ON_ACTIVE)||LA58_2==DOUBLE_PIPE||(LA58_2>=DOUBLE_AMPER && LA58_2<=FROM)||(LA58_2>=ACCUMULATE && LA58_2<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_2==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                         
-                        input.seek(index58_2);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 33 : 
-                        int LA58_48 = input.LA(1);
-
-                         
-                        int index58_48 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_48);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 34 : 
-                        int LA58_51 = input.LA(1);
-
-                         
-                        int index58_51 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_51);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 35 : 
-                        int LA58_33 = input.LA(1);
-
-                         
-                        int index58_33 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( ((LA58_33>=PACKAGE && LA58_33<=ID)||LA58_33==GLOBAL||LA58_33==END||(LA58_33>=QUERY && LA58_33<=ATTRIBUTES)||LA58_33==ENABLED||LA58_33==SALIENCE||(LA58_33>=DURATION && LA58_33<=DIALECT)||LA58_33==FROM||(LA58_33>=INIT && LA58_33<=RESULT)||LA58_33==IN||(LA58_33>=THEN && LA58_33<=EVENT)) ) {s = 66;}
-
-                        else if ( (LA58_33==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( (LA58_33==DOT||LA58_33==COMMA||LA58_33==DECLARE||(LA58_33>=AT && LA58_33<=EQUALS)||(LA58_33>=DATE_EFFECTIVE && LA58_33<=DATE_EXPIRES)||LA58_33==BOOL||(LA58_33>=INT && LA58_33<=AGENDA_GROUP)||(LA58_33>=LOCK_ON_ACTIVE && LA58_33<=WINDOW)||(LA58_33>=EXISTS && LA58_33<=ACCUMULATE)||(LA58_33>=COLLECT && LA58_33<=TILDE)||(LA58_33>=FLOAT && LA58_33<=RIGHT_CURLY)||(LA58_33>=EOL && LA58_33<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_33==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_33);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 36 : 
-                        int LA58_57 = input.LA(1);
-
-                         
-                        int index58_57 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( ((LA58_57>=PACKAGE && LA58_57<=ID)||LA58_57==GLOBAL||LA58_57==END||(LA58_57>=QUERY && LA58_57<=ATTRIBUTES)||LA58_57==ENABLED||LA58_57==SALIENCE||(LA58_57>=DURATION && LA58_57<=DIALECT)||LA58_57==FROM||(LA58_57>=INIT && LA58_57<=RESULT)||LA58_57==IN||(LA58_57>=THEN && LA58_57<=EVENT)) ) {s = 95;}
-
-                        else if ( (LA58_57==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( (LA58_57==DOT||LA58_57==COMMA||LA58_57==DECLARE||(LA58_57>=AT && LA58_57<=EQUALS)||(LA58_57>=DATE_EFFECTIVE && LA58_57<=DATE_EXPIRES)||LA58_57==BOOL||(LA58_57>=INT && LA58_57<=AGENDA_GROUP)||(LA58_57>=LOCK_ON_ACTIVE && LA58_57<=WINDOW)||(LA58_57>=EXISTS && LA58_57<=ACCUMULATE)||(LA58_57>=COLLECT && LA58_57<=TILDE)||(LA58_57>=FLOAT && LA58_57<=RIGHT_CURLY)||(LA58_57>=EOL && LA58_57<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_57==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_57);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 37 : 
-                        int LA58_61 = input.LA(1);
-
-                         
-                        int index58_61 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( ((LA58_61>=PACKAGE && LA58_61<=ID)||LA58_61==GLOBAL||LA58_61==END||(LA58_61>=QUERY && LA58_61<=ATTRIBUTES)||LA58_61==ENABLED||LA58_61==SALIENCE||(LA58_61>=DURATION && LA58_61<=DIALECT)||LA58_61==FROM||(LA58_61>=INIT && LA58_61<=RESULT)||LA58_61==IN||(LA58_61>=THEN && LA58_61<=EVENT)) ) {s = 99;}
-
-                        else if ( (LA58_61==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( (LA58_61==DOT||LA58_61==COMMA||LA58_61==DECLARE||(LA58_61>=AT && LA58_61<=EQUALS)||(LA58_61>=DATE_EFFECTIVE && LA58_61<=DATE_EXPIRES)||LA58_61==BOOL||(LA58_61>=INT && LA58_61<=AGENDA_GROUP)||(LA58_61>=LOCK_ON_ACTIVE && LA58_61<=WINDOW)||(LA58_61>=EXISTS && LA58_61<=ACCUMULATE)||(LA58_61>=COLLECT && LA58_61<=TILDE)||(LA58_61>=FLOAT && LA58_61<=RIGHT_CURLY)||(LA58_61>=EOL && LA58_61<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_61==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_61);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 38 : 
-                        int LA58_52 = input.LA(1);
-
-                         
-                        int index58_52 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_52==ID) ) {s = 89;}
-
-                        else if ( (LA58_52==LEFT_PAREN) ) {s = 90;}
-
-                        else if ( (LA58_52==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_52>=PACKAGE && LA58_52<=FUNCTION)||(LA58_52>=DOT && LA58_52<=GLOBAL)||LA58_52==COMMA||(LA58_52>=DECLARE && LA58_52<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_52);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 39 : 
-                        int LA58_45 = input.LA(1);
-
-                         
-                        int index58_45 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_45);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 40 : 
-                        int LA58_42 = input.LA(1);
-
-                         
-                        int index58_42 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_42==ID) ) {s = 77;}
-
-                        else if ( (LA58_42==LEFT_PAREN) ) {s = 78;}
-
-                        else if ( (LA58_42==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_42>=PACKAGE && LA58_42<=FUNCTION)||(LA58_42>=DOT && LA58_42<=GLOBAL)||LA58_42==COMMA||(LA58_42>=DECLARE && LA58_42<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_42);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 41 : 
-                        int LA58_9 = input.LA(1);
-
-                         
-                        int index58_9 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_9==LEFT_PAREN) ) {s = 30;}
-
-                        else if ( (LA58_9==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_9>=PACKAGE && LA58_9<=GLOBAL)||LA58_9==COMMA||(LA58_9>=DECLARE && LA58_9<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_9);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 42 : 
-                        int LA58_30 = input.LA(1);
-
-                         
-                        int index58_30 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_30);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 43 : 
-                        int LA58_43 = input.LA(1);
-
-                         
-                        int index58_43 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( ((LA58_43>=PACKAGE && LA58_43<=ID)||LA58_43==GLOBAL||LA58_43==END||(LA58_43>=QUERY && LA58_43<=ATTRIBUTES)||LA58_43==ENABLED||LA58_43==SALIENCE||(LA58_43>=DURATION && LA58_43<=DIALECT)||LA58_43==FROM||(LA58_43>=INIT && LA58_43<=RESULT)||LA58_43==IN||(LA58_43>=THEN && LA58_43<=EVENT)) ) {s = 79;}
-
-                        else if ( (LA58_43==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( (LA58_43==DOT||LA58_43==COMMA||LA58_43==DECLARE||(LA58_43>=AT && LA58_43<=EQUALS)||(LA58_43>=DATE_EFFECTIVE && LA58_43<=DATE_EXPIRES)||LA58_43==BOOL||(LA58_43>=INT && LA58_43<=AGENDA_GROUP)||(LA58_43>=LOCK_ON_ACTIVE && LA58_43<=WINDOW)||(LA58_43>=EXISTS && LA58_43<=ACCUMULATE)||(LA58_43>=COLLECT && LA58_43<=TILDE)||(LA58_43>=FLOAT && LA58_43<=RIGHT_CURLY)||(LA58_43>=EOL && LA58_43<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_43==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_43);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 44 : 
-                        int LA58_39 = input.LA(1);
-
-                         
-                        int index58_39 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_39==COLON) ) {s = 73;}
-
-                        else if ( (LA58_39==DOT) ) {s = 74;}
-
-                        else if ( (LA58_39==LEFT_SQUARE) ) {s = 75;}
-
-                        else if ( (LA58_39==LEFT_PAREN) ) {s = 76;}
-
-                        else if ( (LA58_39==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_39>=PACKAGE && LA58_39<=ID)||LA58_39==GLOBAL||LA58_39==COMMA||(LA58_39>=DECLARE && LA58_39<=AT)||(LA58_39>=EQUALS && LA58_39<=ENTRY_POINT)||(LA58_39>=RIGHT_SQUARE && LA58_39<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_39);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 45 : 
-                        int LA58_37 = input.LA(1);
-
-                         
-                        int index58_37 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_37==COLON) ) {s = 69;}
-
-                        else if ( (LA58_37==DOT) ) {s = 70;}
-
-                        else if ( (LA58_37==LEFT_SQUARE) ) {s = 71;}
-
-                        else if ( (LA58_37==LEFT_PAREN) ) {s = 72;}
-
-                        else if ( (LA58_37==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_37>=PACKAGE && LA58_37<=ID)||LA58_37==GLOBAL||LA58_37==COMMA||(LA58_37>=DECLARE && LA58_37<=AT)||(LA58_37>=EQUALS && LA58_37<=ENTRY_POINT)||(LA58_37>=RIGHT_SQUARE && LA58_37<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_37);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 46 : 
-                        int LA58_19 = input.LA(1);
-
-                         
-                        int index58_19 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_19==COLON) ) {s = 42;}
-
-                        else if ( (LA58_19==DOT) ) {s = 43;}
-
-                        else if ( (LA58_19==LEFT_SQUARE) ) {s = 44;}
-
-                        else if ( (LA58_19==LEFT_PAREN) ) {s = 45;}
-
-                        else if ( (LA58_19==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_19>=PACKAGE && LA58_19<=ID)||LA58_19==GLOBAL||LA58_19==COMMA||(LA58_19>=DECLARE && LA58_19<=AT)||(LA58_19>=EQUALS && LA58_19<=ENTRY_POINT)||(LA58_19>=RIGHT_SQUARE && LA58_19<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_19);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 47 : 
-                        int LA58_44 = input.LA(1);
-
-                         
-                        int index58_44 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_44==RIGHT_SQUARE) ) {s = 80;}
-
-                        else if ( (LA58_44==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_44>=PACKAGE && LA58_44<=GLOBAL)||LA58_44==COMMA||(LA58_44>=DECLARE && LA58_44<=LEFT_SQUARE)||(LA58_44>=CONTAINS && LA58_44<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_44==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_44);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 48 : 
-                        int LA58_0 = input.LA(1);
-
-                         
-                        int index58_0 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_0==LEFT_SQUARE) && (synpred9())) {s = 1;}
-
-                        else if ( (LA58_0==LEFT_PAREN) ) {s = 2;}
-
-                        else if ( ((LA58_0>=ID && LA58_0<=DOT)||(LA58_0>=COMMA && LA58_0<=RIGHT_PAREN)||LA58_0==END||(LA58_0>=OR && LA58_0<=DOUBLE_AMPER)||(LA58_0>=EXISTS && LA58_0<=FORALL)||LA58_0==INIT||LA58_0==THEN||LA58_0==81) ) {s = 3;}
-
-                         
-                        input.seek(index58_0);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 49 : 
-                        int LA58_4 = input.LA(1);
-
-                         
-                        int index58_4 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_4==EXISTS) ) {s = 14;}
-
-                        else if ( (LA58_4==NOT) ) {s = 15;}
-
-                        else if ( (LA58_4==EVAL) ) {s = 16;}
-
-                        else if ( (LA58_4==FORALL) ) {s = 17;}
-
-                        else if ( (LA58_4==LEFT_PAREN) ) {s = 18;}
-
-                        else if ( (LA58_4==ID) ) {s = 19;}
-
-                        else if ( (LA58_4==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_4>=PACKAGE && LA58_4<=FUNCTION)||(LA58_4>=DOT && LA58_4<=GLOBAL)||LA58_4==COMMA||(LA58_4>=DECLARE && LA58_4<=FROM)||(LA58_4>=ACCUMULATE && LA58_4<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_4);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 50 : 
-                        int LA58_35 = input.LA(1);
-
-                         
-                        int index58_35 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_35);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 51 : 
-                        int LA58_6 = input.LA(1);
-
-                         
-                        int index58_6 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_6);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 52 : 
-                        int LA58_59 = input.LA(1);
-
-                         
-                        int index58_59 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_59);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 53 : 
-                        int LA58_41 = input.LA(1);
-
-                         
-                        int index58_41 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_41);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 54 : 
-                        int LA58_18 = input.LA(1);
-
-                         
-                        int index58_18 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 13;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_18);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 55 : 
-                        int LA58_8 = input.LA(1);
-
-                         
-                        int index58_8 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_8==LEFT_PAREN) ) {s = 28;}
-
-                        else if ( (LA58_8==ID) ) {s = 29;}
-
-                        else if ( (LA58_8==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_8>=PACKAGE && LA58_8<=FUNCTION)||(LA58_8>=DOT && LA58_8<=GLOBAL)||LA58_8==COMMA||(LA58_8>=DECLARE && LA58_8<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_8);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 56 : 
-                        int LA58_32 = input.LA(1);
-
-                         
-                        int index58_32 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_32==ID) ) {s = 64;}
-
-                        else if ( (LA58_32==LEFT_PAREN) ) {s = 65;}
-
-                        else if ( (LA58_32==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_32>=PACKAGE && LA58_32<=FUNCTION)||(LA58_32>=DOT && LA58_32<=GLOBAL)||LA58_32==COMMA||(LA58_32>=DECLARE && LA58_32<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_32);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 57 : 
-                        int LA58_56 = input.LA(1);
-
-                         
-                        int index58_56 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_56==ID) ) {s = 93;}
-
-                        else if ( (LA58_56==LEFT_PAREN) ) {s = 94;}
-
-                        else if ( (LA58_56==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_56>=PACKAGE && LA58_56<=FUNCTION)||(LA58_56>=DOT && LA58_56<=GLOBAL)||LA58_56==COMMA||(LA58_56>=DECLARE && LA58_56<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_56);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 58 : 
-                        int LA58_60 = input.LA(1);
-
-                         
-                        int index58_60 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_60==ID) ) {s = 97;}
-
-                        else if ( (LA58_60==LEFT_PAREN) ) {s = 98;}
-
-                        else if ( (LA58_60==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_60>=PACKAGE && LA58_60<=FUNCTION)||(LA58_60>=DOT && LA58_60<=GLOBAL)||LA58_60==COMMA||(LA58_60>=DECLARE && LA58_60<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_60);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 59 : 
-                        int LA58_66 = input.LA(1);
-
-                         
-                        int index58_66 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_66==LEFT_SQUARE) ) {s = 34;}
-
-                        else if ( (LA58_66==LEFT_PAREN) ) {s = 35;}
-
-                        else if ( (LA58_66==DOT) ) {s = 33;}
-
-                        else if ( (LA58_66==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_66>=PACKAGE && LA58_66<=ID)||LA58_66==GLOBAL||LA58_66==COMMA||(LA58_66>=DECLARE && LA58_66<=ENTRY_POINT)||(LA58_66>=RIGHT_SQUARE && LA58_66<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_66);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 60 : 
-                        int LA58_63 = input.LA(1);
-
-                         
-                        int index58_63 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred10()) ) {s = 67;}
-
-                        else if ( (true) ) {s = 3;}
-
-                         
-                        input.seek(index58_63);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 61 : 
-                        int LA58_54 = input.LA(1);
-
-                         
-                        int index58_54 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_54==RIGHT_SQUARE) ) {s = 92;}
-
-                        else if ( (LA58_54==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_54>=PACKAGE && LA58_54<=GLOBAL)||LA58_54==COMMA||(LA58_54>=DECLARE && LA58_54<=LEFT_SQUARE)||(LA58_54>=CONTAINS && LA58_54<=89)) && (synpred10())) {s = 12;}
-
-                        else if ( (LA58_54==LEFT_PAREN) && (synpred10())) {s = 67;}
-
-                         
-                        input.seek(index58_54);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 62 : 
-                        int LA58_24 = input.LA(1);
-
-                         
-                        int index58_24 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA58_24==LEFT_PAREN) ) {s = 51;}
-
-                        else if ( (LA58_24==RIGHT_PAREN) && (synpred10())) {s = 13;}
-
-                        else if ( ((LA58_24>=PACKAGE && LA58_24<=GLOBAL)||LA58_24==COMMA||(LA58_24>=DECLARE && LA58_24<=89)) && (synpred10())) {s = 12;}
-
-                         
-                        input.seek(index58_24);
-                        if ( s>=0 ) return s;
-                        break;
-            }
-            if (backtracking>0) {failed=true; return -1;}
-            NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 58, _s, input);
-            error(nvae);
-            throw nvae;
-        }
-    }
- 
-
-    public static final BitSet FOLLOW_81_in_opt_semicolon39 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_prolog_in_compilation_unit57 = new BitSet(new long[]{0x0000003FD69C2260L});
-    public static final BitSet FOLLOW_statement_in_compilation_unit62 = new BitSet(new long[]{0x0000003FD69C2260L});
-    public static final BitSet FOLLOW_EOF_in_compilation_unit67 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_package_statement_in_prolog96 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rule_attribute_in_statement121 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_function_import_statement_in_statement128 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_import_statement_in_statement134 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_global_in_statement140 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_function_in_statement146 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_template_in_statement160 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rule_in_statement169 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_query_in_statement181 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_type_declaration_in_statement196 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_PACKAGE_in_package_statement222 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_dotted_name_in_package_statement226 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_package_statement228 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IMPORT_in_import_statement259 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_import_name_in_import_statement282 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_import_statement285 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IMPORT_in_function_import_statement309 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_FUNCTION_in_function_import_statement311 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_import_name_in_function_import_statement334 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_function_import_statement337 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_import_name362 = new BitSet(new long[]{0x0000000000000102L,0x0000000000040000L});
-    public static final BitSet FOLLOW_DOT_in_import_name374 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_import_name378 = new BitSet(new long[]{0x0000000000000102L,0x0000000000040000L});
-    public static final BitSet FOLLOW_82_in_import_name402 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_GLOBAL_in_global436 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_dotted_name_in_global447 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_global458 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_global460 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUNCTION_in_function485 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_dotted_name_in_function489 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_function494 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_function503 = new BitSet(new long[]{0x003C1018147C52F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_dotted_name_in_function512 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_argument_in_function517 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_function531 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_dotted_name_in_function535 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_argument_in_function540 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_function564 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
-    public static final BitSet FOLLOW_curly_chunk_in_function570 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_argument597 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_argument603 = new BitSet(new long[]{0x0200000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_argument605 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_DECLARE_in_type_declaration645 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_type_declaration649 = new BitSet(new long[]{0x003C1018147CC2F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_decl_metadata_in_type_declaration702 = new BitSet(new long[]{0x003C1018147CC2F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_decl_field_in_type_declaration730 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_END_in_type_declaration750 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AT_in_decl_metadata784 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_decl_metadata788 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_decl_metadata792 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_decl_field853 = new BitSet(new long[]{0x0000000000030000L});
-    public static final BitSet FOLLOW_initialization_in_decl_field857 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_COLON_in_decl_field860 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_qualified_id_in_decl_field864 = new BitSet(new long[]{0x0000000000008002L});
-    public static final BitSet FOLLOW_decl_metadata_in_decl_field873 = new BitSet(new long[]{0x0000000000008002L});
-    public static final BitSet FOLLOW_EQUALS_in_initialization900 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_initialization904 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_QUERY_in_query938 = new BitSet(new long[]{0x0000000001000080L});
-    public static final BitSet FOLLOW_name_in_query942 = new BitSet(new long[]{0x0001E00000004480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_query952 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_qualified_id_in_query987 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_query992 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_query1013 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_qualified_id_in_query1017 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_query1022 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_query1072 = new BitSet(new long[]{0x0001E00000004480L});
-    public static final BitSet FOLLOW_normal_lhs_block_in_query1101 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_END_in_query1106 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_query1108 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_TEMPLATE_in_template1136 = new BitSet(new long[]{0x0000000001000080L});
-    public static final BitSet FOLLOW_name_in_template1140 = new BitSet(new long[]{0x0000000000000080L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template1142 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_template_slot_in_template1157 = new BitSet(new long[]{0x0000000000004080L});
-    public static final BitSet FOLLOW_END_in_template1172 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template1174 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_qualified_id_in_template_slot1220 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_template_slot1236 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template_slot1238 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_in_rule1269 = new BitSet(new long[]{0x0000000001000080L});
-    public static final BitSet FOLLOW_name_in_rule1273 = new BitSet(new long[]{0x0000003FD6E00000L,0x0000000000000020L});
-    public static final BitSet FOLLOW_rule_attributes_in_rule1282 = new BitSet(new long[]{0x0000000000200000L,0x0000000000000020L});
-    public static final BitSet FOLLOW_WHEN_in_rule1294 = new BitSet(new long[]{0x0001E00000010480L,0x0000000000000020L});
-    public static final BitSet FOLLOW_COLON_in_rule1296 = new BitSet(new long[]{0x0001E00000000480L,0x0000000000000020L});
-    public static final BitSet FOLLOW_normal_lhs_block_in_rule1307 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
-    public static final BitSet FOLLOW_rhs_chunk_in_rule1317 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ATTRIBUTES_in_rule_attributes1337 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_COLON_in_rule_attributes1339 = new BitSet(new long[]{0x0000003FD6800000L});
-    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1347 = new BitSet(new long[]{0x0000003FD6800802L});
-    public static final BitSet FOLLOW_COMMA_in_rule_attributes1354 = new BitSet(new long[]{0x0000003FD6800000L});
-    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1359 = new BitSet(new long[]{0x0000003FD6800802L});
-    public static final BitSet FOLLOW_salience_in_rule_attribute1396 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_no_loop_in_rule_attribute1404 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_agenda_group_in_rule_attribute1413 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_duration_in_rule_attribute1422 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_activation_group_in_rule_attribute1431 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_auto_focus_in_rule_attribute1439 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_date_effective_in_rule_attribute1447 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_date_expires_in_rule_attribute1455 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_enabled_in_rule_attribute1463 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleflow_group_in_rule_attribute1471 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lock_on_active_in_rule_attribute1479 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_dialect_in_rule_attribute1486 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DATE_EFFECTIVE_in_date_effective1512 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_date_effective1514 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DATE_EXPIRES_in_date_expires1543 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_date_expires1545 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ENABLED_in_enabled1574 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_BOOL_in_enabled1576 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SALIENCE_in_salience1609 = new BitSet(new long[]{0x0000000020000400L});
-    public static final BitSet FOLLOW_INT_in_salience1620 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_salience1635 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NO_LOOP_in_no_loop1665 = new BitSet(new long[]{0x0000000008000002L});
-    public static final BitSet FOLLOW_BOOL_in_no_loop1678 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AUTO_FOCUS_in_auto_focus1713 = new BitSet(new long[]{0x0000000008000002L});
-    public static final BitSet FOLLOW_BOOL_in_auto_focus1726 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ACTIVATION_GROUP_in_activation_group1762 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_activation_group1764 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1792 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_ruleflow_group1794 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AGENDA_GROUP_in_agenda_group1822 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_agenda_group1824 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DURATION_in_duration1852 = new BitSet(new long[]{0x0000000020000000L});
-    public static final BitSet FOLLOW_INT_in_duration1854 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DIALECT_in_dialect1882 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_STRING_in_dialect1884 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1916 = new BitSet(new long[]{0x0000000008000002L});
-    public static final BitSet FOLLOW_BOOL_in_lock_on_active1929 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_in_normal_lhs_block1968 = new BitSet(new long[]{0x0001E00000000482L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs2005 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_or2030 = new BitSet(new long[]{0x0000004000000000L});
-    public static final BitSet FOLLOW_OR_in_lhs_or2032 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or2045 = new BitSet(new long[]{0x0001E00000001480L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_or2056 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or2074 = new BitSet(new long[]{0x000000C000000002L});
-    public static final BitSet FOLLOW_set_in_lhs_or2082 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or2098 = new BitSet(new long[]{0x000000C000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_and2129 = new BitSet(new long[]{0x0000010000000000L});
-    public static final BitSet FOLLOW_AND_in_lhs_and2131 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and2143 = new BitSet(new long[]{0x0001E00000001480L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_and2153 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and2171 = new BitSet(new long[]{0x0000030000000002L});
-    public static final BitSet FOLLOW_set_in_lhs_and2179 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and2195 = new BitSet(new long[]{0x0000030000000002L});
-    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary2240 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_lhs_not_in_lhs_unary2258 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary2277 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_lhs_forall_in_lhs_unary2296 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_unary2313 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_unary2317 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_unary2319 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_pattern_source_in_lhs_unary2330 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_lhs_unary2342 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_pattern_source2369 = new BitSet(new long[]{0x0000140000000002L});
-    public static final BitSet FOLLOW_OVER_in_pattern_source2384 = new BitSet(new long[]{0x0000080000000000L});
-    public static final BitSet FOLLOW_WINDOW_in_pattern_source2390 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_COLON_in_pattern_source2392 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_pattern_source2396 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_pattern_source2400 = new BitSet(new long[]{0x0000180000000002L});
-    public static final BitSet FOLLOW_FROM_in_pattern_source2471 = new BitSet(new long[]{0x0080000000000000L});
-    public static final BitSet FOLLOW_entrypoint_statement_in_pattern_source2475 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FROM_in_pattern_source2495 = new BitSet(new long[]{0x007E1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_accumulate_statement_in_pattern_source2553 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_collect_statement_in_pattern_source2576 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_from_statement_in_pattern_source2613 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXISTS_in_lhs_exist2656 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_exist2676 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_exist2680 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_exist2710 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_exist2760 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NOT_in_lhs_not2812 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_not2825 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_not2829 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_not2860 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_not2897 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_lhs_eval2943 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_lhs_eval2954 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FORALL_in_lhs_forall2980 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_forall2982 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2986 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall3001 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_forall3017 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_fact_binding_in_lhs_pattern3050 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_fact_in_lhs_pattern3058 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_from_source_in_from_statement3085 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ACCUMULATE_in_accumulate_statement3122 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_accumulate_statement3132 = new BitSet(new long[]{0x0001E00000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_accumulate_statement3136 = new BitSet(new long[]{0x0004000000000880L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement3138 = new BitSet(new long[]{0x0004000000000080L});
-    public static final BitSet FOLLOW_INIT_in_accumulate_statement3156 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement3169 = new BitSet(new long[]{0x0008000000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement3171 = new BitSet(new long[]{0x0008000000000000L});
-    public static final BitSet FOLLOW_ACTION_in_accumulate_statement3182 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement3186 = new BitSet(new long[]{0x0030000000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement3188 = new BitSet(new long[]{0x0030000000000000L});
-    public static final BitSet FOLLOW_REVERSE_in_accumulate_statement3201 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement3205 = new BitSet(new long[]{0x0020000000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement3207 = new BitSet(new long[]{0x0020000000000000L});
-    public static final BitSet FOLLOW_RESULT_in_accumulate_statement3224 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement3228 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_ID_in_accumulate_statement3254 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement3258 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_accumulate_statement3275 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_from_source3306 = new BitSet(new long[]{0x0000000000000502L});
-    public static final BitSet FOLLOW_paren_chunk_in_from_source3334 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_expression_chain_in_from_source3347 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOT_in_expression_chain3378 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_expression_chain3382 = new BitSet(new long[]{0x0100000000000502L});
-    public static final BitSet FOLLOW_square_chunk_in_expression_chain3413 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_paren_chunk_in_expression_chain3446 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_expression_chain_in_expression_chain3461 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_COLLECT_in_collect_statement3512 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_collect_statement3522 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_pattern_source_in_collect_statement3526 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_collect_statement3528 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ENTRY_POINT_in_entrypoint_statement3565 = new BitSet(new long[]{0x0000000001000080L});
-    public static final BitSet FOLLOW_name_in_entrypoint_statement3577 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_fact_binding3609 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_COLON_in_fact_binding3611 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3625 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_fact_binding3641 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3645 = new BitSet(new long[]{0x000000C000001000L});
-    public static final BitSet FOLLOW_set_in_fact_binding3658 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3670 = new BitSet(new long[]{0x000000C000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact_binding3688 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_qualified_id_in_fact3743 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_fact3753 = new BitSet(new long[]{0x013C9018147C56F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_constraints_in_fact3765 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact3772 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EOF_in_fact3781 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_constraint_in_constraints3800 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_behaviors_in_constraints3803 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_COMMA_in_constraints3810 = new BitSet(new long[]{0x013C9018147C46F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_constraint_in_constraints3820 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_behaviors_in_constraints3823 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_or_constr_in_constraint3856 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_behaviors3871 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_behavior_in_behaviors3873 = new BitSet(new long[]{0x0200000000000800L});
-    public static final BitSet FOLLOW_COMMA_in_behaviors3877 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_behavior_in_behaviors3879 = new BitSet(new long[]{0x0200000000000800L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_behaviors3884 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_behavior3898 = new BitSet(new long[]{0x0000000000010402L});
-    public static final BitSet FOLLOW_COLON_in_behavior3901 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_behavior3903 = new BitSet(new long[]{0x0000000000000402L});
-    public static final BitSet FOLLOW_paren_chunk_in_behavior3907 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_and_constr_in_or_constr3929 = new BitSet(new long[]{0x0000008000000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_constr3937 = new BitSet(new long[]{0x003C9018147C46F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_and_constr_in_or_constr3946 = new BitSet(new long[]{0x0000008000000002L});
-    public static final BitSet FOLLOW_unary_constr_in_and_constr3978 = new BitSet(new long[]{0x0000020000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_constr3986 = new BitSet(new long[]{0x003C9018147C46F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_unary_constr_in_and_constr3995 = new BitSet(new long[]{0x0000020000000002L});
-    public static final BitSet FOLLOW_field_constraint_in_unary_constr4023 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_unary_constr4031 = new BitSet(new long[]{0x003C9018147C46F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_or_constr_in_unary_constr4033 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_unary_constr4036 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_unary_constr4042 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_predicate_in_unary_constr4044 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_field_constraint4083 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_COLON_in_field_constraint4085 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_accessor_path_in_field_constraint4104 = new BitSet(new long[]{0xFC00400000000402L,0x0000000003F80001L});
-    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint4118 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_83_in_field_constraint4133 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_predicate_in_field_constraint4135 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_accessor_path_in_field_constraint4161 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint4170 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective4217 = new BitSet(new long[]{0x0000008000000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_restr_connective4241 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective4252 = new BitSet(new long[]{0x0000008000000002L});
-    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective4284 = new BitSet(new long[]{0x0000020000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_restr_connective4304 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective4315 = new BitSet(new long[]{0x0000020000000002L});
-    public static final BitSet FOLLOW_compound_operator_in_constraint_expression4352 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_operator_in_constraint_expression4359 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_constraint_expression4367 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_or_restr_connective_in_constraint_expression4376 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_constraint_expression4381 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_84_in_simple_operator4412 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_85_in_simple_operator4420 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_86_in_simple_operator4428 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_87_in_simple_operator4436 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_88_in_simple_operator4444 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_89_in_simple_operator4452 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_CONTAINS_in_simple_operator4480 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator4508 = new BitSet(new long[]{0x0400000000000000L});
-    public static final BitSet FOLLOW_CONTAINS_in_simple_operator4512 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_EXCLUDES_in_simple_operator4540 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_MATCHES_in_simple_operator4568 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_SOUNDSLIKE_in_simple_operator4596 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator4624 = new BitSet(new long[]{0x1000000000000000L});
-    public static final BitSet FOLLOW_MATCHES_in_simple_operator4628 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator4656 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator4684 = new BitSet(new long[]{0x4000000000000000L});
-    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator4688 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_TILDE_in_simple_operator4694 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_simple_operator4698 = new BitSet(new long[]{0x013C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_square_chunk_in_simple_operator4702 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator4711 = new BitSet(new long[]{0x8000000000000000L});
-    public static final BitSet FOLLOW_TILDE_in_simple_operator4713 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_simple_operator4717 = new BitSet(new long[]{0x013C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_square_chunk_in_simple_operator4721 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_expression_value_in_simple_operator4736 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IN_in_compound_operator4766 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_NOT_in_compound_operator4778 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_IN_in_compound_operator4780 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_compound_operator4795 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_expression_value_in_compound_operator4799 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_compound_operator4806 = new BitSet(new long[]{0x003C10183D7C46F0L,0x0000000000000067L});
-    public static final BitSet FOLLOW_expression_value_in_compound_operator4810 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_compound_operator4819 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_accessor_path_in_expression_value4853 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_literal_constraint_in_expression_value4873 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_expression_value4887 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_literal_constraint4930 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INT_in_literal_constraint4941 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FLOAT_in_literal_constraint4954 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BOOL_in_literal_constraint4965 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NULL_in_literal_constraint4977 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_predicate5015 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_CURLY_in_curly_chunk5033 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_set_in_curly_chunk5037 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_curly_chunk_in_curly_chunk5046 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_RIGHT_CURLY_in_curly_chunk5051 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_paren_chunk5065 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_set_in_paren_chunk5069 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_paren_chunk_in_paren_chunk5078 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_paren_chunk5083 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_square_chunk5096 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_set_in_square_chunk5100 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_square_chunk_in_square_chunk5109 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_square_chunk5114 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_qualified_id5143 = new BitSet(new long[]{0x0100000000000102L});
-    public static final BitSet FOLLOW_DOT_in_qualified_id5149 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_qualified_id5151 = new BitSet(new long[]{0x0100000000000102L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_qualified_id5160 = new BitSet(new long[]{0x0200000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_qualified_id5162 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_identifier_in_dotted_name5196 = new BitSet(new long[]{0x0100000000000102L});
-    public static final BitSet FOLLOW_DOT_in_dotted_name5202 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_identifier_in_dotted_name5206 = new BitSet(new long[]{0x0100000000000102L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_dotted_name5215 = new BitSet(new long[]{0x0200000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_dotted_name5217 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_accessor_element_in_accessor_path5251 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_DOT_in_accessor_path5257 = new BitSet(new long[]{0x003C1018147C42F0L,0x0000000000000061L});
-    public static final BitSet FOLLOW_accessor_element_in_accessor_path5261 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_identifier_in_accessor_element5299 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_square_chunk_in_accessor_element5306 = new BitSet(new long[]{0x0100000000000002L});
-    public static final BitSet FOLLOW_THEN_in_rhs_chunk5327 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_set_in_rhs_chunk5335 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000000003FFFFFFL});
-    public static final BitSet FOLLOW_END_in_rhs_chunk5359 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_opt_semicolon_in_rhs_chunk5361 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_name5395 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_name5403 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_set_in_identifier0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXISTS_in_synpred12232 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NOT_in_synpred22250 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_synpred32269 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FORALL_in_synpred42288 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred52307 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FROM_in_synpred62464 = new BitSet(new long[]{0x0080000000000000L});
-    public static final BitSet FOLLOW_ENTRY_POINT_in_synpred62466 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_synpred93405 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred103438 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_synpred114241 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_and_restr_connective_in_synpred114252 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_synpred124304 = new BitSet(new long[]{0xFC00400000000400L,0x0000000003F00001L});
-    public static final BitSet FOLLOW_constraint_expression_in_synpred124315 = new BitSet(new long[]{0x0000000000000002L});
-
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DRLParser.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,20391 @@
+// $ANTLR 3.0.1 /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2008-06-05 23:49:53
+
+	package org.drools.lang;
+	
+	import org.drools.compiler.DroolsParserException;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.antlr.runtime.tree.*;
+
+public class DRLParser extends Parser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VT_COMPILATION_UNIT", "VT_FUNCTION_IMPORT", "VT_FACT", "VT_CONSTRAINTS", "VT_LABEL", "VT_QUERY_ID", "VT_TEMPLATE_ID", "VT_RULE_ID", "VT_ENTRYPOINT_ID", "VT_SLOT_ID", "VT_SLOT", "VT_RULE_ATTRIBUTES", "VT_RHS_CHUNK", "VT_CURLY_CHUNK", "VT_SQUARE_CHUNK", "VT_PAREN_CHUNK", "VT_AND_IMPLICIT", "VT_AND_PREFIX", "VT_OR_PREFIX", "VT_AND_INFIX", "VT_OR_INFIX", "VT_ACCUMULATE_INIT_CLAUSE", "VT_ACCUMULATE_ID_CLAUSE", "VT_FROM_SOURCE", "VT_EXPRESSION_CHAIN", "VT_PATTERN", "VT_FACT_BINDING", "VT_FACT_OR", "VT_BIND_FIELD", "VT_FIELD", "VT_ACCESSOR_PATH", "VT_ACCESSOR_ELEMENT", "VT_DATA_TYPE", "VT_PATTERN_TYPE", "VT_PACKAGE_ID", "VT_IMPORT_ID", "VT_GLOBAL_ID", "VT_FUNCTION_ID", "VT_PARAM_LIST", "VK_DATE_EFFECTIVE", "VK_DATE_EXPIRES", "VK_LOCK_ON_ACTIVE", "VK_NO_LOOP", "VK_AUTO_FOCUS", "VK_ACTIVATION_GROUP", "VK_AGENDA_GROUP", "VK_RULEFLOW_GROUP", "VK_DURATION", "VK_DIALECT", "VK_SALIENCE", "VK_ENABLED", "VK_ATTRIBUTES", "VK_WHEN", "VK_RULE",!
  "VK_IMPORT", "VK_PACKAGE", "VK_TEMPLATE", "VK_QUERY", "VK_DECLARE", "VK_FUNCTION", "VK_GLOBAL", "VK_EVAL", "VK_CONTAINS", "VK_MATCHES", "VK_EXCLUDES", "VK_SOUNDSLIKE", "VK_MEMBEROF", "VK_ENTRY_POINT", "VK_NOT", "VK_IN", "VK_OR", "VK_AND", "VK_EXISTS", "VK_FORALL", "VK_FROM", "VK_ACCUMULATE", "VK_INIT", "VK_ACTION", "VK_REVERSE", "VK_RESULT", "VK_COLLECT", "SEMICOLON", "ID", "DOT", "DOT_STAR", "END", "STRING", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "COLON", "BOOL", "INT", "DOUBLE_PIPE", "DOUBLE_AMPER", "ARROW", "EQUAL", "GREATER", "GREATER_EQUAL", "LESS", "LESS_EQUAL", "NOT_EQUAL", "GRAVE_ACCENT", "FLOAT", "NULL", "LEFT_SQUARE", "RIGHT_SQUARE", "THEN", "LEFT_CURLY", "RIGHT_CURLY", "MISC", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT"
+    };
+    public static final int COMMA=92;
+    public static final int VT_PATTERN_TYPE=37;
+    public static final int VT_ACCUMULATE_ID_CLAUSE=26;
+    public static final int VK_DIALECT=52;
+    public static final int VK_FUNCTION=63;
+    public static final int END=89;
+    public static final int HexDigit=118;
+    public static final int VK_ATTRIBUTES=55;
+    public static final int VT_EXPRESSION_CHAIN=28;
+    public static final int VK_ACCUMULATE=79;
+    public static final int MISC=114;
+    public static final int VT_AND_PREFIX=21;
+    public static final int VK_QUERY=61;
+    public static final int THEN=111;
+    public static final int VK_AUTO_FOCUS=47;
+    public static final int DOT=87;
+    public static final int VK_IMPORT=58;
+    public static final int VT_SLOT=14;
+    public static final int VT_PACKAGE_ID=38;
+    public static final int LEFT_SQUARE=109;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=121;
+    public static final int VT_DATA_TYPE=36;
+    public static final int VT_FACT=6;
+    public static final int VK_MATCHES=67;
+    public static final int LEFT_CURLY=112;
+    public static final int DOUBLE_AMPER=98;
+    public static final int LEFT_PAREN=91;
+    public static final int VT_QUERY_ID=9;
+    public static final int VT_ACCESSOR_PATH=34;
+    public static final int VT_LABEL=8;
+    public static final int VT_ENTRYPOINT_ID=12;
+    public static final int WS=116;
+    public static final int VT_FIELD=33;
+    public static final int VK_SALIENCE=53;
+    public static final int VK_SOUNDSLIKE=69;
+    public static final int VK_AND=75;
+    public static final int STRING=90;
+    public static final int VT_ACCESSOR_ELEMENT=35;
+    public static final int VT_ACCUMULATE_INIT_CLAUSE=25;
+    public static final int VK_GLOBAL=64;
+    public static final int VK_REVERSE=82;
+    public static final int GRAVE_ACCENT=106;
+    public static final int VK_DURATION=51;
+    public static final int VT_SQUARE_CHUNK=18;
+    public static final int VK_FORALL=77;
+    public static final int VT_COMPILATION_UNIT=4;
+    public static final int VT_PAREN_CHUNK=19;
+    public static final int VK_ENABLED=54;
+    public static final int VK_RESULT=83;
+    public static final int UnicodeEscape=119;
+    public static final int VK_PACKAGE=59;
+    public static final int VT_RULE_ID=11;
+    public static final int EQUAL=100;
+    public static final int VK_NO_LOOP=46;
+    public static final int SEMICOLON=85;
+    public static final int VK_TEMPLATE=60;
+    public static final int VT_AND_IMPLICIT=20;
+    public static final int NULL=108;
+    public static final int COLON=94;
+    public static final int MULTI_LINE_COMMENT=123;
+    public static final int VT_RULE_ATTRIBUTES=15;
+    public static final int RIGHT_SQUARE=110;
+    public static final int VK_AGENDA_GROUP=49;
+    public static final int VT_FACT_OR=31;
+    public static final int VK_NOT=72;
+    public static final int VK_DATE_EXPIRES=44;
+    public static final int ARROW=99;
+    public static final int FLOAT=107;
+    public static final int VT_SLOT_ID=13;
+    public static final int VT_CURLY_CHUNK=17;
+    public static final int VT_OR_PREFIX=22;
+    public static final int DOUBLE_PIPE=97;
+    public static final int LESS=103;
+    public static final int VT_PATTERN=29;
+    public static final int VK_DATE_EFFECTIVE=43;
+    public static final int EscapeSequence=117;
+    public static final int VK_EXISTS=76;
+    public static final int INT=96;
+    public static final int VT_BIND_FIELD=32;
+    public static final int VK_RULE=57;
+    public static final int VK_EVAL=65;
+    public static final int VK_COLLECT=84;
+    public static final int GREATER=101;
+    public static final int VT_FACT_BINDING=30;
+    public static final int ID=86;
+    public static final int NOT_EQUAL=105;
+    public static final int RIGHT_CURLY=113;
+    public static final int BOOL=95;
+    public static final int VT_PARAM_LIST=42;
+    public static final int VT_AND_INFIX=23;
+    public static final int VK_ENTRY_POINT=71;
+    public static final int VT_FROM_SOURCE=27;
+    public static final int VK_LOCK_ON_ACTIVE=45;
+    public static final int VK_CONTAINS=66;
+    public static final int VT_FUNCTION_IMPORT=5;
+    public static final int VK_IN=73;
+    public static final int VT_RHS_CHUNK=16;
+    public static final int GREATER_EQUAL=102;
+    public static final int VK_MEMBEROF=70;
+    public static final int VT_OR_INFIX=24;
+    public static final int DOT_STAR=88;
+    public static final int VK_OR=74;
+    public static final int VT_GLOBAL_ID=40;
+    public static final int LESS_EQUAL=104;
+    public static final int VK_WHEN=56;
+    public static final int VK_RULEFLOW_GROUP=50;
+    public static final int VT_FUNCTION_ID=41;
+    public static final int EOF=-1;
+    public static final int VT_CONSTRAINTS=7;
+    public static final int EOL=115;
+    public static final int VT_IMPORT_ID=39;
+    public static final int VK_ACTIVATION_GROUP=48;
+    public static final int VK_INIT=80;
+    public static final int OctalEscape=120;
+    public static final int VK_ACTION=81;
+    public static final int VK_EXCLUDES=68;
+    public static final int VK_FROM=78;
+    public static final int RIGHT_PAREN=93;
+    public static final int VT_TEMPLATE_ID=10;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=122;
+    public static final int VK_DECLARE=62;
+
+        public DRLParser(TokenStream input) {
+            super(input);
+            ruleMemo = new HashMap[140+1];
+         }
+        
+    protected TreeAdaptor adaptor = new CommonTreeAdaptor();
+
+    public void setTreeAdaptor(TreeAdaptor adaptor) {
+        this.adaptor = adaptor;
+    }
+    public TreeAdaptor getTreeAdaptor() {
+        return adaptor;
+    }
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "/Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g"; }
+
+
+    	private Stack<Map<Integer, String>> paraphrases = new Stack<Map<Integer, String>>();
+    	private List<DroolsParserException> errors = new ArrayList<DroolsParserException>();
+    	private DroolsParserExceptionFactory errorMessageFactory = new DroolsParserExceptionFactory(tokenNames, paraphrases);
+    	private String source = "unknown";
+
+    	private boolean validateLT(int LTNumber, String text) {
+    		if (null == input)
+    			return false;
+    		if (null == input.LT(LTNumber))
+    			return false;
+    		if (null == input.LT(LTNumber).getText())
+    			return false;
+    	
+    		String text2Validate = input.LT(LTNumber).getText();
+    		return text2Validate.equalsIgnoreCase(text);
+    	}
+    	
+    	private boolean validateIdentifierKey(String text) {
+    		return validateLT(1, text);
+    	}
+    	
+    	void checkTrailingSemicolon(String text, Token token) {
+    		if (text.trim().endsWith(";")) {
+    			errors.add(errorMessageFactory
+    					.createTrailingSemicolonException(((DroolsToken) token)
+    							.getLine(), ((DroolsToken) token)
+    							.getCharPositionInLine(), ((DroolsToken) token)
+    							.getStopIndex()));
+    		}
+    	}
+    	
+    	private String safeSubstring(String text, int start, int end) {
+    		return text.substring(Math.min(start, text.length()), Math.min(Math
+    				.max(start, end), text.length()));
+    	}
+    	
+    	public void reportError(RecognitionException ex) {
+    		// if we've already reported an error and have not matched a token
+    		// yet successfully, don't report any errors.
+    		if (errorRecovery) {
+    			return;
+    		}
+    		errorRecovery = true;
+    	
+    		errors.add(errorMessageFactory.createDroolsException(ex));
+    	}
+    	
+    	/** return the raw DroolsParserException errors */
+    	public List<DroolsParserException> getErrors() {
+    		return errors;
+    	}
+    	
+    	/** Return a list of pretty strings summarising the errors */
+    	public List<String> getErrorMessages() {
+    		List<String> messages = new ArrayList<String>(errors.size());
+    	
+    		for (DroolsParserException activeException : errors) {
+    			messages.add(activeException.getMessage());
+    		}
+    	
+    		return messages;
+    	}
+    	
+    	/** return true if any parser errors were accumulated */
+    	public boolean hasErrors() {
+    		return !errors.isEmpty();
+    	}
+
+    	/**
+    	 * Method that adds a paraphrase type into paraphrases stack.
+    	 * 
+    	 * @param type
+    	 *            paraphrase type
+    	 */
+    	private void pushParaphrases(int type) {
+    		Map<Integer, String> activeMap = new HashMap<Integer, String>();
+    		activeMap.put(type, "");
+    		paraphrases.push(activeMap);
+    	}
+
+    	/**
+    	 * Method that sets paraphrase value for a type into paraphrases stack.
+    	 * 
+    	 * @param type
+    	 *            paraphrase type
+    	 * @param value
+    	 *            paraphrase value
+    	 */
+    	private void setParaphrasesValue(int type, String value) {
+    		paraphrases.peek().put(type, value);
+    	}
+
+    	/**
+    	 * Helper method that creates a string from a token list.
+    	 * 
+    	 * @param tokenList
+    	 *            token list
+    	 * @return string
+    	 */
+    	private String buildStringFromTokens(List<Token> tokenList) {
+    		StringBuilder sb = new StringBuilder();
+    		if (null != tokenList) {
+    			for (Token activeToken : tokenList) {
+    				if (null != activeToken) {
+    					sb.append(activeToken.getText());
+    				}
+    			}
+    		}
+    		return sb.toString();
+    	}
+
+
+    public static class compilation_unit_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start compilation_unit
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:242:1: compilation_unit : ( package_statement )? ( statement )* EOF -> ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* ) ;
+    public final compilation_unit_return compilation_unit() throws RecognitionException {
+        compilation_unit_return retval = new compilation_unit_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token EOF3=null;
+        package_statement_return package_statement1 = null;
+
+        statement_return statement2 = null;
+
+
+        Object EOF3_tree=null;
+        RewriteRuleTokenStream stream_EOF=new RewriteRuleTokenStream(adaptor,"token EOF");
+        RewriteRuleSubtreeStream stream_package_statement=new RewriteRuleSubtreeStream(adaptor,"rule package_statement");
+        RewriteRuleSubtreeStream stream_statement=new RewriteRuleSubtreeStream(adaptor,"rule statement");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:243:2: ( ( package_statement )? ( statement )* EOF -> ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:243:4: ( package_statement )? ( statement )* EOF
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:243:4: ( package_statement )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||((validateLT(1, "import") && validateLT(2, "function") )&&(valida!
 teIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.PACKAGE))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords!
 .TEMPLATE))||((validateLT(1, "import") && validateLT(2, "function") )&
&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))))) {
+                int LA1_1 = input.LA(2);
+
+                if ( (LA1_1==ID) && ((((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(D!
 roolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.PACKAGE))))) {
+                    int LA1_6 = input.LA(3);
+
+                    if ( ((validateIdentifierKey(DroolsSoftKeywords.PACKAGE))) ) {
+                        alt1=1;
+                    }
+                }
+            }
+            switch (alt1) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:243:4: package_statement
+                    {
+                    pushFollow(FOLLOW_package_statement_in_compilation_unit400);
+                    package_statement1=package_statement();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_package_statement.add(package_statement1.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:244:3: ( statement )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(v!
 alidateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))))) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:244:3: statement
+            	    {
+            	    pushFollow(FOLLOW_statement_in_compilation_unit405);
+            	    statement2=statement();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_statement.add(statement2.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+            EOF3=(Token)input.LT(1);
+            match(input,EOF,FOLLOW_EOF_in_compilation_unit410); if (failed) return retval;
+            if ( backtracking==0 ) stream_EOF.add(EOF3);
+
+
+            // AST REWRITE
+            // elements: statement, package_statement
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 246:3: -> ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:246:6: ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_COMPILATION_UNIT, "VT_COMPILATION_UNIT"), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:246:28: ( package_statement )?
+                if ( stream_package_statement.hasNext() ) {
+                    adaptor.addChild(root_1, stream_package_statement.next());
+
+                }
+                stream_package_statement.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:246:47: ( statement )*
+                while ( stream_statement.hasNext() ) {
+                    adaptor.addChild(root_1, stream_statement.next());
+
+                }
+                stream_statement.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch ( RecognitionException e ) {
+
+            		reportError( e );
+            	
+        }
+        catch ( RewriteEmptyStreamException e ) {
+
+            	
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end compilation_unit
+
+    public static class package_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start package_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:254:1: package_statement : package_key package_id ( SEMICOLON )? -> ^( package_key package_id ) ;
+    public final package_statement_return package_statement() throws RecognitionException {
+        package_statement_return retval = new package_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON6=null;
+        package_key_return package_key4 = null;
+
+        package_id_return package_id5 = null;
+
+
+        Object SEMICOLON6_tree=null;
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_package_key=new RewriteRuleSubtreeStream(adaptor,"rule package_key");
+        RewriteRuleSubtreeStream stream_package_id=new RewriteRuleSubtreeStream(adaptor,"rule package_id");
+         pushParaphrases(DroolsParaphareseTypes.PACKAGE); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:257:2: ( package_key package_id ( SEMICOLON )? -> ^( package_key package_id ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:257:4: package_key package_id ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_package_key_in_package_statement461);
+            package_key4=package_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_package_key.add(package_key4.getTree());
+            pushFollow(FOLLOW_package_id_in_package_statement463);
+            package_id5=package_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_package_id.add(package_id5.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:257:27: ( SEMICOLON )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==SEMICOLON) ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:257:27: SEMICOLON
+                    {
+                    SEMICOLON6=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_package_statement465); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON6);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: package_id, package_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 258:3: -> ^( package_key package_id )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:258:6: ^( package_key package_id )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_package_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_package_id.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end package_statement
+
+    public static class package_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start package_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:261:1: package_id : id+= ID (id+= DOT id+= ID )* -> ^( VT_PACKAGE_ID ( ID )+ ) ;
+    public final package_id_return package_id() throws RecognitionException {
+        package_id_return retval = new package_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+        List list_id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:262:2: (id+= ID (id+= DOT id+= ID )* -> ^( VT_PACKAGE_ID ( ID )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:262:4: id+= ID (id+= DOT id+= ID )*
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_package_id489); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            if (list_id==null) list_id=new ArrayList();
+            list_id.add(id);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:262:11: (id+= DOT id+= ID )*
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( (LA4_0==DOT) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:262:13: id+= DOT id+= ID
+            	    {
+            	    id=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_package_id495); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_DOT.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+            	    id=(Token)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_package_id499); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_ID.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop4;
+                }
+            } while (true);
+
+            if ( backtracking==0 ) {
+              	setParaphrasesValue(DroolsParaphareseTypes.PACKAGE, buildStringFromTokens(list_id));	
+            }
+
+            // AST REWRITE
+            // elements: ID
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 264:3: -> ^( VT_PACKAGE_ID ( ID )+ )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:264:6: ^( VT_PACKAGE_ID ( ID )+ )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_PACKAGE_ID, "VT_PACKAGE_ID"), root_1);
+
+                if ( !(stream_ID.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_ID.hasNext() ) {
+                    adaptor.addChild(root_1, stream_ID.next());
+
+                }
+                stream_ID.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end package_id
+
+    public static class statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:267:1: statement : ( rule_attribute | {...}? => function_import_statement | import_statement | global | function | template | rule | query );
+    public final statement_return statement() throws RecognitionException {
+        statement_return retval = new statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        rule_attribute_return rule_attribute7 = null;
+
+        function_import_statement_return function_import_statement8 = null;
+
+        import_statement_return import_statement9 = null;
+
+        global_return global10 = null;
+
+        function_return function11 = null;
+
+        template_return template12 = null;
+
+        rule_return rule13 = null;
+
+        query_return query14 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:268:2: ( rule_attribute | {...}? => function_import_statement | import_statement | global | function | template | rule | query )
+            int alt5=8;
+            alt5 = dfa5.predict(input);
+            switch (alt5) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:268:4: rule_attribute
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_rule_attribute_in_statement527);
+                    rule_attribute7=rule_attribute();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, rule_attribute7.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:269:3: {...}? => function_import_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    if ( !((validateLT(1, "import") && validateLT(2, "function") )) ) {
+                        if (backtracking>0) {failed=true; return retval;}
+                        throw new FailedPredicateException(input, "statement", "(validateLT(1, \"import\") && validateLT(2, \"function\") )");
+                    }
+                    pushFollow(FOLLOW_function_import_statement_in_statement534);
+                    function_import_statement8=function_import_statement();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, function_import_statement8.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:270:4: import_statement
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_import_statement_in_statement540);
+                    import_statement9=import_statement();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, import_statement9.getTree());
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:271:4: global
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_global_in_statement546);
+                    global10=global();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, global10.getTree());
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:272:4: function
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_function_in_statement552);
+                    function11=function();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, function11.getTree());
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:273:4: template
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_template_in_statement557);
+                    template12=template();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, template12.getTree());
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:274:4: rule
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_rule_in_statement562);
+                    rule13=rule();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, rule13.getTree());
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:275:4: query
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_query_in_statement567);
+                    query14=query();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, query14.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end statement
+
+    public static class import_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:278:1: import_statement : import_key import_name[DroolsParaphareseTypes.IMPORT] ( SEMICOLON )? -> ^( import_key import_name ) ;
+    public final import_statement_return import_statement() throws RecognitionException {
+        import_statement_return retval = new import_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON17=null;
+        import_key_return import_key15 = null;
+
+        import_name_return import_name16 = null;
+
+
+        Object SEMICOLON17_tree=null;
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_import_key=new RewriteRuleSubtreeStream(adaptor,"rule import_key");
+        RewriteRuleSubtreeStream stream_import_name=new RewriteRuleSubtreeStream(adaptor,"rule import_name");
+         pushParaphrases(DroolsParaphareseTypes.IMPORT); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:281:2: ( import_key import_name[DroolsParaphareseTypes.IMPORT] ( SEMICOLON )? -> ^( import_key import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:281:4: import_key import_name[DroolsParaphareseTypes.IMPORT] ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_import_key_in_import_statement589);
+            import_key15=import_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_import_key.add(import_key15.getTree());
+            pushFollow(FOLLOW_import_name_in_import_statement591);
+            import_name16=import_name(DroolsParaphareseTypes.IMPORT);
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_import_name.add(import_name16.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:281:58: ( SEMICOLON )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==SEMICOLON) ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:281:58: SEMICOLON
+                    {
+                    SEMICOLON17=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_import_statement594); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON17);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: import_name, import_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 282:3: -> ^( import_key import_name )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:282:6: ^( import_key import_name )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_import_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_import_name.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end import_statement
+
+    public static class function_import_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start function_import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:285:1: function_import_statement : imp= import_key function_key import_name[DroolsParaphareseTypes.FUNCTION_IMPORT] ( SEMICOLON )? -> ^( VT_FUNCTION_IMPORT[$imp.start] function_key import_name ) ;
+    public final function_import_statement_return function_import_statement() throws RecognitionException {
+        function_import_statement_return retval = new function_import_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON20=null;
+        import_key_return imp = null;
+
+        function_key_return function_key18 = null;
+
+        import_name_return import_name19 = null;
+
+
+        Object SEMICOLON20_tree=null;
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_import_key=new RewriteRuleSubtreeStream(adaptor,"rule import_key");
+        RewriteRuleSubtreeStream stream_function_key=new RewriteRuleSubtreeStream(adaptor,"rule function_key");
+        RewriteRuleSubtreeStream stream_import_name=new RewriteRuleSubtreeStream(adaptor,"rule import_name");
+         pushParaphrases(DroolsParaphareseTypes.FUNCTION_IMPORT); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:2: (imp= import_key function_key import_name[DroolsParaphareseTypes.FUNCTION_IMPORT] ( SEMICOLON )? -> ^( VT_FUNCTION_IMPORT[$imp.start] function_key import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:4: imp= import_key function_key import_name[DroolsParaphareseTypes.FUNCTION_IMPORT] ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_import_key_in_function_import_statement629);
+            imp=import_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_import_key.add(imp.getTree());
+            pushFollow(FOLLOW_function_key_in_function_import_statement631);
+            function_key18=function_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_function_key.add(function_key18.getTree());
+            pushFollow(FOLLOW_import_name_in_function_import_statement633);
+            import_name19=import_name(DroolsParaphareseTypes.FUNCTION_IMPORT);
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_import_name.add(import_name19.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:84: ( SEMICOLON )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==SEMICOLON) ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:84: SEMICOLON
+                    {
+                    SEMICOLON20=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_function_import_statement636); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON20);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: import_name, function_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 289:3: -> ^( VT_FUNCTION_IMPORT[$imp.start] function_key import_name )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:289:6: ^( VT_FUNCTION_IMPORT[$imp.start] function_key import_name )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FUNCTION_IMPORT, ((Token)imp.start)), root_1);
+
+                adaptor.addChild(root_1, stream_function_key.next());
+                adaptor.addChild(root_1, stream_import_name.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end function_import_statement
+
+    public static class import_name_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start import_name
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:292:1: import_name[int importType] : id+= ID (id+= DOT id+= ID )* (id+= DOT_STAR )? -> ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? ) ;
+    public final import_name_return import_name(int importType) throws RecognitionException {
+        import_name_return retval = new import_name_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+        List list_id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_DOT_STAR=new RewriteRuleTokenStream(adaptor,"token DOT_STAR");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:2: (id+= ID (id+= DOT id+= ID )* (id+= DOT_STAR )? -> ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:4: id+= ID (id+= DOT id+= ID )* (id+= DOT_STAR )?
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_import_name665); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            if (list_id==null) list_id=new ArrayList();
+            list_id.add(id);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:11: (id+= DOT id+= ID )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0==DOT) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:13: id+= DOT id+= ID
+            	    {
+            	    id=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_import_name671); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_DOT.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+            	    id=(Token)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_import_name675); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_ID.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:33: (id+= DOT_STAR )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==DOT_STAR) ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:293:33: id+= DOT_STAR
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,DOT_STAR,FOLLOW_DOT_STAR_in_import_name682); if (failed) return retval;
+                    if ( backtracking==0 ) stream_DOT_STAR.add(id);
+
+                    if (list_id==null) list_id=new ArrayList();
+                    list_id.add(id);
+
+
+                    }
+                    break;
+
+            }
+
+            if ( backtracking==0 ) {
+              	setParaphrasesValue(importType, buildStringFromTokens(list_id));	
+            }
+
+            // AST REWRITE
+            // elements: DOT_STAR, ID
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 295:3: -> ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:295:6: ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_IMPORT_ID, "VT_IMPORT_ID"), root_1);
+
+                if ( !(stream_ID.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_ID.hasNext() ) {
+                    adaptor.addChild(root_1, stream_ID.next());
+
+                }
+                stream_ID.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:295:25: ( DOT_STAR )?
+                if ( stream_DOT_STAR.hasNext() ) {
+                    adaptor.addChild(root_1, stream_DOT_STAR.next());
+
+                }
+                stream_DOT_STAR.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end import_name
+
+    public static class global_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start global
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:298:1: global : global_key data_type global_id ( SEMICOLON )? -> ^( global_key data_type global_id ) ;
+    public final global_return global() throws RecognitionException {
+        global_return retval = new global_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON24=null;
+        global_key_return global_key21 = null;
+
+        data_type_return data_type22 = null;
+
+        global_id_return global_id23 = null;
+
+
+        Object SEMICOLON24_tree=null;
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_data_type=new RewriteRuleSubtreeStream(adaptor,"rule data_type");
+        RewriteRuleSubtreeStream stream_global_id=new RewriteRuleSubtreeStream(adaptor,"rule global_id");
+        RewriteRuleSubtreeStream stream_global_key=new RewriteRuleSubtreeStream(adaptor,"rule global_key");
+         pushParaphrases(DroolsParaphareseTypes.GLOBAL); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:301:2: ( global_key data_type global_id ( SEMICOLON )? -> ^( global_key data_type global_id ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:301:4: global_key data_type global_id ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_global_key_in_global722);
+            global_key21=global_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_global_key.add(global_key21.getTree());
+            pushFollow(FOLLOW_data_type_in_global724);
+            data_type22=data_type();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_data_type.add(data_type22.getTree());
+            pushFollow(FOLLOW_global_id_in_global726);
+            global_id23=global_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_global_id.add(global_id23.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:301:35: ( SEMICOLON )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==SEMICOLON) ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:301:35: SEMICOLON
+                    {
+                    SEMICOLON24=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_global728); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON24);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: data_type, global_id, global_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 302:3: -> ^( global_key data_type global_id )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:302:6: ^( global_key data_type global_id )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_global_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_data_type.next());
+                adaptor.addChild(root_1, stream_global_id.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end global
+
+    public static class global_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start global_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:305:1: global_id : id= ID -> VT_GLOBAL_ID[$id] ;
+    public final global_id_return global_id() throws RecognitionException {
+        global_id_return retval = new global_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:306:2: (id= ID -> VT_GLOBAL_ID[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:306:4: id= ID
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_global_id754); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            if ( backtracking==0 ) {
+              	setParaphrasesValue(DroolsParaphareseTypes.GLOBAL, id.getText());	
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 308:3: -> VT_GLOBAL_ID[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_GLOBAL_ID, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end global_id
+
+    public static class function_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start function
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:311:1: function : function_key ( data_type )? function_id parameters curly_chunk -> ^( function_key ( data_type )? function_id parameters curly_chunk ) ;
+    public final function_return function() throws RecognitionException {
+        function_return retval = new function_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        function_key_return function_key25 = null;
+
+        data_type_return data_type26 = null;
+
+        function_id_return function_id27 = null;
+
+        parameters_return parameters28 = null;
+
+        curly_chunk_return curly_chunk29 = null;
+
+
+        RewriteRuleSubtreeStream stream_parameters=new RewriteRuleSubtreeStream(adaptor,"rule parameters");
+        RewriteRuleSubtreeStream stream_function_key=new RewriteRuleSubtreeStream(adaptor,"rule function_key");
+        RewriteRuleSubtreeStream stream_curly_chunk=new RewriteRuleSubtreeStream(adaptor,"rule curly_chunk");
+        RewriteRuleSubtreeStream stream_data_type=new RewriteRuleSubtreeStream(adaptor,"rule data_type");
+        RewriteRuleSubtreeStream stream_function_id=new RewriteRuleSubtreeStream(adaptor,"rule function_id");
+         pushParaphrases(DroolsParaphareseTypes.FUNCTION); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:314:2: ( function_key ( data_type )? function_id parameters curly_chunk -> ^( function_key ( data_type )? function_id parameters curly_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:314:4: function_key ( data_type )? function_id parameters curly_chunk
+            {
+            pushFollow(FOLLOW_function_key_in_function786);
+            function_key25=function_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_function_key.add(function_key25.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:314:17: ( data_type )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==ID) ) {
+                int LA11_1 = input.LA(2);
+
+                if ( ((LA11_1>=ID && LA11_1<=DOT)||LA11_1==LEFT_SQUARE) ) {
+                    alt11=1;
+                }
+            }
+            switch (alt11) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:314:17: data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_function788);
+                    data_type26=data_type();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_data_type.add(data_type26.getTree());
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_function_id_in_function791);
+            function_id27=function_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_function_id.add(function_id27.getTree());
+            pushFollow(FOLLOW_parameters_in_function793);
+            parameters28=parameters();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_parameters.add(parameters28.getTree());
+            pushFollow(FOLLOW_curly_chunk_in_function795);
+            curly_chunk29=curly_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_curly_chunk.add(curly_chunk29.getTree());
+
+            // AST REWRITE
+            // elements: curly_chunk, parameters, function_id, data_type, function_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 315:3: -> ^( function_key ( data_type )? function_id parameters curly_chunk )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:315:6: ^( function_key ( data_type )? function_id parameters curly_chunk )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_function_key.nextNode(), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:315:21: ( data_type )?
+                if ( stream_data_type.hasNext() ) {
+                    adaptor.addChild(root_1, stream_data_type.next());
+
+                }
+                stream_data_type.reset();
+                adaptor.addChild(root_1, stream_function_id.next());
+                adaptor.addChild(root_1, stream_parameters.next());
+                adaptor.addChild(root_1, stream_curly_chunk.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end function
+
+    public static class function_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start function_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:318:1: function_id : id= ID -> VT_FUNCTION_ID[$id] ;
+    public final function_id_return function_id() throws RecognitionException {
+        function_id_return retval = new function_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:319:2: (id= ID -> VT_FUNCTION_ID[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:319:4: id= ID
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_function_id825); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            if ( backtracking==0 ) {
+              	setParaphrasesValue(DroolsParaphareseTypes.FUNCTION, id.getText());	
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 321:3: -> VT_FUNCTION_ID[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_FUNCTION_ID, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end function_id
+
+    public static class query_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start query
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:324:1: query : query_key query_id ( parameters )? normal_lhs_block END ( SEMICOLON )? -> ^( query_key query_id ( parameters )? normal_lhs_block END ) ;
+    public final query_return query() throws RecognitionException {
+        query_return retval = new query_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token END34=null;
+        Token SEMICOLON35=null;
+        query_key_return query_key30 = null;
+
+        query_id_return query_id31 = null;
+
+        parameters_return parameters32 = null;
+
+        normal_lhs_block_return normal_lhs_block33 = null;
+
+
+        Object END34_tree=null;
+        Object SEMICOLON35_tree=null;
+        RewriteRuleTokenStream stream_END=new RewriteRuleTokenStream(adaptor,"token END");
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_parameters=new RewriteRuleSubtreeStream(adaptor,"rule parameters");
+        RewriteRuleSubtreeStream stream_query_key=new RewriteRuleSubtreeStream(adaptor,"rule query_key");
+        RewriteRuleSubtreeStream stream_normal_lhs_block=new RewriteRuleSubtreeStream(adaptor,"rule normal_lhs_block");
+        RewriteRuleSubtreeStream stream_query_id=new RewriteRuleSubtreeStream(adaptor,"rule query_id");
+         pushParaphrases(DroolsParaphareseTypes.QUERY); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:2: ( query_key query_id ( parameters )? normal_lhs_block END ( SEMICOLON )? -> ^( query_key query_id ( parameters )? normal_lhs_block END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:4: query_key query_id ( parameters )? normal_lhs_block END ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_query_key_in_query857);
+            query_key30=query_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_query_key.add(query_key30.getTree());
+            pushFollow(FOLLOW_query_id_in_query859);
+            query_id31=query_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_query_id.add(query_id31.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:23: ( parameters )?
+            int alt12=2;
+            alt12 = dfa12.predict(input);
+            switch (alt12) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:23: parameters
+                    {
+                    pushFollow(FOLLOW_parameters_in_query861);
+                    parameters32=parameters();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_parameters.add(parameters32.getTree());
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_normal_lhs_block_in_query864);
+            normal_lhs_block33=normal_lhs_block();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_normal_lhs_block.add(normal_lhs_block33.getTree());
+            END34=(Token)input.LT(1);
+            match(input,END,FOLLOW_END_in_query866); if (failed) return retval;
+            if ( backtracking==0 ) stream_END.add(END34);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:56: ( SEMICOLON )?
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0==SEMICOLON) ) {
+                alt13=1;
+            }
+            switch (alt13) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:56: SEMICOLON
+                    {
+                    SEMICOLON35=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_query868); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON35);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: normal_lhs_block, query_id, END, query_key, parameters
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 328:3: -> ^( query_key query_id ( parameters )? normal_lhs_block END )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:328:6: ^( query_key query_id ( parameters )? normal_lhs_block END )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_query_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_query_id.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:328:27: ( parameters )?
+                if ( stream_parameters.hasNext() ) {
+                    adaptor.addChild(root_1, stream_parameters.next());
+
+                }
+                stream_parameters.reset();
+                adaptor.addChild(root_1, stream_normal_lhs_block.next());
+                adaptor.addChild(root_1, stream_END.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end query
+
+    public static class query_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start query_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:331:1: query_id : (id= ID -> VT_QUERY_ID[$id] | id= STRING -> VT_QUERY_ID[$id] );
+    public final query_id_return query_id() throws RecognitionException {
+        query_id_return retval = new query_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:332:2: (id= ID -> VT_QUERY_ID[$id] | id= STRING -> VT_QUERY_ID[$id] )
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==ID) ) {
+                alt14=1;
+            }
+            else if ( (LA14_0==STRING) ) {
+                alt14=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("331:1: query_id : (id= ID -> VT_QUERY_ID[$id] | id= STRING -> VT_QUERY_ID[$id] );", 14, 0, input);
+
+                throw nvae;
+            }
+            switch (alt14) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:332:5: id= ID
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_query_id900); if (failed) return retval;
+                    if ( backtracking==0 ) stream_ID.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.QUERY, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 333:67: -> VT_QUERY_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_QUERY_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:334:5: id= STRING
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_query_id916); if (failed) return retval;
+                    if ( backtracking==0 ) stream_STRING.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.QUERY, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 335:67: -> VT_QUERY_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_QUERY_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end query_id
+
+    public static class parameters_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start parameters
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:338:1: parameters : LEFT_PAREN ( param_definition ( COMMA param_definition )* )? RIGHT_PAREN -> ^( VT_PARAM_LIST ( param_definition )* RIGHT_PAREN ) ;
+    public final parameters_return parameters() throws RecognitionException {
+        parameters_return retval = new parameters_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN36=null;
+        Token COMMA38=null;
+        Token RIGHT_PAREN40=null;
+        param_definition_return param_definition37 = null;
+
+        param_definition_return param_definition39 = null;
+
+
+        Object LEFT_PAREN36_tree=null;
+        Object COMMA38_tree=null;
+        Object RIGHT_PAREN40_tree=null;
+        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_param_definition=new RewriteRuleSubtreeStream(adaptor,"rule param_definition");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:339:2: ( LEFT_PAREN ( param_definition ( COMMA param_definition )* )? RIGHT_PAREN -> ^( VT_PARAM_LIST ( param_definition )* RIGHT_PAREN ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:339:4: LEFT_PAREN ( param_definition ( COMMA param_definition )* )? RIGHT_PAREN
+            {
+            LEFT_PAREN36=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_parameters935); if (failed) return retval;
+            if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN36);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:340:4: ( param_definition ( COMMA param_definition )* )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==ID) ) {
+                alt16=1;
+            }
+            switch (alt16) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:340:6: param_definition ( COMMA param_definition )*
+                    {
+                    pushFollow(FOLLOW_param_definition_in_parameters942);
+                    param_definition37=param_definition();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_param_definition.add(param_definition37.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:340:23: ( COMMA param_definition )*
+                    loop15:
+                    do {
+                        int alt15=2;
+                        int LA15_0 = input.LA(1);
+
+                        if ( (LA15_0==COMMA) ) {
+                            alt15=1;
+                        }
+
+
+                        switch (alt15) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:340:24: COMMA param_definition
+                    	    {
+                    	    COMMA38=(Token)input.LT(1);
+                    	    match(input,COMMA,FOLLOW_COMMA_in_parameters945); if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_COMMA.add(COMMA38);
+
+                    	    pushFollow(FOLLOW_param_definition_in_parameters947);
+                    	    param_definition39=param_definition();
+                    	    _fsp--;
+                    	    if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_param_definition.add(param_definition39.getTree());
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop15;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            RIGHT_PAREN40=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_parameters956); if (failed) return retval;
+            if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN40);
+
+
+            // AST REWRITE
+            // elements: param_definition, RIGHT_PAREN
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 342:3: -> ^( VT_PARAM_LIST ( param_definition )* RIGHT_PAREN )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:342:6: ^( VT_PARAM_LIST ( param_definition )* RIGHT_PAREN )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_PARAM_LIST, "VT_PARAM_LIST"), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:342:22: ( param_definition )*
+                while ( stream_param_definition.hasNext() ) {
+                    adaptor.addChild(root_1, stream_param_definition.next());
+
+                }
+                stream_param_definition.reset();
+                adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end parameters
+
+    public static class param_definition_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start param_definition
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:1: param_definition : ( data_type )? argument ;
+    public final param_definition_return param_definition() throws RecognitionException {
+        param_definition_return retval = new param_definition_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        data_type_return data_type41 = null;
+
+        argument_return argument42 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:346:2: ( ( data_type )? argument )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:346:4: ( data_type )? argument
+            {
+            root_0 = (Object)adaptor.nil();
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:346:4: ( data_type )?
+            int alt17=2;
+            alt17 = dfa17.predict(input);
+            switch (alt17) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:346:4: data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_param_definition980);
+                    data_type41=data_type();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, data_type41.getTree());
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_argument_in_param_definition983);
+            argument42=argument();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, argument42.getTree());
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end param_definition
+
+    public static class argument_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start argument
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:349:1: argument : ID ( dimension_definition )* ;
+    public final argument_return argument() throws RecognitionException {
+        argument_return retval = new argument_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID43=null;
+        dimension_definition_return dimension_definition44 = null;
+
+
+        Object ID43_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:2: ( ID ( dimension_definition )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:4: ID ( dimension_definition )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            ID43=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_argument994); if (failed) return retval;
+            if ( backtracking==0 ) {
+            ID43_tree = (Object)adaptor.create(ID43);
+            adaptor.addChild(root_0, ID43_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:7: ( dimension_definition )*
+            loop18:
+            do {
+                int alt18=2;
+                int LA18_0 = input.LA(1);
+
+                if ( (LA18_0==LEFT_SQUARE) ) {
+                    alt18=1;
+                }
+
+
+                switch (alt18) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:7: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_argument996);
+            	    dimension_definition44=dimension_definition();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, dimension_definition44.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop18;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end argument
+
+    public static class template_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start template
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:354:1: template : template_key template_id ( SEMICOLON )? ( template_slot )+ END ( SEMICOLON )? -> ^( template_key template_id ( template_slot )+ END ) ;
+    public final template_return template() throws RecognitionException {
+        template_return retval = new template_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON47=null;
+        Token END49=null;
+        Token SEMICOLON50=null;
+        template_key_return template_key45 = null;
+
+        template_id_return template_id46 = null;
+
+        template_slot_return template_slot48 = null;
+
+
+        Object SEMICOLON47_tree=null;
+        Object END49_tree=null;
+        Object SEMICOLON50_tree=null;
+        RewriteRuleTokenStream stream_END=new RewriteRuleTokenStream(adaptor,"token END");
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_template_id=new RewriteRuleSubtreeStream(adaptor,"rule template_id");
+        RewriteRuleSubtreeStream stream_template_slot=new RewriteRuleSubtreeStream(adaptor,"rule template_slot");
+        RewriteRuleSubtreeStream stream_template_key=new RewriteRuleSubtreeStream(adaptor,"rule template_key");
+         pushParaphrases(DroolsParaphareseTypes.TEMPLATE); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:357:2: ( template_key template_id ( SEMICOLON )? ( template_slot )+ END ( SEMICOLON )? -> ^( template_key template_id ( template_slot )+ END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:357:4: template_key template_id ( SEMICOLON )? ( template_slot )+ END ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_template_key_in_template1020);
+            template_key45=template_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_template_key.add(template_key45.getTree());
+            pushFollow(FOLLOW_template_id_in_template1022);
+            template_id46=template_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_template_id.add(template_id46.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:357:29: ( SEMICOLON )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==SEMICOLON) ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:357:29: SEMICOLON
+                    {
+                    SEMICOLON47=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_template1024); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON47);
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:358:3: ( template_slot )+
+            int cnt20=0;
+            loop20:
+            do {
+                int alt20=2;
+                int LA20_0 = input.LA(1);
+
+                if ( (LA20_0==ID) ) {
+                    alt20=1;
+                }
+
+
+                switch (alt20) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:358:3: template_slot
+            	    {
+            	    pushFollow(FOLLOW_template_slot_in_template1029);
+            	    template_slot48=template_slot();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_template_slot.add(template_slot48.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt20 >= 1 ) break loop20;
+            	    if (backtracking>0) {failed=true; return retval;}
+                        EarlyExitException eee =
+                            new EarlyExitException(20, input);
+                        throw eee;
+                }
+                cnt20++;
+            } while (true);
+
+            END49=(Token)input.LT(1);
+            match(input,END,FOLLOW_END_in_template1034); if (failed) return retval;
+            if ( backtracking==0 ) stream_END.add(END49);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:359:7: ( SEMICOLON )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==SEMICOLON) ) {
+                alt21=1;
+            }
+            switch (alt21) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:359:7: SEMICOLON
+                    {
+                    SEMICOLON50=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_template1036); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON50);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: template_key, template_slot, template_id, END
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 360:3: -> ^( template_key template_id ( template_slot )+ END )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:360:6: ^( template_key template_id ( template_slot )+ END )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_template_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_template_id.next());
+                if ( !(stream_template_slot.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_template_slot.hasNext() ) {
+                    adaptor.addChild(root_1, stream_template_slot.next());
+
+                }
+                stream_template_slot.reset();
+                adaptor.addChild(root_1, stream_END.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end template
+
+    public static class template_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start template_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:363:1: template_id : (id= ID -> VT_TEMPLATE_ID[$id] | id= STRING -> VT_TEMPLATE_ID[$id] );
+    public final template_id_return template_id() throws RecognitionException {
+        template_id_return retval = new template_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:364:2: (id= ID -> VT_TEMPLATE_ID[$id] | id= STRING -> VT_TEMPLATE_ID[$id] )
+            int alt22=2;
+            int LA22_0 = input.LA(1);
+
+            if ( (LA22_0==ID) ) {
+                alt22=1;
+            }
+            else if ( (LA22_0==STRING) ) {
+                alt22=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("363:1: template_id : (id= ID -> VT_TEMPLATE_ID[$id] | id= STRING -> VT_TEMPLATE_ID[$id] );", 22, 0, input);
+
+                throw nvae;
+            }
+            switch (alt22) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:364:5: id= ID
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_template_id1066); if (failed) return retval;
+                    if ( backtracking==0 ) stream_ID.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.TEMPLATE, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 365:70: -> VT_TEMPLATE_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_TEMPLATE_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:5: id= STRING
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_template_id1082); if (failed) return retval;
+                    if ( backtracking==0 ) stream_STRING.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.TEMPLATE, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 367:70: -> VT_TEMPLATE_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_TEMPLATE_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end template_id
+
+    public static class template_slot_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start template_slot
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:370:1: template_slot : data_type slot_id ( SEMICOLON )? -> ^( VT_SLOT data_type slot_id ) ;
+    public final template_slot_return template_slot() throws RecognitionException {
+        template_slot_return retval = new template_slot_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token SEMICOLON53=null;
+        data_type_return data_type51 = null;
+
+        slot_id_return slot_id52 = null;
+
+
+        Object SEMICOLON53_tree=null;
+        RewriteRuleTokenStream stream_SEMICOLON=new RewriteRuleTokenStream(adaptor,"token SEMICOLON");
+        RewriteRuleSubtreeStream stream_slot_id=new RewriteRuleSubtreeStream(adaptor,"rule slot_id");
+        RewriteRuleSubtreeStream stream_data_type=new RewriteRuleSubtreeStream(adaptor,"rule data_type");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:2: ( data_type slot_id ( SEMICOLON )? -> ^( VT_SLOT data_type slot_id ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:5: data_type slot_id ( SEMICOLON )?
+            {
+            pushFollow(FOLLOW_data_type_in_template_slot1102);
+            data_type51=data_type();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_data_type.add(data_type51.getTree());
+            pushFollow(FOLLOW_slot_id_in_template_slot1104);
+            slot_id52=slot_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_slot_id.add(slot_id52.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:23: ( SEMICOLON )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( (LA23_0==SEMICOLON) ) {
+                alt23=1;
+            }
+            switch (alt23) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:371:23: SEMICOLON
+                    {
+                    SEMICOLON53=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_template_slot1106); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEMICOLON.add(SEMICOLON53);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: slot_id, data_type
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 372:3: -> ^( VT_SLOT data_type slot_id )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:372:6: ^( VT_SLOT data_type slot_id )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_SLOT, "VT_SLOT"), root_1);
+
+                adaptor.addChild(root_1, stream_data_type.next());
+                adaptor.addChild(root_1, stream_slot_id.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end template_slot
+
+    public static class slot_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start slot_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:375:1: slot_id : id= ID -> VT_SLOT_ID[$id] ;
+    public final slot_id_return slot_id() throws RecognitionException {
+        slot_id_return retval = new slot_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:375:9: (id= ID -> VT_SLOT_ID[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:375:11: id= ID
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_slot_id1131); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 376:3: -> VT_SLOT_ID[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_SLOT_ID, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end slot_id
+
+    public static class rule_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rule
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:379:1: rule : rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk -> ^( rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk ) ;
+    public final rule_return rule() throws RecognitionException {
+        rule_return retval = new rule_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        rule_key_return rule_key54 = null;
+
+        rule_id_return rule_id55 = null;
+
+        rule_attributes_return rule_attributes56 = null;
+
+        when_part_return when_part57 = null;
+
+        rhs_chunk_return rhs_chunk58 = null;
+
+
+        RewriteRuleSubtreeStream stream_rule_key=new RewriteRuleSubtreeStream(adaptor,"rule rule_key");
+        RewriteRuleSubtreeStream stream_rule_id=new RewriteRuleSubtreeStream(adaptor,"rule rule_id");
+        RewriteRuleSubtreeStream stream_when_part=new RewriteRuleSubtreeStream(adaptor,"rule when_part");
+        RewriteRuleSubtreeStream stream_rule_attributes=new RewriteRuleSubtreeStream(adaptor,"rule rule_attributes");
+        RewriteRuleSubtreeStream stream_rhs_chunk=new RewriteRuleSubtreeStream(adaptor,"rule rhs_chunk");
+         pushParaphrases(DroolsParaphareseTypes.RULE); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:2: ( rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk -> ^( rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:4: rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk
+            {
+            pushFollow(FOLLOW_rule_key_in_rule1160);
+            rule_key54=rule_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_rule_key.add(rule_key54.getTree());
+            pushFollow(FOLLOW_rule_id_in_rule1162);
+            rule_id55=rule_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_rule_id.add(rule_id55.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:21: ( rule_attributes )?
+            int alt24=2;
+            alt24 = dfa24.predict(input);
+            switch (alt24) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:21: rule_attributes
+                    {
+                    pushFollow(FOLLOW_rule_attributes_in_rule1164);
+                    rule_attributes56=rule_attributes();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_rule_attributes.add(rule_attributes56.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:38: ( when_part )?
+            int alt25=2;
+            int LA25_0 = input.LA(1);
+
+            if ( (LA25_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.WHEN)))) {
+                alt25=1;
+            }
+            switch (alt25) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:382:38: when_part
+                    {
+                    pushFollow(FOLLOW_when_part_in_rule1167);
+                    when_part57=when_part();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_when_part.add(when_part57.getTree());
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_rhs_chunk_in_rule1170);
+            rhs_chunk58=rhs_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_rhs_chunk.add(rhs_chunk58.getTree());
+
+            // AST REWRITE
+            // elements: when_part, rhs_chunk, rule_id, rule_key, rule_attributes
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 383:3: -> ^( rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:6: ^( rule_key rule_id ( rule_attributes )? ( when_part )? rhs_chunk )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_rule_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_rule_id.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:25: ( rule_attributes )?
+                if ( stream_rule_attributes.hasNext() ) {
+                    adaptor.addChild(root_1, stream_rule_attributes.next());
+
+                }
+                stream_rule_attributes.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:42: ( when_part )?
+                if ( stream_when_part.hasNext() ) {
+                    adaptor.addChild(root_1, stream_when_part.next());
+
+                }
+                stream_when_part.reset();
+                adaptor.addChild(root_1, stream_rhs_chunk.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule
+
+    public static class when_part_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start when_part
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:386:1: when_part : when_key ( COLON )? normal_lhs_block -> when_key normal_lhs_block ;
+    public final when_part_return when_part() throws RecognitionException {
+        when_part_return retval = new when_part_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token COLON60=null;
+        when_key_return when_key59 = null;
+
+        normal_lhs_block_return normal_lhs_block61 = null;
+
+
+        Object COLON60_tree=null;
+        RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+        RewriteRuleSubtreeStream stream_normal_lhs_block=new RewriteRuleSubtreeStream(adaptor,"rule normal_lhs_block");
+        RewriteRuleSubtreeStream stream_when_key=new RewriteRuleSubtreeStream(adaptor,"rule when_key");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:2: ( when_key ( COLON )? normal_lhs_block -> when_key normal_lhs_block )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:4: when_key ( COLON )? normal_lhs_block
+            {
+            pushFollow(FOLLOW_when_key_in_when_part1199);
+            when_key59=when_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_when_key.add(when_key59.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:13: ( COLON )?
+            int alt26=2;
+            int LA26_0 = input.LA(1);
+
+            if ( (LA26_0==COLON) ) {
+                alt26=1;
+            }
+            switch (alt26) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:13: COLON
+                    {
+                    COLON60=(Token)input.LT(1);
+                    match(input,COLON,FOLLOW_COLON_in_when_part1201); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COLON.add(COLON60);
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_normal_lhs_block_in_when_part1204);
+            normal_lhs_block61=normal_lhs_block();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_normal_lhs_block.add(normal_lhs_block61.getTree());
+
+            // AST REWRITE
+            // elements: when_key, normal_lhs_block
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 388:2: -> when_key normal_lhs_block
+            {
+                adaptor.addChild(root_0, stream_when_key.next());
+                adaptor.addChild(root_0, stream_normal_lhs_block.next());
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end when_part
+
+    public static class rule_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rule_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:391:1: rule_id : (id= ID -> VT_RULE_ID[$id] | id= STRING -> VT_RULE_ID[$id] );
+    public final rule_id_return rule_id() throws RecognitionException {
+        rule_id_return retval = new rule_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:392:2: (id= ID -> VT_RULE_ID[$id] | id= STRING -> VT_RULE_ID[$id] )
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==ID) ) {
+                alt27=1;
+            }
+            else if ( (LA27_0==STRING) ) {
+                alt27=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("391:1: rule_id : (id= ID -> VT_RULE_ID[$id] | id= STRING -> VT_RULE_ID[$id] );", 27, 0, input);
+
+                throw nvae;
+            }
+            switch (alt27) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:392:5: id= ID
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_rule_id1225); if (failed) return retval;
+                    if ( backtracking==0 ) stream_ID.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.RULE, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 393:66: -> VT_RULE_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_RULE_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:394:5: id= STRING
+                    {
+                    id=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_id1241); if (failed) return retval;
+                    if ( backtracking==0 ) stream_STRING.add(id);
+
+                    if ( backtracking==0 ) {
+                      	setParaphrasesValue(DroolsParaphareseTypes.RULE, id.getText());	
+                    }
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 395:66: -> VT_RULE_ID[$id]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_RULE_ID, id));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule_id
+
+    public static class rule_attributes_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rule_attributes
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:398:1: rule_attributes : ( attributes_key COLON )? rule_attribute ( ( COMMA )? attr= rule_attribute )* -> ^( VT_RULE_ATTRIBUTES ( attributes_key )? ( rule_attribute )+ ) ;
+    public final rule_attributes_return rule_attributes() throws RecognitionException {
+        rule_attributes_return retval = new rule_attributes_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token COLON63=null;
+        Token COMMA65=null;
+        rule_attribute_return attr = null;
+
+        attributes_key_return attributes_key62 = null;
+
+        rule_attribute_return rule_attribute64 = null;
+
+
+        Object COLON63_tree=null;
+        Object COMMA65_tree=null;
+        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+        RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+        RewriteRuleSubtreeStream stream_attributes_key=new RewriteRuleSubtreeStream(adaptor,"rule attributes_key");
+        RewriteRuleSubtreeStream stream_rule_attribute=new RewriteRuleSubtreeStream(adaptor,"rule rule_attribute");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:2: ( ( attributes_key COLON )? rule_attribute ( ( COMMA )? attr= rule_attribute )* -> ^( VT_RULE_ATTRIBUTES ( attributes_key )? ( rule_attribute )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:4: ( attributes_key COLON )? rule_attribute ( ( COMMA )? attr= rule_attribute )*
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:4: ( attributes_key COLON )?
+            int alt28=2;
+            int LA28_0 = input.LA(1);
+
+            if ( (LA28_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(Drool!
 sSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))))) {
+                int LA28_1 = input.LA(2);
+
+                if ( (LA28_1==COLON) && ((validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES)))) {
+                    alt28=1;
+                }
+            }
+            switch (alt28) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:6: attributes_key COLON
+                    {
+                    pushFollow(FOLLOW_attributes_key_in_rule_attributes1262);
+                    attributes_key62=attributes_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_attributes_key.add(attributes_key62.getTree());
+                    COLON63=(Token)input.LT(1);
+                    match(input,COLON,FOLLOW_COLON_in_rule_attributes1264); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COLON.add(COLON63);
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_rule_attribute_in_rule_attributes1269);
+            rule_attribute64=rule_attribute();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_rule_attribute.add(rule_attribute64.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:45: ( ( COMMA )? attr= rule_attribute )*
+            loop30:
+            do {
+                int alt30=2;
+                alt30 = dfa30.predict(input);
+                switch (alt30) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:47: ( COMMA )? attr= rule_attribute
+            	    {
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:47: ( COMMA )?
+            	    int alt29=2;
+            	    int LA29_0 = input.LA(1);
+
+            	    if ( (LA29_0==COMMA) ) {
+            	        alt29=1;
+            	    }
+            	    switch (alt29) {
+            	        case 1 :
+            	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:399:47: COMMA
+            	            {
+            	            COMMA65=(Token)input.LT(1);
+            	            match(input,COMMA,FOLLOW_COMMA_in_rule_attributes1273); if (failed) return retval;
+            	            if ( backtracking==0 ) stream_COMMA.add(COMMA65);
+
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes1278);
+            	    attr=rule_attribute();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_rule_attribute.add(attr.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop30;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: rule_attribute, attributes_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 400:3: -> ^( VT_RULE_ATTRIBUTES ( attributes_key )? ( rule_attribute )+ )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:400:6: ^( VT_RULE_ATTRIBUTES ( attributes_key )? ( rule_attribute )+ )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_RULE_ATTRIBUTES, "VT_RULE_ATTRIBUTES"), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:400:27: ( attributes_key )?
+                if ( stream_attributes_key.hasNext() ) {
+                    adaptor.addChild(root_1, stream_attributes_key.next());
+
+                }
+                stream_attributes_key.reset();
+                if ( !(stream_rule_attribute.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_rule_attribute.hasNext() ) {
+                    adaptor.addChild(root_1, stream_rule_attribute.next());
+
+                }
+                stream_rule_attribute.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule_attributes
+
+    public static class rule_attribute_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rule_attribute
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );
+    public final rule_attribute_return rule_attribute() throws RecognitionException {
+        rule_attribute_return retval = new rule_attribute_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        salience_return salience66 = null;
+
+        no_loop_return no_loop67 = null;
+
+        agenda_group_return agenda_group68 = null;
+
+        duration_return duration69 = null;
+
+        activation_group_return activation_group70 = null;
+
+        auto_focus_return auto_focus71 = null;
+
+        date_effective_return date_effective72 = null;
+
+        date_expires_return date_expires73 = null;
+
+        enabled_return enabled74 = null;
+
+        ruleflow_group_return ruleflow_group75 = null;
+
+        lock_on_active_return lock_on_active76 = null;
+
+        dialect_return dialect77 = null;
+
+
+
+         pushParaphrases(DroolsParaphareseTypes.RULE_ATTRIBUTE); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:406:2: ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect )
+            int alt31=12;
+            int LA31_0 = input.LA(1);
+
+            if ( (LA31_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(Drools!
 SoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {
+                int LA31_1 = input.LA(2);
+
+                if ( (LA31_1==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-"!
 ) && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {
+                    int LA31_2 = input.LA(3);
+
+                    if ( (LA31_2==ID) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "!
 -") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {
+                        int LA31_7 = input.LA(4);
+
+                        if ( (LA31_7==MISC) && ((validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE)))) {
+                            alt31=11;
+                        }
+                        else if ( (LA31_7==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {
+                            int LA31_10 = input.LA(5);
+
+                            if ( ((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                                alt31=3;
+                            }
+                            else if ( ((validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                                alt31=5;
+                            }
+                            else if ( ((validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))) ) {
+                                alt31=7;
+                            }
+                            else if ( ((validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))) ) {
+                                alt31=8;
+                            }
+                            else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                                alt31=10;
+                            }
+                            else {
+                                if (backtracking>0) {failed=true; return retval;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 10, input);
+
+                                throw nvae;
+                            }
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))) ) {
+                            alt31=2;
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))) ) {
+                            alt31=6;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 7, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 2, input);
+
+                        throw nvae;
+                    }
+                }
+                else if ( (LA31_1==INT) && (((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))))) {
+                    int LA31_3 = input.LA(3);
+
+                    if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {
+                        alt31=1;
+                    }
+                    else if ( ((validateIdentifierKey(DroolsSoftKeywords.DURATION))) ) {
+                        alt31=4;
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 3, input);
+
+                        throw nvae;
+                    }
+                }
+                else if ( (LA31_1==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {
+                    alt31=1;
+                }
+                else if ( (LA31_1==STRING) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {
+                    alt31=12;
+                }
+                else if ( (LA31_1==BOOL) && ((validateIdentifierKey(DroolsSoftKeywords.ENABLED)))) {
+                    alt31=9;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("403:1: rule_attribute : ( salience | no_loop | agenda_group | duration | activation_group | auto_focus | date_effective | date_expires | enabled | ruleflow_group | lock_on_active | dialect );", 31, 0, input);
+
+                throw nvae;
+            }
+            switch (alt31) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:406:4: salience
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_salience_in_rule_attribute1317);
+                    salience66=salience();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, salience66.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:407:4: no_loop
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_no_loop_in_rule_attribute1323);
+                    no_loop67=no_loop();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, no_loop67.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:408:4: agenda_group
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_agenda_group_in_rule_attribute1330);
+                    agenda_group68=agenda_group();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, agenda_group68.getTree());
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:409:4: duration
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_duration_in_rule_attribute1337);
+                    duration69=duration();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, duration69.getTree());
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:410:4: activation_group
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_activation_group_in_rule_attribute1344);
+                    activation_group70=activation_group();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, activation_group70.getTree());
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:411:4: auto_focus
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_auto_focus_in_rule_attribute1350);
+                    auto_focus71=auto_focus();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, auto_focus71.getTree());
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:412:4: date_effective
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_date_effective_in_rule_attribute1356);
+                    date_effective72=date_effective();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, date_effective72.getTree());
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:4: date_expires
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_date_expires_in_rule_attribute1362);
+                    date_expires73=date_expires();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, date_expires73.getTree());
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:414:4: enabled
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_enabled_in_rule_attribute1368);
+                    enabled74=enabled();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, enabled74.getTree());
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:415:4: ruleflow_group
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_ruleflow_group_in_rule_attribute1374);
+                    ruleflow_group75=ruleflow_group();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, ruleflow_group75.getTree());
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:416:4: lock_on_active
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_lock_on_active_in_rule_attribute1380);
+                    lock_on_active76=lock_on_active();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lock_on_active76.getTree());
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:417:4: dialect
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_dialect_in_rule_attribute1385);
+                    dialect77=dialect();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, dialect77.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule_attribute
+
+    public static class date_effective_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start date_effective
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:420:1: date_effective : date_effective_key STRING ;
+    public final date_effective_return date_effective() throws RecognitionException {
+        date_effective_return retval = new date_effective_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING79=null;
+        date_effective_key_return date_effective_key78 = null;
+
+
+        Object STRING79_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:421:2: ( date_effective_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:421:4: date_effective_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_date_effective_key_in_date_effective1397);
+            date_effective_key78=date_effective_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(date_effective_key78.getTree(), root_0);
+            STRING79=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_date_effective1400); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING79_tree = (Object)adaptor.create(STRING79);
+            adaptor.addChild(root_0, STRING79_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end date_effective
+
+    public static class date_expires_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start date_expires
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:424:1: date_expires : date_expires_key STRING ;
+    public final date_expires_return date_expires() throws RecognitionException {
+        date_expires_return retval = new date_expires_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING81=null;
+        date_expires_key_return date_expires_key80 = null;
+
+
+        Object STRING81_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:425:2: ( date_expires_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:425:4: date_expires_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_date_expires_key_in_date_expires1411);
+            date_expires_key80=date_expires_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(date_expires_key80.getTree(), root_0);
+            STRING81=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_date_expires1414); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING81_tree = (Object)adaptor.create(STRING81);
+            adaptor.addChild(root_0, STRING81_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end date_expires
+
+    public static class enabled_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start enabled
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:428:1: enabled : enabled_key BOOL ;
+    public final enabled_return enabled() throws RecognitionException {
+        enabled_return retval = new enabled_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token BOOL83=null;
+        enabled_key_return enabled_key82 = null;
+
+
+        Object BOOL83_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:429:2: ( enabled_key BOOL )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:429:4: enabled_key BOOL
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_enabled_key_in_enabled1428);
+            enabled_key82=enabled_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(enabled_key82.getTree(), root_0);
+            BOOL83=(Token)input.LT(1);
+            match(input,BOOL,FOLLOW_BOOL_in_enabled1431); if (failed) return retval;
+            if ( backtracking==0 ) {
+            BOOL83_tree = (Object)adaptor.create(BOOL83);
+            adaptor.addChild(root_0, BOOL83_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end enabled
+
+    public static class salience_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start salience
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:432:1: salience : salience_key ( INT | paren_chunk ) ;
+    public final salience_return salience() throws RecognitionException {
+        salience_return retval = new salience_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token INT85=null;
+        salience_key_return salience_key84 = null;
+
+        paren_chunk_return paren_chunk86 = null;
+
+
+        Object INT85_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:433:2: ( salience_key ( INT | paren_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:433:4: salience_key ( INT | paren_chunk )
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_salience_key_in_salience1443);
+            salience_key84=salience_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(salience_key84.getTree(), root_0);
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:434:3: ( INT | paren_chunk )
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==INT) ) {
+                alt32=1;
+            }
+            else if ( (LA32_0==LEFT_PAREN) ) {
+                alt32=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("434:3: ( INT | paren_chunk )", 32, 0, input);
+
+                throw nvae;
+            }
+            switch (alt32) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:434:5: INT
+                    {
+                    INT85=(Token)input.LT(1);
+                    match(input,INT,FOLLOW_INT_in_salience1450); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    INT85_tree = (Object)adaptor.create(INT85);
+                    adaptor.addChild(root_0, INT85_tree);
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:435:5: paren_chunk
+                    {
+                    pushFollow(FOLLOW_paren_chunk_in_salience1459);
+                    paren_chunk86=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, paren_chunk86.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end salience
+
+    public static class no_loop_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start no_loop
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:439:1: no_loop : no_loop_key ( BOOL )? ;
+    public final no_loop_return no_loop() throws RecognitionException {
+        no_loop_return retval = new no_loop_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token BOOL88=null;
+        no_loop_key_return no_loop_key87 = null;
+
+
+        Object BOOL88_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:2: ( no_loop_key ( BOOL )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:4: no_loop_key ( BOOL )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_no_loop_key_in_no_loop1475);
+            no_loop_key87=no_loop_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(no_loop_key87.getTree(), root_0);
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:17: ( BOOL )?
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==BOOL) ) {
+                alt33=1;
+            }
+            switch (alt33) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:440:17: BOOL
+                    {
+                    BOOL88=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_no_loop1478); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    BOOL88_tree = (Object)adaptor.create(BOOL88);
+                    adaptor.addChild(root_0, BOOL88_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end no_loop
+
+    public static class auto_focus_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start auto_focus
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:443:1: auto_focus : auto_focus_key ( BOOL )? ;
+    public final auto_focus_return auto_focus() throws RecognitionException {
+        auto_focus_return retval = new auto_focus_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token BOOL90=null;
+        auto_focus_key_return auto_focus_key89 = null;
+
+
+        Object BOOL90_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:444:2: ( auto_focus_key ( BOOL )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:444:4: auto_focus_key ( BOOL )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_auto_focus_key_in_auto_focus1490);
+            auto_focus_key89=auto_focus_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(auto_focus_key89.getTree(), root_0);
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:444:20: ( BOOL )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==BOOL) ) {
+                alt34=1;
+            }
+            switch (alt34) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:444:20: BOOL
+                    {
+                    BOOL90=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_auto_focus1493); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    BOOL90_tree = (Object)adaptor.create(BOOL90);
+                    adaptor.addChild(root_0, BOOL90_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end auto_focus
+
+    public static class activation_group_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start activation_group
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:447:1: activation_group : activation_group_key STRING ;
+    public final activation_group_return activation_group() throws RecognitionException {
+        activation_group_return retval = new activation_group_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING92=null;
+        activation_group_key_return activation_group_key91 = null;
+
+
+        Object STRING92_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:448:2: ( activation_group_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:448:4: activation_group_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_activation_group_key_in_activation_group1507);
+            activation_group_key91=activation_group_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(activation_group_key91.getTree(), root_0);
+            STRING92=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_activation_group1510); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING92_tree = (Object)adaptor.create(STRING92);
+            adaptor.addChild(root_0, STRING92_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end activation_group
+
+    public static class ruleflow_group_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start ruleflow_group
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:451:1: ruleflow_group : ruleflow_group_key STRING ;
+    public final ruleflow_group_return ruleflow_group() throws RecognitionException {
+        ruleflow_group_return retval = new ruleflow_group_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING94=null;
+        ruleflow_group_key_return ruleflow_group_key93 = null;
+
+
+        Object STRING94_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:452:2: ( ruleflow_group_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:452:4: ruleflow_group_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_ruleflow_group_key_in_ruleflow_group1521);
+            ruleflow_group_key93=ruleflow_group_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(ruleflow_group_key93.getTree(), root_0);
+            STRING94=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_ruleflow_group1524); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING94_tree = (Object)adaptor.create(STRING94);
+            adaptor.addChild(root_0, STRING94_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end ruleflow_group
+
+    public static class agenda_group_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start agenda_group
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:455:1: agenda_group : agenda_group_key STRING ;
+    public final agenda_group_return agenda_group() throws RecognitionException {
+        agenda_group_return retval = new agenda_group_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING96=null;
+        agenda_group_key_return agenda_group_key95 = null;
+
+
+        Object STRING96_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:456:2: ( agenda_group_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:456:4: agenda_group_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_agenda_group_key_in_agenda_group1535);
+            agenda_group_key95=agenda_group_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(agenda_group_key95.getTree(), root_0);
+            STRING96=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_agenda_group1538); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING96_tree = (Object)adaptor.create(STRING96);
+            adaptor.addChild(root_0, STRING96_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end agenda_group
+
+    public static class duration_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start duration
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:459:1: duration : duration_key INT ;
+    public final duration_return duration() throws RecognitionException {
+        duration_return retval = new duration_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token INT98=null;
+        duration_key_return duration_key97 = null;
+
+
+        Object INT98_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:460:2: ( duration_key INT )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:460:4: duration_key INT
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_duration_key_in_duration1549);
+            duration_key97=duration_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(duration_key97.getTree(), root_0);
+            INT98=(Token)input.LT(1);
+            match(input,INT,FOLLOW_INT_in_duration1552); if (failed) return retval;
+            if ( backtracking==0 ) {
+            INT98_tree = (Object)adaptor.create(INT98);
+            adaptor.addChild(root_0, INT98_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end duration
+
+    public static class dialect_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start dialect
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:463:1: dialect : dialect_key STRING ;
+    public final dialect_return dialect() throws RecognitionException {
+        dialect_return retval = new dialect_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token STRING100=null;
+        dialect_key_return dialect_key99 = null;
+
+
+        Object STRING100_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:464:2: ( dialect_key STRING )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:464:4: dialect_key STRING
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_dialect_key_in_dialect1566);
+            dialect_key99=dialect_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(dialect_key99.getTree(), root_0);
+            STRING100=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_dialect1569); if (failed) return retval;
+            if ( backtracking==0 ) {
+            STRING100_tree = (Object)adaptor.create(STRING100);
+            adaptor.addChild(root_0, STRING100_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end dialect
+
+    public static class lock_on_active_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lock_on_active
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:467:1: lock_on_active : lock_on_active_key ( BOOL )? ;
+    public final lock_on_active_return lock_on_active() throws RecognitionException {
+        lock_on_active_return retval = new lock_on_active_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token BOOL102=null;
+        lock_on_active_key_return lock_on_active_key101 = null;
+
+
+        Object BOOL102_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:468:2: ( lock_on_active_key ( BOOL )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:468:4: lock_on_active_key ( BOOL )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_lock_on_active_key_in_lock_on_active1587);
+            lock_on_active_key101=lock_on_active_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(lock_on_active_key101.getTree(), root_0);
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:468:24: ( BOOL )?
+            int alt35=2;
+            int LA35_0 = input.LA(1);
+
+            if ( (LA35_0==BOOL) ) {
+                alt35=1;
+            }
+            switch (alt35) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:468:24: BOOL
+                    {
+                    BOOL102=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_lock_on_active1590); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    BOOL102_tree = (Object)adaptor.create(BOOL102);
+                    adaptor.addChild(root_0, BOOL102_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lock_on_active
+
+    public static class normal_lhs_block_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start normal_lhs_block
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:471:1: normal_lhs_block : ( lhs )* -> ^( VT_AND_IMPLICIT ( lhs )* ) ;
+    public final normal_lhs_block_return normal_lhs_block() throws RecognitionException {
+        normal_lhs_block_return retval = new normal_lhs_block_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        lhs_return lhs103 = null;
+
+
+        RewriteRuleSubtreeStream stream_lhs=new RewriteRuleSubtreeStream(adaptor,"rule lhs");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:472:2: ( ( lhs )* -> ^( VT_AND_IMPLICIT ( lhs )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:472:4: ( lhs )*
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:472:4: ( lhs )*
+            loop36:
+            do {
+                int alt36=2;
+                int LA36_0 = input.LA(1);
+
+                if ( (LA36_0==ID||LA36_0==LEFT_PAREN) ) {
+                    alt36=1;
+                }
+
+
+                switch (alt36) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:472:4: lhs
+            	    {
+            	    pushFollow(FOLLOW_lhs_in_normal_lhs_block1602);
+            	    lhs103=lhs();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_lhs.add(lhs103.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop36;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: lhs
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 473:2: -> ^( VT_AND_IMPLICIT ( lhs )* )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:473:5: ^( VT_AND_IMPLICIT ( lhs )* )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_AND_IMPLICIT, "VT_AND_IMPLICIT"), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:473:23: ( lhs )*
+                while ( stream_lhs.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs.next());
+
+                }
+                stream_lhs.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end normal_lhs_block
+
+    public static class lhs_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:476:1: lhs : lhs_or ;
+    public final lhs_return lhs() throws RecognitionException {
+        lhs_return retval = new lhs_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        lhs_or_return lhs_or104 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:476:5: ( lhs_or )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:476:7: lhs_or
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_lhs_or_in_lhs1623);
+            lhs_or104=lhs_or();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, lhs_or104.getTree());
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs
+
+    public static class lhs_or_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_or
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );
+    public final lhs_or_return lhs_or() throws RecognitionException {
+        lhs_or_return retval = new lhs_or_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token pipe=null;
+        Token LEFT_PAREN105=null;
+        Token RIGHT_PAREN107=null;
+        or_key_return or = null;
+
+        or_key_return value = null;
+
+        lhs_and_return lhs_and106 = null;
+
+        lhs_and_return lhs_and108 = null;
+
+        lhs_and_return lhs_and109 = null;
+
+
+        Object pipe_tree=null;
+        Object LEFT_PAREN105_tree=null;
+        Object RIGHT_PAREN107_tree=null;
+        RewriteRuleTokenStream stream_DOUBLE_PIPE=new RewriteRuleTokenStream(adaptor,"token DOUBLE_PIPE");
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_or_key=new RewriteRuleSubtreeStream(adaptor,"rule or_key");
+        RewriteRuleSubtreeStream stream_lhs_and=new RewriteRuleSubtreeStream(adaptor,"rule lhs_and");
+
+        	Token orToken = null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:3: ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* )
+            int alt40=2;
+            int LA40_0 = input.LA(1);
+
+            if ( (LA40_0==LEFT_PAREN) ) {
+                int LA40_1 = input.LA(2);
+
+                if ( (LA40_1==LEFT_PAREN) ) {
+                    alt40=2;
+                }
+                else if ( (LA40_1==ID) ) {
+                    switch ( input.LA(3) ) {
+                    case DOT:
+                    case COLON:
+                    case LEFT_SQUARE:
+                        {
+                        alt40=2;
+                        }
+                        break;
+                    case ID:
+                        {
+                        int LA40_4 = input.LA(4);
+
+                        if ( (synpred1()) ) {
+                            alt40=1;
+                        }
+                        else if ( (true) ) {
+                            alt40=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );", 40, 4, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case LEFT_PAREN:
+                        {
+                        int LA40_5 = input.LA(4);
+
+                        if ( (synpred1()) ) {
+                            alt40=1;
+                        }
+                        else if ( (true) ) {
+                            alt40=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );", 40, 5, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    default:
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );", 40, 3, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );", 40, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA40_0==ID) ) {
+                alt40=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("479:1: lhs_or : ( ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN ) | ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )* );", 40, 0, input);
+
+                throw nvae;
+            }
+            switch (alt40) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:5: ( LEFT_PAREN or_key )=> LEFT_PAREN or= or_key ( lhs_and )+ RIGHT_PAREN
+                    {
+                    LEFT_PAREN105=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_or1644); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN105);
+
+                    pushFollow(FOLLOW_or_key_in_lhs_or1648);
+                    or=or_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_or_key.add(or.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:48: ( lhs_and )+
+                    int cnt37=0;
+                    loop37:
+                    do {
+                        int alt37=2;
+                        int LA37_0 = input.LA(1);
+
+                        if ( (LA37_0==ID||LA37_0==LEFT_PAREN) ) {
+                            alt37=1;
+                        }
+
+
+                        switch (alt37) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:48: lhs_and
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1650);
+                    	    lhs_and106=lhs_and();
+                    	    _fsp--;
+                    	    if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_lhs_and.add(lhs_and106.getTree());
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt37 >= 1 ) break loop37;
+                    	    if (backtracking>0) {failed=true; return retval;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(37, input);
+                                throw eee;
+                        }
+                        cnt37++;
+                    } while (true);
+
+                    RIGHT_PAREN107=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_or1653); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN107);
+
+
+                    // AST REWRITE
+                    // elements: lhs_and, RIGHT_PAREN
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 483:3: -> ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:483:6: ^( VT_OR_PREFIX[$or.start] ( lhs_and )+ RIGHT_PAREN )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_OR_PREFIX, ((Token)or.start)), root_1);
+
+                        if ( !(stream_lhs_and.hasNext()) ) {
+                            throw new RewriteEarlyExitException();
+                        }
+                        while ( stream_lhs_and.hasNext() ) {
+                            adaptor.addChild(root_1, stream_lhs_and.next());
+
+                        }
+                        stream_lhs_and.reset();
+                        adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:484:4: ( lhs_and -> lhs_and ) ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )*
+                    {
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:484:4: ( lhs_and -> lhs_and )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:484:5: lhs_and
+                    {
+                    pushFollow(FOLLOW_lhs_and_in_lhs_or1674);
+                    lhs_and108=lhs_and();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_and.add(lhs_and108.getTree());
+
+                    // AST REWRITE
+                    // elements: lhs_and
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 484:13: -> lhs_and
+                    {
+                        adaptor.addChild(root_0, stream_lhs_and.next());
+
+                    }
+
+                    }
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:3: ( ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and ) )*
+                    loop39:
+                    do {
+                        int alt39=2;
+                        int LA39_0 = input.LA(1);
+
+                        if ( (LA39_0==ID) ) {
+                            int LA39_2 = input.LA(2);
+
+                            if ( ((synpred2()&&(validateIdentifierKey(DroolsSoftKeywords.OR)))) ) {
+                                alt39=1;
+                            }
+
+
+                        }
+                        else if ( (LA39_0==DOUBLE_PIPE) ) {
+                            int LA39_3 = input.LA(2);
+
+                            if ( (synpred2()) ) {
+                                alt39=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt39) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:5: ( or_key | DOUBLE_PIPE )=> (value= or_key | pipe= DOUBLE_PIPE ) lhs_and
+                    	    {
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:28: (value= or_key | pipe= DOUBLE_PIPE )
+                    	    int alt38=2;
+                    	    int LA38_0 = input.LA(1);
+
+                    	    if ( (LA38_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.OR)))) {
+                    	        alt38=1;
+                    	    }
+                    	    else if ( (LA38_0==DOUBLE_PIPE) ) {
+                    	        alt38=2;
+                    	    }
+                    	    else {
+                    	        if (backtracking>0) {failed=true; return retval;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("485:28: (value= or_key | pipe= DOUBLE_PIPE )", 38, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt38) {
+                    	        case 1 :
+                    	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:29: value= or_key
+                    	            {
+                    	            pushFollow(FOLLOW_or_key_in_lhs_or1696);
+                    	            value=or_key();
+                    	            _fsp--;
+                    	            if (failed) return retval;
+                    	            if ( backtracking==0 ) stream_or_key.add(value.getTree());
+                    	            if ( backtracking==0 ) {
+                    	              orToken = ((Token)value.start);
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:69: pipe= DOUBLE_PIPE
+                    	            {
+                    	            pipe=(Token)input.LT(1);
+                    	            match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_lhs_or1703); if (failed) return retval;
+                    	            if ( backtracking==0 ) stream_DOUBLE_PIPE.add(pipe);
+
+                    	            if ( backtracking==0 ) {
+                    	              orToken = pipe;
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1708);
+                    	    lhs_and109=lhs_and();
+                    	    _fsp--;
+                    	    if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_lhs_and.add(lhs_and109.getTree());
+
+                    	    // AST REWRITE
+                    	    // elements: lhs_and, lhs_or
+                    	    // token labels: 
+                    	    // rule labels: retval
+                    	    // token list labels: 
+                    	    // rule list labels: 
+                    	    if ( backtracking==0 ) {
+                    	    retval.tree = root_0;
+                    	    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    	    root_0 = (Object)adaptor.nil();
+                    	    // 486:3: -> ^( VT_OR_INFIX[orToken] $lhs_or lhs_and )
+                    	    {
+                    	        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:486:6: ^( VT_OR_INFIX[orToken] $lhs_or lhs_and )
+                    	        {
+                    	        Object root_1 = (Object)adaptor.nil();
+                    	        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_OR_INFIX, orToken), root_1);
+
+                    	        adaptor.addChild(root_1, stream_retval.next());
+                    	        adaptor.addChild(root_1, stream_lhs_and.next());
+
+                    	        adaptor.addChild(root_0, root_1);
+                    	        }
+
+                    	    }
+
+                    	    }
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop39;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_or
+
+    public static class lhs_and_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_and
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );
+    public final lhs_and_return lhs_and() throws RecognitionException {
+        lhs_and_return retval = new lhs_and_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token amper=null;
+        Token LEFT_PAREN110=null;
+        Token RIGHT_PAREN112=null;
+        and_key_return and = null;
+
+        and_key_return value = null;
+
+        lhs_unary_return lhs_unary111 = null;
+
+        lhs_unary_return lhs_unary113 = null;
+
+        lhs_unary_return lhs_unary114 = null;
+
+
+        Object amper_tree=null;
+        Object LEFT_PAREN110_tree=null;
+        Object RIGHT_PAREN112_tree=null;
+        RewriteRuleTokenStream stream_DOUBLE_AMPER=new RewriteRuleTokenStream(adaptor,"token DOUBLE_AMPER");
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_and_key=new RewriteRuleSubtreeStream(adaptor,"rule and_key");
+        RewriteRuleSubtreeStream stream_lhs_unary=new RewriteRuleSubtreeStream(adaptor,"rule lhs_unary");
+
+        	Token andToken = null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:3: ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* )
+            int alt44=2;
+            int LA44_0 = input.LA(1);
+
+            if ( (LA44_0==LEFT_PAREN) ) {
+                int LA44_1 = input.LA(2);
+
+                if ( (LA44_1==LEFT_PAREN) ) {
+                    alt44=2;
+                }
+                else if ( (LA44_1==ID) ) {
+                    switch ( input.LA(3) ) {
+                    case DOT:
+                    case COLON:
+                    case LEFT_SQUARE:
+                        {
+                        alt44=2;
+                        }
+                        break;
+                    case LEFT_PAREN:
+                        {
+                        switch ( input.LA(4) ) {
+                        case ID:
+                            {
+                            int LA44_6 = input.LA(5);
+
+                            if ( (synpred3()) ) {
+                                alt44=1;
+                            }
+                            else if ( (true) ) {
+                                alt44=2;
+                            }
+                            else {
+                                if (backtracking>0) {failed=true; return retval;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 6, input);
+
+                                throw nvae;
+                            }
+                            }
+                            break;
+                        case LEFT_PAREN:
+                            {
+                            int LA44_7 = input.LA(5);
+
+                            if ( (synpred3()) ) {
+                                alt44=1;
+                            }
+                            else if ( (true) ) {
+                                alt44=2;
+                            }
+                            else {
+                                if (backtracking>0) {failed=true; return retval;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 7, input);
+
+                                throw nvae;
+                            }
+                            }
+                            break;
+                        case VT_COMPILATION_UNIT:
+                        case VT_FUNCTION_IMPORT:
+                        case VT_FACT:
+                        case VT_CONSTRAINTS:
+                        case VT_LABEL:
+                        case VT_QUERY_ID:
+                        case VT_TEMPLATE_ID:
+                        case VT_RULE_ID:
+                        case VT_ENTRYPOINT_ID:
+                        case VT_SLOT_ID:
+                        case VT_SLOT:
+                        case VT_RULE_ATTRIBUTES:
+                        case VT_RHS_CHUNK:
+                        case VT_CURLY_CHUNK:
+                        case VT_SQUARE_CHUNK:
+                        case VT_PAREN_CHUNK:
+                        case VT_AND_IMPLICIT:
+                        case VT_AND_PREFIX:
+                        case VT_OR_PREFIX:
+                        case VT_AND_INFIX:
+                        case VT_OR_INFIX:
+                        case VT_ACCUMULATE_INIT_CLAUSE:
+                        case VT_ACCUMULATE_ID_CLAUSE:
+                        case VT_FROM_SOURCE:
+                        case VT_EXPRESSION_CHAIN:
+                        case VT_PATTERN:
+                        case VT_FACT_BINDING:
+                        case VT_FACT_OR:
+                        case VT_BIND_FIELD:
+                        case VT_FIELD:
+                        case VT_ACCESSOR_PATH:
+                        case VT_ACCESSOR_ELEMENT:
+                        case VT_DATA_TYPE:
+                        case VT_PATTERN_TYPE:
+                        case VT_PACKAGE_ID:
+                        case VT_IMPORT_ID:
+                        case VT_GLOBAL_ID:
+                        case VT_FUNCTION_ID:
+                        case VT_PARAM_LIST:
+                        case VK_DATE_EFFECTIVE:
+                        case VK_DATE_EXPIRES:
+                        case VK_LOCK_ON_ACTIVE:
+                        case VK_NO_LOOP:
+                        case VK_AUTO_FOCUS:
+                        case VK_ACTIVATION_GROUP:
+                        case VK_AGENDA_GROUP:
+                        case VK_RULEFLOW_GROUP:
+                        case VK_DURATION:
+                        case VK_DIALECT:
+                        case VK_SALIENCE:
+                        case VK_ENABLED:
+                        case VK_ATTRIBUTES:
+                        case VK_WHEN:
+                        case VK_RULE:
+                        case VK_IMPORT:
+                        case VK_PACKAGE:
+                        case VK_TEMPLATE:
+                        case VK_QUERY:
+                        case VK_DECLARE:
+                        case VK_FUNCTION:
+                        case VK_GLOBAL:
+                        case VK_EVAL:
+                        case VK_CONTAINS:
+                        case VK_MATCHES:
+                        case VK_EXCLUDES:
+                        case VK_SOUNDSLIKE:
+                        case VK_MEMBEROF:
+                        case VK_ENTRY_POINT:
+                        case VK_NOT:
+                        case VK_IN:
+                        case VK_OR:
+                        case VK_AND:
+                        case VK_EXISTS:
+                        case VK_FORALL:
+                        case VK_FROM:
+                        case VK_ACCUMULATE:
+                        case VK_INIT:
+                        case VK_ACTION:
+                        case VK_REVERSE:
+                        case VK_RESULT:
+                        case VK_COLLECT:
+                        case SEMICOLON:
+                        case DOT:
+                        case DOT_STAR:
+                        case END:
+                        case STRING:
+                        case COMMA:
+                        case RIGHT_PAREN:
+                        case COLON:
+                        case BOOL:
+                        case INT:
+                        case DOUBLE_PIPE:
+                        case DOUBLE_AMPER:
+                        case ARROW:
+                        case EQUAL:
+                        case GREATER:
+                        case GREATER_EQUAL:
+                        case LESS:
+                        case LESS_EQUAL:
+                        case NOT_EQUAL:
+                        case GRAVE_ACCENT:
+                        case FLOAT:
+                        case NULL:
+                        case LEFT_SQUARE:
+                        case RIGHT_SQUARE:
+                        case THEN:
+                        case LEFT_CURLY:
+                        case RIGHT_CURLY:
+                        case MISC:
+                        case EOL:
+                        case WS:
+                        case EscapeSequence:
+                        case HexDigit:
+                        case UnicodeEscape:
+                        case OctalEscape:
+                        case SH_STYLE_SINGLE_LINE_COMMENT:
+                        case C_STYLE_SINGLE_LINE_COMMENT:
+                        case MULTI_LINE_COMMENT:
+                            {
+                            alt44=2;
+                            }
+                            break;
+                        default:
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 4, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case ID:
+                        {
+                        int LA44_5 = input.LA(4);
+
+                        if ( (synpred3()) ) {
+                            alt44=1;
+                        }
+                        else if ( (true) ) {
+                            alt44=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 5, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    default:
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 3, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA44_0==ID) ) {
+                alt44=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("489:1: lhs_and : ( ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN ) | ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )* );", 44, 0, input);
+
+                throw nvae;
+            }
+            switch (alt44) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:5: ( LEFT_PAREN and_key )=> LEFT_PAREN and= and_key ( lhs_unary )+ RIGHT_PAREN
+                    {
+                    LEFT_PAREN110=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_and1746); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN110);
+
+                    pushFollow(FOLLOW_and_key_in_lhs_and1750);
+                    and=and_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_and_key.add(and.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:51: ( lhs_unary )+
+                    int cnt41=0;
+                    loop41:
+                    do {
+                        int alt41=2;
+                        int LA41_0 = input.LA(1);
+
+                        if ( (LA41_0==ID||LA41_0==LEFT_PAREN) ) {
+                            alt41=1;
+                        }
+
+
+                        switch (alt41) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:51: lhs_unary
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1752);
+                    	    lhs_unary111=lhs_unary();
+                    	    _fsp--;
+                    	    if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_lhs_unary.add(lhs_unary111.getTree());
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt41 >= 1 ) break loop41;
+                    	    if (backtracking>0) {failed=true; return retval;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(41, input);
+                                throw eee;
+                        }
+                        cnt41++;
+                    } while (true);
+
+                    RIGHT_PAREN112=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_and1755); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN112);
+
+
+                    // AST REWRITE
+                    // elements: lhs_unary, RIGHT_PAREN
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 493:3: -> ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:493:6: ^( VT_AND_PREFIX[$and.start] ( lhs_unary )+ RIGHT_PAREN )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_AND_PREFIX, ((Token)and.start)), root_1);
+
+                        if ( !(stream_lhs_unary.hasNext()) ) {
+                            throw new RewriteEarlyExitException();
+                        }
+                        while ( stream_lhs_unary.hasNext() ) {
+                            adaptor.addChild(root_1, stream_lhs_unary.next());
+
+                        }
+                        stream_lhs_unary.reset();
+                        adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:4: ( lhs_unary -> lhs_unary ) ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )*
+                    {
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:4: ( lhs_unary -> lhs_unary )
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:5: lhs_unary
+                    {
+                    pushFollow(FOLLOW_lhs_unary_in_lhs_and1776);
+                    lhs_unary113=lhs_unary();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_unary.add(lhs_unary113.getTree());
+
+                    // AST REWRITE
+                    // elements: lhs_unary
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 494:15: -> lhs_unary
+                    {
+                        adaptor.addChild(root_0, stream_lhs_unary.next());
+
+                    }
+
+                    }
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:3: ( ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary ) )*
+                    loop43:
+                    do {
+                        int alt43=2;
+                        int LA43_0 = input.LA(1);
+
+                        if ( (LA43_0==ID) ) {
+                            int LA43_2 = input.LA(2);
+
+                            if ( ((synpred4()&&(validateIdentifierKey(DroolsSoftKeywords.AND)))) ) {
+                                alt43=1;
+                            }
+
+
+                        }
+                        else if ( (LA43_0==DOUBLE_AMPER) ) {
+                            int LA43_3 = input.LA(2);
+
+                            if ( (synpred4()) ) {
+                                alt43=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt43) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:5: ( and_key | DOUBLE_AMPER )=> (value= and_key | amper= DOUBLE_AMPER ) lhs_unary
+                    	    {
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:30: (value= and_key | amper= DOUBLE_AMPER )
+                    	    int alt42=2;
+                    	    int LA42_0 = input.LA(1);
+
+                    	    if ( (LA42_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.AND)))) {
+                    	        alt42=1;
+                    	    }
+                    	    else if ( (LA42_0==DOUBLE_AMPER) ) {
+                    	        alt42=2;
+                    	    }
+                    	    else {
+                    	        if (backtracking>0) {failed=true; return retval;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("495:30: (value= and_key | amper= DOUBLE_AMPER )", 42, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt42) {
+                    	        case 1 :
+                    	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:31: value= and_key
+                    	            {
+                    	            pushFollow(FOLLOW_and_key_in_lhs_and1798);
+                    	            value=and_key();
+                    	            _fsp--;
+                    	            if (failed) return retval;
+                    	            if ( backtracking==0 ) stream_and_key.add(value.getTree());
+                    	            if ( backtracking==0 ) {
+                    	              andToken = ((Token)value.start);
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:73: amper= DOUBLE_AMPER
+                    	            {
+                    	            amper=(Token)input.LT(1);
+                    	            match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_lhs_and1805); if (failed) return retval;
+                    	            if ( backtracking==0 ) stream_DOUBLE_AMPER.add(amper);
+
+                    	            if ( backtracking==0 ) {
+                    	              andToken = amper;
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1810);
+                    	    lhs_unary114=lhs_unary();
+                    	    _fsp--;
+                    	    if (failed) return retval;
+                    	    if ( backtracking==0 ) stream_lhs_unary.add(lhs_unary114.getTree());
+
+                    	    // AST REWRITE
+                    	    // elements: lhs_unary, lhs_and
+                    	    // token labels: 
+                    	    // rule labels: retval
+                    	    // token list labels: 
+                    	    // rule list labels: 
+                    	    if ( backtracking==0 ) {
+                    	    retval.tree = root_0;
+                    	    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    	    root_0 = (Object)adaptor.nil();
+                    	    // 496:3: -> ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary )
+                    	    {
+                    	        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:6: ^( VT_AND_INFIX[andToken] $lhs_and lhs_unary )
+                    	        {
+                    	        Object root_1 = (Object)adaptor.nil();
+                    	        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_AND_INFIX, andToken), root_1);
+
+                    	        adaptor.addChild(root_1, stream_retval.next());
+                    	        adaptor.addChild(root_1, stream_lhs_unary.next());
+
+                    	        adaptor.addChild(root_0, root_1);
+                    	        }
+
+                    	    }
+
+                    	    }
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop43;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_and
+
+    public static class lhs_unary_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_unary
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:499:1: lhs_unary options {backtrack=true; } : ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source ) ( ( SEMICOLON )=> SEMICOLON )? ;
+    public final lhs_unary_return lhs_unary() throws RecognitionException {
+        lhs_unary_return retval = new lhs_unary_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN119=null;
+        Token RIGHT_PAREN121=null;
+        Token SEMICOLON123=null;
+        lhs_exist_return lhs_exist115 = null;
+
+        lhs_not_return lhs_not116 = null;
+
+        lhs_eval_return lhs_eval117 = null;
+
+        lhs_forall_return lhs_forall118 = null;
+
+        lhs_or_return lhs_or120 = null;
+
+        pattern_source_return pattern_source122 = null;
+
+
+        Object LEFT_PAREN119_tree=null;
+        Object RIGHT_PAREN121_tree=null;
+        Object SEMICOLON123_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:501:2: ( ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source ) ( ( SEMICOLON )=> SEMICOLON )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:501:4: ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source ) ( ( SEMICOLON )=> SEMICOLON )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:501:4: ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source )
+            int alt45=6;
+            int LA45_0 = input.LA(1);
+
+            if ( (LA45_0==ID) ) {
+                int LA45_1 = input.LA(2);
+
+                if ( ((validateIdentifierKey(DroolsSoftKeywords.EXISTS))) ) {
+                    alt45=1;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.NOT))) ) {
+                    alt45=2;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.EVAL))) ) {
+                    alt45=3;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.FORALL))) ) {
+                    alt45=4;
+                }
+                else if ( (true) ) {
+                    alt45=6;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("501:4: ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source )", 45, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA45_0==LEFT_PAREN) ) {
+                alt45=5;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("501:4: ( lhs_exist | lhs_not | lhs_eval | lhs_forall | LEFT_PAREN lhs_or RIGHT_PAREN | pattern_source )", 45, 0, input);
+
+                throw nvae;
+            }
+            switch (alt45) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:501:6: lhs_exist
+                    {
+                    pushFollow(FOLLOW_lhs_exist_in_lhs_unary1848);
+                    lhs_exist115=lhs_exist();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lhs_exist115.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:502:5: lhs_not
+                    {
+                    pushFollow(FOLLOW_lhs_not_in_lhs_unary1854);
+                    lhs_not116=lhs_not();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lhs_not116.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:503:5: lhs_eval
+                    {
+                    pushFollow(FOLLOW_lhs_eval_in_lhs_unary1860);
+                    lhs_eval117=lhs_eval();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lhs_eval117.getTree());
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:504:5: lhs_forall
+                    {
+                    pushFollow(FOLLOW_lhs_forall_in_lhs_unary1866);
+                    lhs_forall118=lhs_forall();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lhs_forall118.getTree());
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:505:5: LEFT_PAREN lhs_or RIGHT_PAREN
+                    {
+                    LEFT_PAREN119=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_unary1872); if (failed) return retval;
+                    pushFollow(FOLLOW_lhs_or_in_lhs_unary1875);
+                    lhs_or120=lhs_or();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, lhs_or120.getTree());
+                    RIGHT_PAREN121=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_unary1877); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    RIGHT_PAREN121_tree = (Object)adaptor.create(RIGHT_PAREN121);
+                    adaptor.addChild(root_0, RIGHT_PAREN121_tree);
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:506:5: pattern_source
+                    {
+                    pushFollow(FOLLOW_pattern_source_in_lhs_unary1883);
+                    pattern_source122=pattern_source();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, pattern_source122.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:3: ( ( SEMICOLON )=> SEMICOLON )?
+            int alt46=2;
+            int LA46_0 = input.LA(1);
+
+            if ( (LA46_0==SEMICOLON) ) {
+                int LA46_1 = input.LA(2);
+
+                if ( (synpred5()) ) {
+                    alt46=1;
+                }
+            }
+            switch (alt46) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:4: ( SEMICOLON )=> SEMICOLON
+                    {
+                    SEMICOLON123=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_lhs_unary1897); if (failed) return retval;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_unary
+
+    public static class lhs_exist_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_exist
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:1: lhs_exist : exists_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern ) -> ^( exists_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? ) ;
+    public final lhs_exist_return lhs_exist() throws RecognitionException {
+        lhs_exist_return retval = new lhs_exist_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN126=null;
+        Token RIGHT_PAREN128=null;
+        exists_key_return exists_key124 = null;
+
+        lhs_or_return lhs_or125 = null;
+
+        lhs_or_return lhs_or127 = null;
+
+        lhs_pattern_return lhs_pattern129 = null;
+
+
+        Object LEFT_PAREN126_tree=null;
+        Object RIGHT_PAREN128_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_lhs_or=new RewriteRuleSubtreeStream(adaptor,"rule lhs_or");
+        RewriteRuleSubtreeStream stream_exists_key=new RewriteRuleSubtreeStream(adaptor,"rule exists_key");
+        RewriteRuleSubtreeStream stream_lhs_pattern=new RewriteRuleSubtreeStream(adaptor,"rule lhs_pattern");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:512:2: ( exists_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern ) -> ^( exists_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:512:4: exists_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )
+            {
+            pushFollow(FOLLOW_exists_key_in_lhs_exist1911);
+            exists_key124=exists_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_exists_key.add(exists_key124.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:10: ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )
+            int alt47=3;
+            alt47 = dfa47.predict(input);
+            switch (alt47) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:12: ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or
+                    {
+                    pushFollow(FOLLOW_lhs_or_in_lhs_exist1935);
+                    lhs_or125=lhs_or();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_or.add(lhs_or125.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:514:5: LEFT_PAREN lhs_or RIGHT_PAREN
+                    {
+                    LEFT_PAREN126=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_exist1942); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN126);
+
+                    pushFollow(FOLLOW_lhs_or_in_lhs_exist1944);
+                    lhs_or127=lhs_or();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_or.add(lhs_or127.getTree());
+                    RIGHT_PAREN128=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_exist1946); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN128);
+
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:515:12: lhs_pattern
+                    {
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs_exist1959);
+                    lhs_pattern129=lhs_pattern();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_pattern.add(lhs_pattern129.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: RIGHT_PAREN, lhs_pattern, lhs_or, exists_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 517:10: -> ^( exists_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:517:13: ^( exists_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_exists_key.nextNode(), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:517:26: ( lhs_or )?
+                if ( stream_lhs_or.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs_or.next());
+
+                }
+                stream_lhs_or.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:517:34: ( lhs_pattern )?
+                if ( stream_lhs_pattern.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs_pattern.next());
+
+                }
+                stream_lhs_pattern.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:517:47: ( RIGHT_PAREN )?
+                if ( stream_RIGHT_PAREN.hasNext() ) {
+                    adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                }
+                stream_RIGHT_PAREN.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_exist
+
+    public static class lhs_not_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_not
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:520:1: lhs_not : not_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern ) -> ^( not_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? ) ;
+    public final lhs_not_return lhs_not() throws RecognitionException {
+        lhs_not_return retval = new lhs_not_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN132=null;
+        Token RIGHT_PAREN134=null;
+        not_key_return not_key130 = null;
+
+        lhs_or_return lhs_or131 = null;
+
+        lhs_or_return lhs_or133 = null;
+
+        lhs_pattern_return lhs_pattern135 = null;
+
+
+        Object LEFT_PAREN132_tree=null;
+        Object RIGHT_PAREN134_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_lhs_or=new RewriteRuleSubtreeStream(adaptor,"rule lhs_or");
+        RewriteRuleSubtreeStream stream_not_key=new RewriteRuleSubtreeStream(adaptor,"rule not_key");
+        RewriteRuleSubtreeStream stream_lhs_pattern=new RewriteRuleSubtreeStream(adaptor,"rule lhs_pattern");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:520:9: ( not_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern ) -> ^( not_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:520:11: not_key ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )
+            {
+            pushFollow(FOLLOW_not_key_in_lhs_not2005);
+            not_key130=not_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_not_key.add(not_key130.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:3: ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )
+            int alt48=3;
+            alt48 = dfa48.predict(input);
+            switch (alt48) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:5: ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or
+                    {
+                    pushFollow(FOLLOW_lhs_or_in_lhs_not2022);
+                    lhs_or131=lhs_or();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_or.add(lhs_or131.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:522:5: LEFT_PAREN lhs_or RIGHT_PAREN
+                    {
+                    LEFT_PAREN132=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_not2029); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN132);
+
+                    pushFollow(FOLLOW_lhs_or_in_lhs_not2031);
+                    lhs_or133=lhs_or();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_or.add(lhs_or133.getTree());
+                    RIGHT_PAREN134=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_not2033); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN134);
+
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:523:6: lhs_pattern
+                    {
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs_not2041);
+                    lhs_pattern135=lhs_pattern();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_lhs_pattern.add(lhs_pattern135.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: lhs_or, RIGHT_PAREN, not_key, lhs_pattern
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 524:10: -> ^( not_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:524:13: ^( not_key ( lhs_or )? ( lhs_pattern )? ( RIGHT_PAREN )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_not_key.nextNode(), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:524:23: ( lhs_or )?
+                if ( stream_lhs_or.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs_or.next());
+
+                }
+                stream_lhs_or.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:524:31: ( lhs_pattern )?
+                if ( stream_lhs_pattern.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs_pattern.next());
+
+                }
+                stream_lhs_pattern.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:524:44: ( RIGHT_PAREN )?
+                if ( stream_RIGHT_PAREN.hasNext() ) {
+                    adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                }
+                stream_RIGHT_PAREN.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_not
+
+    public static class lhs_eval_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_eval
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:527:1: lhs_eval : ev= eval_key pc= paren_chunk -> ^( eval_key paren_chunk ) ;
+    public final lhs_eval_return lhs_eval() throws RecognitionException {
+        lhs_eval_return retval = new lhs_eval_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        eval_key_return ev = null;
+
+        paren_chunk_return pc = null;
+
+
+        RewriteRuleSubtreeStream stream_eval_key=new RewriteRuleSubtreeStream(adaptor,"rule eval_key");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:528:2: (ev= eval_key pc= paren_chunk -> ^( eval_key paren_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:528:4: ev= eval_key pc= paren_chunk
+            {
+            pushFollow(FOLLOW_eval_key_in_lhs_eval2080);
+            ev=eval_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_eval_key.add(ev.getTree());
+            pushFollow(FOLLOW_paren_chunk_in_lhs_eval2084);
+            pc=paren_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk.add(pc.getTree());
+            if ( backtracking==0 ) {
+              	String body = safeSubstring( input.toString(pc.start,pc.stop), 1, input.toString(pc.start,pc.stop).length()-1 );
+              		checkTrailingSemicolon( body, ((Token)ev.start) );	
+            }
+
+            // AST REWRITE
+            // elements: paren_chunk, eval_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 531:3: -> ^( eval_key paren_chunk )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:531:6: ^( eval_key paren_chunk )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_eval_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_paren_chunk.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_eval
+
+    public static class lhs_forall_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_forall
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:534:1: lhs_forall : forall_key LEFT_PAREN ( lhs_pattern )+ RIGHT_PAREN -> ^( forall_key ( lhs_pattern )+ RIGHT_PAREN ) ;
+    public final lhs_forall_return lhs_forall() throws RecognitionException {
+        lhs_forall_return retval = new lhs_forall_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN137=null;
+        Token RIGHT_PAREN139=null;
+        forall_key_return forall_key136 = null;
+
+        lhs_pattern_return lhs_pattern138 = null;
+
+
+        Object LEFT_PAREN137_tree=null;
+        Object RIGHT_PAREN139_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_forall_key=new RewriteRuleSubtreeStream(adaptor,"rule forall_key");
+        RewriteRuleSubtreeStream stream_lhs_pattern=new RewriteRuleSubtreeStream(adaptor,"rule lhs_pattern");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:535:2: ( forall_key LEFT_PAREN ( lhs_pattern )+ RIGHT_PAREN -> ^( forall_key ( lhs_pattern )+ RIGHT_PAREN ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:535:4: forall_key LEFT_PAREN ( lhs_pattern )+ RIGHT_PAREN
+            {
+            pushFollow(FOLLOW_forall_key_in_lhs_forall2108);
+            forall_key136=forall_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_forall_key.add(forall_key136.getTree());
+            LEFT_PAREN137=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_forall2110); if (failed) return retval;
+            if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN137);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:535:26: ( lhs_pattern )+
+            int cnt49=0;
+            loop49:
+            do {
+                int alt49=2;
+                int LA49_0 = input.LA(1);
+
+                if ( (LA49_0==ID) ) {
+                    alt49=1;
+                }
+
+
+                switch (alt49) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:535:26: lhs_pattern
+            	    {
+            	    pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2112);
+            	    lhs_pattern138=lhs_pattern();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_lhs_pattern.add(lhs_pattern138.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt49 >= 1 ) break loop49;
+            	    if (backtracking>0) {failed=true; return retval;}
+                        EarlyExitException eee =
+                            new EarlyExitException(49, input);
+                        throw eee;
+                }
+                cnt49++;
+            } while (true);
+
+            RIGHT_PAREN139=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_forall2115); if (failed) return retval;
+            if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN139);
+
+
+            // AST REWRITE
+            // elements: forall_key, lhs_pattern, RIGHT_PAREN
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 536:3: -> ^( forall_key ( lhs_pattern )+ RIGHT_PAREN )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:536:6: ^( forall_key ( lhs_pattern )+ RIGHT_PAREN )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_forall_key.nextNode(), root_1);
+
+                if ( !(stream_lhs_pattern.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_lhs_pattern.hasNext() ) {
+                    adaptor.addChild(root_1, stream_lhs_pattern.next());
+
+                }
+                stream_lhs_pattern.reset();
+                adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_forall
+
+    public static class pattern_source_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start pattern_source
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:539:1: pattern_source options {k=3; } : lhs_pattern ( from_key ( accumulate_statement | collect_statement | entrypoint_statement | from_source ) )? ;
+    public final pattern_source_return pattern_source() throws RecognitionException {
+        pattern_source_return retval = new pattern_source_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        lhs_pattern_return lhs_pattern140 = null;
+
+        from_key_return from_key141 = null;
+
+        accumulate_statement_return accumulate_statement142 = null;
+
+        collect_statement_return collect_statement143 = null;
+
+        entrypoint_statement_return entrypoint_statement144 = null;
+
+        from_source_return from_source145 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:541:2: ( lhs_pattern ( from_key ( accumulate_statement | collect_statement | entrypoint_statement | from_source ) )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:541:4: lhs_pattern ( from_key ( accumulate_statement | collect_statement | entrypoint_statement | from_source ) )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_lhs_pattern_in_pattern_source2147);
+            lhs_pattern140=lhs_pattern();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, lhs_pattern140.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:542:3: ( from_key ( accumulate_statement | collect_statement | entrypoint_statement | from_source ) )?
+            int alt51=2;
+            int LA51_0 = input.LA(1);
+
+            if ( (LA51_0==ID) ) {
+                int LA51_1 = input.LA(2);
+
+                if ( (LA51_1==ID) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                    int LA51_3 = input.LA(3);
+
+                    if ( (LA51_3==SEMICOLON||LA51_3==END||(LA51_3>=COMMA && LA51_3<=RIGHT_PAREN)||(LA51_3>=DOUBLE_PIPE && LA51_3<=DOUBLE_AMPER)||LA51_3==THEN||LA51_3==MISC) && ((validateIdentifierKey(DroolsSoftKeywords.FROM)))) {
+                        alt51=1;
+                    }
+                    else if ( (LA51_3==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.OR))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))))) {
+                        int LA51_6 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                            alt51=1;
+                        }
+                    }
+                    else if ( (LA51_3==ID) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                        int LA51_7 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                            alt51=1;
+                        }
+                    }
+                    else if ( (LA51_3==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.OR))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))))) {
+                        int LA51_8 = input.LA(4);
+
+                        if ( (LA51_8==ID) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                            int LA51_10 = input.LA(5);
+
+                            if ( (LA51_10==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                                int LA51_11 = input.LA(6);
+
+                                if ( (LA51_11==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                                    int LA51_14 = input.LA(7);
+
+                                    if ( (LA51_14==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.OR))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))))) {
+                                        int LA51_16 = input.LA(8);
+
+                                        if ( ((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                                            alt51=1;
+                                        }
+                                    }
+                                    else if ( ((LA51_14>=SEMICOLON && LA51_14<=DOT)||LA51_14==END||(LA51_14>=COMMA && LA51_14<=RIGHT_PAREN)||(LA51_14>=DOUBLE_PIPE && LA51_14<=DOUBLE_AMPER)||LA51_14==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.FROM)))) {
+                                        alt51=1;
+                                    }
+                                }
+                                else if ( ((LA51_11>=VT_COMPILATION_UNIT && LA51_11<=LEFT_SQUARE)||(LA51_11>=THEN && LA51_11<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.FROM)))) {
+                                    alt51=1;
+                                }
+                            }
+                            else if ( (LA51_10==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.OR))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))))) {
+                                int LA51_12 = input.LA(6);
+
+                                if ( ((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                                    alt51=1;
+                                }
+                            }
+                            else if ( (LA51_10==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.OR))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))))) {
+                                int LA51_13 = input.LA(6);
+
+                                if ( (LA51_13==ID) && (((validateIdentifierKey(DroolsSoftKeywords.NOT))||(validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.FROM))||(validateIdentifierKey(DroolsSoftKeywords.EXISTS))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+                                    int LA51_15 = input.LA(7);
+
+                                    if ( ((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                                        alt51=1;
+                                    }
+                                }
+                            }
+                            else if ( ((LA51_10>=SEMICOLON && LA51_10<=ID)||LA51_10==END||(LA51_10>=COMMA && LA51_10<=RIGHT_PAREN)||(LA51_10>=DOUBLE_PIPE && LA51_10<=DOUBLE_AMPER)||LA51_10==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.FROM)))) {
+                                alt51=1;
+                            }
+                        }
+                    }
+                }
+            }
+            switch (alt51) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:543:4: from_key ( accumulate_statement | collect_statement | entrypoint_statement | from_source )
+                    {
+                    pushFollow(FOLLOW_from_key_in_pattern_source2156);
+                    from_key141=from_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(from_key141.getTree(), root_0);
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )
+                    int alt50=4;
+                    int LA50_0 = input.LA(1);
+
+                    if ( (LA50_0==ID) ) {
+                        int LA50_1 = input.LA(2);
+
+                        if ( (LA50_1==MISC) && ((validateIdentifierKey(DroolsSoftKeywords.ENTRY) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.POINT)))) {
+                            alt50=3;
+                        }
+                        else if ( (LA50_1==LEFT_PAREN) ) {
+                            switch ( input.LA(3) ) {
+                            case LEFT_PAREN:
+                                {
+                                int LA50_5 = input.LA(4);
+
+                                if ( ((validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE))) ) {
+                                    alt50=1;
+                                }
+                                else if ( (true) ) {
+                                    alt50=4;
+                                }
+                                else {
+                                    if (backtracking>0) {failed=true; return retval;}
+                                    NoViableAltException nvae =
+                                        new NoViableAltException("544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )", 50, 5, input);
+
+                                    throw nvae;
+                                }
+                                }
+                                break;
+                            case ID:
+                                {
+                                int LA50_6 = input.LA(4);
+
+                                if ( ((validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE))) ) {
+                                    alt50=1;
+                                }
+                                else if ( ((validateIdentifierKey(DroolsSoftKeywords.COLLECT))) ) {
+                                    alt50=2;
+                                }
+                                else if ( (true) ) {
+                                    alt50=4;
+                                }
+                                else {
+                                    if (backtracking>0) {failed=true; return retval;}
+                                    NoViableAltException nvae =
+                                        new NoViableAltException("544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )", 50, 6, input);
+
+                                    throw nvae;
+                                }
+                                }
+                                break;
+                            case VT_COMPILATION_UNIT:
+                            case VT_FUNCTION_IMPORT:
+                            case VT_FACT:
+                            case VT_CONSTRAINTS:
+                            case VT_LABEL:
+                            case VT_QUERY_ID:
+                            case VT_TEMPLATE_ID:
+                            case VT_RULE_ID:
+                            case VT_ENTRYPOINT_ID:
+                            case VT_SLOT_ID:
+                            case VT_SLOT:
+                            case VT_RULE_ATTRIBUTES:
+                            case VT_RHS_CHUNK:
+                            case VT_CURLY_CHUNK:
+                            case VT_SQUARE_CHUNK:
+                            case VT_PAREN_CHUNK:
+                            case VT_AND_IMPLICIT:
+                            case VT_AND_PREFIX:
+                            case VT_OR_PREFIX:
+                            case VT_AND_INFIX:
+                            case VT_OR_INFIX:
+                            case VT_ACCUMULATE_INIT_CLAUSE:
+                            case VT_ACCUMULATE_ID_CLAUSE:
+                            case VT_FROM_SOURCE:
+                            case VT_EXPRESSION_CHAIN:
+                            case VT_PATTERN:
+                            case VT_FACT_BINDING:
+                            case VT_FACT_OR:
+                            case VT_BIND_FIELD:
+                            case VT_FIELD:
+                            case VT_ACCESSOR_PATH:
+                            case VT_ACCESSOR_ELEMENT:
+                            case VT_DATA_TYPE:
+                            case VT_PATTERN_TYPE:
+                            case VT_PACKAGE_ID:
+                            case VT_IMPORT_ID:
+                            case VT_GLOBAL_ID:
+                            case VT_FUNCTION_ID:
+                            case VT_PARAM_LIST:
+                            case VK_DATE_EFFECTIVE:
+                            case VK_DATE_EXPIRES:
+                            case VK_LOCK_ON_ACTIVE:
+                            case VK_NO_LOOP:
+                            case VK_AUTO_FOCUS:
+                            case VK_ACTIVATION_GROUP:
+                            case VK_AGENDA_GROUP:
+                            case VK_RULEFLOW_GROUP:
+                            case VK_DURATION:
+                            case VK_DIALECT:
+                            case VK_SALIENCE:
+                            case VK_ENABLED:
+                            case VK_ATTRIBUTES:
+                            case VK_WHEN:
+                            case VK_RULE:
+                            case VK_IMPORT:
+                            case VK_PACKAGE:
+                            case VK_TEMPLATE:
+                            case VK_QUERY:
+                            case VK_DECLARE:
+                            case VK_FUNCTION:
+                            case VK_GLOBAL:
+                            case VK_EVAL:
+                            case VK_CONTAINS:
+                            case VK_MATCHES:
+                            case VK_EXCLUDES:
+                            case VK_SOUNDSLIKE:
+                            case VK_MEMBEROF:
+                            case VK_ENTRY_POINT:
+                            case VK_NOT:
+                            case VK_IN:
+                            case VK_OR:
+                            case VK_AND:
+                            case VK_EXISTS:
+                            case VK_FORALL:
+                            case VK_FROM:
+                            case VK_ACCUMULATE:
+                            case VK_INIT:
+                            case VK_ACTION:
+                            case VK_REVERSE:
+                            case VK_RESULT:
+                            case VK_COLLECT:
+                            case SEMICOLON:
+                            case DOT:
+                            case DOT_STAR:
+                            case END:
+                            case STRING:
+                            case COMMA:
+                            case RIGHT_PAREN:
+                            case COLON:
+                            case BOOL:
+                            case INT:
+                            case DOUBLE_PIPE:
+                            case DOUBLE_AMPER:
+                            case ARROW:
+                            case EQUAL:
+                            case GREATER:
+                            case GREATER_EQUAL:
+                            case LESS:
+                            case LESS_EQUAL:
+                            case NOT_EQUAL:
+                            case GRAVE_ACCENT:
+                            case FLOAT:
+                            case NULL:
+                            case LEFT_SQUARE:
+                            case RIGHT_SQUARE:
+                            case THEN:
+                            case LEFT_CURLY:
+                            case RIGHT_CURLY:
+                            case MISC:
+                            case EOL:
+                            case WS:
+                            case EscapeSequence:
+                            case HexDigit:
+                            case UnicodeEscape:
+                            case OctalEscape:
+                            case SH_STYLE_SINGLE_LINE_COMMENT:
+                            case C_STYLE_SINGLE_LINE_COMMENT:
+                            case MULTI_LINE_COMMENT:
+                                {
+                                alt50=4;
+                                }
+                                break;
+                            default:
+                                if (backtracking>0) {failed=true; return retval;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )", 50, 3, input);
+
+                                throw nvae;
+                            }
+
+                        }
+                        else if ( ((LA50_1>=SEMICOLON && LA50_1<=DOT)||LA50_1==END||(LA50_1>=COMMA && LA50_1<=RIGHT_PAREN)||(LA50_1>=DOUBLE_PIPE && LA50_1<=DOUBLE_AMPER)||LA50_1==THEN) ) {
+                            alt50=4;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )", 50, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("544:11: ( accumulate_statement | collect_statement | entrypoint_statement | from_source )", 50, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt50) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:544:14: accumulate_statement
+                            {
+                            pushFollow(FOLLOW_accumulate_statement_in_pattern_source2172);
+                            accumulate_statement142=accumulate_statement();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) adaptor.addChild(root_0, accumulate_statement142.getTree());
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:545:15: collect_statement
+                            {
+                            pushFollow(FOLLOW_collect_statement_in_pattern_source2188);
+                            collect_statement143=collect_statement();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) adaptor.addChild(root_0, collect_statement143.getTree());
+
+                            }
+                            break;
+                        case 3 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:546:15: entrypoint_statement
+                            {
+                            pushFollow(FOLLOW_entrypoint_statement_in_pattern_source2205);
+                            entrypoint_statement144=entrypoint_statement();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) adaptor.addChild(root_0, entrypoint_statement144.getTree());
+
+                            }
+                            break;
+                        case 4 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:547:15: from_source
+                            {
+                            pushFollow(FOLLOW_from_source_in_pattern_source2221);
+                            from_source145=from_source();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) adaptor.addChild(root_0, from_source145.getTree());
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end pattern_source
+
+    public static class accumulate_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accumulate_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:552:1: accumulate_statement : accumulate_key LEFT_PAREN lhs_or ( COMMA )? ( accumulate_init_clause | accumulate_id_clause ) RIGHT_PAREN -> ^( accumulate_key lhs_or ( accumulate_init_clause )? ( accumulate_id_clause )? RIGHT_PAREN ) ;
+    public final accumulate_statement_return accumulate_statement() throws RecognitionException {
+        accumulate_statement_return retval = new accumulate_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN147=null;
+        Token COMMA149=null;
+        Token RIGHT_PAREN152=null;
+        accumulate_key_return accumulate_key146 = null;
+
+        lhs_or_return lhs_or148 = null;
+
+        accumulate_init_clause_return accumulate_init_clause150 = null;
+
+        accumulate_id_clause_return accumulate_id_clause151 = null;
+
+
+        Object LEFT_PAREN147_tree=null;
+        Object COMMA149_tree=null;
+        Object RIGHT_PAREN152_tree=null;
+        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_lhs_or=new RewriteRuleSubtreeStream(adaptor,"rule lhs_or");
+        RewriteRuleSubtreeStream stream_accumulate_init_clause=new RewriteRuleSubtreeStream(adaptor,"rule accumulate_init_clause");
+        RewriteRuleSubtreeStream stream_accumulate_id_clause=new RewriteRuleSubtreeStream(adaptor,"rule accumulate_id_clause");
+        RewriteRuleSubtreeStream stream_accumulate_key=new RewriteRuleSubtreeStream(adaptor,"rule accumulate_key");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:553:2: ( accumulate_key LEFT_PAREN lhs_or ( COMMA )? ( accumulate_init_clause | accumulate_id_clause ) RIGHT_PAREN -> ^( accumulate_key lhs_or ( accumulate_init_clause )? ( accumulate_id_clause )? RIGHT_PAREN ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:553:4: accumulate_key LEFT_PAREN lhs_or ( COMMA )? ( accumulate_init_clause | accumulate_id_clause ) RIGHT_PAREN
+            {
+            pushFollow(FOLLOW_accumulate_key_in_accumulate_statement2249);
+            accumulate_key146=accumulate_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_accumulate_key.add(accumulate_key146.getTree());
+            LEFT_PAREN147=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_accumulate_statement2253); if (failed) return retval;
+            if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN147);
+
+            pushFollow(FOLLOW_lhs_or_in_accumulate_statement2255);
+            lhs_or148=lhs_or();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_lhs_or.add(lhs_or148.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:21: ( COMMA )?
+            int alt52=2;
+            int LA52_0 = input.LA(1);
+
+            if ( (LA52_0==COMMA) ) {
+                alt52=1;
+            }
+            switch (alt52) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:21: COMMA
+                    {
+                    COMMA149=(Token)input.LT(1);
+                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2257); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COMMA.add(COMMA149);
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:555:3: ( accumulate_init_clause | accumulate_id_clause )
+            int alt53=2;
+            alt53 = dfa53.predict(input);
+            switch (alt53) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:555:5: accumulate_init_clause
+                    {
+                    pushFollow(FOLLOW_accumulate_init_clause_in_accumulate_statement2265);
+                    accumulate_init_clause150=accumulate_init_clause();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_accumulate_init_clause.add(accumulate_init_clause150.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:556:5: accumulate_id_clause
+                    {
+                    pushFollow(FOLLOW_accumulate_id_clause_in_accumulate_statement2271);
+                    accumulate_id_clause151=accumulate_id_clause();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_accumulate_id_clause.add(accumulate_id_clause151.getTree());
+
+                    }
+                    break;
+
+            }
+
+            RIGHT_PAREN152=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_accumulate_statement2279); if (failed) return retval;
+            if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN152);
+
+
+            // AST REWRITE
+            // elements: accumulate_id_clause, lhs_or, accumulate_key, RIGHT_PAREN, accumulate_init_clause
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 559:3: -> ^( accumulate_key lhs_or ( accumulate_init_clause )? ( accumulate_id_clause )? RIGHT_PAREN )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:559:6: ^( accumulate_key lhs_or ( accumulate_init_clause )? ( accumulate_id_clause )? RIGHT_PAREN )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_accumulate_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_lhs_or.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:559:30: ( accumulate_init_clause )?
+                if ( stream_accumulate_init_clause.hasNext() ) {
+                    adaptor.addChild(root_1, stream_accumulate_init_clause.next());
+
+                }
+                stream_accumulate_init_clause.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:559:54: ( accumulate_id_clause )?
+                if ( stream_accumulate_id_clause.hasNext() ) {
+                    adaptor.addChild(root_1, stream_accumulate_id_clause.next());
+
+                }
+                stream_accumulate_id_clause.reset();
+                adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_statement
+
+    public static class accumulate_init_clause_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accumulate_init_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:562:1: accumulate_init_clause : init_key pc1= paren_chunk ( COMMA )? action_key pc2= paren_chunk ( COMMA )? ( reverse_key pc3= paren_chunk ( COMMA )? )? result_key pc4= paren_chunk -> ^( VT_ACCUMULATE_INIT_CLAUSE ^( init_key $pc1) ^( action_key $pc2) ( ^( reverse_key $pc3) )? ^( result_key $pc4) ) ;
+    public final accumulate_init_clause_return accumulate_init_clause() throws RecognitionException {
+        accumulate_init_clause_return retval = new accumulate_init_clause_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token COMMA154=null;
+        Token COMMA156=null;
+        Token COMMA158=null;
+        paren_chunk_return pc1 = null;
+
+        paren_chunk_return pc2 = null;
+
+        paren_chunk_return pc3 = null;
+
+        paren_chunk_return pc4 = null;
+
+        init_key_return init_key153 = null;
+
+        action_key_return action_key155 = null;
+
+        reverse_key_return reverse_key157 = null;
+
+        result_key_return result_key159 = null;
+
+
+        Object COMMA154_tree=null;
+        Object COMMA156_tree=null;
+        Object COMMA158_tree=null;
+        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
+        RewriteRuleSubtreeStream stream_reverse_key=new RewriteRuleSubtreeStream(adaptor,"rule reverse_key");
+        RewriteRuleSubtreeStream stream_result_key=new RewriteRuleSubtreeStream(adaptor,"rule result_key");
+        RewriteRuleSubtreeStream stream_init_key=new RewriteRuleSubtreeStream(adaptor,"rule init_key");
+        RewriteRuleSubtreeStream stream_action_key=new RewriteRuleSubtreeStream(adaptor,"rule action_key");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:563:2: ( init_key pc1= paren_chunk ( COMMA )? action_key pc2= paren_chunk ( COMMA )? ( reverse_key pc3= paren_chunk ( COMMA )? )? result_key pc4= paren_chunk -> ^( VT_ACCUMULATE_INIT_CLAUSE ^( init_key $pc1) ^( action_key $pc2) ( ^( reverse_key $pc3) )? ^( result_key $pc4) ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:563:4: init_key pc1= paren_chunk ( COMMA )? action_key pc2= paren_chunk ( COMMA )? ( reverse_key pc3= paren_chunk ( COMMA )? )? result_key pc4= paren_chunk
+            {
+            pushFollow(FOLLOW_init_key_in_accumulate_init_clause2308);
+            init_key153=init_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_init_key.add(init_key153.getTree());
+            pushFollow(FOLLOW_paren_chunk_in_accumulate_init_clause2313);
+            pc1=paren_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk.add(pc1.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:564:18: ( COMMA )?
+            int alt54=2;
+            int LA54_0 = input.LA(1);
+
+            if ( (LA54_0==COMMA) ) {
+                alt54=1;
+            }
+            switch (alt54) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:564:18: COMMA
+                    {
+                    COMMA154=(Token)input.LT(1);
+                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_init_clause2315); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COMMA.add(COMMA154);
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_action_key_in_accumulate_init_clause2319);
+            action_key155=action_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_action_key.add(action_key155.getTree());
+            pushFollow(FOLLOW_paren_chunk_in_accumulate_init_clause2323);
+            pc2=paren_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk.add(pc2.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:565:29: ( COMMA )?
+            int alt55=2;
+            int LA55_0 = input.LA(1);
+
+            if ( (LA55_0==COMMA) ) {
+                alt55=1;
+            }
+            switch (alt55) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:565:29: COMMA
+                    {
+                    COMMA156=(Token)input.LT(1);
+                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_init_clause2325); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COMMA.add(COMMA156);
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:566:2: ( reverse_key pc3= paren_chunk ( COMMA )? )?
+            int alt57=2;
+            alt57 = dfa57.predict(input);
+            switch (alt57) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:566:4: reverse_key pc3= paren_chunk ( COMMA )?
+                    {
+                    pushFollow(FOLLOW_reverse_key_in_accumulate_init_clause2331);
+                    reverse_key157=reverse_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_reverse_key.add(reverse_key157.getTree());
+                    pushFollow(FOLLOW_paren_chunk_in_accumulate_init_clause2335);
+                    pc3=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_paren_chunk.add(pc3.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:566:32: ( COMMA )?
+                    int alt56=2;
+                    int LA56_0 = input.LA(1);
+
+                    if ( (LA56_0==COMMA) ) {
+                        alt56=1;
+                    }
+                    switch (alt56) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:566:32: COMMA
+                            {
+                            COMMA158=(Token)input.LT(1);
+                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_init_clause2337); if (failed) return retval;
+                            if ( backtracking==0 ) stream_COMMA.add(COMMA158);
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_result_key_in_accumulate_init_clause2343);
+            result_key159=result_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_result_key.add(result_key159.getTree());
+            pushFollow(FOLLOW_paren_chunk_in_accumulate_init_clause2347);
+            pc4=paren_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk.add(pc4.getTree());
+
+            // AST REWRITE
+            // elements: pc3, pc2, action_key, pc1, pc4, init_key, result_key, reverse_key
+            // token labels: 
+            // rule labels: pc2, pc4, pc3, pc1, retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_pc2=new RewriteRuleSubtreeStream(adaptor,"token pc2",pc2!=null?pc2.tree:null);
+            RewriteRuleSubtreeStream stream_pc4=new RewriteRuleSubtreeStream(adaptor,"token pc4",pc4!=null?pc4.tree:null);
+            RewriteRuleSubtreeStream stream_pc3=new RewriteRuleSubtreeStream(adaptor,"token pc3",pc3!=null?pc3.tree:null);
+            RewriteRuleSubtreeStream stream_pc1=new RewriteRuleSubtreeStream(adaptor,"token pc1",pc1!=null?pc1.tree:null);
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 568:2: -> ^( VT_ACCUMULATE_INIT_CLAUSE ^( init_key $pc1) ^( action_key $pc2) ( ^( reverse_key $pc3) )? ^( result_key $pc4) )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:5: ^( VT_ACCUMULATE_INIT_CLAUSE ^( init_key $pc1) ^( action_key $pc2) ( ^( reverse_key $pc3) )? ^( result_key $pc4) )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_ACCUMULATE_INIT_CLAUSE, "VT_ACCUMULATE_INIT_CLAUSE"), root_1);
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:33: ^( init_key $pc1)
+                {
+                Object root_2 = (Object)adaptor.nil();
+                root_2 = (Object)adaptor.becomeRoot(stream_init_key.nextNode(), root_2);
+
+                adaptor.addChild(root_2, stream_pc1.next());
+
+                adaptor.addChild(root_1, root_2);
+                }
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:50: ^( action_key $pc2)
+                {
+                Object root_2 = (Object)adaptor.nil();
+                root_2 = (Object)adaptor.becomeRoot(stream_action_key.nextNode(), root_2);
+
+                adaptor.addChild(root_2, stream_pc2.next());
+
+                adaptor.addChild(root_1, root_2);
+                }
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:69: ( ^( reverse_key $pc3) )?
+                if ( stream_pc3.hasNext()||stream_reverse_key.hasNext() ) {
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:69: ^( reverse_key $pc3)
+                    {
+                    Object root_2 = (Object)adaptor.nil();
+                    root_2 = (Object)adaptor.becomeRoot(stream_reverse_key.nextNode(), root_2);
+
+                    adaptor.addChild(root_2, stream_pc3.next());
+
+                    adaptor.addChild(root_1, root_2);
+                    }
+
+                }
+                stream_pc3.reset();
+                stream_reverse_key.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:90: ^( result_key $pc4)
+                {
+                Object root_2 = (Object)adaptor.nil();
+                root_2 = (Object)adaptor.becomeRoot(stream_result_key.nextNode(), root_2);
+
+                adaptor.addChild(root_2, stream_pc4.next());
+
+                adaptor.addChild(root_1, root_2);
+                }
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_init_clause
+
+    public static class accumulate_id_clause_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accumulate_id_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:571:1: accumulate_id_clause : id= ID text= paren_chunk -> ^( VT_ACCUMULATE_ID_CLAUSE ID paren_chunk ) ;
+    public final accumulate_id_clause_return accumulate_id_clause() throws RecognitionException {
+        accumulate_id_clause_return retval = new accumulate_id_clause_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+        paren_chunk_return text = null;
+
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:572:2: (id= ID text= paren_chunk -> ^( VT_ACCUMULATE_ID_CLAUSE ID paren_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:572:4: id= ID text= paren_chunk
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_accumulate_id_clause2396); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            pushFollow(FOLLOW_paren_chunk_in_accumulate_id_clause2400);
+            text=paren_chunk();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk.add(text.getTree());
+
+            // AST REWRITE
+            // elements: paren_chunk, ID
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 573:2: -> ^( VT_ACCUMULATE_ID_CLAUSE ID paren_chunk )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:573:5: ^( VT_ACCUMULATE_ID_CLAUSE ID paren_chunk )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_ACCUMULATE_ID_CLAUSE, "VT_ACCUMULATE_ID_CLAUSE"), root_1);
+
+                adaptor.addChild(root_1, stream_ID.next());
+                adaptor.addChild(root_1, stream_paren_chunk.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_id_clause
+
+    public static class collect_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start collect_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:576:1: collect_statement : collect_key LEFT_PAREN pattern_source RIGHT_PAREN -> ^( collect_key pattern_source RIGHT_PAREN ) ;
+    public final collect_statement_return collect_statement() throws RecognitionException {
+        collect_statement_return retval = new collect_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN161=null;
+        Token RIGHT_PAREN163=null;
+        collect_key_return collect_key160 = null;
+
+        pattern_source_return pattern_source162 = null;
+
+
+        Object LEFT_PAREN161_tree=null;
+        Object RIGHT_PAREN163_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_collect_key=new RewriteRuleSubtreeStream(adaptor,"rule collect_key");
+        RewriteRuleSubtreeStream stream_pattern_source=new RewriteRuleSubtreeStream(adaptor,"rule pattern_source");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:577:2: ( collect_key LEFT_PAREN pattern_source RIGHT_PAREN -> ^( collect_key pattern_source RIGHT_PAREN ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:577:4: collect_key LEFT_PAREN pattern_source RIGHT_PAREN
+            {
+            pushFollow(FOLLOW_collect_key_in_collect_statement2422);
+            collect_key160=collect_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_collect_key.add(collect_key160.getTree());
+            LEFT_PAREN161=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_collect_statement2426); if (failed) return retval;
+            if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN161);
+
+            pushFollow(FOLLOW_pattern_source_in_collect_statement2428);
+            pattern_source162=pattern_source();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_pattern_source.add(pattern_source162.getTree());
+            RIGHT_PAREN163=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_collect_statement2430); if (failed) return retval;
+            if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN163);
+
+
+            // AST REWRITE
+            // elements: collect_key, pattern_source, RIGHT_PAREN
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 579:2: -> ^( collect_key pattern_source RIGHT_PAREN )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:579:5: ^( collect_key pattern_source RIGHT_PAREN )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_collect_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_pattern_source.next());
+                adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end collect_statement
+
+    public static class entrypoint_statement_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start entrypoint_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:582:1: entrypoint_statement : entry_point_key entrypoint_id -> ^( entry_point_key entrypoint_id ) ;
+    public final entrypoint_statement_return entrypoint_statement() throws RecognitionException {
+        entrypoint_statement_return retval = new entrypoint_statement_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        entry_point_key_return entry_point_key164 = null;
+
+        entrypoint_id_return entrypoint_id165 = null;
+
+
+        RewriteRuleSubtreeStream stream_entrypoint_id=new RewriteRuleSubtreeStream(adaptor,"rule entrypoint_id");
+        RewriteRuleSubtreeStream stream_entry_point_key=new RewriteRuleSubtreeStream(adaptor,"rule entry_point_key");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:583:2: ( entry_point_key entrypoint_id -> ^( entry_point_key entrypoint_id ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:583:4: entry_point_key entrypoint_id
+            {
+            pushFollow(FOLLOW_entry_point_key_in_entrypoint_statement2452);
+            entry_point_key164=entry_point_key();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_entry_point_key.add(entry_point_key164.getTree());
+            pushFollow(FOLLOW_entrypoint_id_in_entrypoint_statement2454);
+            entrypoint_id165=entrypoint_id();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_entrypoint_id.add(entrypoint_id165.getTree());
+
+            // AST REWRITE
+            // elements: entrypoint_id, entry_point_key
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 584:2: -> ^( entry_point_key entrypoint_id )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:584:5: ^( entry_point_key entrypoint_id )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(stream_entry_point_key.nextNode(), root_1);
+
+                adaptor.addChild(root_1, stream_entrypoint_id.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end entrypoint_statement
+
+    public static class entrypoint_id_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start entrypoint_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:587:1: entrypoint_id : (value= ID -> VT_ENTRYPOINT_ID[$value] | value= STRING -> VT_ENTRYPOINT_ID[$value] );
+    public final entrypoint_id_return entrypoint_id() throws RecognitionException {
+        entrypoint_id_return retval = new entrypoint_id_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token value=null;
+
+        Object value_tree=null;
+        RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:588:2: (value= ID -> VT_ENTRYPOINT_ID[$value] | value= STRING -> VT_ENTRYPOINT_ID[$value] )
+            int alt58=2;
+            int LA58_0 = input.LA(1);
+
+            if ( (LA58_0==ID) ) {
+                alt58=1;
+            }
+            else if ( (LA58_0==STRING) ) {
+                alt58=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("587:1: entrypoint_id : (value= ID -> VT_ENTRYPOINT_ID[$value] | value= STRING -> VT_ENTRYPOINT_ID[$value] );", 58, 0, input);
+
+                throw nvae;
+            }
+            switch (alt58) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:588:5: value= ID
+                    {
+                    value=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_entrypoint_id2477); if (failed) return retval;
+                    if ( backtracking==0 ) stream_ID.add(value);
+
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 588:14: -> VT_ENTRYPOINT_ID[$value]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_ENTRYPOINT_ID, value));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:589:5: value= STRING
+                    {
+                    value=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_entrypoint_id2490); if (failed) return retval;
+                    if ( backtracking==0 ) stream_STRING.add(value);
+
+
+                    // AST REWRITE
+                    // elements: 
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 589:18: -> VT_ENTRYPOINT_ID[$value]
+                    {
+                        adaptor.addChild(root_0, adaptor.create(VT_ENTRYPOINT_ID, value));
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end entrypoint_id
+
+    public static class from_source_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start from_source
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:592:1: from_source : ID ( ( LEFT_PAREN )=>args= paren_chunk )? ( expression_chain )? -> ^( VT_FROM_SOURCE ID ( paren_chunk )? ( expression_chain )? ) ;
+    public final from_source_return from_source() throws RecognitionException {
+        from_source_return retval = new from_source_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID166=null;
+        paren_chunk_return args = null;
+
+        expression_chain_return expression_chain167 = null;
+
+
+        Object ID166_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleSubtreeStream stream_expression_chain=new RewriteRuleSubtreeStream(adaptor,"rule expression_chain");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:593:2: ( ID ( ( LEFT_PAREN )=>args= paren_chunk )? ( expression_chain )? -> ^( VT_FROM_SOURCE ID ( paren_chunk )? ( expression_chain )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:593:4: ID ( ( LEFT_PAREN )=>args= paren_chunk )? ( expression_chain )?
+            {
+            ID166=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_from_source2506); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID166);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:594:3: ( ( LEFT_PAREN )=>args= paren_chunk )?
+            int alt59=2;
+            int LA59_0 = input.LA(1);
+
+            if ( (LA59_0==LEFT_PAREN) ) {
+                int LA59_1 = input.LA(2);
+
+                if ( (LA59_1==LEFT_PAREN) ) {
+                    int LA59_3 = input.LA(3);
+
+                    if ( (synpred8()) ) {
+                        alt59=1;
+                    }
+                }
+                else if ( (LA59_1==ID) ) {
+                    int LA59_4 = input.LA(3);
+
+                    if ( (synpred8()) ) {
+                        alt59=1;
+                    }
+                }
+                else if ( ((LA59_1>=VT_COMPILATION_UNIT && LA59_1<=SEMICOLON)||(LA59_1>=DOT && LA59_1<=STRING)||LA59_1==COMMA||(LA59_1>=COLON && LA59_1<=MULTI_LINE_COMMENT)) && (synpred8())) {
+                    alt59=1;
+                }
+                else if ( (LA59_1==RIGHT_PAREN) && (synpred8())) {
+                    alt59=1;
+                }
+            }
+            switch (alt59) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:594:5: ( LEFT_PAREN )=>args= paren_chunk
+                    {
+                    pushFollow(FOLLOW_paren_chunk_in_from_source2519);
+                    args=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_paren_chunk.add(args.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:595:3: ( expression_chain )?
+            int alt60=2;
+            int LA60_0 = input.LA(1);
+
+            if ( (LA60_0==DOT) ) {
+                alt60=1;
+            }
+            switch (alt60) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:595:3: expression_chain
+                    {
+                    pushFollow(FOLLOW_expression_chain_in_from_source2526);
+                    expression_chain167=expression_chain();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_expression_chain.add(expression_chain167.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: ID, paren_chunk, expression_chain
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 596:2: -> ^( VT_FROM_SOURCE ID ( paren_chunk )? ( expression_chain )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:596:5: ^( VT_FROM_SOURCE ID ( paren_chunk )? ( expression_chain )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FROM_SOURCE, "VT_FROM_SOURCE"), root_1);
+
+                adaptor.addChild(root_1, stream_ID.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:596:25: ( paren_chunk )?
+                if ( stream_paren_chunk.hasNext() ) {
+                    adaptor.addChild(root_1, stream_paren_chunk.next());
+
+                }
+                stream_paren_chunk.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:596:38: ( expression_chain )?
+                if ( stream_expression_chain.hasNext() ) {
+                    adaptor.addChild(root_1, stream_expression_chain.next());
+
+                }
+                stream_expression_chain.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end from_source
+
+    public static class expression_chain_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start expression_chain
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:599:1: expression_chain : startToken= DOT ID ( ( LEFT_SQUARE )=> square_chunk | ( LEFT_PAREN )=> paren_chunk )? ( expression_chain )? -> ^( VT_EXPRESSION_CHAIN[$startToken] ID ( square_chunk )? ( paren_chunk )? ( expression_chain )? ) ;
+    public final expression_chain_return expression_chain() throws RecognitionException {
+        expression_chain_return retval = new expression_chain_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token startToken=null;
+        Token ID168=null;
+        square_chunk_return square_chunk169 = null;
+
+        paren_chunk_return paren_chunk170 = null;
+
+        expression_chain_return expression_chain171 = null;
+
+
+        Object startToken_tree=null;
+        Object ID168_tree=null;
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleSubtreeStream stream_square_chunk=new RewriteRuleSubtreeStream(adaptor,"rule square_chunk");
+        RewriteRuleSubtreeStream stream_expression_chain=new RewriteRuleSubtreeStream(adaptor,"rule expression_chain");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:600:2: (startToken= DOT ID ( ( LEFT_SQUARE )=> square_chunk | ( LEFT_PAREN )=> paren_chunk )? ( expression_chain )? -> ^( VT_EXPRESSION_CHAIN[$startToken] ID ( square_chunk )? ( paren_chunk )? ( expression_chain )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:601:3: startToken= DOT ID ( ( LEFT_SQUARE )=> square_chunk | ( LEFT_PAREN )=> paren_chunk )? ( expression_chain )?
+            {
+            startToken=(Token)input.LT(1);
+            match(input,DOT,FOLLOW_DOT_in_expression_chain2558); if (failed) return retval;
+            if ( backtracking==0 ) stream_DOT.add(startToken);
+
+            ID168=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_expression_chain2560); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID168);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:602:4: ( ( LEFT_SQUARE )=> square_chunk | ( LEFT_PAREN )=> paren_chunk )?
+            int alt61=3;
+            int LA61_0 = input.LA(1);
+
+            if ( (LA61_0==LEFT_SQUARE) && (synpred9())) {
+                alt61=1;
+            }
+            else if ( (LA61_0==LEFT_PAREN) ) {
+                int LA61_2 = input.LA(2);
+
+                if ( (LA61_2==LEFT_PAREN) ) {
+                    int LA61_4 = input.LA(3);
+
+                    if ( (synpred10()) ) {
+                        alt61=2;
+                    }
+                }
+                else if ( (LA61_2==ID) ) {
+                    int LA61_5 = input.LA(3);
+
+                    if ( (synpred10()) ) {
+                        alt61=2;
+                    }
+                }
+                else if ( ((LA61_2>=VT_COMPILATION_UNIT && LA61_2<=SEMICOLON)||(LA61_2>=DOT && LA61_2<=STRING)||LA61_2==COMMA||(LA61_2>=COLON && LA61_2<=MULTI_LINE_COMMENT)) && (synpred10())) {
+                    alt61=2;
+                }
+                else if ( (LA61_2==RIGHT_PAREN) && (synpred10())) {
+                    alt61=2;
+                }
+            }
+            switch (alt61) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:603:6: ( LEFT_SQUARE )=> square_chunk
+                    {
+                    pushFollow(FOLLOW_square_chunk_in_expression_chain2580);
+                    square_chunk169=square_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_square_chunk.add(square_chunk169.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:605:6: ( LEFT_PAREN )=> paren_chunk
+                    {
+                    pushFollow(FOLLOW_paren_chunk_in_expression_chain2602);
+                    paren_chunk170=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_paren_chunk.add(paren_chunk170.getTree());
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:607:4: ( expression_chain )?
+            int alt62=2;
+            int LA62_0 = input.LA(1);
+
+            if ( (LA62_0==DOT) ) {
+                alt62=1;
+            }
+            switch (alt62) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:607:4: expression_chain
+                    {
+                    pushFollow(FOLLOW_expression_chain_in_expression_chain2613);
+                    expression_chain171=expression_chain();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_expression_chain.add(expression_chain171.getTree());
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: square_chunk, paren_chunk, ID, expression_chain
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 608:4: -> ^( VT_EXPRESSION_CHAIN[$startToken] ID ( square_chunk )? ( paren_chunk )? ( expression_chain )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:7: ^( VT_EXPRESSION_CHAIN[$startToken] ID ( square_chunk )? ( paren_chunk )? ( expression_chain )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_EXPRESSION_CHAIN, startToken), root_1);
+
+                adaptor.addChild(root_1, stream_ID.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:45: ( square_chunk )?
+                if ( stream_square_chunk.hasNext() ) {
+                    adaptor.addChild(root_1, stream_square_chunk.next());
+
+                }
+                stream_square_chunk.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:59: ( paren_chunk )?
+                if ( stream_paren_chunk.hasNext() ) {
+                    adaptor.addChild(root_1, stream_paren_chunk.next());
+
+                }
+                stream_paren_chunk.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:72: ( expression_chain )?
+                if ( stream_expression_chain.hasNext() ) {
+                    adaptor.addChild(root_1, stream_expression_chain.next());
+
+                }
+                stream_expression_chain.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end expression_chain
+
+    public static class lhs_pattern_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lhs_pattern
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:611:1: lhs_pattern : ( fact_binding -> ^( VT_PATTERN fact_binding ) | fact -> ^( VT_PATTERN fact ) );
+    public final lhs_pattern_return lhs_pattern() throws RecognitionException {
+        lhs_pattern_return retval = new lhs_pattern_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        fact_binding_return fact_binding172 = null;
+
+        fact_return fact173 = null;
+
+
+        RewriteRuleSubtreeStream stream_fact_binding=new RewriteRuleSubtreeStream(adaptor,"rule fact_binding");
+        RewriteRuleSubtreeStream stream_fact=new RewriteRuleSubtreeStream(adaptor,"rule fact");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:612:2: ( fact_binding -> ^( VT_PATTERN fact_binding ) | fact -> ^( VT_PATTERN fact ) )
+            int alt63=2;
+            int LA63_0 = input.LA(1);
+
+            if ( (LA63_0==ID) ) {
+                int LA63_1 = input.LA(2);
+
+                if ( (LA63_1==COLON) ) {
+                    alt63=1;
+                }
+                else if ( (LA63_1==DOT||LA63_1==LEFT_PAREN||LA63_1==LEFT_SQUARE) ) {
+                    alt63=2;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("611:1: lhs_pattern : ( fact_binding -> ^( VT_PATTERN fact_binding ) | fact -> ^( VT_PATTERN fact ) );", 63, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("611:1: lhs_pattern : ( fact_binding -> ^( VT_PATTERN fact_binding ) | fact -> ^( VT_PATTERN fact ) );", 63, 0, input);
+
+                throw nvae;
+            }
+            switch (alt63) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:612:4: fact_binding
+                    {
+                    pushFollow(FOLLOW_fact_binding_in_lhs_pattern2646);
+                    fact_binding172=fact_binding();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_fact_binding.add(fact_binding172.getTree());
+
+                    // AST REWRITE
+                    // elements: fact_binding
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 612:17: -> ^( VT_PATTERN fact_binding )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:612:20: ^( VT_PATTERN fact_binding )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_PATTERN, "VT_PATTERN"), root_1);
+
+                        adaptor.addChild(root_1, stream_fact_binding.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:613:4: fact
+                    {
+                    pushFollow(FOLLOW_fact_in_lhs_pattern2659);
+                    fact173=fact();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_fact.add(fact173.getTree());
+
+                    // AST REWRITE
+                    // elements: fact
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 613:9: -> ^( VT_PATTERN fact )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:613:12: ^( VT_PATTERN fact )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_PATTERN, "VT_PATTERN"), root_1);
+
+                        adaptor.addChild(root_1, stream_fact.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs_pattern
+
+    public static class fact_binding_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start fact_binding
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:616:1: fact_binding : label ( fact | LEFT_PAREN fact_binding_expression RIGHT_PAREN ) -> ^( VT_FACT_BINDING label ( fact )? ( fact_binding_expression )? ( RIGHT_PAREN )? ) ;
+    public final fact_binding_return fact_binding() throws RecognitionException {
+        fact_binding_return retval = new fact_binding_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN176=null;
+        Token RIGHT_PAREN178=null;
+        label_return label174 = null;
+
+        fact_return fact175 = null;
+
+        fact_binding_expression_return fact_binding_expression177 = null;
+
+
+        Object LEFT_PAREN176_tree=null;
+        Object RIGHT_PAREN178_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_label=new RewriteRuleSubtreeStream(adaptor,"rule label");
+        RewriteRuleSubtreeStream stream_fact_binding_expression=new RewriteRuleSubtreeStream(adaptor,"rule fact_binding_expression");
+        RewriteRuleSubtreeStream stream_fact=new RewriteRuleSubtreeStream(adaptor,"rule fact");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:617:3: ( label ( fact | LEFT_PAREN fact_binding_expression RIGHT_PAREN ) -> ^( VT_FACT_BINDING label ( fact )? ( fact_binding_expression )? ( RIGHT_PAREN )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:617:5: label ( fact | LEFT_PAREN fact_binding_expression RIGHT_PAREN )
+            {
+            pushFollow(FOLLOW_label_in_fact_binding2679);
+            label174=label();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_label.add(label174.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:618:3: ( fact | LEFT_PAREN fact_binding_expression RIGHT_PAREN )
+            int alt64=2;
+            int LA64_0 = input.LA(1);
+
+            if ( (LA64_0==ID) ) {
+                alt64=1;
+            }
+            else if ( (LA64_0==LEFT_PAREN) ) {
+                alt64=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("618:3: ( fact | LEFT_PAREN fact_binding_expression RIGHT_PAREN )", 64, 0, input);
+
+                throw nvae;
+            }
+            switch (alt64) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:618:5: fact
+                    {
+                    pushFollow(FOLLOW_fact_in_fact_binding2685);
+                    fact175=fact();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_fact.add(fact175.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:619:6: LEFT_PAREN fact_binding_expression RIGHT_PAREN
+                    {
+                    LEFT_PAREN176=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact_binding2692); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN176);
+
+                    pushFollow(FOLLOW_fact_binding_expression_in_fact_binding2694);
+                    fact_binding_expression177=fact_binding_expression();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_fact_binding_expression.add(fact_binding_expression177.getTree());
+                    RIGHT_PAREN178=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact_binding2696); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN178);
+
+
+                    }
+                    break;
+
+            }
+
+
+            // AST REWRITE
+            // elements: RIGHT_PAREN, fact_binding_expression, fact, label
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 621:3: -> ^( VT_FACT_BINDING label ( fact )? ( fact_binding_expression )? ( RIGHT_PAREN )? )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:621:6: ^( VT_FACT_BINDING label ( fact )? ( fact_binding_expression )? ( RIGHT_PAREN )? )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FACT_BINDING, "VT_FACT_BINDING"), root_1);
+
+                adaptor.addChild(root_1, stream_label.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:621:30: ( fact )?
+                if ( stream_fact.hasNext() ) {
+                    adaptor.addChild(root_1, stream_fact.next());
+
+                }
+                stream_fact.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:621:36: ( fact_binding_expression )?
+                if ( stream_fact_binding_expression.hasNext() ) {
+                    adaptor.addChild(root_1, stream_fact_binding_expression.next());
+
+                }
+                stream_fact_binding_expression.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:621:61: ( RIGHT_PAREN )?
+                if ( stream_RIGHT_PAREN.hasNext() ) {
+                    adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                }
+                stream_RIGHT_PAREN.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end fact_binding
+
+    public static class fact_binding_expression_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start fact_binding_expression
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:624:1: fact_binding_expression : ( fact -> fact ) ( (value= or_key | pipe= DOUBLE_PIPE ) fact -> ^( VT_FACT_OR[orToken] $fact_binding_expression fact ) )* ;
+    public final fact_binding_expression_return fact_binding_expression() throws RecognitionException {
+        fact_binding_expression_return retval = new fact_binding_expression_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token pipe=null;
+        or_key_return value = null;
+
+        fact_return fact179 = null;
+
+        fact_return fact180 = null;
+
+
+        Object pipe_tree=null;
+        RewriteRuleTokenStream stream_DOUBLE_PIPE=new RewriteRuleTokenStream(adaptor,"token DOUBLE_PIPE");
+        RewriteRuleSubtreeStream stream_or_key=new RewriteRuleSubtreeStream(adaptor,"rule or_key");
+        RewriteRuleSubtreeStream stream_fact=new RewriteRuleSubtreeStream(adaptor,"rule fact");
+
+        	Token orToken = null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:3: ( ( fact -> fact ) ( (value= or_key | pipe= DOUBLE_PIPE ) fact -> ^( VT_FACT_OR[orToken] $fact_binding_expression fact ) )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:5: ( fact -> fact ) ( (value= or_key | pipe= DOUBLE_PIPE ) fact -> ^( VT_FACT_OR[orToken] $fact_binding_expression fact ) )*
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:5: ( fact -> fact )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:6: fact
+            {
+            pushFollow(FOLLOW_fact_in_fact_binding_expression2735);
+            fact179=fact();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_fact.add(fact179.getTree());
+
+            // AST REWRITE
+            // elements: fact
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 627:11: -> fact
+            {
+                adaptor.addChild(root_0, stream_fact.next());
+
+            }
+
+            }
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:20: ( (value= or_key | pipe= DOUBLE_PIPE ) fact -> ^( VT_FACT_OR[orToken] $fact_binding_expression fact ) )*
+            loop66:
+            do {
+                int alt66=2;
+                int LA66_0 = input.LA(1);
+
+                if ( (LA66_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.OR)))) {
+                    alt66=1;
+                }
+                else if ( (LA66_0==DOUBLE_PIPE) ) {
+                    alt66=1;
+                }
+
+
+                switch (alt66) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:22: (value= or_key | pipe= DOUBLE_PIPE ) fact
+            	    {
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:22: (value= or_key | pipe= DOUBLE_PIPE )
+            	    int alt65=2;
+            	    int LA65_0 = input.LA(1);
+
+            	    if ( (LA65_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.OR)))) {
+            	        alt65=1;
+            	    }
+            	    else if ( (LA65_0==DOUBLE_PIPE) ) {
+            	        alt65=2;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return retval;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("627:22: (value= or_key | pipe= DOUBLE_PIPE )", 65, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt65) {
+            	        case 1 :
+            	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:23: value= or_key
+            	            {
+            	            pushFollow(FOLLOW_or_key_in_fact_binding_expression2747);
+            	            value=or_key();
+            	            _fsp--;
+            	            if (failed) return retval;
+            	            if ( backtracking==0 ) stream_or_key.add(value.getTree());
+            	            if ( backtracking==0 ) {
+            	              orToken = ((Token)value.start);
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:62: pipe= DOUBLE_PIPE
+            	            {
+            	            pipe=(Token)input.LT(1);
+            	            match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_fact_binding_expression2753); if (failed) return retval;
+            	            if ( backtracking==0 ) stream_DOUBLE_PIPE.add(pipe);
+
+            	            if ( backtracking==0 ) {
+            	              orToken = pipe;
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    pushFollow(FOLLOW_fact_in_fact_binding_expression2758);
+            	    fact180=fact();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_fact.add(fact180.getTree());
+
+            	    // AST REWRITE
+            	    // elements: fact_binding_expression, fact
+            	    // token labels: 
+            	    // rule labels: retval
+            	    // token list labels: 
+            	    // rule list labels: 
+            	    if ( backtracking==0 ) {
+            	    retval.tree = root_0;
+            	    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            	    root_0 = (Object)adaptor.nil();
+            	    // 628:3: -> ^( VT_FACT_OR[orToken] $fact_binding_expression fact )
+            	    {
+            	        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:628:6: ^( VT_FACT_OR[orToken] $fact_binding_expression fact )
+            	        {
+            	        Object root_1 = (Object)adaptor.nil();
+            	        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FACT_OR, orToken), root_1);
+
+            	        adaptor.addChild(root_1, stream_retval.next());
+            	        adaptor.addChild(root_1, stream_fact.next());
+
+            	        adaptor.addChild(root_0, root_1);
+            	        }
+
+            	    }
+
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop66;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end fact_binding_expression
+
+    public static class fact_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start fact
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:631:1: fact : pattern_type LEFT_PAREN ( constraints )? RIGHT_PAREN -> ^( VT_FACT pattern_type ( constraints )? RIGHT_PAREN ) ;
+    public final fact_return fact() throws RecognitionException {
+        fact_return retval = new fact_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN182=null;
+        Token RIGHT_PAREN184=null;
+        pattern_type_return pattern_type181 = null;
+
+        constraints_return constraints183 = null;
+
+
+        Object LEFT_PAREN182_tree=null;
+        Object RIGHT_PAREN184_tree=null;
+        RewriteRuleTokenStream stream_LEFT_PAREN=new RewriteRuleTokenStream(adaptor,"token LEFT_PAREN");
+        RewriteRuleTokenStream stream_RIGHT_PAREN=new RewriteRuleTokenStream(adaptor,"token RIGHT_PAREN");
+        RewriteRuleSubtreeStream stream_pattern_type=new RewriteRuleSubtreeStream(adaptor,"rule pattern_type");
+        RewriteRuleSubtreeStream stream_constraints=new RewriteRuleSubtreeStream(adaptor,"rule constraints");
+         pushParaphrases(DroolsParaphareseTypes.PATTERN); 
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:2: ( pattern_type LEFT_PAREN ( constraints )? RIGHT_PAREN -> ^( VT_FACT pattern_type ( constraints )? RIGHT_PAREN ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:4: pattern_type LEFT_PAREN ( constraints )? RIGHT_PAREN
+            {
+            pushFollow(FOLLOW_pattern_type_in_fact2798);
+            pattern_type181=pattern_type();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_pattern_type.add(pattern_type181.getTree());
+            LEFT_PAREN182=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact2800); if (failed) return retval;
+            if ( backtracking==0 ) stream_LEFT_PAREN.add(LEFT_PAREN182);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:28: ( constraints )?
+            int alt67=2;
+            int LA67_0 = input.LA(1);
+
+            if ( (LA67_0==ID||LA67_0==LEFT_PAREN) ) {
+                alt67=1;
+            }
+            switch (alt67) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:28: constraints
+                    {
+                    pushFollow(FOLLOW_constraints_in_fact2802);
+                    constraints183=constraints();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_constraints.add(constraints183.getTree());
+
+                    }
+                    break;
+
+            }
+
+            RIGHT_PAREN184=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact2805); if (failed) return retval;
+            if ( backtracking==0 ) stream_RIGHT_PAREN.add(RIGHT_PAREN184);
+
+
+            // AST REWRITE
+            // elements: RIGHT_PAREN, pattern_type, constraints
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 635:2: -> ^( VT_FACT pattern_type ( constraints )? RIGHT_PAREN )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:635:5: ^( VT_FACT pattern_type ( constraints )? RIGHT_PAREN )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FACT, "VT_FACT"), root_1);
+
+                adaptor.addChild(root_1, stream_pattern_type.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:635:28: ( constraints )?
+                if ( stream_constraints.hasNext() ) {
+                    adaptor.addChild(root_1, stream_constraints.next());
+
+                }
+                stream_constraints.reset();
+                adaptor.addChild(root_1, stream_RIGHT_PAREN.next());
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+            if ( backtracking==0 ) {
+               paraphrases.pop(); 
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end fact
+
+    public static class constraints_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start constraints
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:638:1: constraints : constraint ( COMMA constraint )* ;
+    public final constraints_return constraints() throws RecognitionException {
+        constraints_return retval = new constraints_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token COMMA186=null;
+        constraint_return constraint185 = null;
+
+        constraint_return constraint187 = null;
+
+
+        Object COMMA186_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:639:2: ( constraint ( COMMA constraint )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:639:4: constraint ( COMMA constraint )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_constraint_in_constraints2830);
+            constraint185=constraint();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, constraint185.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:639:15: ( COMMA constraint )*
+            loop68:
+            do {
+                int alt68=2;
+                int LA68_0 = input.LA(1);
+
+                if ( (LA68_0==COMMA) ) {
+                    alt68=1;
+                }
+
+
+                switch (alt68) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:639:17: COMMA constraint
+            	    {
+            	    COMMA186=(Token)input.LT(1);
+            	    match(input,COMMA,FOLLOW_COMMA_in_constraints2834); if (failed) return retval;
+            	    pushFollow(FOLLOW_constraint_in_constraints2837);
+            	    constraint187=constraint();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, constraint187.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop68;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end constraints
+
+    public static class constraint_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start constraint
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:1: constraint : or_constr ;
+    public final constraint_return constraint() throws RecognitionException {
+        constraint_return retval = new constraint_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        or_constr_return or_constr188 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:643:2: ( or_constr )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:643:4: or_constr
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_or_constr_in_constraint2851);
+            or_constr188=or_constr();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, or_constr188.getTree());
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end constraint
+
+    public static class or_constr_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start or_constr
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:646:1: or_constr : and_constr ( DOUBLE_PIPE and_constr )* ;
+    public final or_constr_return or_constr() throws RecognitionException {
+        or_constr_return retval = new or_constr_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOUBLE_PIPE190=null;
+        and_constr_return and_constr189 = null;
+
+        and_constr_return and_constr191 = null;
+
+
+        Object DOUBLE_PIPE190_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:647:2: ( and_constr ( DOUBLE_PIPE and_constr )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:647:4: and_constr ( DOUBLE_PIPE and_constr )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_and_constr_in_or_constr2862);
+            and_constr189=and_constr();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, and_constr189.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:647:15: ( DOUBLE_PIPE and_constr )*
+            loop69:
+            do {
+                int alt69=2;
+                int LA69_0 = input.LA(1);
+
+                if ( (LA69_0==DOUBLE_PIPE) ) {
+                    alt69=1;
+                }
+
+
+                switch (alt69) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:647:17: DOUBLE_PIPE and_constr
+            	    {
+            	    DOUBLE_PIPE190=(Token)input.LT(1);
+            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_constr2866); if (failed) return retval;
+            	    if ( backtracking==0 ) {
+            	    DOUBLE_PIPE190_tree = (Object)adaptor.create(DOUBLE_PIPE190);
+            	    root_0 = (Object)adaptor.becomeRoot(DOUBLE_PIPE190_tree, root_0);
+            	    }
+            	    pushFollow(FOLLOW_and_constr_in_or_constr2869);
+            	    and_constr191=and_constr();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, and_constr191.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop69;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end or_constr
+
+    public static class and_constr_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start and_constr
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:650:1: and_constr : unary_constr ( DOUBLE_AMPER unary_constr )* ;
+    public final and_constr_return and_constr() throws RecognitionException {
+        and_constr_return retval = new and_constr_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOUBLE_AMPER193=null;
+        unary_constr_return unary_constr192 = null;
+
+        unary_constr_return unary_constr194 = null;
+
+
+        Object DOUBLE_AMPER193_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:651:2: ( unary_constr ( DOUBLE_AMPER unary_constr )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:651:4: unary_constr ( DOUBLE_AMPER unary_constr )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_unary_constr_in_and_constr2884);
+            unary_constr192=unary_constr();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, unary_constr192.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:651:17: ( DOUBLE_AMPER unary_constr )*
+            loop70:
+            do {
+                int alt70=2;
+                int LA70_0 = input.LA(1);
+
+                if ( (LA70_0==DOUBLE_AMPER) ) {
+                    alt70=1;
+                }
+
+
+                switch (alt70) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:651:19: DOUBLE_AMPER unary_constr
+            	    {
+            	    DOUBLE_AMPER193=(Token)input.LT(1);
+            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_constr2888); if (failed) return retval;
+            	    if ( backtracking==0 ) {
+            	    DOUBLE_AMPER193_tree = (Object)adaptor.create(DOUBLE_AMPER193);
+            	    root_0 = (Object)adaptor.becomeRoot(DOUBLE_AMPER193_tree, root_0);
+            	    }
+            	    pushFollow(FOLLOW_unary_constr_in_and_constr2891);
+            	    unary_constr194=unary_constr();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, unary_constr194.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop70;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end and_constr
+
+    public static class unary_constr_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start unary_constr
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:654:1: unary_constr options {k=2; } : ( eval_key paren_chunk | field_constraint | LEFT_PAREN or_constr RIGHT_PAREN );
+    public final unary_constr_return unary_constr() throws RecognitionException {
+        unary_constr_return retval = new unary_constr_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN198=null;
+        Token RIGHT_PAREN200=null;
+        eval_key_return eval_key195 = null;
+
+        paren_chunk_return paren_chunk196 = null;
+
+        field_constraint_return field_constraint197 = null;
+
+        or_constr_return or_constr199 = null;
+
+
+        Object LEFT_PAREN198_tree=null;
+        Object RIGHT_PAREN200_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:656:2: ( eval_key paren_chunk | field_constraint | LEFT_PAREN or_constr RIGHT_PAREN )
+            int alt71=3;
+            int LA71_0 = input.LA(1);
+
+            if ( (LA71_0==ID) ) {
+                int LA71_1 = input.LA(2);
+
+                if ( ((LA71_1>=ID && LA71_1<=DOT)||LA71_1==COLON||(LA71_1>=EQUAL && LA71_1<=GRAVE_ACCENT)||LA71_1==LEFT_SQUARE) ) {
+                    alt71=2;
+                }
+                else if ( (LA71_1==LEFT_PAREN) ) {
+                    int LA71_14 = input.LA(3);
+
+                    if ( ((validateIdentifierKey(DroolsSoftKeywords.EVAL))) ) {
+                        alt71=1;
+                    }
+                    else if ( (true) ) {
+                        alt71=2;
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("654:1: unary_constr options {k=2; } : ( eval_key paren_chunk | field_constraint | LEFT_PAREN or_constr RIGHT_PAREN );", 71, 14, input);
+
+                        throw nvae;
+                    }
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("654:1: unary_constr options {k=2; } : ( eval_key paren_chunk | field_constraint | LEFT_PAREN or_constr RIGHT_PAREN );", 71, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA71_0==LEFT_PAREN) ) {
+                alt71=3;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("654:1: unary_constr options {k=2; } : ( eval_key paren_chunk | field_constraint | LEFT_PAREN or_constr RIGHT_PAREN );", 71, 0, input);
+
+                throw nvae;
+            }
+            switch (alt71) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:656:4: eval_key paren_chunk
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_eval_key_in_unary_constr2912);
+                    eval_key195=eval_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(eval_key195.getTree(), root_0);
+                    pushFollow(FOLLOW_paren_chunk_in_unary_constr2915);
+                    paren_chunk196=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, paren_chunk196.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:657:4: field_constraint
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_field_constraint_in_unary_constr2920);
+                    field_constraint197=field_constraint();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, field_constraint197.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:658:4: LEFT_PAREN or_constr RIGHT_PAREN
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    LEFT_PAREN198=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unary_constr2925); if (failed) return retval;
+                    pushFollow(FOLLOW_or_constr_in_unary_constr2928);
+                    or_constr199=or_constr();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, or_constr199.getTree());
+                    RIGHT_PAREN200=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unary_constr2930); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    RIGHT_PAREN200_tree = (Object)adaptor.create(RIGHT_PAREN200);
+                    adaptor.addChild(root_0, RIGHT_PAREN200_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end unary_constr
+
+    public static class field_constraint_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start field_constraint
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:661:1: field_constraint : ( label accessor_path ( or_restr_connective | arw= ARROW paren_chunk )? -> {isArrow}? ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) ) ( ^( VK_EVAL[$arw] paren_chunk ) )? -> ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) ) | accessor_path or_restr_connective -> ^( VT_FIELD accessor_path or_restr_connective ) );
+    public final field_constraint_return field_constraint() throws RecognitionException {
+        field_constraint_return retval = new field_constraint_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token arw=null;
+        label_return label201 = null;
+
+        accessor_path_return accessor_path202 = null;
+
+        or_restr_connective_return or_restr_connective203 = null;
+
+        paren_chunk_return paren_chunk204 = null;
+
+        accessor_path_return accessor_path205 = null;
+
+        or_restr_connective_return or_restr_connective206 = null;
+
+
+        Object arw_tree=null;
+        RewriteRuleTokenStream stream_ARROW=new RewriteRuleTokenStream(adaptor,"token ARROW");
+        RewriteRuleSubtreeStream stream_accessor_path=new RewriteRuleSubtreeStream(adaptor,"rule accessor_path");
+        RewriteRuleSubtreeStream stream_label=new RewriteRuleSubtreeStream(adaptor,"rule label");
+        RewriteRuleSubtreeStream stream_paren_chunk=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk");
+        RewriteRuleSubtreeStream stream_or_restr_connective=new RewriteRuleSubtreeStream(adaptor,"rule or_restr_connective");
+
+        	boolean isArrow = false;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:3: ( label accessor_path ( or_restr_connective | arw= ARROW paren_chunk )? -> {isArrow}? ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) ) ( ^( VK_EVAL[$arw] paren_chunk ) )? -> ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) ) | accessor_path or_restr_connective -> ^( VT_FIELD accessor_path or_restr_connective ) )
+            int alt73=2;
+            int LA73_0 = input.LA(1);
+
+            if ( (LA73_0==ID) ) {
+                int LA73_1 = input.LA(2);
+
+                if ( (LA73_1==COLON) ) {
+                    alt73=1;
+                }
+                else if ( ((LA73_1>=ID && LA73_1<=DOT)||LA73_1==LEFT_PAREN||(LA73_1>=EQUAL && LA73_1<=GRAVE_ACCENT)||LA73_1==LEFT_SQUARE) ) {
+                    alt73=2;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("661:1: field_constraint : ( label accessor_path ( or_restr_connective | arw= ARROW paren_chunk )? -> {isArrow}? ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) ) ( ^( VK_EVAL[$arw] paren_chunk ) )? -> ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) ) | accessor_path or_restr_connective -> ^( VT_FIELD accessor_path or_restr_connective ) );", 73, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("661:1: field_constraint : ( label accessor_path ( or_restr_connective | arw= ARROW paren_chunk )? -> {isArrow}? ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) ) ( ^( VK_EVAL[$arw] paren_chunk ) )? -> ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) ) | accessor_path or_restr_connective -> ^( VT_FIELD accessor_path or_restr_connective ) );", 73, 0, input);
+
+                throw nvae;
+            }
+            switch (alt73) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:5: label accessor_path ( or_restr_connective | arw= ARROW paren_chunk )?
+                    {
+                    pushFollow(FOLLOW_label_in_field_constraint2944);
+                    label201=label();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_label.add(label201.getTree());
+                    pushFollow(FOLLOW_accessor_path_in_field_constraint2946);
+                    accessor_path202=accessor_path();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_accessor_path.add(accessor_path202.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:25: ( or_restr_connective | arw= ARROW paren_chunk )?
+                    int alt72=3;
+                    int LA72_0 = input.LA(1);
+
+                    if ( (LA72_0==ID||LA72_0==LEFT_PAREN||(LA72_0>=EQUAL && LA72_0<=GRAVE_ACCENT)) ) {
+                        alt72=1;
+                    }
+                    else if ( (LA72_0==ARROW) ) {
+                        alt72=2;
+                    }
+                    switch (alt72) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:27: or_restr_connective
+                            {
+                            pushFollow(FOLLOW_or_restr_connective_in_field_constraint2950);
+                            or_restr_connective203=or_restr_connective();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) stream_or_restr_connective.add(or_restr_connective203.getTree());
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:49: arw= ARROW paren_chunk
+                            {
+                            arw=(Token)input.LT(1);
+                            match(input,ARROW,FOLLOW_ARROW_in_field_constraint2956); if (failed) return retval;
+                            if ( backtracking==0 ) stream_ARROW.add(arw);
+
+                            pushFollow(FOLLOW_paren_chunk_in_field_constraint2958);
+                            paren_chunk204=paren_chunk();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) stream_paren_chunk.add(paren_chunk204.getTree());
+                            if ( backtracking==0 ) {
+                              isArrow = true;
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    // AST REWRITE
+                    // elements: accessor_path, label, paren_chunk, label, or_restr_connective, accessor_path
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 665:3: -> {isArrow}? ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) ) ( ^( VK_EVAL[$arw] paren_chunk ) )?
+                    if (isArrow) {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:665:17: ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ) )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_BIND_FIELD, "VT_BIND_FIELD"), root_1);
+
+                        adaptor.addChild(root_1, stream_label.next());
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:665:39: ^( VT_FIELD accessor_path )
+                        {
+                        Object root_2 = (Object)adaptor.nil();
+                        root_2 = (Object)adaptor.becomeRoot(adaptor.create(VT_FIELD, "VT_FIELD"), root_2);
+
+                        adaptor.addChild(root_2, stream_accessor_path.next());
+
+                        adaptor.addChild(root_1, root_2);
+                        }
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:665:66: ( ^( VK_EVAL[$arw] paren_chunk ) )?
+                        if ( stream_paren_chunk.hasNext() ) {
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:665:66: ^( VK_EVAL[$arw] paren_chunk )
+                            {
+                            Object root_1 = (Object)adaptor.nil();
+                            root_1 = (Object)adaptor.becomeRoot(adaptor.create(VK_EVAL, arw), root_1);
+
+                            adaptor.addChild(root_1, stream_paren_chunk.next());
+
+                            adaptor.addChild(root_0, root_1);
+                            }
+
+                        }
+                        stream_paren_chunk.reset();
+
+                    }
+                    else // 666:3: -> ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:666:6: ^( VT_BIND_FIELD label ^( VT_FIELD accessor_path ( or_restr_connective )? ) )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_BIND_FIELD, "VT_BIND_FIELD"), root_1);
+
+                        adaptor.addChild(root_1, stream_label.next());
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:666:28: ^( VT_FIELD accessor_path ( or_restr_connective )? )
+                        {
+                        Object root_2 = (Object)adaptor.nil();
+                        root_2 = (Object)adaptor.becomeRoot(adaptor.create(VT_FIELD, "VT_FIELD"), root_2);
+
+                        adaptor.addChild(root_2, stream_accessor_path.next());
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:666:53: ( or_restr_connective )?
+                        if ( stream_or_restr_connective.hasNext() ) {
+                            adaptor.addChild(root_2, stream_or_restr_connective.next());
+
+                        }
+                        stream_or_restr_connective.reset();
+
+                        adaptor.addChild(root_1, root_2);
+                        }
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:667:4: accessor_path or_restr_connective
+                    {
+                    pushFollow(FOLLOW_accessor_path_in_field_constraint3012);
+                    accessor_path205=accessor_path();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_accessor_path.add(accessor_path205.getTree());
+                    pushFollow(FOLLOW_or_restr_connective_in_field_constraint3014);
+                    or_restr_connective206=or_restr_connective();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) stream_or_restr_connective.add(or_restr_connective206.getTree());
+
+                    // AST REWRITE
+                    // elements: accessor_path, or_restr_connective
+                    // token labels: 
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 668:3: -> ^( VT_FIELD accessor_path or_restr_connective )
+                    {
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:668:6: ^( VT_FIELD accessor_path or_restr_connective )
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_FIELD, "VT_FIELD"), root_1);
+
+                        adaptor.addChild(root_1, stream_accessor_path.next());
+                        adaptor.addChild(root_1, stream_or_restr_connective.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end field_constraint
+
+    public static class label_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start label
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:671:1: label : value= ID COLON -> VT_LABEL[$value] ;
+    public final label_return label() throws RecognitionException {
+        label_return retval = new label_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token value=null;
+        Token COLON207=null;
+
+        Object value_tree=null;
+        Object COLON207_tree=null;
+        RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:671:7: (value= ID COLON -> VT_LABEL[$value] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:671:9: value= ID COLON
+            {
+            value=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_label3038); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(value);
+
+            COLON207=(Token)input.LT(1);
+            match(input,COLON,FOLLOW_COLON_in_label3040); if (failed) return retval;
+            if ( backtracking==0 ) stream_COLON.add(COLON207);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 671:24: -> VT_LABEL[$value]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_LABEL, value));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end label
+
+    public static class or_restr_connective_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start or_restr_connective
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:674:1: or_restr_connective : and_restr_connective ( ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective )* ;
+    public final or_restr_connective_return or_restr_connective() throws RecognitionException {
+        or_restr_connective_return retval = new or_restr_connective_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOUBLE_PIPE209=null;
+        and_restr_connective_return and_restr_connective208 = null;
+
+        and_restr_connective_return and_restr_connective210 = null;
+
+
+        Object DOUBLE_PIPE209_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:2: ( and_restr_connective ( ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:4: and_restr_connective ( ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3056);
+            and_restr_connective208=and_restr_connective();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, and_restr_connective208.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:25: ( ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective )*
+            loop74:
+            do {
+                int alt74=2;
+                alt74 = dfa74.predict(input);
+                switch (alt74) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:26: ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective
+            	    {
+            	    DOUBLE_PIPE209=(Token)input.LT(1);
+            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_restr_connective3064); if (failed) return retval;
+            	    if ( backtracking==0 ) {
+            	    DOUBLE_PIPE209_tree = (Object)adaptor.create(DOUBLE_PIPE209);
+            	    root_0 = (Object)adaptor.becomeRoot(DOUBLE_PIPE209_tree, root_0);
+            	    }
+            	    pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3067);
+            	    and_restr_connective210=and_restr_connective();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, and_restr_connective210.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop74;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end or_restr_connective
+
+    public static class and_restr_connective_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start and_restr_connective
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:678:1: and_restr_connective : constraint_expression ( ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression )* ;
+    public final and_restr_connective_return and_restr_connective() throws RecognitionException {
+        and_restr_connective_return retval = new and_restr_connective_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOUBLE_AMPER212=null;
+        constraint_expression_return constraint_expression211 = null;
+
+        constraint_expression_return constraint_expression213 = null;
+
+
+        Object DOUBLE_AMPER212_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:2: ( constraint_expression ( ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:4: constraint_expression ( ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression )*
+            {
+            root_0 = (Object)adaptor.nil();
+
+            pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3082);
+            constraint_expression211=constraint_expression();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, constraint_expression211.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:26: ( ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression )*
+            loop75:
+            do {
+                int alt75=2;
+                alt75 = dfa75.predict(input);
+                switch (alt75) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:27: ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression
+            	    {
+            	    DOUBLE_AMPER212=(Token)input.LT(1);
+            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_restr_connective3090); if (failed) return retval;
+            	    if ( backtracking==0 ) {
+            	    DOUBLE_AMPER212_tree = (Object)adaptor.create(DOUBLE_AMPER212);
+            	    root_0 = (Object)adaptor.becomeRoot(DOUBLE_AMPER212_tree, root_0);
+            	    }
+            	    pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3093);
+            	    constraint_expression213=constraint_expression();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, constraint_expression213.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop75;
+                }
+            } while (true);
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end and_restr_connective
+
+    public static class constraint_expression_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start constraint_expression
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );
+    public final constraint_expression_return constraint_expression() throws RecognitionException {
+        constraint_expression_return retval = new constraint_expression_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN216=null;
+        Token RIGHT_PAREN218=null;
+        compound_operator_return compound_operator214 = null;
+
+        simple_operator_return simple_operator215 = null;
+
+        or_restr_connective_return or_restr_connective217 = null;
+
+
+        Object LEFT_PAREN216_tree=null;
+        Object RIGHT_PAREN218_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:685:3: ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN )
+            int alt76=3;
+            switch ( input.LA(1) ) {
+            case ID:
+                {
+                int LA76_1 = input.LA(2);
+
+                if ( (LA76_1==ID) ) {
+                    int LA76_10 = input.LA(3);
+
+                    if ( (LA76_10==ID||LA76_10==STRING||(LA76_10>=BOOL && LA76_10<=INT)||(LA76_10>=FLOAT && LA76_10<=NULL)) && ((validateIdentifierKey(DroolsSoftKeywords.NOT)))) {
+                        alt76=2;
+                    }
+                    else if ( (LA76_10==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.NOT)))) {
+                        int LA76_16 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.NOT))) ) {
+                            alt76=1;
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.NOT))) ) {
+                            alt76=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 16, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else if ( (LA76_10==DOT||(LA76_10>=COMMA && LA76_10<=RIGHT_PAREN)||(LA76_10>=DOUBLE_PIPE && LA76_10<=DOUBLE_AMPER)||LA76_10==LEFT_SQUARE) ) {
+                        alt76=2;
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 10, input);
+
+                        throw nvae;
+                    }
+                }
+                else if ( (LA76_1==STRING||(LA76_1>=BOOL && LA76_1<=INT)||(LA76_1>=FLOAT && LA76_1<=NULL)) ) {
+                    alt76=2;
+                }
+                else if ( (LA76_1==LEFT_PAREN) ) {
+                    switch ( input.LA(3) ) {
+                    case ID:
+                        {
+                        int LA76_23 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IN))) ) {
+                            alt76=1;
+                        }
+                        else if ( (true) ) {
+                            alt76=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 23, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case STRING:
+                    case BOOL:
+                    case INT:
+                    case FLOAT:
+                    case NULL:
+                        {
+                        int LA76_24 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IN))) ) {
+                            alt76=1;
+                        }
+                        else if ( (true) ) {
+                            alt76=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 24, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case LEFT_PAREN:
+                        {
+                        int LA76_25 = input.LA(4);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IN))) ) {
+                            alt76=1;
+                        }
+                        else if ( (true) ) {
+                            alt76=2;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 25, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case VT_COMPILATION_UNIT:
+                    case VT_FUNCTION_IMPORT:
+                    case VT_FACT:
+                    case VT_CONSTRAINTS:
+                    case VT_LABEL:
+                    case VT_QUERY_ID:
+                    case VT_TEMPLATE_ID:
+                    case VT_RULE_ID:
+                    case VT_ENTRYPOINT_ID:
+                    case VT_SLOT_ID:
+                    case VT_SLOT:
+                    case VT_RULE_ATTRIBUTES:
+                    case VT_RHS_CHUNK:
+                    case VT_CURLY_CHUNK:
+                    case VT_SQUARE_CHUNK:
+                    case VT_PAREN_CHUNK:
+                    case VT_AND_IMPLICIT:
+                    case VT_AND_PREFIX:
+                    case VT_OR_PREFIX:
+                    case VT_AND_INFIX:
+                    case VT_OR_INFIX:
+                    case VT_ACCUMULATE_INIT_CLAUSE:
+                    case VT_ACCUMULATE_ID_CLAUSE:
+                    case VT_FROM_SOURCE:
+                    case VT_EXPRESSION_CHAIN:
+                    case VT_PATTERN:
+                    case VT_FACT_BINDING:
+                    case VT_FACT_OR:
+                    case VT_BIND_FIELD:
+                    case VT_FIELD:
+                    case VT_ACCESSOR_PATH:
+                    case VT_ACCESSOR_ELEMENT:
+                    case VT_DATA_TYPE:
+                    case VT_PATTERN_TYPE:
+                    case VT_PACKAGE_ID:
+                    case VT_IMPORT_ID:
+                    case VT_GLOBAL_ID:
+                    case VT_FUNCTION_ID:
+                    case VT_PARAM_LIST:
+                    case VK_DATE_EFFECTIVE:
+                    case VK_DATE_EXPIRES:
+                    case VK_LOCK_ON_ACTIVE:
+                    case VK_NO_LOOP:
+                    case VK_AUTO_FOCUS:
+                    case VK_ACTIVATION_GROUP:
+                    case VK_AGENDA_GROUP:
+                    case VK_RULEFLOW_GROUP:
+                    case VK_DURATION:
+                    case VK_DIALECT:
+                    case VK_SALIENCE:
+                    case VK_ENABLED:
+                    case VK_ATTRIBUTES:
+                    case VK_WHEN:
+                    case VK_RULE:
+                    case VK_IMPORT:
+                    case VK_PACKAGE:
+                    case VK_TEMPLATE:
+                    case VK_QUERY:
+                    case VK_DECLARE:
+                    case VK_FUNCTION:
+                    case VK_GLOBAL:
+                    case VK_EVAL:
+                    case VK_CONTAINS:
+                    case VK_MATCHES:
+                    case VK_EXCLUDES:
+                    case VK_SOUNDSLIKE:
+                    case VK_MEMBEROF:
+                    case VK_ENTRY_POINT:
+                    case VK_NOT:
+                    case VK_IN:
+                    case VK_OR:
+                    case VK_AND:
+                    case VK_EXISTS:
+                    case VK_FORALL:
+                    case VK_FROM:
+                    case VK_ACCUMULATE:
+                    case VK_INIT:
+                    case VK_ACTION:
+                    case VK_REVERSE:
+                    case VK_RESULT:
+                    case VK_COLLECT:
+                    case SEMICOLON:
+                    case DOT:
+                    case DOT_STAR:
+                    case END:
+                    case COMMA:
+                    case RIGHT_PAREN:
+                    case COLON:
+                    case DOUBLE_PIPE:
+                    case DOUBLE_AMPER:
+                    case ARROW:
+                    case EQUAL:
+                    case GREATER:
+                    case GREATER_EQUAL:
+                    case LESS:
+                    case LESS_EQUAL:
+                    case NOT_EQUAL:
+                    case GRAVE_ACCENT:
+                    case LEFT_SQUARE:
+                    case RIGHT_SQUARE:
+                    case THEN:
+                    case LEFT_CURLY:
+                    case RIGHT_CURLY:
+                    case MISC:
+                    case EOL:
+                    case WS:
+                    case EscapeSequence:
+                    case HexDigit:
+                    case UnicodeEscape:
+                    case OctalEscape:
+                    case SH_STYLE_SINGLE_LINE_COMMENT:
+                    case C_STYLE_SINGLE_LINE_COMMENT:
+                    case MULTI_LINE_COMMENT:
+                        {
+                        alt76=2;
+                        }
+                        break;
+                    default:
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 12, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else if ( (LA76_1==GRAVE_ACCENT) && ((validateIdentifierKey(DroolsSoftKeywords.NOT)))) {
+                    alt76=2;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case EQUAL:
+            case GREATER:
+            case GREATER_EQUAL:
+            case LESS:
+            case LESS_EQUAL:
+            case NOT_EQUAL:
+            case GRAVE_ACCENT:
+                {
+                alt76=2;
+                }
+                break;
+            case LEFT_PAREN:
+                {
+                alt76=3;
+                }
+                break;
+            default:
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("682:1: constraint_expression options {k=3; } : ( compound_operator | simple_operator | LEFT_PAREN or_restr_connective RIGHT_PAREN );", 76, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt76) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:685:5: compound_operator
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_compound_operator_in_constraint_expression3115);
+                    compound_operator214=compound_operator();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, compound_operator214.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:686:4: simple_operator
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_simple_operator_in_constraint_expression3120);
+                    simple_operator215=simple_operator();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, simple_operator215.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:687:4: LEFT_PAREN or_restr_connective RIGHT_PAREN
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    LEFT_PAREN216=(Token)input.LT(1);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_constraint_expression3125); if (failed) return retval;
+                    pushFollow(FOLLOW_or_restr_connective_in_constraint_expression3128);
+                    or_restr_connective217=or_restr_connective();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, or_restr_connective217.getTree());
+                    RIGHT_PAREN218=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_constraint_expression3130); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    RIGHT_PAREN218_tree = (Object)adaptor.create(RIGHT_PAREN218);
+                    adaptor.addChild(root_0, RIGHT_PAREN218_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end constraint_expression
+
+    public static class simple_operator_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start simple_operator
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:690:1: simple_operator : ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) expression_value ;
+    public final simple_operator_return simple_operator() throws RecognitionException {
+        simple_operator_return retval = new simple_operator_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token EQUAL219=null;
+        Token GREATER220=null;
+        Token GREATER_EQUAL221=null;
+        Token LESS222=null;
+        Token LESS_EQUAL223=null;
+        Token NOT_EQUAL224=null;
+        Token ID230=null;
+        Token GRAVE_ACCENT231=null;
+        Token ID232=null;
+        Token ID239=null;
+        Token GRAVE_ACCENT240=null;
+        Token ID241=null;
+        not_key_return not_key225 = null;
+
+        contains_key_return contains_key226 = null;
+
+        soundslike_key_return soundslike_key227 = null;
+
+        matches_key_return matches_key228 = null;
+
+        memberof_key_return memberof_key229 = null;
+
+        square_chunk_return square_chunk233 = null;
+
+        contains_key_return contains_key234 = null;
+
+        excludes_key_return excludes_key235 = null;
+
+        matches_key_return matches_key236 = null;
+
+        soundslike_key_return soundslike_key237 = null;
+
+        memberof_key_return memberof_key238 = null;
+
+        square_chunk_return square_chunk242 = null;
+
+        expression_value_return expression_value243 = null;
+
+
+        Object EQUAL219_tree=null;
+        Object GREATER220_tree=null;
+        Object GREATER_EQUAL221_tree=null;
+        Object LESS222_tree=null;
+        Object LESS_EQUAL223_tree=null;
+        Object NOT_EQUAL224_tree=null;
+        Object ID230_tree=null;
+        Object GRAVE_ACCENT231_tree=null;
+        Object ID232_tree=null;
+        Object ID239_tree=null;
+        Object GRAVE_ACCENT240_tree=null;
+        Object ID241_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:691:2: ( ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) expression_value )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:691:4: ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) expression_value
+            {
+            root_0 = (Object)adaptor.nil();
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:691:4: ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )
+            int alt78=14;
+            switch ( input.LA(1) ) {
+            case EQUAL:
+                {
+                alt78=1;
+                }
+                break;
+            case GREATER:
+                {
+                alt78=2;
+                }
+                break;
+            case GREATER_EQUAL:
+                {
+                alt78=3;
+                }
+                break;
+            case LESS:
+                {
+                alt78=4;
+                }
+                break;
+            case LESS_EQUAL:
+                {
+                alt78=5;
+                }
+                break;
+            case NOT_EQUAL:
+                {
+                alt78=6;
+                }
+                break;
+            case ID:
+                {
+                int LA78_7 = input.LA(2);
+
+                if ( (LA78_7==ID||LA78_7==GRAVE_ACCENT) && ((validateIdentifierKey(DroolsSoftKeywords.NOT)))) {
+                    alt78=7;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.CONTAINS))) ) {
+                    alt78=8;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.EXCLUDES))) ) {
+                    alt78=9;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.MATCHES))) ) {
+                    alt78=10;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.SOUNDSLIKE))) ) {
+                    alt78=11;
+                }
+                else if ( ((validateIdentifierKey(DroolsSoftKeywords.MEMBEROF))) ) {
+                    alt78=12;
+                }
+                else if ( (true) ) {
+                    alt78=13;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("691:4: ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )", 78, 7, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case GRAVE_ACCENT:
+                {
+                alt78=14;
+                }
+                break;
+            default:
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("691:4: ( EQUAL | GREATER | GREATER_EQUAL | LESS | LESS_EQUAL | NOT_EQUAL | not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk ) | contains_key | excludes_key | matches_key | soundslike_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )", 78, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt78) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:691:5: EQUAL
+                    {
+                    EQUAL219=(Token)input.LT(1);
+                    match(input,EQUAL,FOLLOW_EQUAL_in_simple_operator3142); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    EQUAL219_tree = (Object)adaptor.create(EQUAL219);
+                    root_0 = (Object)adaptor.becomeRoot(EQUAL219_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:692:4: GREATER
+                    {
+                    GREATER220=(Token)input.LT(1);
+                    match(input,GREATER,FOLLOW_GREATER_in_simple_operator3148); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    GREATER220_tree = (Object)adaptor.create(GREATER220);
+                    root_0 = (Object)adaptor.becomeRoot(GREATER220_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:693:4: GREATER_EQUAL
+                    {
+                    GREATER_EQUAL221=(Token)input.LT(1);
+                    match(input,GREATER_EQUAL,FOLLOW_GREATER_EQUAL_in_simple_operator3154); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    GREATER_EQUAL221_tree = (Object)adaptor.create(GREATER_EQUAL221);
+                    root_0 = (Object)adaptor.becomeRoot(GREATER_EQUAL221_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:694:4: LESS
+                    {
+                    LESS222=(Token)input.LT(1);
+                    match(input,LESS,FOLLOW_LESS_in_simple_operator3160); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    LESS222_tree = (Object)adaptor.create(LESS222);
+                    root_0 = (Object)adaptor.becomeRoot(LESS222_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:695:4: LESS_EQUAL
+                    {
+                    LESS_EQUAL223=(Token)input.LT(1);
+                    match(input,LESS_EQUAL,FOLLOW_LESS_EQUAL_in_simple_operator3166); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    LESS_EQUAL223_tree = (Object)adaptor.create(LESS_EQUAL223);
+                    root_0 = (Object)adaptor.becomeRoot(LESS_EQUAL223_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:696:4: NOT_EQUAL
+                    {
+                    NOT_EQUAL224=(Token)input.LT(1);
+                    match(input,NOT_EQUAL,FOLLOW_NOT_EQUAL_in_simple_operator3172); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    NOT_EQUAL224_tree = (Object)adaptor.create(NOT_EQUAL224);
+                    root_0 = (Object)adaptor.becomeRoot(NOT_EQUAL224_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:4: not_key ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )
+                    {
+                    pushFollow(FOLLOW_not_key_in_simple_operator3178);
+                    not_key225=not_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, not_key225.getTree());
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:12: ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )
+                    int alt77=6;
+                    int LA77_0 = input.LA(1);
+
+                    if ( (LA77_0==ID) ) {
+                        int LA77_1 = input.LA(2);
+
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.CONTAINS))) ) {
+                            alt77=1;
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.SOUNDSLIKE))) ) {
+                            alt77=2;
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.MATCHES))) ) {
+                            alt77=3;
+                        }
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.MEMBEROF))) ) {
+                            alt77=4;
+                        }
+                        else if ( (true) ) {
+                            alt77=5;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("697:12: ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )", 77, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else if ( (LA77_0==GRAVE_ACCENT) ) {
+                        alt77=6;
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("697:12: ( contains_key | soundslike_key | matches_key | memberof_key | ID | GRAVE_ACCENT ID square_chunk )", 77, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt77) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:13: contains_key
+                            {
+                            pushFollow(FOLLOW_contains_key_in_simple_operator3181);
+                            contains_key226=contains_key();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(contains_key226.getTree(), root_0);
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:27: soundslike_key
+                            {
+                            pushFollow(FOLLOW_soundslike_key_in_simple_operator3184);
+                            soundslike_key227=soundslike_key();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(soundslike_key227.getTree(), root_0);
+
+                            }
+                            break;
+                        case 3 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:43: matches_key
+                            {
+                            pushFollow(FOLLOW_matches_key_in_simple_operator3187);
+                            matches_key228=matches_key();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(matches_key228.getTree(), root_0);
+
+                            }
+                            break;
+                        case 4 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:56: memberof_key
+                            {
+                            pushFollow(FOLLOW_memberof_key_in_simple_operator3190);
+                            memberof_key229=memberof_key();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(memberof_key229.getTree(), root_0);
+
+                            }
+                            break;
+                        case 5 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:71: ID
+                            {
+                            ID230=(Token)input.LT(1);
+                            match(input,ID,FOLLOW_ID_in_simple_operator3194); if (failed) return retval;
+                            if ( backtracking==0 ) {
+                            ID230_tree = (Object)adaptor.create(ID230);
+                            root_0 = (Object)adaptor.becomeRoot(ID230_tree, root_0);
+                            }
+
+                            }
+                            break;
+                        case 6 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:697:77: GRAVE_ACCENT ID square_chunk
+                            {
+                            GRAVE_ACCENT231=(Token)input.LT(1);
+                            match(input,GRAVE_ACCENT,FOLLOW_GRAVE_ACCENT_in_simple_operator3199); if (failed) return retval;
+                            ID232=(Token)input.LT(1);
+                            match(input,ID,FOLLOW_ID_in_simple_operator3202); if (failed) return retval;
+                            if ( backtracking==0 ) {
+                            ID232_tree = (Object)adaptor.create(ID232);
+                            root_0 = (Object)adaptor.becomeRoot(ID232_tree, root_0);
+                            }
+                            pushFollow(FOLLOW_square_chunk_in_simple_operator3205);
+                            square_chunk233=square_chunk();
+                            _fsp--;
+                            if (failed) return retval;
+                            if ( backtracking==0 ) adaptor.addChild(root_0, square_chunk233.getTree());
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:698:4: contains_key
+                    {
+                    pushFollow(FOLLOW_contains_key_in_simple_operator3211);
+                    contains_key234=contains_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(contains_key234.getTree(), root_0);
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:699:4: excludes_key
+                    {
+                    pushFollow(FOLLOW_excludes_key_in_simple_operator3217);
+                    excludes_key235=excludes_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(excludes_key235.getTree(), root_0);
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:700:4: matches_key
+                    {
+                    pushFollow(FOLLOW_matches_key_in_simple_operator3223);
+                    matches_key236=matches_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(matches_key236.getTree(), root_0);
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:701:4: soundslike_key
+                    {
+                    pushFollow(FOLLOW_soundslike_key_in_simple_operator3229);
+                    soundslike_key237=soundslike_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(soundslike_key237.getTree(), root_0);
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:702:4: memberof_key
+                    {
+                    pushFollow(FOLLOW_memberof_key_in_simple_operator3235);
+                    memberof_key238=memberof_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(memberof_key238.getTree(), root_0);
+
+                    }
+                    break;
+                case 13 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:703:4: ID
+                    {
+                    ID239=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_simple_operator3241); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    ID239_tree = (Object)adaptor.create(ID239);
+                    root_0 = (Object)adaptor.becomeRoot(ID239_tree, root_0);
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:704:4: GRAVE_ACCENT ID square_chunk
+                    {
+                    GRAVE_ACCENT240=(Token)input.LT(1);
+                    match(input,GRAVE_ACCENT,FOLLOW_GRAVE_ACCENT_in_simple_operator3247); if (failed) return retval;
+                    ID241=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_simple_operator3250); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    ID241_tree = (Object)adaptor.create(ID241);
+                    root_0 = (Object)adaptor.becomeRoot(ID241_tree, root_0);
+                    }
+                    pushFollow(FOLLOW_square_chunk_in_simple_operator3253);
+                    square_chunk242=square_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, square_chunk242.getTree());
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_expression_value_in_simple_operator3257);
+            expression_value243=expression_value();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, expression_value243.getTree());
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end simple_operator
+
+    public static class compound_operator_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start compound_operator
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:709:1: compound_operator : ( in_key | not_key in_key ) LEFT_PAREN expression_value ( COMMA expression_value )* RIGHT_PAREN ;
+    public final compound_operator_return compound_operator() throws RecognitionException {
+        compound_operator_return retval = new compound_operator_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN247=null;
+        Token COMMA249=null;
+        Token RIGHT_PAREN251=null;
+        in_key_return in_key244 = null;
+
+        not_key_return not_key245 = null;
+
+        in_key_return in_key246 = null;
+
+        expression_value_return expression_value248 = null;
+
+        expression_value_return expression_value250 = null;
+
+
+        Object LEFT_PAREN247_tree=null;
+        Object COMMA249_tree=null;
+        Object RIGHT_PAREN251_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:2: ( ( in_key | not_key in_key ) LEFT_PAREN expression_value ( COMMA expression_value )* RIGHT_PAREN )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:4: ( in_key | not_key in_key ) LEFT_PAREN expression_value ( COMMA expression_value )* RIGHT_PAREN
+            {
+            root_0 = (Object)adaptor.nil();
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:4: ( in_key | not_key in_key )
+            int alt79=2;
+            int LA79_0 = input.LA(1);
+
+            if ( (LA79_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IN))||(validateIdentifierKey(DroolsSoftKeywords.NOT))))) {
+                int LA79_1 = input.LA(2);
+
+                if ( (LA79_1==ID) && ((validateIdentifierKey(DroolsSoftKeywords.NOT)))) {
+                    alt79=2;
+                }
+                else if ( (LA79_1==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.IN)))) {
+                    alt79=1;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("710:4: ( in_key | not_key in_key )", 79, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("710:4: ( in_key | not_key in_key )", 79, 0, input);
+
+                throw nvae;
+            }
+            switch (alt79) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:6: in_key
+                    {
+                    pushFollow(FOLLOW_in_key_in_compound_operator3272);
+                    in_key244=in_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(in_key244.getTree(), root_0);
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:16: not_key in_key
+                    {
+                    pushFollow(FOLLOW_not_key_in_compound_operator3277);
+                    not_key245=not_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, not_key245.getTree());
+                    pushFollow(FOLLOW_in_key_in_compound_operator3279);
+                    in_key246=in_key();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) root_0 = (Object)adaptor.becomeRoot(in_key246.getTree(), root_0);
+
+                    }
+                    break;
+
+            }
+
+            LEFT_PAREN247=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_compound_operator3284); if (failed) return retval;
+            pushFollow(FOLLOW_expression_value_in_compound_operator3287);
+            expression_value248=expression_value();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) adaptor.addChild(root_0, expression_value248.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:63: ( COMMA expression_value )*
+            loop80:
+            do {
+                int alt80=2;
+                int LA80_0 = input.LA(1);
+
+                if ( (LA80_0==COMMA) ) {
+                    alt80=1;
+                }
+
+
+                switch (alt80) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:710:65: COMMA expression_value
+            	    {
+            	    COMMA249=(Token)input.LT(1);
+            	    match(input,COMMA,FOLLOW_COMMA_in_compound_operator3291); if (failed) return retval;
+            	    pushFollow(FOLLOW_expression_value_in_compound_operator3294);
+            	    expression_value250=expression_value();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, expression_value250.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop80;
+                }
+            } while (true);
+
+            RIGHT_PAREN251=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_compound_operator3299); if (failed) return retval;
+            if ( backtracking==0 ) {
+            RIGHT_PAREN251_tree = (Object)adaptor.create(RIGHT_PAREN251);
+            adaptor.addChild(root_0, RIGHT_PAREN251_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end compound_operator
+
+    public static class expression_value_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start expression_value
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:713:1: expression_value : ( accessor_path | literal_constraint | paren_chunk );
+    public final expression_value_return expression_value() throws RecognitionException {
+        expression_value_return retval = new expression_value_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        accessor_path_return accessor_path252 = null;
+
+        literal_constraint_return literal_constraint253 = null;
+
+        paren_chunk_return paren_chunk254 = null;
+
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:714:2: ( accessor_path | literal_constraint | paren_chunk )
+            int alt81=3;
+            switch ( input.LA(1) ) {
+            case ID:
+                {
+                alt81=1;
+                }
+                break;
+            case STRING:
+            case BOOL:
+            case INT:
+            case FLOAT:
+            case NULL:
+                {
+                alt81=2;
+                }
+                break;
+            case LEFT_PAREN:
+                {
+                alt81=3;
+                }
+                break;
+            default:
+                if (backtracking>0) {failed=true; return retval;}
+                NoViableAltException nvae =
+                    new NoViableAltException("713:1: expression_value : ( accessor_path | literal_constraint | paren_chunk );", 81, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt81) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:714:4: accessor_path
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_accessor_path_in_expression_value3310);
+                    accessor_path252=accessor_path();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, accessor_path252.getTree());
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:715:4: literal_constraint
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_literal_constraint_in_expression_value3315);
+                    literal_constraint253=literal_constraint();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, literal_constraint253.getTree());
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:716:4: paren_chunk
+                    {
+                    root_0 = (Object)adaptor.nil();
+
+                    pushFollow(FOLLOW_paren_chunk_in_expression_value3321);
+                    paren_chunk254=paren_chunk();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, paren_chunk254.getTree());
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end expression_value
+
+    public static class literal_constraint_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start literal_constraint
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:719:1: literal_constraint : ( STRING | INT | FLOAT | BOOL | NULL );
+    public final literal_constraint_return literal_constraint() throws RecognitionException {
+        literal_constraint_return retval = new literal_constraint_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token set255=null;
+
+        Object set255_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:720:2: ( STRING | INT | FLOAT | BOOL | NULL )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
+            {
+            root_0 = (Object)adaptor.nil();
+
+            set255=(Token)input.LT(1);
+            if ( input.LA(1)==STRING||(input.LA(1)>=BOOL && input.LA(1)<=INT)||(input.LA(1)>=FLOAT && input.LA(1)<=NULL) ) {
+                input.consume();
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set255));
+                errorRecovery=false;failed=false;
+            }
+            else {
+                if (backtracking>0) {failed=true; return retval;}
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recoverFromMismatchedSet(input,mse,FOLLOW_set_in_literal_constraint0);    throw mse;
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end literal_constraint
+
+    public static class pattern_type_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start pattern_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:727:1: pattern_type : id+= ID (id+= DOT id+= ID )* ( dimension_definition )* -> ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* ) ;
+    public final pattern_type_return pattern_type() throws RecognitionException {
+        pattern_type_return retval = new pattern_type_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+        List list_id=null;
+        dimension_definition_return dimension_definition256 = null;
+
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+        RewriteRuleSubtreeStream stream_dimension_definition=new RewriteRuleSubtreeStream(adaptor,"rule dimension_definition");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:728:2: (id+= ID (id+= DOT id+= ID )* ( dimension_definition )* -> ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:728:4: id+= ID (id+= DOT id+= ID )* ( dimension_definition )*
+            {
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_pattern_type3365); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+            if (list_id==null) list_id=new ArrayList();
+            list_id.add(id);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:728:11: (id+= DOT id+= ID )*
+            loop82:
+            do {
+                int alt82=2;
+                int LA82_0 = input.LA(1);
+
+                if ( (LA82_0==DOT) ) {
+                    alt82=1;
+                }
+
+
+                switch (alt82) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:728:13: id+= DOT id+= ID
+            	    {
+            	    id=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_pattern_type3371); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_DOT.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+            	    id=(Token)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_pattern_type3375); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_ID.add(id);
+
+            	    if (list_id==null) list_id=new ArrayList();
+            	    list_id.add(id);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop82;
+                }
+            } while (true);
+
+            if ( backtracking==0 ) {
+              	setParaphrasesValue(DroolsParaphareseTypes.PATTERN, buildStringFromTokens(list_id));	
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:730:6: ( dimension_definition )*
+            loop83:
+            do {
+                int alt83=2;
+                int LA83_0 = input.LA(1);
+
+                if ( (LA83_0==LEFT_SQUARE) ) {
+                    alt83=1;
+                }
+
+
+                switch (alt83) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:730:6: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_pattern_type3390);
+            	    dimension_definition256=dimension_definition();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_dimension_definition.add(dimension_definition256.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop83;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: ID, dimension_definition
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 731:3: -> ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:731:6: ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_PATTERN_TYPE, "VT_PATTERN_TYPE"), root_1);
+
+                if ( !(stream_ID.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_ID.hasNext() ) {
+                    adaptor.addChild(root_1, stream_ID.next());
+
+                }
+                stream_ID.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:731:28: ( dimension_definition )*
+                while ( stream_dimension_definition.hasNext() ) {
+                    adaptor.addChild(root_1, stream_dimension_definition.next());
+
+                }
+                stream_dimension_definition.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end pattern_type
+
+    public static class data_type_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start data_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:734:1: data_type : ID ( DOT ID )* ( dimension_definition )* -> ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* ) ;
+    public final data_type_return data_type() throws RecognitionException {
+        data_type_return retval = new data_type_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID257=null;
+        Token DOT258=null;
+        Token ID259=null;
+        dimension_definition_return dimension_definition260 = null;
+
+
+        Object ID257_tree=null;
+        Object DOT258_tree=null;
+        Object ID259_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+        RewriteRuleSubtreeStream stream_dimension_definition=new RewriteRuleSubtreeStream(adaptor,"rule dimension_definition");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:2: ( ID ( DOT ID )* ( dimension_definition )* -> ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:4: ID ( DOT ID )* ( dimension_definition )*
+            {
+            ID257=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_data_type3416); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID257);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:7: ( DOT ID )*
+            loop84:
+            do {
+                int alt84=2;
+                int LA84_0 = input.LA(1);
+
+                if ( (LA84_0==DOT) ) {
+                    alt84=1;
+                }
+
+
+                switch (alt84) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:9: DOT ID
+            	    {
+            	    DOT258=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_data_type3420); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_DOT.add(DOT258);
+
+            	    ID259=(Token)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_data_type3422); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_ID.add(ID259);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop84;
+                }
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:19: ( dimension_definition )*
+            loop85:
+            do {
+                int alt85=2;
+                int LA85_0 = input.LA(1);
+
+                if ( (LA85_0==LEFT_SQUARE) ) {
+                    alt85=1;
+                }
+
+
+                switch (alt85) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:735:19: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_data_type3427);
+            	    dimension_definition260=dimension_definition();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_dimension_definition.add(dimension_definition260.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop85;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: ID, dimension_definition
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 736:3: -> ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:736:6: ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_DATA_TYPE, "VT_DATA_TYPE"), root_1);
+
+                if ( !(stream_ID.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_ID.hasNext() ) {
+                    adaptor.addChild(root_1, stream_ID.next());
+
+                }
+                stream_ID.reset();
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:736:25: ( dimension_definition )*
+                while ( stream_dimension_definition.hasNext() ) {
+                    adaptor.addChild(root_1, stream_dimension_definition.next());
+
+                }
+                stream_dimension_definition.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end data_type
+
+    public static class dimension_definition_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start dimension_definition
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:739:1: dimension_definition : LEFT_SQUARE RIGHT_SQUARE ;
+    public final dimension_definition_return dimension_definition() throws RecognitionException {
+        dimension_definition_return retval = new dimension_definition_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_SQUARE261=null;
+        Token RIGHT_SQUARE262=null;
+
+        Object LEFT_SQUARE261_tree=null;
+        Object RIGHT_SQUARE262_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:740:2: ( LEFT_SQUARE RIGHT_SQUARE )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:740:4: LEFT_SQUARE RIGHT_SQUARE
+            {
+            root_0 = (Object)adaptor.nil();
+
+            LEFT_SQUARE261=(Token)input.LT(1);
+            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_dimension_definition3453); if (failed) return retval;
+            if ( backtracking==0 ) {
+            LEFT_SQUARE261_tree = (Object)adaptor.create(LEFT_SQUARE261);
+            adaptor.addChild(root_0, LEFT_SQUARE261_tree);
+            }
+            RIGHT_SQUARE262=(Token)input.LT(1);
+            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_dimension_definition3455); if (failed) return retval;
+            if ( backtracking==0 ) {
+            RIGHT_SQUARE262_tree = (Object)adaptor.create(RIGHT_SQUARE262);
+            adaptor.addChild(root_0, RIGHT_SQUARE262_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end dimension_definition
+
+    public static class accessor_path_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accessor_path
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:743:1: accessor_path : accessor_element ( DOT accessor_element )* -> ^( VT_ACCESSOR_PATH ( accessor_element )+ ) ;
+    public final accessor_path_return accessor_path() throws RecognitionException {
+        accessor_path_return retval = new accessor_path_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token DOT264=null;
+        accessor_element_return accessor_element263 = null;
+
+        accessor_element_return accessor_element265 = null;
+
+
+        Object DOT264_tree=null;
+        RewriteRuleTokenStream stream_DOT=new RewriteRuleTokenStream(adaptor,"token DOT");
+        RewriteRuleSubtreeStream stream_accessor_element=new RewriteRuleSubtreeStream(adaptor,"rule accessor_element");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:744:2: ( accessor_element ( DOT accessor_element )* -> ^( VT_ACCESSOR_PATH ( accessor_element )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:744:4: accessor_element ( DOT accessor_element )*
+            {
+            pushFollow(FOLLOW_accessor_element_in_accessor_path3466);
+            accessor_element263=accessor_element();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_accessor_element.add(accessor_element263.getTree());
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:744:21: ( DOT accessor_element )*
+            loop86:
+            do {
+                int alt86=2;
+                int LA86_0 = input.LA(1);
+
+                if ( (LA86_0==DOT) ) {
+                    alt86=1;
+                }
+
+
+                switch (alt86) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:744:23: DOT accessor_element
+            	    {
+            	    DOT264=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_accessor_path3470); if (failed) return retval;
+            	    if ( backtracking==0 ) stream_DOT.add(DOT264);
+
+            	    pushFollow(FOLLOW_accessor_element_in_accessor_path3472);
+            	    accessor_element265=accessor_element();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_accessor_element.add(accessor_element265.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop86;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: accessor_element
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 745:2: -> ^( VT_ACCESSOR_PATH ( accessor_element )+ )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:745:5: ^( VT_ACCESSOR_PATH ( accessor_element )+ )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_ACCESSOR_PATH, "VT_ACCESSOR_PATH"), root_1);
+
+                if ( !(stream_accessor_element.hasNext()) ) {
+                    throw new RewriteEarlyExitException();
+                }
+                while ( stream_accessor_element.hasNext() ) {
+                    adaptor.addChild(root_1, stream_accessor_element.next());
+
+                }
+                stream_accessor_element.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accessor_path
+
+    public static class accessor_element_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accessor_element
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:748:1: accessor_element : ID ( square_chunk )* -> ^( VT_ACCESSOR_ELEMENT ID ( square_chunk )* ) ;
+    public final accessor_element_return accessor_element() throws RecognitionException {
+        accessor_element_return retval = new accessor_element_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID266=null;
+        square_chunk_return square_chunk267 = null;
+
+
+        Object ID266_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+        RewriteRuleSubtreeStream stream_square_chunk=new RewriteRuleSubtreeStream(adaptor,"rule square_chunk");
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:749:2: ( ID ( square_chunk )* -> ^( VT_ACCESSOR_ELEMENT ID ( square_chunk )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:749:4: ID ( square_chunk )*
+            {
+            ID266=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_accessor_element3496); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID266);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:749:7: ( square_chunk )*
+            loop87:
+            do {
+                int alt87=2;
+                int LA87_0 = input.LA(1);
+
+                if ( (LA87_0==LEFT_SQUARE) ) {
+                    alt87=1;
+                }
+
+
+                switch (alt87) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:749:7: square_chunk
+            	    {
+            	    pushFollow(FOLLOW_square_chunk_in_accessor_element3498);
+            	    square_chunk267=square_chunk();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) stream_square_chunk.add(square_chunk267.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop87;
+                }
+            } while (true);
+
+
+            // AST REWRITE
+            // elements: square_chunk, ID
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 750:2: -> ^( VT_ACCESSOR_ELEMENT ID ( square_chunk )* )
+            {
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:750:5: ^( VT_ACCESSOR_ELEMENT ID ( square_chunk )* )
+                {
+                Object root_1 = (Object)adaptor.nil();
+                root_1 = (Object)adaptor.becomeRoot(adaptor.create(VT_ACCESSOR_ELEMENT, "VT_ACCESSOR_ELEMENT"), root_1);
+
+                adaptor.addChild(root_1, stream_ID.next());
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:750:30: ( square_chunk )*
+                while ( stream_square_chunk.hasNext() ) {
+                    adaptor.addChild(root_1, stream_square_chunk.next());
+
+                }
+                stream_square_chunk.reset();
+
+                adaptor.addChild(root_0, root_1);
+                }
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accessor_element
+
+    public static class rhs_chunk_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rhs_chunk
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:753:1: rhs_chunk : rc= rhs_chunk_data -> VT_RHS_CHUNK[$rc.start,text] ;
+    public final rhs_chunk_return rhs_chunk() throws RecognitionException {
+        rhs_chunk_return retval = new rhs_chunk_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        rhs_chunk_data_return rc = null;
+
+
+        RewriteRuleSubtreeStream stream_rhs_chunk_data=new RewriteRuleSubtreeStream(adaptor,"rule rhs_chunk_data");
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:756:3: (rc= rhs_chunk_data -> VT_RHS_CHUNK[$rc.start,text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:756:5: rc= rhs_chunk_data
+            {
+            pushFollow(FOLLOW_rhs_chunk_data_in_rhs_chunk3527);
+            rc=rhs_chunk_data();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_rhs_chunk_data.add(rc.getTree());
+            if ( backtracking==0 ) {
+              text = input.toString(rc.start,rc.stop);
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 757:2: -> VT_RHS_CHUNK[$rc.start,text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_RHS_CHUNK, ((Token)rc.start), text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rhs_chunk
+
+    public static class rhs_chunk_data_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rhs_chunk_data
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:760:1: rhs_chunk_data : THEN (~ END )* END ( SEMICOLON )? ;
+    public final rhs_chunk_data_return rhs_chunk_data() throws RecognitionException {
+        rhs_chunk_data_return retval = new rhs_chunk_data_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token THEN268=null;
+        Token set269=null;
+        Token END270=null;
+        Token SEMICOLON271=null;
+
+        Object THEN268_tree=null;
+        Object set269_tree=null;
+        Object END270_tree=null;
+        Object SEMICOLON271_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:2: ( THEN (~ END )* END ( SEMICOLON )? )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:4: THEN (~ END )* END ( SEMICOLON )?
+            {
+            root_0 = (Object)adaptor.nil();
+
+            THEN268=(Token)input.LT(1);
+            match(input,THEN,FOLLOW_THEN_in_rhs_chunk_data3546); if (failed) return retval;
+            if ( backtracking==0 ) {
+            THEN268_tree = (Object)adaptor.create(THEN268);
+            adaptor.addChild(root_0, THEN268_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:9: (~ END )*
+            loop88:
+            do {
+                int alt88=2;
+                int LA88_0 = input.LA(1);
+
+                if ( ((LA88_0>=VT_COMPILATION_UNIT && LA88_0<=DOT_STAR)||(LA88_0>=STRING && LA88_0<=MULTI_LINE_COMMENT)) ) {
+                    alt88=1;
+                }
+
+
+                switch (alt88) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:11: ~ END
+            	    {
+            	    set269=(Token)input.LT(1);
+            	    if ( (input.LA(1)>=VT_COMPILATION_UNIT && input.LA(1)<=DOT_STAR)||(input.LA(1)>=STRING && input.LA(1)<=MULTI_LINE_COMMENT) ) {
+            	        input.consume();
+            	        if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set269));
+            	        errorRecovery=false;failed=false;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return retval;}
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_rhs_chunk_data3550);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop88;
+                }
+            } while (true);
+
+            END270=(Token)input.LT(1);
+            match(input,END,FOLLOW_END_in_rhs_chunk_data3556); if (failed) return retval;
+            if ( backtracking==0 ) {
+            END270_tree = (Object)adaptor.create(END270);
+            adaptor.addChild(root_0, END270_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:23: ( SEMICOLON )?
+            int alt89=2;
+            int LA89_0 = input.LA(1);
+
+            if ( (LA89_0==SEMICOLON) ) {
+                alt89=1;
+            }
+            switch (alt89) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:761:23: SEMICOLON
+                    {
+                    SEMICOLON271=(Token)input.LT(1);
+                    match(input,SEMICOLON,FOLLOW_SEMICOLON_in_rhs_chunk_data3558); if (failed) return retval;
+                    if ( backtracking==0 ) {
+                    SEMICOLON271_tree = (Object)adaptor.create(SEMICOLON271);
+                    adaptor.addChild(root_0, SEMICOLON271_tree);
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rhs_chunk_data
+
+    public static class curly_chunk_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start curly_chunk
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:764:1: curly_chunk : cc= curly_chunk_data -> VT_CURLY_CHUNK[$cc.start,text] ;
+    public final curly_chunk_return curly_chunk() throws RecognitionException {
+        curly_chunk_return retval = new curly_chunk_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        curly_chunk_data_return cc = null;
+
+
+        RewriteRuleSubtreeStream stream_curly_chunk_data=new RewriteRuleSubtreeStream(adaptor,"rule curly_chunk_data");
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:767:3: (cc= curly_chunk_data -> VT_CURLY_CHUNK[$cc.start,text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:767:5: cc= curly_chunk_data
+            {
+            pushFollow(FOLLOW_curly_chunk_data_in_curly_chunk3575);
+            cc=curly_chunk_data();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_curly_chunk_data.add(cc.getTree());
+            if ( backtracking==0 ) {
+              text = input.toString(cc.start,cc.stop);
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 768:2: -> VT_CURLY_CHUNK[$cc.start,text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_CURLY_CHUNK, ((Token)cc.start), text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end curly_chunk
+
+    public static class curly_chunk_data_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start curly_chunk_data
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:771:1: curly_chunk_data : LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data )* RIGHT_CURLY ;
+    public final curly_chunk_data_return curly_chunk_data() throws RecognitionException {
+        curly_chunk_data_return retval = new curly_chunk_data_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_CURLY272=null;
+        Token set273=null;
+        Token RIGHT_CURLY275=null;
+        curly_chunk_data_return curly_chunk_data274 = null;
+
+
+        Object LEFT_CURLY272_tree=null;
+        Object set273_tree=null;
+        Object RIGHT_CURLY275_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:2: ( LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data )* RIGHT_CURLY )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:4: LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data )* RIGHT_CURLY
+            {
+            root_0 = (Object)adaptor.nil();
+
+            LEFT_CURLY272=(Token)input.LT(1);
+            match(input,LEFT_CURLY,FOLLOW_LEFT_CURLY_in_curly_chunk_data3594); if (failed) return retval;
+            if ( backtracking==0 ) {
+            LEFT_CURLY272_tree = (Object)adaptor.create(LEFT_CURLY272);
+            adaptor.addChild(root_0, LEFT_CURLY272_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:15: (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data )*
+            loop90:
+            do {
+                int alt90=3;
+                int LA90_0 = input.LA(1);
+
+                if ( ((LA90_0>=VT_COMPILATION_UNIT && LA90_0<=THEN)||(LA90_0>=MISC && LA90_0<=MULTI_LINE_COMMENT)) ) {
+                    alt90=1;
+                }
+                else if ( (LA90_0==LEFT_CURLY) ) {
+                    alt90=2;
+                }
+
+
+                switch (alt90) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:16: ~ ( LEFT_CURLY | RIGHT_CURLY )
+            	    {
+            	    set273=(Token)input.LT(1);
+            	    if ( (input.LA(1)>=VT_COMPILATION_UNIT && input.LA(1)<=THEN)||(input.LA(1)>=MISC && input.LA(1)<=MULTI_LINE_COMMENT) ) {
+            	        input.consume();
+            	        if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set273));
+            	        errorRecovery=false;failed=false;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return retval;}
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_curly_chunk_data3597);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:772:49: curly_chunk_data
+            	    {
+            	    pushFollow(FOLLOW_curly_chunk_data_in_curly_chunk_data3611);
+            	    curly_chunk_data274=curly_chunk_data();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, curly_chunk_data274.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop90;
+                }
+            } while (true);
+
+            RIGHT_CURLY275=(Token)input.LT(1);
+            match(input,RIGHT_CURLY,FOLLOW_RIGHT_CURLY_in_curly_chunk_data3616); if (failed) return retval;
+            if ( backtracking==0 ) {
+            RIGHT_CURLY275_tree = (Object)adaptor.create(RIGHT_CURLY275);
+            adaptor.addChild(root_0, RIGHT_CURLY275_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end curly_chunk_data
+
+    public static class paren_chunk_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start paren_chunk
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:775:1: paren_chunk : pc= paren_chunk_data -> VT_PAREN_CHUNK[$pc.start,text] ;
+    public final paren_chunk_return paren_chunk() throws RecognitionException {
+        paren_chunk_return retval = new paren_chunk_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        paren_chunk_data_return pc = null;
+
+
+        RewriteRuleSubtreeStream stream_paren_chunk_data=new RewriteRuleSubtreeStream(adaptor,"rule paren_chunk_data");
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:778:3: (pc= paren_chunk_data -> VT_PAREN_CHUNK[$pc.start,text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:778:5: pc= paren_chunk_data
+            {
+            pushFollow(FOLLOW_paren_chunk_data_in_paren_chunk3632);
+            pc=paren_chunk_data();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_paren_chunk_data.add(pc.getTree());
+            if ( backtracking==0 ) {
+              text = input.toString(pc.start,pc.stop);
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 779:2: -> VT_PAREN_CHUNK[$pc.start,text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_PAREN_CHUNK, ((Token)pc.start), text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end paren_chunk
+
+    public static class paren_chunk_data_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start paren_chunk_data
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:782:1: paren_chunk_data : LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data )* RIGHT_PAREN ;
+    public final paren_chunk_data_return paren_chunk_data() throws RecognitionException {
+        paren_chunk_data_return retval = new paren_chunk_data_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_PAREN276=null;
+        Token set277=null;
+        Token RIGHT_PAREN279=null;
+        paren_chunk_data_return paren_chunk_data278 = null;
+
+
+        Object LEFT_PAREN276_tree=null;
+        Object set277_tree=null;
+        Object RIGHT_PAREN279_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:2: ( LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data )* RIGHT_PAREN )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:4: LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data )* RIGHT_PAREN
+            {
+            root_0 = (Object)adaptor.nil();
+
+            LEFT_PAREN276=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_paren_chunk_data3652); if (failed) return retval;
+            if ( backtracking==0 ) {
+            LEFT_PAREN276_tree = (Object)adaptor.create(LEFT_PAREN276);
+            adaptor.addChild(root_0, LEFT_PAREN276_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:15: (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data )*
+            loop91:
+            do {
+                int alt91=3;
+                int LA91_0 = input.LA(1);
+
+                if ( ((LA91_0>=VT_COMPILATION_UNIT && LA91_0<=STRING)||LA91_0==COMMA||(LA91_0>=COLON && LA91_0<=MULTI_LINE_COMMENT)) ) {
+                    alt91=1;
+                }
+                else if ( (LA91_0==LEFT_PAREN) ) {
+                    alt91=2;
+                }
+
+
+                switch (alt91) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:16: ~ ( LEFT_PAREN | RIGHT_PAREN )
+            	    {
+            	    set277=(Token)input.LT(1);
+            	    if ( (input.LA(1)>=VT_COMPILATION_UNIT && input.LA(1)<=STRING)||input.LA(1)==COMMA||(input.LA(1)>=COLON && input.LA(1)<=MULTI_LINE_COMMENT) ) {
+            	        input.consume();
+            	        if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set277));
+            	        errorRecovery=false;failed=false;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return retval;}
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_paren_chunk_data3655);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:783:49: paren_chunk_data
+            	    {
+            	    pushFollow(FOLLOW_paren_chunk_data_in_paren_chunk_data3669);
+            	    paren_chunk_data278=paren_chunk_data();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, paren_chunk_data278.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop91;
+                }
+            } while (true);
+
+            RIGHT_PAREN279=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_paren_chunk_data3674); if (failed) return retval;
+            if ( backtracking==0 ) {
+            RIGHT_PAREN279_tree = (Object)adaptor.create(RIGHT_PAREN279);
+            adaptor.addChild(root_0, RIGHT_PAREN279_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end paren_chunk_data
+
+    public static class square_chunk_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start square_chunk
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:786:1: square_chunk : sc= square_chunk_data -> VT_SQUARE_CHUNK[$sc.start,text] ;
+    public final square_chunk_return square_chunk() throws RecognitionException {
+        square_chunk_return retval = new square_chunk_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        square_chunk_data_return sc = null;
+
+
+        RewriteRuleSubtreeStream stream_square_chunk_data=new RewriteRuleSubtreeStream(adaptor,"rule square_chunk_data");
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:789:3: (sc= square_chunk_data -> VT_SQUARE_CHUNK[$sc.start,text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:789:5: sc= square_chunk_data
+            {
+            pushFollow(FOLLOW_square_chunk_data_in_square_chunk3691);
+            sc=square_chunk_data();
+            _fsp--;
+            if (failed) return retval;
+            if ( backtracking==0 ) stream_square_chunk_data.add(sc.getTree());
+            if ( backtracking==0 ) {
+              text = input.toString(sc.start,sc.stop);
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 790:2: -> VT_SQUARE_CHUNK[$sc.start,text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VT_SQUARE_CHUNK, ((Token)sc.start), text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end square_chunk
+
+    public static class square_chunk_data_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start square_chunk_data
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:793:1: square_chunk_data : LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data )* RIGHT_SQUARE ;
+    public final square_chunk_data_return square_chunk_data() throws RecognitionException {
+        square_chunk_data_return retval = new square_chunk_data_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token LEFT_SQUARE280=null;
+        Token set281=null;
+        Token RIGHT_SQUARE283=null;
+        square_chunk_data_return square_chunk_data282 = null;
+
+
+        Object LEFT_SQUARE280_tree=null;
+        Object set281_tree=null;
+        Object RIGHT_SQUARE283_tree=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:794:2: ( LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data )* RIGHT_SQUARE )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:794:4: LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data )* RIGHT_SQUARE
+            {
+            root_0 = (Object)adaptor.nil();
+
+            LEFT_SQUARE280=(Token)input.LT(1);
+            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_square_chunk_data3710); if (failed) return retval;
+            if ( backtracking==0 ) {
+            LEFT_SQUARE280_tree = (Object)adaptor.create(LEFT_SQUARE280);
+            adaptor.addChild(root_0, LEFT_SQUARE280_tree);
+            }
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:794:16: (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data )*
+            loop92:
+            do {
+                int alt92=3;
+                int LA92_0 = input.LA(1);
+
+                if ( ((LA92_0>=VT_COMPILATION_UNIT && LA92_0<=NULL)||(LA92_0>=THEN && LA92_0<=MULTI_LINE_COMMENT)) ) {
+                    alt92=1;
+                }
+                else if ( (LA92_0==LEFT_SQUARE) ) {
+                    alt92=2;
+                }
+
+
+                switch (alt92) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:794:17: ~ ( LEFT_SQUARE | RIGHT_SQUARE )
+            	    {
+            	    set281=(Token)input.LT(1);
+            	    if ( (input.LA(1)>=VT_COMPILATION_UNIT && input.LA(1)<=NULL)||(input.LA(1)>=THEN && input.LA(1)<=MULTI_LINE_COMMENT) ) {
+            	        input.consume();
+            	        if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set281));
+            	        errorRecovery=false;failed=false;
+            	    }
+            	    else {
+            	        if (backtracking>0) {failed=true; return retval;}
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_square_chunk_data3713);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:794:52: square_chunk_data
+            	    {
+            	    pushFollow(FOLLOW_square_chunk_data_in_square_chunk_data3727);
+            	    square_chunk_data282=square_chunk_data();
+            	    _fsp--;
+            	    if (failed) return retval;
+            	    if ( backtracking==0 ) adaptor.addChild(root_0, square_chunk_data282.getTree());
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop92;
+                }
+            } while (true);
+
+            RIGHT_SQUARE283=(Token)input.LT(1);
+            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_square_chunk_data3732); if (failed) return retval;
+            if ( backtracking==0 ) {
+            RIGHT_SQUARE283_tree = (Object)adaptor.create(RIGHT_SQUARE283);
+            adaptor.addChild(root_0, RIGHT_SQUARE283_tree);
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end square_chunk_data
+
+    public static class date_effective_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start date_effective_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:798:1: date_effective_key : {...}? => ID MISC ID -> VK_DATE_EFFECTIVE[$start, text] ;
+    public final date_effective_key_return date_effective_key() throws RecognitionException {
+        date_effective_key_return retval = new date_effective_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID284=null;
+        Token MISC285=null;
+        Token ID286=null;
+
+        Object ID284_tree=null;
+        Object MISC285_tree=null;
+        Object ID286_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:801:3: ({...}? => ID MISC ID -> VK_DATE_EFFECTIVE[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:801:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "date_effective_key", "(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))");
+            }
+            ID284=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_date_effective_key3751); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID284);
+
+            MISC285=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_date_effective_key3753); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC285);
+
+            ID286=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_date_effective_key3755); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID286);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 802:2: -> VK_DATE_EFFECTIVE[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_DATE_EFFECTIVE, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end date_effective_key
+
+    public static class date_expires_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start date_expires_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:805:1: date_expires_key : {...}? => ID MISC ID -> VK_DATE_EXPIRES[$start, text] ;
+    public final date_expires_key_return date_expires_key() throws RecognitionException {
+        date_expires_key_return retval = new date_expires_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID287=null;
+        Token MISC288=null;
+        Token ID289=null;
+
+        Object ID287_tree=null;
+        Object MISC288_tree=null;
+        Object ID289_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:808:3: ({...}? => ID MISC ID -> VK_DATE_EXPIRES[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:808:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "date_expires_key", "(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.EXPIRES))");
+            }
+            ID287=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_date_expires_key3781); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID287);
+
+            MISC288=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_date_expires_key3783); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC288);
+
+            ID289=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_date_expires_key3785); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID289);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 809:2: -> VK_DATE_EXPIRES[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_DATE_EXPIRES, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end date_expires_key
+
+    public static class lock_on_active_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start lock_on_active_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:812:1: lock_on_active_key : {...}? => ID MISC ID MISC ID -> VK_LOCK_ON_ACTIVE[$start, text] ;
+    public final lock_on_active_key_return lock_on_active_key() throws RecognitionException {
+        lock_on_active_key_return retval = new lock_on_active_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID290=null;
+        Token MISC291=null;
+        Token ID292=null;
+        Token MISC293=null;
+        Token ID294=null;
+
+        Object ID290_tree=null;
+        Object MISC291_tree=null;
+        Object ID292_tree=null;
+        Object MISC293_tree=null;
+        Object ID294_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:815:3: ({...}? => ID MISC ID MISC ID -> VK_LOCK_ON_ACTIVE[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:815:5: {...}? => ID MISC ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "lock_on_active_key", "(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, \"-\") && validateLT(5, DroolsSoftKeywords.ACTIVE))");
+            }
+            ID290=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_lock_on_active_key3811); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID290);
+
+            MISC291=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_lock_on_active_key3813); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC291);
+
+            ID292=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_lock_on_active_key3815); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID292);
+
+            MISC293=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_lock_on_active_key3817); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC293);
+
+            ID294=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_lock_on_active_key3819); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID294);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 816:2: -> VK_LOCK_ON_ACTIVE[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_LOCK_ON_ACTIVE, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lock_on_active_key
+
+    public static class no_loop_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start no_loop_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:1: no_loop_key : {...}? => ID MISC ID -> VK_NO_LOOP[$start, text] ;
+    public final no_loop_key_return no_loop_key() throws RecognitionException {
+        no_loop_key_return retval = new no_loop_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID295=null;
+        Token MISC296=null;
+        Token ID297=null;
+
+        Object ID295_tree=null;
+        Object MISC296_tree=null;
+        Object ID297_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:822:3: ({...}? => ID MISC ID -> VK_NO_LOOP[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:822:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "no_loop_key", "(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.LOOP))");
+            }
+            ID295=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_no_loop_key3845); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID295);
+
+            MISC296=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_no_loop_key3847); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC296);
+
+            ID297=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_no_loop_key3849); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID297);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 823:2: -> VK_NO_LOOP[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_NO_LOOP, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end no_loop_key
+
+    public static class auto_focus_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start auto_focus_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:826:1: auto_focus_key : {...}? => ID MISC ID -> VK_AUTO_FOCUS[$start, text] ;
+    public final auto_focus_key_return auto_focus_key() throws RecognitionException {
+        auto_focus_key_return retval = new auto_focus_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID298=null;
+        Token MISC299=null;
+        Token ID300=null;
+
+        Object ID298_tree=null;
+        Object MISC299_tree=null;
+        Object ID300_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:829:3: ({...}? => ID MISC ID -> VK_AUTO_FOCUS[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:829:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "auto_focus_key", "(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.FOCUS))");
+            }
+            ID298=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_auto_focus_key3875); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID298);
+
+            MISC299=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_auto_focus_key3877); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC299);
+
+            ID300=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_auto_focus_key3879); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID300);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 830:2: -> VK_AUTO_FOCUS[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_AUTO_FOCUS, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end auto_focus_key
+
+    public static class activation_group_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start activation_group_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:833:1: activation_group_key : {...}? => ID MISC ID -> VK_ACTIVATION_GROUP[$start, text] ;
+    public final activation_group_key_return activation_group_key() throws RecognitionException {
+        activation_group_key_return retval = new activation_group_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID301=null;
+        Token MISC302=null;
+        Token ID303=null;
+
+        Object ID301_tree=null;
+        Object MISC302_tree=null;
+        Object ID303_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:836:3: ({...}? => ID MISC ID -> VK_ACTIVATION_GROUP[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:836:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "activation_group_key", "(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.GROUP))");
+            }
+            ID301=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_activation_group_key3905); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID301);
+
+            MISC302=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_activation_group_key3907); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC302);
+
+            ID303=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_activation_group_key3909); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID303);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 837:2: -> VK_ACTIVATION_GROUP[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ACTIVATION_GROUP, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end activation_group_key
+
+    public static class agenda_group_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start agenda_group_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:840:1: agenda_group_key : {...}? => ID MISC ID -> VK_AGENDA_GROUP[$start, text] ;
+    public final agenda_group_key_return agenda_group_key() throws RecognitionException {
+        agenda_group_key_return retval = new agenda_group_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID304=null;
+        Token MISC305=null;
+        Token ID306=null;
+
+        Object ID304_tree=null;
+        Object MISC305_tree=null;
+        Object ID306_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:3: ({...}? => ID MISC ID -> VK_AGENDA_GROUP[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "agenda_group_key", "(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.GROUP))");
+            }
+            ID304=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_agenda_group_key3935); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID304);
+
+            MISC305=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_agenda_group_key3937); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC305);
+
+            ID306=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_agenda_group_key3939); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID306);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 844:2: -> VK_AGENDA_GROUP[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_AGENDA_GROUP, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end agenda_group_key
+
+    public static class ruleflow_group_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start ruleflow_group_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:847:1: ruleflow_group_key : {...}? => ID MISC ID -> VK_RULEFLOW_GROUP[$start, text] ;
+    public final ruleflow_group_key_return ruleflow_group_key() throws RecognitionException {
+        ruleflow_group_key_return retval = new ruleflow_group_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID307=null;
+        Token MISC308=null;
+        Token ID309=null;
+
+        Object ID307_tree=null;
+        Object MISC308_tree=null;
+        Object ID309_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:850:3: ({...}? => ID MISC ID -> VK_RULEFLOW_GROUP[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:850:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "ruleflow_group_key", "(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.GROUP))");
+            }
+            ID307=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_ruleflow_group_key3965); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID307);
+
+            MISC308=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_ruleflow_group_key3967); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC308);
+
+            ID309=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_ruleflow_group_key3969); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID309);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 851:2: -> VK_RULEFLOW_GROUP[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_RULEFLOW_GROUP, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end ruleflow_group_key
+
+    public static class duration_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start duration_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:854:1: duration_key : {...}? =>id= ID -> VK_DURATION[$id] ;
+    public final duration_key_return duration_key() throws RecognitionException {
+        duration_key_return retval = new duration_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:855:2: ({...}? =>id= ID -> VK_DURATION[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:855:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.DURATION))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "duration_key", "(validateIdentifierKey(DroolsSoftKeywords.DURATION))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_duration_key3994); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 855:69: -> VK_DURATION[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_DURATION, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end duration_key
+
+    public static class package_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start package_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:858:1: package_key : {...}? =>id= ID -> VK_PACKAGE[$id] ;
+    public final package_key_return package_key() throws RecognitionException {
+        package_key_return retval = new package_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:859:2: ({...}? =>id= ID -> VK_PACKAGE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:859:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.PACKAGE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "package_key", "(validateIdentifierKey(DroolsSoftKeywords.PACKAGE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_package_key4016); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 859:68: -> VK_PACKAGE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_PACKAGE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end package_key
+
+    public static class import_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start import_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:862:1: import_key : {...}? =>id= ID -> VK_IMPORT[$id] ;
+    public final import_key_return import_key() throws RecognitionException {
+        import_key_return retval = new import_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:863:2: ({...}? =>id= ID -> VK_IMPORT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:863:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "import_key", "(validateIdentifierKey(DroolsSoftKeywords.IMPORT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_import_key4038); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 863:67: -> VK_IMPORT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_IMPORT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end import_key
+
+    public static class dialect_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start dialect_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:866:1: dialect_key : {...}? =>id= ID -> VK_DIALECT[$id] ;
+    public final dialect_key_return dialect_key() throws RecognitionException {
+        dialect_key_return retval = new dialect_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:867:2: ({...}? =>id= ID -> VK_DIALECT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:867:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "dialect_key", "(validateIdentifierKey(DroolsSoftKeywords.DIALECT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_dialect_key4060); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 867:68: -> VK_DIALECT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_DIALECT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end dialect_key
+
+    public static class salience_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start salience_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:870:1: salience_key : {...}? =>id= ID -> VK_SALIENCE[$id] ;
+    public final salience_key_return salience_key() throws RecognitionException {
+        salience_key_return retval = new salience_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:871:2: ({...}? =>id= ID -> VK_SALIENCE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:871:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "salience_key", "(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_salience_key4082); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 871:69: -> VK_SALIENCE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_SALIENCE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end salience_key
+
+    public static class enabled_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start enabled_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:874:1: enabled_key : {...}? =>id= ID -> VK_ENABLED[$id] ;
+    public final enabled_key_return enabled_key() throws RecognitionException {
+        enabled_key_return retval = new enabled_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:875:2: ({...}? =>id= ID -> VK_ENABLED[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:875:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ENABLED))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "enabled_key", "(validateIdentifierKey(DroolsSoftKeywords.ENABLED))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_enabled_key4104); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 875:68: -> VK_ENABLED[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ENABLED, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end enabled_key
+
+    public static class attributes_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start attributes_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:878:1: attributes_key : {...}? =>id= ID -> VK_ATTRIBUTES[$id] ;
+    public final attributes_key_return attributes_key() throws RecognitionException {
+        attributes_key_return retval = new attributes_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:879:2: ({...}? =>id= ID -> VK_ATTRIBUTES[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:879:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "attributes_key", "(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_attributes_key4126); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 879:71: -> VK_ATTRIBUTES[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ATTRIBUTES, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end attributes_key
+
+    public static class when_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start when_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:882:1: when_key : {...}? =>id= ID -> VK_WHEN[$id] ;
+    public final when_key_return when_key() throws RecognitionException {
+        when_key_return retval = new when_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:883:2: ({...}? =>id= ID -> VK_WHEN[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:883:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "when_key", "(validateIdentifierKey(DroolsSoftKeywords.WHEN))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_when_key4148); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 883:65: -> VK_WHEN[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_WHEN, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end when_key
+
+    public static class rule_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start rule_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:886:1: rule_key : {...}? =>id= ID -> VK_RULE[$id] ;
+    public final rule_key_return rule_key() throws RecognitionException {
+        rule_key_return retval = new rule_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:887:2: ({...}? =>id= ID -> VK_RULE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:887:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "rule_key", "(validateIdentifierKey(DroolsSoftKeywords.RULE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_rule_key4170); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 887:65: -> VK_RULE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_RULE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule_key
+
+    public static class template_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start template_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:890:1: template_key : {...}? =>id= ID -> VK_TEMPLATE[$id] ;
+    public final template_key_return template_key() throws RecognitionException {
+        template_key_return retval = new template_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:891:2: ({...}? =>id= ID -> VK_TEMPLATE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:891:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "template_key", "(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_template_key4192); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 891:69: -> VK_TEMPLATE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_TEMPLATE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end template_key
+
+    public static class query_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start query_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:894:1: query_key : {...}? =>id= ID -> VK_QUERY[$id] ;
+    public final query_key_return query_key() throws RecognitionException {
+        query_key_return retval = new query_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:895:2: ({...}? =>id= ID -> VK_QUERY[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:895:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "query_key", "(validateIdentifierKey(DroolsSoftKeywords.QUERY))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_query_key4214); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 895:66: -> VK_QUERY[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_QUERY, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end query_key
+
+    public static class declare_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start declare_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:898:1: declare_key : {...}? =>id= ID -> VK_DECLARE[$id] ;
+    public final declare_key_return declare_key() throws RecognitionException {
+        declare_key_return retval = new declare_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:899:2: ({...}? =>id= ID -> VK_DECLARE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:899:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.DECLARE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "declare_key", "(validateIdentifierKey(DroolsSoftKeywords.DECLARE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_declare_key4236); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 899:68: -> VK_DECLARE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_DECLARE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end declare_key
+
+    public static class function_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start function_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:902:1: function_key : {...}? =>id= ID -> VK_FUNCTION[$id] ;
+    public final function_key_return function_key() throws RecognitionException {
+        function_key_return retval = new function_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:903:2: ({...}? =>id= ID -> VK_FUNCTION[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:903:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.FUNCTION))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "function_key", "(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_function_key4258); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 903:69: -> VK_FUNCTION[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_FUNCTION, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end function_key
+
+    public static class global_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start global_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:906:1: global_key : {...}? =>id= ID -> VK_GLOBAL[$id] ;
+    public final global_key_return global_key() throws RecognitionException {
+        global_key_return retval = new global_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:907:2: ({...}? =>id= ID -> VK_GLOBAL[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:907:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "global_key", "(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_global_key4280); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 907:67: -> VK_GLOBAL[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_GLOBAL, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end global_key
+
+    public static class eval_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start eval_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:910:1: eval_key : {...}? =>id= ID -> VK_EVAL[$id] ;
+    public final eval_key_return eval_key() throws RecognitionException {
+        eval_key_return retval = new eval_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:911:2: ({...}? =>id= ID -> VK_EVAL[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:911:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.EVAL))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "eval_key", "(validateIdentifierKey(DroolsSoftKeywords.EVAL))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_eval_key4302); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 911:65: -> VK_EVAL[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_EVAL, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end eval_key
+
+    public static class contains_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start contains_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:914:1: contains_key : {...}? =>id= ID -> VK_CONTAINS[$id] ;
+    public final contains_key_return contains_key() throws RecognitionException {
+        contains_key_return retval = new contains_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:915:2: ({...}? =>id= ID -> VK_CONTAINS[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:915:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.CONTAINS))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "contains_key", "(validateIdentifierKey(DroolsSoftKeywords.CONTAINS))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_contains_key4324); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 915:69: -> VK_CONTAINS[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_CONTAINS, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end contains_key
+
+    public static class matches_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start matches_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:918:1: matches_key : {...}? =>id= ID -> VK_MATCHES[$id] ;
+    public final matches_key_return matches_key() throws RecognitionException {
+        matches_key_return retval = new matches_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:919:2: ({...}? =>id= ID -> VK_MATCHES[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:919:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.MATCHES))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "matches_key", "(validateIdentifierKey(DroolsSoftKeywords.MATCHES))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_matches_key4346); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 919:68: -> VK_MATCHES[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_MATCHES, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end matches_key
+
+    public static class excludes_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start excludes_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:922:1: excludes_key : {...}? =>id= ID -> VK_EXCLUDES[$id] ;
+    public final excludes_key_return excludes_key() throws RecognitionException {
+        excludes_key_return retval = new excludes_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:923:2: ({...}? =>id= ID -> VK_EXCLUDES[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:923:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.EXCLUDES))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "excludes_key", "(validateIdentifierKey(DroolsSoftKeywords.EXCLUDES))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_excludes_key4368); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 923:69: -> VK_EXCLUDES[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_EXCLUDES, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end excludes_key
+
+    public static class soundslike_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start soundslike_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:926:1: soundslike_key : {...}? =>id= ID -> VK_SOUNDSLIKE[$id] ;
+    public final soundslike_key_return soundslike_key() throws RecognitionException {
+        soundslike_key_return retval = new soundslike_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:927:2: ({...}? =>id= ID -> VK_SOUNDSLIKE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:927:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.SOUNDSLIKE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "soundslike_key", "(validateIdentifierKey(DroolsSoftKeywords.SOUNDSLIKE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_soundslike_key4390); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 927:71: -> VK_SOUNDSLIKE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_SOUNDSLIKE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end soundslike_key
+
+    public static class memberof_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start memberof_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:930:1: memberof_key : {...}? =>id= ID -> VK_MEMBEROF[$id] ;
+    public final memberof_key_return memberof_key() throws RecognitionException {
+        memberof_key_return retval = new memberof_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:931:2: ({...}? =>id= ID -> VK_MEMBEROF[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:931:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.MEMBEROF))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "memberof_key", "(validateIdentifierKey(DroolsSoftKeywords.MEMBEROF))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_memberof_key4412); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 931:69: -> VK_MEMBEROF[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_MEMBEROF, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end memberof_key
+
+    public static class not_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start not_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:934:1: not_key : {...}? =>id= ID -> VK_NOT[$id] ;
+    public final not_key_return not_key() throws RecognitionException {
+        not_key_return retval = new not_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:935:2: ({...}? =>id= ID -> VK_NOT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:935:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.NOT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "not_key", "(validateIdentifierKey(DroolsSoftKeywords.NOT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_not_key4434); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 935:64: -> VK_NOT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_NOT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end not_key
+
+    public static class in_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start in_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:938:1: in_key : {...}? =>id= ID -> VK_IN[$id] ;
+    public final in_key_return in_key() throws RecognitionException {
+        in_key_return retval = new in_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:939:2: ({...}? =>id= ID -> VK_IN[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:939:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.IN))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "in_key", "(validateIdentifierKey(DroolsSoftKeywords.IN))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_in_key4456); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 939:63: -> VK_IN[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_IN, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end in_key
+
+    public static class or_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start or_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:942:1: or_key : {...}? =>id= ID -> VK_OR[$id] ;
+    public final or_key_return or_key() throws RecognitionException {
+        or_key_return retval = new or_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:943:2: ({...}? =>id= ID -> VK_OR[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:943:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.OR))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "or_key", "(validateIdentifierKey(DroolsSoftKeywords.OR))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_or_key4478); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 943:63: -> VK_OR[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_OR, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end or_key
+
+    public static class and_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start and_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:946:1: and_key : {...}? =>id= ID -> VK_AND[$id] ;
+    public final and_key_return and_key() throws RecognitionException {
+        and_key_return retval = new and_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:947:2: ({...}? =>id= ID -> VK_AND[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:947:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.AND))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "and_key", "(validateIdentifierKey(DroolsSoftKeywords.AND))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_and_key4500); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 947:64: -> VK_AND[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_AND, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end and_key
+
+    public static class exists_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start exists_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:950:1: exists_key : {...}? =>id= ID -> VK_EXISTS[$id] ;
+    public final exists_key_return exists_key() throws RecognitionException {
+        exists_key_return retval = new exists_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:951:2: ({...}? =>id= ID -> VK_EXISTS[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:951:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.EXISTS))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "exists_key", "(validateIdentifierKey(DroolsSoftKeywords.EXISTS))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_exists_key4522); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 951:67: -> VK_EXISTS[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_EXISTS, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end exists_key
+
+    public static class forall_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start forall_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:954:1: forall_key : {...}? =>id= ID -> VK_FORALL[$id] ;
+    public final forall_key_return forall_key() throws RecognitionException {
+        forall_key_return retval = new forall_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:955:2: ({...}? =>id= ID -> VK_FORALL[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:955:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.FORALL))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "forall_key", "(validateIdentifierKey(DroolsSoftKeywords.FORALL))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_forall_key4544); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 955:67: -> VK_FORALL[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_FORALL, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end forall_key
+
+    public static class from_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start from_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:958:1: from_key : {...}? =>id= ID -> VK_FROM[$id] ;
+    public final from_key_return from_key() throws RecognitionException {
+        from_key_return retval = new from_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:959:2: ({...}? =>id= ID -> VK_FROM[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:959:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.FROM))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "from_key", "(validateIdentifierKey(DroolsSoftKeywords.FROM))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_from_key4566); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 959:65: -> VK_FROM[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_FROM, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end from_key
+
+    public static class entry_point_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start entry_point_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:962:1: entry_point_key : {...}? => ID MISC ID -> VK_ENTRY_POINT[$start, text] ;
+    public final entry_point_key_return entry_point_key() throws RecognitionException {
+        entry_point_key_return retval = new entry_point_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token ID310=null;
+        Token MISC311=null;
+        Token ID312=null;
+
+        Object ID310_tree=null;
+        Object MISC311_tree=null;
+        Object ID312_tree=null;
+        RewriteRuleTokenStream stream_MISC=new RewriteRuleTokenStream(adaptor,"token MISC");
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+
+        	String text = "";
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:965:3: ({...}? => ID MISC ID -> VK_ENTRY_POINT[$start, text] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:965:5: {...}? => ID MISC ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ENTRY) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.POINT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "entry_point_key", "(validateIdentifierKey(DroolsSoftKeywords.ENTRY) && validateLT(2, \"-\") && validateLT(3, DroolsSoftKeywords.POINT))");
+            }
+            ID310=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_entry_point_key4589); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID310);
+
+            MISC311=(Token)input.LT(1);
+            match(input,MISC,FOLLOW_MISC_in_entry_point_key4591); if (failed) return retval;
+            if ( backtracking==0 ) stream_MISC.add(MISC311);
+
+            ID312=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_entry_point_key4593); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(ID312);
+
+            if ( backtracking==0 ) {
+              text = input.toString(retval.start,input.LT(-1));
+            }
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 966:2: -> VK_ENTRY_POINT[$start, text]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ENTRY_POINT, ((Token)retval.start),  text));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end entry_point_key
+
+    public static class accumulate_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start accumulate_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:969:1: accumulate_key : {...}? =>id= ID -> VK_ACCUMULATE[$id] ;
+    public final accumulate_key_return accumulate_key() throws RecognitionException {
+        accumulate_key_return retval = new accumulate_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:970:2: ({...}? =>id= ID -> VK_ACCUMULATE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:970:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "accumulate_key", "(validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_accumulate_key4618); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 970:71: -> VK_ACCUMULATE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ACCUMULATE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_key
+
+    public static class init_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start init_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:973:1: init_key : {...}? =>id= ID -> VK_INIT[$id] ;
+    public final init_key_return init_key() throws RecognitionException {
+        init_key_return retval = new init_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:974:2: ({...}? =>id= ID -> VK_INIT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:974:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.INIT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "init_key", "(validateIdentifierKey(DroolsSoftKeywords.INIT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_init_key4640); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 974:65: -> VK_INIT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_INIT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end init_key
+
+    public static class action_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start action_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:977:1: action_key : {...}? =>id= ID -> VK_ACTION[$id] ;
+    public final action_key_return action_key() throws RecognitionException {
+        action_key_return retval = new action_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:978:2: ({...}? =>id= ID -> VK_ACTION[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:978:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.ACTION))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "action_key", "(validateIdentifierKey(DroolsSoftKeywords.ACTION))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_action_key4662); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 978:67: -> VK_ACTION[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_ACTION, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end action_key
+
+    public static class reverse_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start reverse_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:981:1: reverse_key : {...}? =>id= ID -> VK_REVERSE[$id] ;
+    public final reverse_key_return reverse_key() throws RecognitionException {
+        reverse_key_return retval = new reverse_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:982:2: ({...}? =>id= ID -> VK_REVERSE[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:982:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.REVERSE))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "reverse_key", "(validateIdentifierKey(DroolsSoftKeywords.REVERSE))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_reverse_key4684); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 982:68: -> VK_REVERSE[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_REVERSE, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end reverse_key
+
+    public static class result_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start result_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:985:1: result_key : {...}? =>id= ID -> VK_RESULT[$id] ;
+    public final result_key_return result_key() throws RecognitionException {
+        result_key_return retval = new result_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:986:2: ({...}? =>id= ID -> VK_RESULT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:986:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.RESULT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "result_key", "(validateIdentifierKey(DroolsSoftKeywords.RESULT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_result_key4706); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 986:67: -> VK_RESULT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_RESULT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end result_key
+
+    public static class collect_key_return extends ParserRuleReturnScope {
+        Object tree;
+        public Object getTree() { return tree; }
+    };
+
+    // $ANTLR start collect_key
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:989:1: collect_key : {...}? =>id= ID -> VK_COLLECT[$id] ;
+    public final collect_key_return collect_key() throws RecognitionException {
+        collect_key_return retval = new collect_key_return();
+        retval.start = input.LT(1);
+
+        Object root_0 = null;
+
+        Token id=null;
+
+        Object id_tree=null;
+        RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:990:2: ({...}? =>id= ID -> VK_COLLECT[$id] )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:990:4: {...}? =>id= ID
+            {
+            if ( !((validateIdentifierKey(DroolsSoftKeywords.COLLECT))) ) {
+                if (backtracking>0) {failed=true; return retval;}
+                throw new FailedPredicateException(input, "collect_key", "(validateIdentifierKey(DroolsSoftKeywords.COLLECT))");
+            }
+            id=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_collect_key4728); if (failed) return retval;
+            if ( backtracking==0 ) stream_ID.add(id);
+
+
+            // AST REWRITE
+            // elements: 
+            // token labels: 
+            // rule labels: retval
+            // token list labels: 
+            // rule list labels: 
+            if ( backtracking==0 ) {
+            retval.tree = root_0;
+            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+            root_0 = (Object)adaptor.nil();
+            // 990:68: -> VK_COLLECT[$id]
+            {
+                adaptor.addChild(root_0, adaptor.create(VK_COLLECT, id));
+
+            }
+
+            }
+
+            }
+
+            retval.stop = input.LT(-1);
+
+            if ( backtracking==0 ) {
+                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
+                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end collect_key
+
+    // $ANTLR start synpred1
+    public final void synpred1_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:5: ( LEFT_PAREN or_key )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:482:6: LEFT_PAREN or_key
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred11638); if (failed) return ;
+        pushFollow(FOLLOW_or_key_in_synpred11640);
+        or_key();
+        _fsp--;
+        if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1
+
+    // $ANTLR start synpred2
+    public final void synpred2_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:5: ( or_key | DOUBLE_PIPE )
+        int alt93=2;
+        int LA93_0 = input.LA(1);
+
+        if ( (LA93_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.OR)))) {
+            alt93=1;
+        }
+        else if ( (LA93_0==DOUBLE_PIPE) ) {
+            alt93=2;
+        }
+        else {
+            if (backtracking>0) {failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("485:5: synpred2 : ( or_key | DOUBLE_PIPE );", 93, 0, input);
+
+            throw nvae;
+        }
+        switch (alt93) {
+            case 1 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:6: or_key
+                {
+                pushFollow(FOLLOW_or_key_in_synpred21687);
+                or_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+            case 2 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:485:13: DOUBLE_PIPE
+                {
+                match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_synpred21689); if (failed) return ;
+
+                }
+                break;
+
+        }}
+    // $ANTLR end synpred2
+
+    // $ANTLR start synpred3
+    public final void synpred3_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:5: ( LEFT_PAREN and_key )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:6: LEFT_PAREN and_key
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred31740); if (failed) return ;
+        pushFollow(FOLLOW_and_key_in_synpred31742);
+        and_key();
+        _fsp--;
+        if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred3
+
+    // $ANTLR start synpred4
+    public final void synpred4_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:5: ( and_key | DOUBLE_AMPER )
+        int alt94=2;
+        int LA94_0 = input.LA(1);
+
+        if ( (LA94_0==ID) && ((validateIdentifierKey(DroolsSoftKeywords.AND)))) {
+            alt94=1;
+        }
+        else if ( (LA94_0==DOUBLE_AMPER) ) {
+            alt94=2;
+        }
+        else {
+            if (backtracking>0) {failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("495:5: synpred4 : ( and_key | DOUBLE_AMPER );", 94, 0, input);
+
+            throw nvae;
+        }
+        switch (alt94) {
+            case 1 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:6: and_key
+                {
+                pushFollow(FOLLOW_and_key_in_synpred41789);
+                and_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+            case 2 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:14: DOUBLE_AMPER
+                {
+                match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_synpred41791); if (failed) return ;
+
+                }
+                break;
+
+        }}
+    // $ANTLR end synpred4
+
+    // $ANTLR start synpred5
+    public final void synpred5_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:4: ( SEMICOLON )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:5: SEMICOLON
+        {
+        match(input,SEMICOLON,FOLLOW_SEMICOLON_in_synpred51893); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred5
+
+    // $ANTLR start synpred6
+    public final void synpred6_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:12: ( LEFT_PAREN ( or_key | and_key ) )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:13: LEFT_PAREN ( or_key | and_key )
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred61925); if (failed) return ;
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:24: ( or_key | and_key )
+        int alt95=2;
+        int LA95_0 = input.LA(1);
+
+        if ( (LA95_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+            int LA95_1 = input.LA(2);
+
+            if ( ((validateIdentifierKey(DroolsSoftKeywords.OR))) ) {
+                alt95=1;
+            }
+            else if ( ((validateIdentifierKey(DroolsSoftKeywords.AND))) ) {
+                alt95=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("513:24: ( or_key | and_key )", 95, 1, input);
+
+                throw nvae;
+            }
+        }
+        else {
+            if (backtracking>0) {failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("513:24: ( or_key | and_key )", 95, 0, input);
+
+            throw nvae;
+        }
+        switch (alt95) {
+            case 1 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:25: or_key
+                {
+                pushFollow(FOLLOW_or_key_in_synpred61928);
+                or_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+            case 2 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:32: and_key
+                {
+                pushFollow(FOLLOW_and_key_in_synpred61930);
+                and_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred6
+
+    // $ANTLR start synpred7
+    public final void synpred7_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:5: ( LEFT_PAREN ( or_key | and_key ) )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:6: LEFT_PAREN ( or_key | and_key )
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred72012); if (failed) return ;
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:17: ( or_key | and_key )
+        int alt96=2;
+        int LA96_0 = input.LA(1);
+
+        if ( (LA96_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.AND))||(validateIdentifierKey(DroolsSoftKeywords.OR))))) {
+            int LA96_1 = input.LA(2);
+
+            if ( ((validateIdentifierKey(DroolsSoftKeywords.OR))) ) {
+                alt96=1;
+            }
+            else if ( ((validateIdentifierKey(DroolsSoftKeywords.AND))) ) {
+                alt96=2;
+            }
+            else {
+                if (backtracking>0) {failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("521:17: ( or_key | and_key )", 96, 1, input);
+
+                throw nvae;
+            }
+        }
+        else {
+            if (backtracking>0) {failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("521:17: ( or_key | and_key )", 96, 0, input);
+
+            throw nvae;
+        }
+        switch (alt96) {
+            case 1 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:18: or_key
+                {
+                pushFollow(FOLLOW_or_key_in_synpred72015);
+                or_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+            case 2 :
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:521:25: and_key
+                {
+                pushFollow(FOLLOW_and_key_in_synpred72017);
+                and_key();
+                _fsp--;
+                if (failed) return ;
+
+                }
+                break;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred7
+
+    // $ANTLR start synpred8
+    public final void synpred8_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:594:5: ( LEFT_PAREN )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:594:6: LEFT_PAREN
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred82513); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred8
+
+    // $ANTLR start synpred9
+    public final void synpred9_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:603:6: ( LEFT_SQUARE )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:603:8: LEFT_SQUARE
+        {
+        match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_synpred92574); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred9
+
+    // $ANTLR start synpred10
+    public final void synpred10_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:605:6: ( LEFT_PAREN )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:605:8: LEFT_PAREN
+        {
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred102596); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred10
+
+    // $ANTLR start synpred11
+    public final void synpred11_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:26: ( DOUBLE_PIPE )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:675:27: DOUBLE_PIPE
+        {
+        match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_synpred113060); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred11
+
+    // $ANTLR start synpred12
+    public final void synpred12_fragment() throws RecognitionException {   
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:27: ( DOUBLE_AMPER )
+        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DRL.g:679:28: DOUBLE_AMPER
+        {
+        match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_synpred123086); if (failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred12
+
+    public final boolean synpred12() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred12_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred4() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred4_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred9() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred9_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred7() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred7_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred2() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred2_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred3() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred3_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred1() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred11() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred11_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred5() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred5_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred6() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred6_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred8() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred8_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+    public final boolean synpred10() {
+        backtracking++;
+        int start = input.mark();
+        try {
+            synpred10_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !failed;
+        input.rewind(start);
+        backtracking--;
+        failed=false;
+        return success;
+    }
+
+
+    protected DFA5 dfa5 = new DFA5(this);
+    protected DFA12 dfa12 = new DFA12(this);
+    protected DFA17 dfa17 = new DFA17(this);
+    protected DFA24 dfa24 = new DFA24(this);
+    protected DFA30 dfa30 = new DFA30(this);
+    protected DFA47 dfa47 = new DFA47(this);
+    protected DFA48 dfa48 = new DFA48(this);
+    protected DFA53 dfa53 = new DFA53(this);
+    protected DFA57 dfa57 = new DFA57(this);
+    protected DFA74 dfa74 = new DFA74(this);
+    protected DFA75 dfa75 = new DFA75(this);
+    static final String DFA5_eotS =
+        "\u0085\uffff";
+    static final String DFA5_eofS =
+        "\3\uffff\1\17\1\22\11\uffff\1\17\10\uffff\1\17\5\uffff\1\17\2\uffff"+
+        "\1\17\5\uffff\1\22\1\uffff\1\22\5\uffff\1\17\5\uffff\2\107\1\uffff"+
+        "\1\22\5\uffff\2\17\2\uffff\1\17\2\uffff\1\17\4\uffff\2\22\3\uffff"+
+        "\1\22\1\uffff\1\22\5\uffff\2\17\1\uffff\1\17\2\22\5\uffff\1\17\1"+
+        "\uffff\2\17\4\uffff\1\22\1\uffff\2\22\3\uffff\1\17\4\uffff\1\22"+
+        "\1\uffff\1\17\5\uffff\1\22\7\uffff";
+    static final String DFA5_minS =
+        "\2\126\1\uffff\2\125\3\uffff\2\126\2\uffff\1\126\1\156\1\126\1\uffff"+
+        "\1\126\2\uffff\5\126\2\0\1\126\1\156\1\0\1\126\2\uffff\1\125\3\126"+
+        "\2\0\1\126\1\0\1\126\1\156\1\126\1\0\1\126\1\uffff\1\126\2\0\3\126"+
+        "\2\125\1\0\11\126\1\0\1\126\2\0\1\126\1\0\1\4\1\uffff\4\126\2\0"+
+        "\1\126\1\0\1\126\1\134\1\126\1\156\1\134\1\156\2\126\1\4\3\126\1"+
+        "\156\2\126\1\156\5\126\4\4\4\126\1\134\1\156\1\134\1\126\4\4\3\126"+
+        "\5\4\1\126\7\4";
+    static final String DFA5_maxS =
+        "\1\126\1\162\1\uffff\2\157\3\uffff\1\135\1\162\2\uffff\1\126\1\156"+
+        "\1\126\1\uffff\1\162\2\uffff\1\155\1\160\1\126\2\157\2\0\1\126\1"+
+        "\156\1\0\1\157\2\uffff\2\155\1\162\1\126\2\0\1\157\1\0\1\157\1\156"+
+        "\1\126\1\0\1\126\1\uffff\1\162\2\0\1\162\2\155\1\162\1\133\1\0\2"+
+        "\162\3\155\1\126\2\157\1\126\1\0\1\157\2\0\1\157\1\0\1\173\1\uffff"+
+        "\1\126\2\157\1\126\2\0\1\157\1\0\1\157\1\155\1\126\1\156\1\155\1"+
+        "\156\1\157\1\162\1\173\1\160\1\157\1\162\1\156\2\155\1\156\1\155"+
+        "\1\157\1\126\2\157\4\173\1\157\1\126\2\157\1\155\1\156\1\155\1\157"+
+        "\4\173\1\157\1\155\1\157\5\173\1\157\7\173";
+    static final String DFA5_acceptS =
+        "\2\uffff\1\1\2\uffff\3\1\2\uffff\1\10\1\7\3\uffff\1\3\1\uffff\1"+
+        "\6\1\1\13\uffff\1\2\1\4\15\uffff\1\5\31\uffff\1\4\75\uffff";
+    static final String DFA5_specialS =
+        "\1\14\1\62\1\uffff\1\130\1\103\3\uffff\1\34\1\127\2\uffff\1\163"+
+        "\1\154\1\5\1\uffff\1\107\2\uffff\1\122\1\104\1\24\1\121\1\46\1\111"+
+        "\1\13\1\37\1\33\1\162\1\74\2\uffff\1\1\1\141\1\132\1\76\1\40\1\112"+
+        "\1\144\1\102\1\32\1\136\1\115\1\26\1\10\1\uffff\1\2\1\52\1\145\1"+
+        "\156\1\43\1\41\1\65\1\42\1\150\1\143\1\56\1\161\1\60\1\16\1\55\1"+
+        "\75\1\7\1\25\1\151\1\11\1\146\1\64\1\110\1\157\1\167\1\uffff\1\153"+
+        "\1\22\1\47\1\77\1\17\1\44\1\6\1\133\1\106\1\15\1\66\1\61\1\147\1"+
+        "\67\1\114\1\12\1\53\1\72\1\120\1\142\1\30\1\117\1\63\1\31\1\23\1"+
+        "\131\1\54\1\0\1\51\1\101\1\36\1\71\1\4\1\134\1\152\1\113\1\57\1"+
+        "\45\1\27\1\35\1\50\1\135\1\73\1\140\1\126\1\165\1\164\1\160\1\70"+
+        "\1\100\1\166\1\125\1\116\1\105\1\137\1\155\1\124\1\21\1\123\1\3"+
+        "\1\20}>";
+    static final String[] DFA5_transitionS = {
+            "\1\1",
+            "\1\3\3\uffff\1\4\1\7\3\uffff\1\6\1\5\21\uffff\1\2",
+            "",
+            "\1\16\1\11\1\14\1\17\1\12\1\uffff\1\10\21\uffff\1\15\1\uffff"+
+            "\1\13",
+            "\1\21\1\20\2\uffff\1\12\1\uffff\1\12\23\uffff\1\13",
+            "",
+            "",
+            "",
+            "\1\23\4\uffff\1\12\1\uffff\1\24",
+            "\1\31\1\32\2\uffff\1\34\1\30\2\uffff\1\26\1\35\1\27\14\uffff"+
+            "\1\33\1\uffff\1\13\2\uffff\1\25",
+            "",
+            "",
+            "\1\40",
+            "\1\41",
+            "\1\42",
+            "",
+            "\1\44\1\32\2\uffff\1\45\1\47\2\uffff\1\26\1\50\1\46\14\uffff"+
+            "\1\33\1\uffff\1\13\2\uffff\1\43",
+            "",
+            "",
+            "\1\53\1\54\3\uffff\1\12\1\52\1\24\1\12\16\uffff\1\51",
+            "\1\12\2\uffff\1\12\1\uffff\1\12\24\uffff\1\55",
+            "\1\56",
+            "\1\57\4\uffff\1\60\23\uffff\1\13",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\62",
+            "\1\63",
+            "\1\uffff",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "",
+            "",
+            "\1\17\1\64\1\14\1\17\24\uffff\1\15",
+            "\1\65\26\uffff\1\15",
+            "\1\66\1\21\2\uffff\2\17\3\uffff\2\17\14\uffff\1\21\4\uffff\1"+
+            "\17",
+            "\1\67",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\uffff",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\71",
+            "\1\72",
+            "\1\uffff",
+            "\1\73",
+            "",
+            "\1\61\3\uffff\1\76\1\uffff\1\13\2\uffff\1\75\17\uffff\1\13\2"+
+            "\uffff\1\74",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\100\3\uffff\1\103\1\102\2\uffff\1\13\1\104\1\101\16\uffff"+
+            "\1\13\2\uffff\1\77",
+            "\1\21\1\32\3\uffff\1\12\21\uffff\1\33",
+            "\1\21\4\uffff\1\12\21\uffff\1\33",
+            "\1\107\1\105\3\uffff\1\17\1\106\3\uffff\2\17\21\uffff\1\17",
+            "\2\107\4\uffff\1\55",
+            "\1\uffff",
+            "\1\70\3\uffff\1\111\1\uffff\1\13\2\uffff\1\112\17\uffff\1\13"+
+            "\2\uffff\1\110",
+            "\1\114\3\uffff\1\115\1\117\2\uffff\1\13\1\120\1\116\16\uffff"+
+            "\1\13\2\uffff\1\113",
+            "\1\121\4\uffff\1\12\1\52\1\24\17\uffff\1\51",
+            "\1\124\1\122\4\uffff\1\52\1\24\17\uffff\1\123",
+            "\1\121\1\54\3\uffff\1\12\21\uffff\1\125",
+            "\1\126",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\127",
+            "\1\uffff",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\uffff",
+            "\122\17\1\130\6\17\1\131\36\17",
+            "",
+            "\1\132",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\133",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\uffff",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\52\1\24\17\uffff\1\134",
+            "\1\135",
+            "\1\136",
+            "\1\52\1\24\17\uffff\1\137",
+            "\1\140",
+            "\1\61\5\uffff\1\13\2\uffff\1\141\17\uffff\1\13",
+            "\1\61\3\uffff\1\144\1\uffff\1\13\2\uffff\1\143\17\uffff\1\13"+
+            "\2\uffff\1\142",
+            "\122\17\1\150\1\147\4\17\1\146\1\131\17\17\1\145\16\17",
+            "\1\17\31\uffff\1\55",
+            "\1\70\5\uffff\1\13\2\uffff\1\151\17\uffff\1\13",
+            "\1\70\3\uffff\1\153\1\uffff\1\13\2\uffff\1\154\17\uffff\1\13"+
+            "\2\uffff\1\152",
+            "\1\155",
+            "\1\124\1\122\25\uffff\1\156",
+            "\1\124\5\uffff\1\52\1\24\17\uffff\1\123",
+            "\1\157",
+            "\1\121\4\uffff\1\12\21\uffff\1\125",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\160",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\152\17\1\161\15\17",
+            "\122\17\1\162\45\17",
+            "\122\17\1\163\45\17",
+            "\130\17\1\146\1\131\17\17\1\164\16\17",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\165",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\1\52\1\24\17\uffff\1\134",
+            "\1\166",
+            "\1\52\1\24\17\uffff\1\137",
+            "\1\61\5\uffff\1\13\2\uffff\1\167\17\uffff\1\13",
+            "\122\17\1\150\5\17\1\146\1\131\17\17\1\145\16\17",
+            "\122\17\1\172\1\170\4\17\1\146\1\131\17\17\1\171\16\17",
+            "\122\17\1\150\1\147\25\17\1\173\16\17",
+            "\152\17\1\174\15\17",
+            "\1\70\5\uffff\1\13\2\uffff\1\175\17\uffff\1\13",
+            "\1\124\26\uffff\1\156",
+            "\1\61\5\uffff\1\13\22\uffff\1\13",
+            "\122\17\1\176\45\17",
+            "\152\17\1\177\15\17",
+            "\130\17\1\146\1\131\17\17\1\u0080\16\17",
+            "\152\17\1\u0081\15\17",
+            "\130\17\1\146\1\131\17\17\1\164\16\17",
+            "\1\70\5\uffff\1\13\22\uffff\1\13",
+            "\122\17\1\172\1\170\25\17\1\u0082\16\17",
+            "\122\17\1\172\5\17\1\146\1\131\17\17\1\171\16\17",
+            "\152\17\1\u0083\15\17",
+            "\122\17\1\150\26\17\1\173\16\17",
+            "\152\17\1\u0084\15\17",
+            "\130\17\1\146\1\131\17\17\1\u0080\16\17",
+            "\122\17\1\172\26\17\1\u0082\16\17"
+    };
+
+    static final short[] DFA5_eot = DFA.unpackEncodedString(DFA5_eotS);
+    static final short[] DFA5_eof = DFA.unpackEncodedString(DFA5_eofS);
+    static final char[] DFA5_min = DFA.unpackEncodedStringToUnsignedChars(DFA5_minS);
+    static final char[] DFA5_max = DFA.unpackEncodedStringToUnsignedChars(DFA5_maxS);
+    static final short[] DFA5_accept = DFA.unpackEncodedString(DFA5_acceptS);
+    static final short[] DFA5_special = DFA.unpackEncodedString(DFA5_specialS);
+    static final short[][] DFA5_transition;
+
+    static {
+        int numStates = DFA5_transitionS.length;
+        DFA5_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA5_transition[i] = DFA.unpackEncodedString(DFA5_transitionS[i]);
+        }
+    }
+
+    class DFA5 extends DFA {
+
+        public DFA5(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 5;
+            this.eot = DFA5_eot;
+            this.eof = DFA5_eof;
+            this.min = DFA5_min;
+            this.max = DFA5_max;
+            this.accept = DFA5_accept;
+            this.special = DFA5_special;
+            this.transition = DFA5_transition;
+        }
+        public String getDescription() {
+            return "267:1: statement : ( rule_attribute | {...}? => function_import_statement | import_statement | global | function | template | rule | query );";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA5_99 = input.LA(1);
+
+                         
+                        int index5_99 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_99==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_99==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_99==COMMA||LA5_99==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_99);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA5_32 = input.LA(1);
+
+                         
+                        int index5_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_32==EOF||LA5_32==SEMICOLON||LA5_32==DOT_STAR) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_32==ID) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 52;}
+
+                        else if ( (LA5_32==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 12;}
+
+                        else if ( (LA5_32==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 13;}
+
+                         
+                        input.seek(index5_32);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA5_46 = input.LA(1);
+
+                         
+                        int index5_46 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_46==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 60;}
+
+                        else if ( (LA5_46==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 61;}
+
+                        else if ( (LA5_46==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_46==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_46==COMMA||LA5_46==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_46==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 62;}
+
+                         
+                        input.seek(index5_46);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA5_131 = input.LA(1);
+
+                         
+                        int index5_131 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_131==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_131==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( ((LA5_131>=VT_COMPILATION_UNIT && LA5_131<=LEFT_PAREN)||(LA5_131>=COLON && LA5_131<=NULL)||(LA5_131>=RIGHT_SQUARE && LA5_131<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_131==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 128;}
+
+                         
+                        input.seek(index5_131);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA5_104 = input.LA(1);
+
+                         
+                        int index5_104 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_104==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 116;}
+
+                        else if ( (LA5_104==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( (LA5_104==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( ((LA5_104>=VT_COMPILATION_UNIT && LA5_104<=LEFT_PAREN)||(LA5_104>=COLON && LA5_104<=NULL)||(LA5_104>=RIGHT_SQUARE && LA5_104<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_104);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA5_14 = input.LA(1);
+
+                         
+                        int index5_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_14==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 34;}
+
+                        else if ( (LA5_14==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA5_78 = input.LA(1);
+
+                         
+                        int index5_78 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_78==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_78==COMMA||LA5_78==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_78==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_78);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA5_62 = input.LA(1);
+
+                         
+                        int index5_62 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_62==COMMA||LA5_62==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_62==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_62==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_62);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA5_44 = input.LA(1);
+
+                         
+                        int index5_44 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_44==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 59;}
+
+                         
+                        input.seek(index5_44);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA5_65 = input.LA(1);
+
+                         
+                        int index5_65 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_65==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_65==COMMA||LA5_65==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_65==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_65);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA5_87 = input.LA(1);
+
+                         
+                        int index5_87 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_87==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 98;}
+
+                        else if ( (LA5_87==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 99;}
+
+                        else if ( (LA5_87==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_87==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_87==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 100;}
+
+                        else if ( (LA5_87==COMMA||LA5_87==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_87);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA5_25 = input.LA(1);
+
+                         
+                        int index5_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))) ) {s = 17;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA5_0 = input.LA(1);
+
+                         
+                        int index5_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPOR!
 T)))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))||(validateIdentifierKey(Drool!
 sSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftK
eywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))))) {s = 1;}
+
+                         
+                        input.seek(index5_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA5_81 = input.LA(1);
+
+                         
+                        int index5_81 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_81==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 92;}
+
+                        else if ( (LA5_81==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                        else if ( (LA5_81==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                         
+                        input.seek(index5_81);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA5_59 = input.LA(1);
+
+                         
+                        int index5_59 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_59==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 85;}
+
+                        else if ( (LA5_59==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 81;}
+
+                        else if ( (LA5_59==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 44;}
+
+                        else if ( (LA5_59==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                         
+                        input.seek(index5_59);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA5_76 = input.LA(1);
+
+                         
+                        int index5_76 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_76);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 16 : 
+                        int LA5_132 = input.LA(1);
+
+                         
+                        int index5_132 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_132==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 122;}
+
+                        else if ( (LA5_132==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 130;}
+
+                        else if ( ((LA5_132>=VT_COMPILATION_UNIT && LA5_132<=SEMICOLON)||(LA5_132>=DOT && LA5_132<=NULL)||(LA5_132>=RIGHT_SQUARE && LA5_132<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_132);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 17 : 
+                        int LA5_129 = input.LA(1);
+
+                         
+                        int index5_129 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA5_129>=VT_COMPILATION_UNIT && LA5_129<=SEMICOLON)||(LA5_129>=DOT && LA5_129<=NULL)||(LA5_129>=RIGHT_SQUARE && LA5_129<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_129==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 104;}
+
+                        else if ( (LA5_129==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 123;}
+
+                         
+                        input.seek(index5_129);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 18 : 
+                        int LA5_73 = input.LA(1);
+
+                         
+                        int index5_73 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_73==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_73==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_73==COMMA||LA5_73==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_73);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 19 : 
+                        int LA5_96 = input.LA(1);
+
+                         
+                        int index5_96 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_96==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_96==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 85;}
+
+                        else if ( (LA5_96==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 81;}
+
+                         
+                        input.seek(index5_96);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 20 : 
+                        int LA5_21 = input.LA(1);
+
+                         
+                        int index5_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_21==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 46;}
+
+                         
+                        input.seek(index5_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 21 : 
+                        int LA5_63 = input.LA(1);
+
+                         
+                        int index5_63 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_63==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 87;}
+
+                         
+                        input.seek(index5_63);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 22 : 
+                        int LA5_43 = input.LA(1);
+
+                         
+                        int index5_43 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.FUNCTION))) ) {s = 45;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_43);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 23 : 
+                        int LA5_110 = input.LA(1);
+
+                         
+                        int index5_110 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_110==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 118;}
+
+                         
+                        input.seek(index5_110);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 24 : 
+                        int LA5_92 = input.LA(1);
+
+                         
+                        int index5_92 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_92==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 109;}
+
+                         
+                        input.seek(index5_92);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 25 : 
+                        int LA5_95 = input.LA(1);
+
+                         
+                        int index5_95 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_95==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 111;}
+
+                         
+                        input.seek(index5_95);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 26 : 
+                        int LA5_40 = input.LA(1);
+
+                         
+                        int index5_40 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_40==COMMA||LA5_40==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_40==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_40==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_40);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 27 : 
+                        int LA5_27 = input.LA(1);
+
+                         
+                        int index5_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_27==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 51;}
+
+                         
+                        input.seek(index5_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 28 : 
+                        int LA5_8 = input.LA(1);
+
+                         
+                        int index5_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_8==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 19;}
+
+                        else if ( (LA5_8==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_8==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                         
+                        input.seek(index5_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 29 : 
+                        int LA5_111 = input.LA(1);
+
+                         
+                        int index5_111 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_111==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_111==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                        else if ( (LA5_111==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 95;}
+
+                         
+                        input.seek(index5_111);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 30 : 
+                        int LA5_102 = input.LA(1);
+
+                         
+                        int index5_102 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_102==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 114;}
+
+                        else if ( ((LA5_102>=VT_COMPILATION_UNIT && LA5_102<=SEMICOLON)||(LA5_102>=DOT && LA5_102<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_102);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 31 : 
+                        int LA5_26 = input.LA(1);
+
+                         
+                        int index5_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_26==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 50;}
+
+                         
+                        input.seek(index5_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 32 : 
+                        int LA5_36 = input.LA(1);
+
+                         
+                        int index5_36 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))) ) {s = 17;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_36);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 33 : 
+                        int LA5_51 = input.LA(1);
+
+                         
+                        int index5_51 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_51==ID) && ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE)))) {s = 17;}
+
+                        else if ( (LA5_51==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 27;}
+
+                        else if ( (LA5_51==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                         
+                        input.seek(index5_51);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 34 : 
+                        int LA5_53 = input.LA(1);
+
+                         
+                        int index5_53 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_53==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.FUNCTION)))) {s = 45;}
+
+                        else if ( (LA5_53==EOF||(LA5_53>=SEMICOLON && LA5_53<=ID)) && ((validateIdentifierKey(DroolsSoftKeywords.GLOBAL)))) {s = 71;}
+
+                         
+                        input.seek(index5_53);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 35 : 
+                        int LA5_50 = input.LA(1);
+
+                         
+                        int index5_50 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_50==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 27;}
+
+                        else if ( (LA5_50==ID) && ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE)))) {s = 17;}
+
+                        else if ( (LA5_50==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 26;}
+
+                        else if ( (LA5_50==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                         
+                        input.seek(index5_50);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 36 : 
+                        int LA5_77 = input.LA(1);
+
+                         
+                        int index5_77 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_77);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 37 : 
+                        int LA5_109 = input.LA(1);
+
+                         
+                        int index5_109 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_109==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                        else if ( (LA5_109==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_109==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 92;}
+
+                         
+                        input.seek(index5_109);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 38 : 
+                        int LA5_23 = input.LA(1);
+
+                         
+                        int index5_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_23==COMMA||LA5_23==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_23==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_23==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 39 : 
+                        int LA5_74 = input.LA(1);
+
+                         
+                        int index5_74 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_74==COMMA||LA5_74==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_74==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_74==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_74);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 40 : 
+                        int LA5_112 = input.LA(1);
+
+                         
+                        int index5_112 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_112==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 119;}
+
+                        else if ( (LA5_112==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_112==COMMA||LA5_112==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_112==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_112);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 41 : 
+                        int LA5_100 = input.LA(1);
+
+                         
+                        int index5_100 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_100==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_100==COMMA||LA5_100==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_100==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_100);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 42 : 
+                        int LA5_47 = input.LA(1);
+
+                         
+                        int index5_47 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_47);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 43 : 
+                        int LA5_88 = input.LA(1);
+
+                         
+                        int index5_88 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_88==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 101;}
+
+                        else if ( (LA5_88==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( (LA5_88==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_88==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 103;}
+
+                        else if ( ((LA5_88>=VT_COMPILATION_UNIT && LA5_88<=SEMICOLON)||(LA5_88>=DOT_STAR && LA5_88<=LEFT_PAREN)||(LA5_88>=COLON && LA5_88<=NULL)||(LA5_88>=RIGHT_SQUARE && LA5_88<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_88==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 104;}
+
+                         
+                        input.seek(index5_88);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 44 : 
+                        int LA5_98 = input.LA(1);
+
+                         
+                        int index5_98 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_98==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 112;}
+
+                         
+                        input.seek(index5_98);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 45 : 
+                        int LA5_60 = input.LA(1);
+
+                         
+                        int index5_60 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_60==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 86;}
+
+                         
+                        input.seek(index5_60);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 46 : 
+                        int LA5_56 = input.LA(1);
+
+                         
+                        int index5_56 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_56==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 75;}
+
+                        else if ( (LA5_56==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 76;}
+
+                        else if ( (LA5_56==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 77;}
+
+                        else if ( (LA5_56==INT) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 78;}
+
+                        else if ( (LA5_56==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 79;}
+
+                        else if ( (LA5_56==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 80;}
+
+                        else if ( (LA5_56==COLON||LA5_56==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_56);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 47 : 
+                        int LA5_108 = input.LA(1);
+
+                         
+                        int index5_108 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_108==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_108==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_108==COMMA||LA5_108==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_108);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 48 : 
+                        int LA5_58 = input.LA(1);
+
+                         
+                        int index5_58 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_58==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 82;}
+
+                        else if ( (LA5_58==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 83;}
+
+                        else if ( (LA5_58==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 84;}
+
+                        else if ( (LA5_58==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_58==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                         
+                        input.seek(index5_58);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 49 : 
+                        int LA5_83 = input.LA(1);
+
+                         
+                        int index5_83 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_83==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 94;}
+
+                         
+                        input.seek(index5_83);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 50 : 
+                        int LA5_1 = input.LA(1);
+
+                         
+                        int index5_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_1==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT!
 (2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {s = 2;}
+
+                        else if ( (LA5_1==ID) && ((((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIde!
 ntifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 3;}
+
+                        else if ( (LA5_1==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 4;}
+
+                        else if ( (LA5_1==INT) && (((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))))) {s = 5;}
+
+                        else if ( (LA5_1==BOOL) && ((validateIdentifierKey(DroolsSoftKeywords.ENABLED)))) {s = 6;}
+
+                        else if ( (LA5_1==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 7;}
+
+                         
+                        input.seek(index5_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 51 : 
+                        int LA5_94 = input.LA(1);
+
+                         
+                        int index5_94 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_94==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 84;}
+
+                        else if ( (LA5_94==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 83;}
+
+                        else if ( (LA5_94==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_94==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                         
+                        input.seek(index5_94);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 52 : 
+                        int LA5_67 = input.LA(1);
+
+                         
+                        int index5_67 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_67);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 53 : 
+                        int LA5_52 = input.LA(1);
+
+                         
+                        int index5_52 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_52==STRING||(LA5_52>=BOOL && LA5_52<=INT)||LA5_52==MISC) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_52==ID) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 69;}
+
+                        else if ( (LA5_52==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 70;}
+
+                        else if ( (LA5_52==EOF||LA5_52==SEMICOLON) && ((validateIdentifierKey(DroolsSoftKeywords.GLOBAL)))) {s = 71;}
+
+                         
+                        input.seek(index5_52);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 54 : 
+                        int LA5_82 = input.LA(1);
+
+                         
+                        int index5_82 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_82==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 93;}
+
+                         
+                        input.seek(index5_82);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 55 : 
+                        int LA5_85 = input.LA(1);
+
+                         
+                        int index5_85 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_85==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 96;}
+
+                         
+                        input.seek(index5_85);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 56 : 
+                        int LA5_120 = input.LA(1);
+
+                         
+                        int index5_120 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_120==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 126;}
+
+                        else if ( ((LA5_120>=VT_COMPILATION_UNIT && LA5_120<=SEMICOLON)||(LA5_120>=DOT && LA5_120<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_120);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 57 : 
+                        int LA5_103 = input.LA(1);
+
+                         
+                        int index5_103 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_103==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 115;}
+
+                        else if ( ((LA5_103>=VT_COMPILATION_UNIT && LA5_103<=SEMICOLON)||(LA5_103>=DOT && LA5_103<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_103);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 58 : 
+                        int LA5_89 = input.LA(1);
+
+                         
+                        int index5_89 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_89==LEFT_CURLY) && ((validateIdentifierKey(DroolsSoftKeywords.FUNCTION)))) {s = 45;}
+
+                        else if ( (LA5_89==EOF||LA5_89==ID) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_89);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 59 : 
+                        int LA5_114 = input.LA(1);
+
+                         
+                        int index5_114 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_114==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 120;}
+
+                        else if ( (LA5_114==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 121;}
+
+                        else if ( (LA5_114==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 122;}
+
+                        else if ( (LA5_114==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_114==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( ((LA5_114>=VT_COMPILATION_UNIT && LA5_114<=SEMICOLON)||(LA5_114>=DOT_STAR && LA5_114<=LEFT_PAREN)||(LA5_114>=COLON && LA5_114<=NULL)||(LA5_114>=RIGHT_SQUARE && LA5_114<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_114);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 60 : 
+                        int LA5_29 = input.LA(1);
+
+                         
+                        int index5_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_29==COMMA||LA5_29==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_29==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_29==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 61 : 
+                        int LA5_61 = input.LA(1);
+
+                         
+                        int index5_61 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_61==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_61==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_61==COMMA||LA5_61==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_61);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 62 : 
+                        int LA5_35 = input.LA(1);
+
+                         
+                        int index5_35 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_35==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 55;}
+
+                         
+                        input.seek(index5_35);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 63 : 
+                        int LA5_75 = input.LA(1);
+
+                         
+                        int index5_75 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_75==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 91;}
+
+                         
+                        input.seek(index5_75);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 64 : 
+                        int LA5_121 = input.LA(1);
+
+                         
+                        int index5_121 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_121==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 127;}
+
+                        else if ( ((LA5_121>=VT_COMPILATION_UNIT && LA5_121<=LEFT_SQUARE)||(LA5_121>=THEN && LA5_121<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_121);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 65 : 
+                        int LA5_101 = input.LA(1);
+
+                         
+                        int index5_101 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_101==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 113;}
+
+                        else if ( ((LA5_101>=VT_COMPILATION_UNIT && LA5_101<=LEFT_SQUARE)||(LA5_101>=THEN && LA5_101<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_101);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 66 : 
+                        int LA5_39 = input.LA(1);
+
+                         
+                        int index5_39 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_39);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 67 : 
+                        int LA5_4 = input.LA(1);
+
+                         
+                        int index5_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_4==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 16;}
+
+                        else if ( (LA5_4==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_4==END||LA5_4==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_4==SEMICOLON) && ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE)))) {s = 17;}
+
+                        else if ( (LA5_4==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 68 : 
+                        int LA5_20 = input.LA(1);
+
+                         
+                        int index5_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_20==ID||LA5_20==END||LA5_20==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_20==LEFT_CURLY) && ((validateIdentifierKey(DroolsSoftKeywords.FUNCTION)))) {s = 45;}
+
+                         
+                        input.seek(index5_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 69 : 
+                        int LA5_125 = input.LA(1);
+
+                         
+                        int index5_125 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_125==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_125==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_125==COMMA||LA5_125==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_125);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 70 : 
+                        int LA5_80 = input.LA(1);
+
+                         
+                        int index5_80 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_80==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_80==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_80==COMMA||LA5_80==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_80);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 71 : 
+                        int LA5_16 = input.LA(1);
+
+                         
+                        int index5_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_16==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 35;}
+
+                        else if ( (LA5_16==COLON) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))))) {s = 22;}
+
+                        else if ( (LA5_16==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 36;}
+
+                        else if ( (LA5_16==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 37;}
+
+                        else if ( (LA5_16==INT) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 38;}
+
+                        else if ( (LA5_16==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 39;}
+
+                        else if ( (LA5_16==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 26;}
+
+                        else if ( (LA5_16==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 27;}
+
+                        else if ( (LA5_16==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 40;}
+
+                        else if ( (LA5_16==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 72 : 
+                        int LA5_68 = input.LA(1);
+
+                         
+                        int index5_68 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_68==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_68==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_68==COMMA||LA5_68==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_68);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 73 : 
+                        int LA5_24 = input.LA(1);
+
+                         
+                        int index5_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.FUNCTION))) ) {s = 45;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 74 : 
+                        int LA5_37 = input.LA(1);
+
+                         
+                        int index5_37 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_37);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 75 : 
+                        int LA5_107 = input.LA(1);
+
+                         
+                        int index5_107 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_107==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_107==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_107==COMMA||LA5_107==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_107);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 76 : 
+                        int LA5_86 = input.LA(1);
+
+                         
+                        int index5_86 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_86==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 97;}
+
+                        else if ( (LA5_86==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_86==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_86==COMMA||LA5_86==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_86);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 77 : 
+                        int LA5_42 = input.LA(1);
+
+                         
+                        int index5_42 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_42==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 58;}
+
+                         
+                        input.seek(index5_42);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 78 : 
+                        int LA5_124 = input.LA(1);
+
+                         
+                        int index5_124 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_124==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_124==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( ((LA5_124>=VT_COMPILATION_UNIT && LA5_124<=LEFT_PAREN)||(LA5_124>=COLON && LA5_124<=NULL)||(LA5_124>=RIGHT_SQUARE && LA5_124<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_124==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 116;}
+
+                         
+                        input.seek(index5_124);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 79 : 
+                        int LA5_93 = input.LA(1);
+
+                         
+                        int index5_93 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_93==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 110;}
+
+                        else if ( (LA5_93==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 84;}
+
+                        else if ( (LA5_93==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 82;}
+
+                         
+                        input.seek(index5_93);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 80 : 
+                        int LA5_90 = input.LA(1);
+
+                         
+                        int index5_90 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_90==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 105;}
+
+                        else if ( (LA5_90==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_90==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_90==COMMA||LA5_90==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_90);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 81 : 
+                        int LA5_22 = input.LA(1);
+
+                         
+                        int index5_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_22==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))))) {s = 47;}
+
+                        else if ( (LA5_22==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))))) {s = 48;}
+
+                        else if ( (LA5_22==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 82 : 
+                        int LA5_19 = input.LA(1);
+
+                         
+                        int index5_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_19==LEFT_PAREN||LA5_19==COLON) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_19==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 41;}
+
+                        else if ( (LA5_19==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                        else if ( (LA5_19==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_19==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 43;}
+
+                        else if ( (LA5_19==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 44;}
+
+                         
+                        input.seek(index5_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 83 : 
+                        int LA5_130 = input.LA(1);
+
+                         
+                        int index5_130 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_130==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 132;}
+
+                        else if ( ((LA5_130>=VT_COMPILATION_UNIT && LA5_130<=LEFT_SQUARE)||(LA5_130>=THEN && LA5_130<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_130);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 84 : 
+                        int LA5_128 = input.LA(1);
+
+                         
+                        int index5_128 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_128==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 131;}
+
+                        else if ( ((LA5_128>=VT_COMPILATION_UNIT && LA5_128<=LEFT_SQUARE)||(LA5_128>=THEN && LA5_128<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_128);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 85 : 
+                        int LA5_123 = input.LA(1);
+
+                         
+                        int index5_123 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_123==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 129;}
+
+                        else if ( ((LA5_123>=VT_COMPILATION_UNIT && LA5_123<=LEFT_SQUARE)||(LA5_123>=THEN && LA5_123<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_123);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 86 : 
+                        int LA5_116 = input.LA(1);
+
+                         
+                        int index5_116 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_116==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 124;}
+
+                        else if ( ((LA5_116>=VT_COMPILATION_UNIT && LA5_116<=LEFT_SQUARE)||(LA5_116>=THEN && LA5_116<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_116);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 87 : 
+                        int LA5_9 = input.LA(1);
+
+                         
+                        int index5_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_9==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 21;}
+
+                        else if ( (LA5_9==COLON) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))))) {s = 22;}
+
+                        else if ( (LA5_9==INT) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 23;}
+
+                        else if ( (LA5_9==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 24;}
+
+                        else if ( (LA5_9==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 25;}
+
+                        else if ( (LA5_9==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 26;}
+
+                        else if ( (LA5_9==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 27;}
+
+                        else if ( (LA5_9==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 28;}
+
+                        else if ( (LA5_9==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 29;}
+
+                        else if ( (LA5_9==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) ) {s = 30;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))) ) {s = 31;}
+
+                         
+                        input.seek(index5_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 88 : 
+                        int LA5_3 = input.LA(1);
+
+                         
+                        int index5_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_3==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 8;}
+
+                        else if ( (LA5_3==ID) && ((((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "funct!
 ion") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateL!
 T(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT))
)||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeyword!
 s.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(Drools!
 SoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "fu
nction") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeyw!
 ords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(Dro!
 olsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, 
"function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && vali!
 dateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "impor!
 t") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftK
eywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(D!
 roolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.RULE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "impo!
 rt") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoft
Keywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(!
 DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIde!
 ntifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && 
validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "im!
 port") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(valida!
 teIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import"
) && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1!
 , "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(val!
 idateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "impo
rt") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateL!
 T(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||!
 ((validateLT(1, "import") && validateLT(2, "function") )&&(validateIde
ntifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(v!
 alidateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.QUERY))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") !
 )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1
, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((va!
 lidateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPORT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(validateIdentifierKey(DroolsSoftKeywords.IMPO!
 RT)))||((validateLT(1, "import") && validateLT(2, "function") )&&(vali
dateIdentifierKey(DroolsSoftKeywords.IMPORT)))))) {s = 9;}
+
+                        else if ( (LA5_3==END) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_3==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_3==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 12;}
+
+                        else if ( (LA5_3==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 13;}
+
+                        else if ( (LA5_3==SEMICOLON) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 14;}
+
+                        else if ( (LA5_3==EOF||LA5_3==DOT_STAR) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 89 : 
+                        int LA5_97 = input.LA(1);
+
+                         
+                        int index5_97 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_97==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_97==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_97==COMMA||LA5_97==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_97);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 90 : 
+                        int LA5_34 = input.LA(1);
+
+                         
+                        int index5_34 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA5_34>=STRING && LA5_34<=LEFT_PAREN)||(LA5_34>=BOOL && LA5_34<=INT)||LA5_34==MISC) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_34==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))))) {s = 54;}
+
+                        else if ( (LA5_34==DOT||LA5_34==LEFT_SQUARE) && ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE)))) {s = 17;}
+
+                         
+                        input.seek(index5_34);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 91 : 
+                        int LA5_79 = input.LA(1);
+
+                         
+                        int index5_79 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.DIALECT))) ) {s = 18;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_79);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 92 : 
+                        int LA5_105 = input.LA(1);
+
+                         
+                        int index5_105 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_105==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_105==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_105==COMMA||LA5_105==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_105);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 93 : 
+                        int LA5_113 = input.LA(1);
+
+                         
+                        int index5_113 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_113==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_113==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( ((LA5_113>=VT_COMPILATION_UNIT && LA5_113<=SEMICOLON)||(LA5_113>=DOT && LA5_113<=LEFT_PAREN)||(LA5_113>=COLON && LA5_113<=NULL)||(LA5_113>=RIGHT_SQUARE && LA5_113<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_113==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 101;}
+
+                        else if ( (LA5_113==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 104;}
+
+                         
+                        input.seek(index5_113);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 94 : 
+                        int LA5_41 = input.LA(1);
+
+                         
+                        int index5_41 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_41==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 57;}
+
+                         
+                        input.seek(index5_41);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 95 : 
+                        int LA5_126 = input.LA(1);
+
+                         
+                        int index5_126 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA5_126>=VT_COMPILATION_UNIT && LA5_126<=SEMICOLON)||(LA5_126>=DOT_STAR && LA5_126<=NULL)||(LA5_126>=RIGHT_SQUARE && LA5_126<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_126==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 130;}
+
+                        else if ( (LA5_126==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 122;}
+
+                        else if ( (LA5_126==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 120;}
+
+                         
+                        input.seek(index5_126);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 96 : 
+                        int LA5_115 = input.LA(1);
+
+                         
+                        int index5_115 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA5_115>=VT_COMPILATION_UNIT && LA5_115<=SEMICOLON)||(LA5_115>=DOT_STAR && LA5_115<=NULL)||(LA5_115>=RIGHT_SQUARE && LA5_115<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_115==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 123;}
+
+                        else if ( (LA5_115==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 104;}
+
+                        else if ( (LA5_115==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 103;}
+
+                         
+                        input.seek(index5_115);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 97 : 
+                        int LA5_33 = input.LA(1);
+
+                         
+                        int index5_33 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_33==ID) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 53;}
+
+                        else if ( (LA5_33==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 13;}
+
+                         
+                        input.seek(index5_33);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 98 : 
+                        int LA5_91 = input.LA(1);
+
+                         
+                        int index5_91 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_91==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 106;}
+
+                        else if ( (LA5_91==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 107;}
+
+                        else if ( (LA5_91==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 108;}
+
+                        else if ( (LA5_91==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                        else if ( (LA5_91==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_91==COMMA||LA5_91==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_91);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 99 : 
+                        int LA5_55 = input.LA(1);
+
+                         
+                        int index5_55 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_55==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 72;}
+
+                        else if ( (LA5_55==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 73;}
+
+                        else if ( (LA5_55==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 74;}
+
+                        else if ( (LA5_55==COMMA||LA5_55==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_55==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_55==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_55);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 100 : 
+                        int LA5_38 = input.LA(1);
+
+                         
+                        int index5_38 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_38==COMMA||LA5_38==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_38==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_38==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_38);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 101 : 
+                        int LA5_48 = input.LA(1);
+
+                         
+                        int index5_48 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.QUERY))) ) {s = 10;}
+
+                         
+                        input.seek(index5_48);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 102 : 
+                        int LA5_66 = input.LA(1);
+
+                         
+                        int index5_66 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_66);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 103 : 
+                        int LA5_84 = input.LA(1);
+
+                         
+                        int index5_84 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_84==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 95;}
+
+                        else if ( (LA5_84==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_84==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                         
+                        input.seek(index5_84);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 104 : 
+                        int LA5_54 = input.LA(1);
+
+                         
+                        int index5_54 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))) ) {s = 17;}
+
+                         
+                        input.seek(index5_54);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 105 : 
+                        int LA5_64 = input.LA(1);
+
+                         
+                        int index5_64 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_64);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 106 : 
+                        int LA5_106 = input.LA(1);
+
+                         
+                        int index5_106 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_106==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 117;}
+
+                         
+                        input.seek(index5_106);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 107 : 
+                        int LA5_72 = input.LA(1);
+
+                         
+                        int index5_72 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_72==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 90;}
+
+                         
+                        input.seek(index5_72);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 108 : 
+                        int LA5_13 = input.LA(1);
+
+                         
+                        int index5_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_13==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 33;}
+
+                         
+                        input.seek(index5_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 109 : 
+                        int LA5_127 = input.LA(1);
+
+                         
+                        int index5_127 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_127==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 122;}
+
+                        else if ( (LA5_127==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 121;}
+
+                        else if ( (LA5_127==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_127==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                        else if ( ((LA5_127>=VT_COMPILATION_UNIT && LA5_127<=SEMICOLON)||(LA5_127>=DOT && LA5_127<=LEFT_PAREN)||(LA5_127>=COLON && LA5_127<=NULL)||(LA5_127>=RIGHT_SQUARE && LA5_127<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                         
+                        input.seek(index5_127);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 110 : 
+                        int LA5_49 = input.LA(1);
+
+                         
+                        int index5_49 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_49==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 63;}
+
+                        else if ( (LA5_49==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 64;}
+
+                        else if ( (LA5_49==INT) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 65;}
+
+                        else if ( (LA5_49==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 66;}
+
+                        else if ( (LA5_49==STRING) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 67;}
+
+                        else if ( (LA5_49==COLON||LA5_49==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_49==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 68;}
+
+                         
+                        input.seek(index5_49);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 111 : 
+                        int LA5_69 = input.LA(1);
+
+                         
+                        int index5_69 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))) ) {s = 71;}
+
+                         
+                        input.seek(index5_69);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 112 : 
+                        int LA5_119 = input.LA(1);
+
+                         
+                        int index5_119 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_119==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_119==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))))) {s = 49;}
+
+                        else if ( (LA5_119==COMMA||LA5_119==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                         
+                        input.seek(index5_119);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 113 : 
+                        int LA5_57 = input.LA(1);
+
+                         
+                        int index5_57 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_57==LEFT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.QUERY)))) {s = 10;}
+
+                        else if ( (LA5_57==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 41;}
+
+                        else if ( (LA5_57==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 42;}
+
+                        else if ( (LA5_57==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 20;}
+
+                        else if ( (LA5_57==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 81;}
+
+                         
+                        input.seek(index5_57);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 114 : 
+                        int LA5_28 = input.LA(1);
+
+                         
+                        int index5_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.IMPORT))) ) {s = 15;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RULE))) ) {s = 11;}
+
+                         
+                        input.seek(index5_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 115 : 
+                        int LA5_12 = input.LA(1);
+
+                         
+                        int index5_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_12==ID) && (((validateIdentifierKey(DroolsSoftKeywords.GLOBAL))||(validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 32;}
+
+                         
+                        input.seek(index5_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 116 : 
+                        int LA5_118 = input.LA(1);
+
+                         
+                        int index5_118 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_118==ID) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 84;}
+
+                        else if ( (LA5_118==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.QUERY))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 110;}
+
+                         
+                        input.seek(index5_118);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 117 : 
+                        int LA5_117 = input.LA(1);
+
+                         
+                        int index5_117 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_117==BOOL) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 125;}
+
+                        else if ( (LA5_117==ID) && (((validateIdentifierKey(DroolsSoftKeywords.RULE))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))))) {s = 56;}
+
+                        else if ( (LA5_117==COMMA||LA5_117==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.RULE)))) {s = 11;}
+
+                        else if ( (LA5_117==EOF) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 18;}
+
+                         
+                        input.seek(index5_117);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 118 : 
+                        int LA5_122 = input.LA(1);
+
+                         
+                        int index5_122 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_122==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                        else if ( (LA5_122==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 128;}
+
+                        else if ( ((LA5_122>=VT_COMPILATION_UNIT && LA5_122<=LEFT_PAREN)||(LA5_122>=COLON && LA5_122<=NULL)||(LA5_122>=RIGHT_SQUARE && LA5_122<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_122==COMMA) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 102;}
+
+                         
+                        input.seek(index5_122);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 119 : 
+                        int LA5_70 = input.LA(1);
+
+                         
+                        int index5_70 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA5_70==ID) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 88;}
+
+                        else if ( ((LA5_70>=VT_COMPILATION_UNIT && LA5_70<=SEMICOLON)||(LA5_70>=DOT && LA5_70<=COMMA)||(LA5_70>=COLON && LA5_70<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.IMPORT)))) {s = 15;}
+
+                        else if ( (LA5_70==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.IMPORT))||(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))))) {s = 89;}
+
+                         
+                        input.seek(index5_70);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 5, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA12_eotS =
+        "\16\uffff";
+    static final String DFA12_eofS =
+        "\16\uffff";
+    static final String DFA12_minS =
+        "\2\126\1\uffff\1\126\1\uffff\1\126\1\156\3\126\2\156\1\133\1\126";
+    static final String DFA12_maxS =
+        "\1\133\1\135\1\uffff\1\155\1\uffff\1\126\1\156\3\155\2\156\2\155";
+    static final String DFA12_acceptS =
+        "\2\uffff\1\2\1\uffff\1\1\11\uffff";
+    static final String DFA12_specialS =
+        "\16\uffff}>";
+    static final String[] DFA12_transitionS = {
+            "\1\2\2\uffff\1\2\1\uffff\1\1",
+            "\1\3\4\uffff\1\2\1\uffff\1\4",
+            "",
+            "\1\7\1\5\3\uffff\1\2\2\4\1\2\16\uffff\1\6",
+            "",
+            "\1\10",
+            "\1\11",
+            "\2\2\3\uffff\1\2\2\4\1\2\16\uffff\1\12",
+            "\1\4\1\5\3\uffff\1\2\21\uffff\1\13",
+            "\1\4\4\uffff\1\2\2\4\17\uffff\1\6",
+            "\1\14",
+            "\1\15",
+            "\1\2\2\4\17\uffff\1\12",
+            "\1\4\4\uffff\1\2\21\uffff\1\13"
+    };
+
+    static final short[] DFA12_eot = DFA.unpackEncodedString(DFA12_eotS);
+    static final short[] DFA12_eof = DFA.unpackEncodedString(DFA12_eofS);
+    static final char[] DFA12_min = DFA.unpackEncodedStringToUnsignedChars(DFA12_minS);
+    static final char[] DFA12_max = DFA.unpackEncodedStringToUnsignedChars(DFA12_maxS);
+    static final short[] DFA12_accept = DFA.unpackEncodedString(DFA12_acceptS);
+    static final short[] DFA12_special = DFA.unpackEncodedString(DFA12_specialS);
+    static final short[][] DFA12_transition;
+
+    static {
+        int numStates = DFA12_transitionS.length;
+        DFA12_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA12_transition[i] = DFA.unpackEncodedString(DFA12_transitionS[i]);
+        }
+    }
+
+    class DFA12 extends DFA {
+
+        public DFA12(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 12;
+            this.eot = DFA12_eot;
+            this.eof = DFA12_eof;
+            this.min = DFA12_min;
+            this.max = DFA12_max;
+            this.accept = DFA12_accept;
+            this.special = DFA12_special;
+            this.transition = DFA12_transition;
+        }
+        public String getDescription() {
+            return "327:23: ( parameters )?";
+        }
+    }
+    static final String DFA17_eotS =
+        "\6\uffff";
+    static final String DFA17_eofS =
+        "\6\uffff";
+    static final String DFA17_minS =
+        "\2\126\1\uffff\1\156\1\uffff\1\126";
+    static final String DFA17_maxS =
+        "\1\126\1\155\1\uffff\1\156\1\uffff\1\155";
+    static final String DFA17_acceptS =
+        "\2\uffff\1\1\1\uffff\1\2\1\uffff";
+    static final String DFA17_specialS =
+        "\6\uffff}>";
+    static final String[] DFA17_transitionS = {
+            "\1\1",
+            "\2\2\4\uffff\2\4\17\uffff\1\3",
+            "",
+            "\1\5",
+            "",
+            "\1\2\5\uffff\2\4\17\uffff\1\3"
+    };
+
+    static final short[] DFA17_eot = DFA.unpackEncodedString(DFA17_eotS);
+    static final short[] DFA17_eof = DFA.unpackEncodedString(DFA17_eofS);
+    static final char[] DFA17_min = DFA.unpackEncodedStringToUnsignedChars(DFA17_minS);
+    static final char[] DFA17_max = DFA.unpackEncodedStringToUnsignedChars(DFA17_maxS);
+    static final short[] DFA17_accept = DFA.unpackEncodedString(DFA17_acceptS);
+    static final short[] DFA17_special = DFA.unpackEncodedString(DFA17_specialS);
+    static final short[][] DFA17_transition;
+
+    static {
+        int numStates = DFA17_transitionS.length;
+        DFA17_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA17_transition[i] = DFA.unpackEncodedString(DFA17_transitionS[i]);
+        }
+    }
+
+    class DFA17 extends DFA {
+
+        public DFA17(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 17;
+            this.eot = DFA17_eot;
+            this.eof = DFA17_eof;
+            this.min = DFA17_min;
+            this.max = DFA17_max;
+            this.accept = DFA17_accept;
+            this.special = DFA17_special;
+            this.transition = DFA17_transition;
+        }
+        public String getDescription() {
+            return "346:4: ( data_type )?";
+        }
+    }
+    static final String DFA24_eotS =
+        "\33\uffff";
+    static final String DFA24_eofS =
+        "\33\uffff";
+    static final String DFA24_minS =
+        "\2\126\3\uffff\1\4\1\126\3\uffff\1\4\1\uffff\2\0\1\4\2\0\3\4\1\0"+
+        "\2\4\4\0";
+    static final String DFA24_maxS =
+        "\1\157\1\162\3\uffff\1\173\1\157\3\uffff\1\173\1\uffff\2\0\1\173"+
+        "\2\0\3\173\1\0\2\173\4\0";
+    static final String DFA24_acceptS =
+        "\2\uffff\1\2\2\1\2\uffff\1\2\2\1\1\uffff\1\1\17\uffff";
+    static final String DFA24_specialS =
+        "\1\4\1\12\3\uffff\1\7\1\1\3\uffff\1\0\1\uffff\1\17\1\6\1\13\1\15"+
+        "\1\3\1\16\1\11\1\14\1\2\1\5\1\10\4\uffff}>";
+    static final String[] DFA24_transitionS = {
+            "\1\1\30\uffff\1\2",
+            "\1\7\3\uffff\1\10\1\5\2\uffff\1\6\1\11\1\4\16\uffff\1\7\2\uffff"+
+            "\1\3",
+            "",
+            "",
+            "",
+            "\122\13\1\12\4\13\1\14\40\13",
+            "\1\15\4\uffff\1\7\23\uffff\1\7",
+            "",
+            "",
+            "",
+            "\122\13\1\20\1\21\3\13\1\17\2\13\1\16\16\13\1\22\16\13",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\13\1\23\4\13\1\24\40\13",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\13\1\25\45\13",
+            "\152\13\1\26\15\13",
+            "\123\13\1\27\3\13\1\31\21\13\1\30\16\13",
+            "\1\uffff",
+            "\123\13\1\21\3\13\1\32\21\13\1\22\16\13",
+            "\127\13\1\32\21\13\1\22\16\13",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA24_eot = DFA.unpackEncodedString(DFA24_eotS);
+    static final short[] DFA24_eof = DFA.unpackEncodedString(DFA24_eofS);
+    static final char[] DFA24_min = DFA.unpackEncodedStringToUnsignedChars(DFA24_minS);
+    static final char[] DFA24_max = DFA.unpackEncodedStringToUnsignedChars(DFA24_maxS);
+    static final short[] DFA24_accept = DFA.unpackEncodedString(DFA24_acceptS);
+    static final short[] DFA24_special = DFA.unpackEncodedString(DFA24_specialS);
+    static final short[][] DFA24_transition;
+
+    static {
+        int numStates = DFA24_transitionS.length;
+        DFA24_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA24_transition[i] = DFA.unpackEncodedString(DFA24_transitionS[i]);
+        }
+    }
+
+    class DFA24 extends DFA {
+
+        public DFA24(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 24;
+            this.eot = DFA24_eot;
+            this.eof = DFA24_eof;
+            this.min = DFA24_min;
+            this.max = DFA24_max;
+            this.accept = DFA24_accept;
+            this.special = DFA24_special;
+            this.transition = DFA24_transition;
+        }
+        public String getDescription() {
+            return "382:21: ( rule_attributes )?";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA24_10 = input.LA(1);
+
+                         
+                        int index24_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_10==COLON) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 14;}
+
+                        else if ( (LA24_10==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 15;}
+
+                        else if ( (LA24_10==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 16;}
+
+                        else if ( ((LA24_10>=VT_COMPILATION_UNIT && LA24_10<=SEMICOLON)||(LA24_10>=DOT_STAR && LA24_10<=STRING)||(LA24_10>=COMMA && LA24_10<=RIGHT_PAREN)||(LA24_10>=BOOL && LA24_10<=NULL)||(LA24_10>=RIGHT_SQUARE && LA24_10<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                        else if ( (LA24_10==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 17;}
+
+                        else if ( (LA24_10==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 18;}
+
+                         
+                        input.seek(index24_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA24_6 = input.LA(1);
+
+                         
+                        int index24_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_6==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))))) {s = 13;}
+
+                        else if ( (LA24_6==LEFT_PAREN||LA24_6==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.WHEN)))) {s = 7;}
+
+                         
+                        input.seek(index24_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA24_20 = input.LA(1);
+
+                         
+                        int index24_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 7;}
+
+                         
+                        input.seek(index24_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA24_16 = input.LA(1);
+
+                         
+                        int index24_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 7;}
+
+                         
+                        input.seek(index24_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA24_0 = input.LA(1);
+
+                         
+                        int index24_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierK!
 ey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))))) {s = 1;}
+
+                        else if ( (LA24_0==THEN) ) {s = 2;}
+
+                         
+                        input.seek(index24_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA24_21 = input.LA(1);
+
+                         
+                        int index24_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA24_21>=VT_COMPILATION_UNIT && LA24_21<=ID)||(LA24_21>=DOT_STAR && LA24_21<=STRING)||(LA24_21>=COMMA && LA24_21<=NULL)||(LA24_21>=RIGHT_SQUARE && LA24_21<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                        else if ( (LA24_21==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 18;}
+
+                        else if ( (LA24_21==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 26;}
+
+                        else if ( (LA24_21==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 17;}
+
+                         
+                        input.seek(index24_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA24_13 = input.LA(1);
+
+                         
+                        int index24_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 7;}
+
+                         
+                        input.seek(index24_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA24_5 = input.LA(1);
+
+                         
+                        int index24_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_5==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 10;}
+
+                        else if ( ((LA24_5>=VT_COMPILATION_UNIT && LA24_5<=SEMICOLON)||(LA24_5>=DOT && LA24_5<=STRING)||(LA24_5>=COMMA && LA24_5<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                        else if ( (LA24_5==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 12;}
+
+                         
+                        input.seek(index24_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA24_22 = input.LA(1);
+
+                         
+                        int index24_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA24_22>=VT_COMPILATION_UNIT && LA24_22<=STRING)||(LA24_22>=COMMA && LA24_22<=NULL)||(LA24_22>=RIGHT_SQUARE && LA24_22<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                        else if ( (LA24_22==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 18;}
+
+                        else if ( (LA24_22==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 26;}
+
+                         
+                        input.seek(index24_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA24_18 = input.LA(1);
+
+                         
+                        int index24_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_18==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 22;}
+
+                        else if ( ((LA24_18>=VT_COMPILATION_UNIT && LA24_18<=LEFT_SQUARE)||(LA24_18>=THEN && LA24_18<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                         
+                        input.seek(index24_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA24_1 = input.LA(1);
+
+                         
+                        int index24_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_1==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateL!
 T(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {s = 3;}
+
+                        else if ( (LA24_1==INT) && (((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))))) {s = 4;}
+
+                        else if ( (LA24_1==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 5;}
+
+                        else if ( (LA24_1==COLON) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))))) {s = 6;}
+
+                        else if ( (LA24_1==ID||LA24_1==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.WHEN)))) {s = 7;}
+
+                        else if ( (LA24_1==STRING) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 8;}
+
+                        else if ( (LA24_1==BOOL) && ((validateIdentifierKey(DroolsSoftKeywords.ENABLED)))) {s = 9;}
+
+                         
+                        input.seek(index24_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA24_14 = input.LA(1);
+
+                         
+                        int index24_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA24_14>=VT_COMPILATION_UNIT && LA24_14<=SEMICOLON)||(LA24_14>=DOT && LA24_14<=STRING)||(LA24_14>=COMMA && LA24_14<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                        else if ( (LA24_14==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 19;}
+
+                        else if ( (LA24_14==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 20;}
+
+                         
+                        input.seek(index24_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA24_19 = input.LA(1);
+
+                         
+                        int index24_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_19==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 23;}
+
+                        else if ( (LA24_19==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 24;}
+
+                        else if ( (LA24_19==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 25;}
+
+                        else if ( ((LA24_19>=VT_COMPILATION_UNIT && LA24_19<=ID)||(LA24_19>=DOT_STAR && LA24_19<=STRING)||(LA24_19>=COMMA && LA24_19<=NULL)||(LA24_19>=RIGHT_SQUARE && LA24_19<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                         
+                        input.seek(index24_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA24_15 = input.LA(1);
+
+                         
+                        int index24_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 7;}
+
+                         
+                        input.seek(index24_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 14 : 
+                        int LA24_17 = input.LA(1);
+
+                         
+                        int index24_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA24_17==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 21;}
+
+                        else if ( ((LA24_17>=VT_COMPILATION_UNIT && LA24_17<=SEMICOLON)||(LA24_17>=DOT && LA24_17<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 11;}
+
+                         
+                        input.seek(index24_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 15 : 
+                        int LA24_12 = input.LA(1);
+
+                         
+                        int index24_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 11;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 7;}
+
+                         
+                        input.seek(index24_12);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 24, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA30_eotS =
+        "\32\uffff";
+    static final String DFA30_eofS =
+        "\32\uffff";
+    static final String DFA30_minS =
+        "\2\126\4\uffff\1\4\3\uffff\1\4\1\0\1\uffff\1\4\2\0\3\4\1\0\2\4\4"+
+        "\0";
+    static final String DFA30_maxS =
+        "\1\157\1\162\4\uffff\1\173\3\uffff\1\173\1\0\1\uffff\1\173\2\0\3"+
+        "\173\1\0\2\173\4\0";
+    static final String DFA30_acceptS =
+        "\2\uffff\1\2\3\1\1\uffff\2\1\1\2\2\uffff\1\1\15\uffff";
+    static final String DFA30_specialS =
+        "\1\15\1\6\4\uffff\1\4\3\uffff\1\0\1\10\1\uffff\1\11\1\13\1\3\1\14"+
+        "\1\7\1\12\1\1\1\2\1\5\4\uffff}>";
+    static final String[] DFA30_transitionS = {
+            "\1\1\5\uffff\1\3\22\uffff\1\2",
+            "\1\11\3\uffff\1\10\1\6\2\uffff\1\11\1\7\1\5\16\uffff\1\11\2"+
+            "\uffff\1\4",
+            "",
+            "",
+            "",
+            "",
+            "\122\14\1\12\4\14\1\13\40\14",
+            "",
+            "",
+            "",
+            "\122\14\1\17\1\20\3\14\1\16\2\14\1\15\16\14\1\21\16\14",
+            "\1\uffff",
+            "",
+            "\122\14\1\22\4\14\1\23\40\14",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\14\1\24\45\14",
+            "\152\14\1\25\15\14",
+            "\123\14\1\26\3\14\1\30\21\14\1\27\16\14",
+            "\1\uffff",
+            "\123\14\1\20\3\14\1\31\21\14\1\21\16\14",
+            "\127\14\1\31\21\14\1\21\16\14",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA30_eot = DFA.unpackEncodedString(DFA30_eotS);
+    static final short[] DFA30_eof = DFA.unpackEncodedString(DFA30_eofS);
+    static final char[] DFA30_min = DFA.unpackEncodedStringToUnsignedChars(DFA30_minS);
+    static final char[] DFA30_max = DFA.unpackEncodedStringToUnsignedChars(DFA30_maxS);
+    static final short[] DFA30_accept = DFA.unpackEncodedString(DFA30_acceptS);
+    static final short[] DFA30_special = DFA.unpackEncodedString(DFA30_specialS);
+    static final short[][] DFA30_transition;
+
+    static {
+        int numStates = DFA30_transitionS.length;
+        DFA30_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA30_transition[i] = DFA.unpackEncodedString(DFA30_transitionS[i]);
+        }
+    }
+
+    class DFA30 extends DFA {
+
+        public DFA30(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 30;
+            this.eot = DFA30_eot;
+            this.eof = DFA30_eof;
+            this.min = DFA30_min;
+            this.max = DFA30_max;
+            this.accept = DFA30_accept;
+            this.special = DFA30_special;
+            this.transition = DFA30_transition;
+        }
+        public String getDescription() {
+            return "()* loopback of 399:45: ( ( COMMA )? attr= rule_attribute )*";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA30_10 = input.LA(1);
+
+                         
+                        int index30_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_10==COLON) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 13;}
+
+                        else if ( (LA30_10==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 14;}
+
+                        else if ( ((LA30_10>=VT_COMPILATION_UNIT && LA30_10<=SEMICOLON)||(LA30_10>=DOT_STAR && LA30_10<=STRING)||(LA30_10>=COMMA && LA30_10<=RIGHT_PAREN)||(LA30_10>=BOOL && LA30_10<=NULL)||(LA30_10>=RIGHT_SQUARE && LA30_10<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                        else if ( (LA30_10==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 15;}
+
+                        else if ( (LA30_10==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 16;}
+
+                        else if ( (LA30_10==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 17;}
+
+                         
+                        input.seek(index30_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA30_19 = input.LA(1);
+
+                         
+                        int index30_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 12;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 9;}
+
+                         
+                        input.seek(index30_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA30_20 = input.LA(1);
+
+                         
+                        int index30_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA30_20>=VT_COMPILATION_UNIT && LA30_20<=ID)||(LA30_20>=DOT_STAR && LA30_20<=STRING)||(LA30_20>=COMMA && LA30_20<=NULL)||(LA30_20>=RIGHT_SQUARE && LA30_20<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                        else if ( (LA30_20==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 17;}
+
+                        else if ( (LA30_20==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 25;}
+
+                        else if ( (LA30_20==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 16;}
+
+                         
+                        input.seek(index30_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA30_15 = input.LA(1);
+
+                         
+                        int index30_15 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 12;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 9;}
+
+                         
+                        input.seek(index30_15);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA30_6 = input.LA(1);
+
+                         
+                        int index30_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_6==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 10;}
+
+                        else if ( (LA30_6==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 11;}
+
+                        else if ( ((LA30_6>=VT_COMPILATION_UNIT && LA30_6<=SEMICOLON)||(LA30_6>=DOT && LA30_6<=STRING)||(LA30_6>=COMMA && LA30_6<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                         
+                        input.seek(index30_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA30_21 = input.LA(1);
+
+                         
+                        int index30_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA30_21>=VT_COMPILATION_UNIT && LA30_21<=STRING)||(LA30_21>=COMMA && LA30_21<=NULL)||(LA30_21>=RIGHT_SQUARE && LA30_21<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                        else if ( (LA30_21==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 17;}
+
+                        else if ( (LA30_21==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 25;}
+
+                         
+                        input.seek(index30_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA30_1 = input.LA(1);
+
+                         
+                        int index30_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_1==MISC) && (((validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateL!
 T(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))))) {s = 4;}
+
+                        else if ( (LA30_1==INT) && (((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))))) {s = 5;}
+
+                        else if ( (LA30_1==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 6;}
+
+                        else if ( (LA30_1==BOOL) && ((validateIdentifierKey(DroolsSoftKeywords.ENABLED)))) {s = 7;}
+
+                        else if ( (LA30_1==STRING) && ((validateIdentifierKey(DroolsSoftKeywords.DIALECT)))) {s = 8;}
+
+                        else if ( (LA30_1==ID||LA30_1==COLON||LA30_1==THEN) && ((validateIdentifierKey(DroolsSoftKeywords.WHEN)))) {s = 9;}
+
+                         
+                        input.seek(index30_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA30_17 = input.LA(1);
+
+                         
+                        int index30_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_17==RIGHT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 21;}
+
+                        else if ( ((LA30_17>=VT_COMPILATION_UNIT && LA30_17<=LEFT_SQUARE)||(LA30_17>=THEN && LA30_17<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                         
+                        input.seek(index30_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA30_11 = input.LA(1);
+
+                         
+                        int index30_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 12;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 9;}
+
+                         
+                        input.seek(index30_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA30_13 = input.LA(1);
+
+                         
+                        int index30_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA30_13>=VT_COMPILATION_UNIT && LA30_13<=SEMICOLON)||(LA30_13>=DOT && LA30_13<=STRING)||(LA30_13>=COMMA && LA30_13<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                        else if ( (LA30_13==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 18;}
+
+                        else if ( (LA30_13==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 19;}
+
+                         
+                        input.seek(index30_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA30_18 = input.LA(1);
+
+                         
+                        int index30_18 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_18==DOT) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 22;}
+
+                        else if ( (LA30_18==LEFT_SQUARE) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 23;}
+
+                        else if ( (LA30_18==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 24;}
+
+                        else if ( ((LA30_18>=VT_COMPILATION_UNIT && LA30_18<=ID)||(LA30_18>=DOT_STAR && LA30_18<=STRING)||(LA30_18>=COMMA && LA30_18<=NULL)||(LA30_18>=RIGHT_SQUARE && LA30_18<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                         
+                        input.seek(index30_18);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA30_14 = input.LA(1);
+
+                         
+                        int index30_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE))) ) {s = 12;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.WHEN))) ) {s = 9;}
+
+                         
+                        input.seek(index30_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA30_16 = input.LA(1);
+
+                         
+                        int index30_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_16==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))))) {s = 20;}
+
+                        else if ( ((LA30_16>=VT_COMPILATION_UNIT && LA30_16<=SEMICOLON)||(LA30_16>=DOT && LA30_16<=MULTI_LINE_COMMENT)) && ((validateIdentifierKey(DroolsSoftKeywords.SALIENCE)))) {s = 12;}
+
+                         
+                        input.seek(index30_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 13 : 
+                        int LA30_0 = input.LA(1);
+
+                         
+                        int index30_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA30_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.WHEN))||(validateIdentifierKey(DroolsSoftKeywords.DIALECT))||(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))||(validateIdentifierKey(DroolsSoftKeywords.DURATION))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))||(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))||(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))||(validateIdentifierK!
 ey(DroolsSoftKeywords.SALIENCE))||(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))||(validateIdentifierKey(DroolsSoftKeywords.ENABLED))||(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))))) {s = 1;}
+
+                        else if ( (LA30_0==THEN) ) {s = 2;}
+
+                        else if ( (LA30_0==COMMA) ) {s = 3;}
+
+                         
+                        input.seek(index30_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 30, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA47_eotS =
+        "\172\uffff";
+    static final String DFA47_eofS =
+        "\172\uffff";
+    static final String DFA47_minS =
+        "\3\126\2\0\1\126\1\0\1\uffff\1\126\1\156\2\uffff\1\127\1\126\1\uffff"+
+        "\1\127\1\133\1\126\1\156\1\126\1\127\1\126\1\127\1\133\1\126\2\0"+
+        "\1\126\1\156\2\126\2\0\1\126\1\0\1\4\11\126\2\uffff\1\127\1\133"+
+        "\1\126\1\0\2\126\1\4\11\126\1\0\1\uffff\1\126\1\uffff\1\4\26\0\1"+
+        "\uffff\17\0\1\uffff\17\0";
+    static final String DFA47_maxS =
+        "\2\133\1\155\2\0\1\133\1\0\1\uffff\1\126\1\156\2\uffff\1\155\1\126"+
+        "\1\uffff\2\155\1\126\1\156\1\135\1\155\1\135\3\155\2\0\1\126\1\156"+
+        "\1\135\1\155\2\0\1\126\1\0\1\173\1\126\7\154\1\126\2\uffff\3\155"+
+        "\1\0\1\141\1\126\1\173\1\126\7\154\1\126\1\0\1\uffff\1\155\1\uffff"+
+        "\1\173\26\0\1\uffff\17\0\1\uffff\17\0";
+    static final String DFA47_acceptS =
+        "\7\uffff\1\1\2\uffff\2\2\2\uffff\1\3\36\uffff\2\3\21\uffff\1\3\1"+
+        "\uffff\1\3\27\uffff\1\3\17\uffff\1\3\17\uffff";
+    static final String DFA47_specialS =
+        "\2\uffff\1\5\1\0\1\7\1\uffff\1\11\22\uffff\1\3\1\12\4\uffff\1\2"+
+        "\1\10\1\uffff\1\6\17\uffff\1\4\14\uffff\1\1\72\uffff}>";
+    static final String[] DFA47_transitionS = {
+            "\1\2\4\uffff\1\1",
+            "\1\3\4\uffff\1\4",
+            "\1\7\1\10\3\uffff\1\6\2\uffff\1\5\16\uffff\1\11",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\14\4\uffff\1\15",
+            "\1\uffff",
+            "",
+            "\1\17",
+            "\1\20",
+            "",
+            "",
+            "\1\21\3\uffff\1\23\21\uffff\1\22",
+            "\1\24",
+            "",
+            "\1\10\3\uffff\1\25\21\uffff\1\11",
+            "\1\25\21\uffff\1\11",
+            "\1\26",
+            "\1\27",
+            "\1\30\4\uffff\1\31\1\uffff\1\32",
+            "\1\33\3\uffff\1\35\21\uffff\1\34",
+            "\1\36\4\uffff\1\37\1\uffff\1\40",
+            "\1\21\3\uffff\1\23\21\uffff\1\22",
+            "\1\23\21\uffff\1\22",
+            "\1\45\1\44\3\uffff\1\42\2\uffff\1\41\5\uffff\1\46\1\47\1\50"+
+            "\1\51\1\52\1\53\1\54\2\uffff\1\43",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\57",
+            "\1\60",
+            "\1\61\4\uffff\1\62\1\uffff\1\63",
+            "\1\67\1\66\3\uffff\1\77\2\uffff\1\64\5\uffff\1\70\1\71\1\72"+
+            "\1\73\1\74\1\75\1\76\2\uffff\1\65",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\101",
+            "\1\uffff",
+            "\151\103\1\104\1\105\15\103",
+            "\1\106",
+            "\1\107\3\uffff\1\111\1\112\3\uffff\2\111\11\uffff\1\110\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\115",
+            "",
+            "",
+            "\1\33\3\uffff\1\35\21\uffff\1\34",
+            "\1\35\21\uffff\1\34",
+            "\1\121\1\120\3\uffff\1\131\2\uffff\1\116\5\uffff\1\122\1\123"+
+            "\1\124\1\125\1\126\1\127\1\130\2\uffff\1\117",
+            "\1\uffff",
+            "\1\133\6\uffff\1\135\3\uffff\1\134",
+            "\1\136",
+            "\151\137\1\140\1\141\15\137",
+            "\1\142",
+            "\1\143\3\uffff\1\144\1\145\3\uffff\2\144\11\uffff\1\146\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\147\3\uffff\1\144\1\150\3\uffff\2\144\12\uffff\2\144",
+            "\1\151",
+            "\1\uffff",
+            "",
+            "\1\155\1\154\3\uffff\1\165\1\171\1\32\3\uffff\1\170\1\167\1"+
+            "\166\1\156\1\157\1\160\1\161\1\162\1\163\1\164\2\uffff\1\153",
+            "",
+            "\151\103\1\104\1\105\15\103",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA47_eot = DFA.unpackEncodedString(DFA47_eotS);
+    static final short[] DFA47_eof = DFA.unpackEncodedString(DFA47_eofS);
+    static final char[] DFA47_min = DFA.unpackEncodedStringToUnsignedChars(DFA47_minS);
+    static final char[] DFA47_max = DFA.unpackEncodedStringToUnsignedChars(DFA47_maxS);
+    static final short[] DFA47_accept = DFA.unpackEncodedString(DFA47_acceptS);
+    static final short[] DFA47_special = DFA.unpackEncodedString(DFA47_specialS);
+    static final short[][] DFA47_transition;
+
+    static {
+        int numStates = DFA47_transitionS.length;
+        DFA47_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA47_transition[i] = DFA.unpackEncodedString(DFA47_transitionS[i]);
+        }
+    }
+
+    class DFA47 extends DFA {
+
+        public DFA47(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 47;
+            this.eot = DFA47_eot;
+            this.eof = DFA47_eof;
+            this.min = DFA47_min;
+            this.max = DFA47_max;
+            this.accept = DFA47_accept;
+            this.special = DFA47_special;
+            this.transition = DFA47_transition;
+        }
+        public String getDescription() {
+            return "513:10: ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA47_3 = input.LA(1);
+
+                         
+                        int index47_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index47_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA47_63 = input.LA(1);
+
+                         
+                        int index47_63 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 106;}
+
+                         
+                        input.seek(index47_63);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA47_31 = input.LA(1);
+
+                         
+                        int index47_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 64;}
+
+                         
+                        input.seek(index47_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA47_25 = input.LA(1);
+
+                         
+                        int index47_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 45;}
+
+                         
+                        input.seek(index47_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA47_50 = input.LA(1);
+
+                         
+                        int index47_50 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 90;}
+
+                         
+                        input.seek(index47_50);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA47_2 = input.LA(1);
+
+                         
+                        int index47_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA47_2==COLON) ) {s = 5;}
+
+                        else if ( (LA47_2==LEFT_PAREN) ) {s = 6;}
+
+                        else if ( (LA47_2==ID) && (((synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifi!
 erKey(DroolsSoftKeywords.NOT)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))))) {s = 7;}
+
+                        else if ( (LA47_2==DOT) ) {s = 8;}
+
+                        else if ( (LA47_2==LEFT_SQUARE) ) {s = 9;}
+
+                         
+                        input.seek(index47_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA47_34 = input.LA(1);
+
+                         
+                        int index47_34 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 66;}
+
+                         
+                        input.seek(index47_34);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA47_4 = input.LA(1);
+
+                         
+                        int index47_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index47_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA47_32 = input.LA(1);
+
+                         
+                        int index47_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 46;}
+
+                         
+                        input.seek(index47_32);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA47_6 = input.LA(1);
+
+                         
+                        int index47_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (((synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.EVAL)))||synpred6()||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.FORALL)))||(synpred6()&&(validateIdentifierKey(DroolsSoftKeywords.NOT))))) ) {s = 7;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index47_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA47_26 = input.LA(1);
+
+                         
+                        int index47_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred6()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 46;}
+
+                         
+                        input.seek(index47_26);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 47, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA48_eotS =
+        "\173\uffff";
+    static final String DFA48_eofS =
+        "\173\uffff";
+    static final String DFA48_minS =
+        "\3\126\2\0\1\126\1\0\1\uffff\1\126\1\156\2\uffff\1\127\1\126\1\uffff"+
+        "\1\127\1\133\1\126\1\156\1\126\1\127\1\126\1\127\1\133\1\126\2\0"+
+        "\1\126\1\156\2\126\2\0\1\126\1\4\11\126\1\0\2\uffff\1\127\1\133"+
+        "\1\126\1\0\2\126\1\4\11\126\1\0\2\uffff\1\126\1\4\12\0\1\uffff\14"+
+        "\0\1\uffff\17\0\1\uffff\17\0";
+    static final String DFA48_maxS =
+        "\2\133\1\155\2\0\1\133\1\0\1\uffff\1\126\1\156\2\uffff\1\155\1\126"+
+        "\1\uffff\2\155\1\126\1\156\1\135\1\155\1\135\3\155\2\0\1\126\1\156"+
+        "\1\135\1\155\2\0\1\126\1\173\1\126\7\154\1\126\1\0\2\uffff\3\155"+
+        "\1\0\1\141\1\126\1\173\1\126\7\154\1\126\1\0\2\uffff\1\155\1\173"+
+        "\12\0\1\uffff\14\0\1\uffff\17\0\1\uffff\17\0";
+    static final String DFA48_acceptS =
+        "\7\uffff\1\1\2\uffff\2\2\2\uffff\1\3\36\uffff\2\3\21\uffff\2\3\14"+
+        "\uffff\1\3\14\uffff\1\3\17\uffff\1\3\17\uffff";
+    static final String DFA48_specialS =
+        "\2\uffff\1\5\1\2\1\1\1\uffff\1\7\22\uffff\1\0\1\6\4\uffff\1\3\1"+
+        "\11\13\uffff\1\12\5\uffff\1\4\14\uffff\1\10\73\uffff}>";
+    static final String[] DFA48_transitionS = {
+            "\1\2\4\uffff\1\1",
+            "\1\4\4\uffff\1\3",
+            "\1\7\1\10\3\uffff\1\6\2\uffff\1\5\16\uffff\1\11",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\14\4\uffff\1\15",
+            "\1\uffff",
+            "",
+            "\1\17",
+            "\1\20",
+            "",
+            "",
+            "\1\21\3\uffff\1\23\21\uffff\1\22",
+            "\1\24",
+            "",
+            "\1\10\3\uffff\1\25\21\uffff\1\11",
+            "\1\25\21\uffff\1\11",
+            "\1\26",
+            "\1\27",
+            "\1\30\4\uffff\1\31\1\uffff\1\32",
+            "\1\33\3\uffff\1\35\21\uffff\1\34",
+            "\1\36\4\uffff\1\37\1\uffff\1\40",
+            "\1\21\3\uffff\1\23\21\uffff\1\22",
+            "\1\23\21\uffff\1\22",
+            "\1\44\1\43\3\uffff\1\54\2\uffff\1\41\5\uffff\1\45\1\46\1\47"+
+            "\1\50\1\51\1\52\1\53\2\uffff\1\42",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\57",
+            "\1\60",
+            "\1\61\4\uffff\1\62\1\uffff\1\63",
+            "\1\67\1\66\3\uffff\1\77\2\uffff\1\64\5\uffff\1\70\1\71\1\72"+
+            "\1\73\1\74\1\75\1\76\2\uffff\1\65",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\102",
+            "\151\103\1\104\1\105\15\103",
+            "\1\106",
+            "\1\107\3\uffff\1\111\1\112\3\uffff\2\111\11\uffff\1\110\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\113\3\uffff\1\111\1\114\3\uffff\2\111\12\uffff\2\111",
+            "\1\115",
+            "\1\uffff",
+            "",
+            "",
+            "\1\33\3\uffff\1\35\21\uffff\1\34",
+            "\1\35\21\uffff\1\34",
+            "\1\123\1\122\3\uffff\1\120\2\uffff\1\117\5\uffff\1\124\1\125"+
+            "\1\126\1\127\1\130\1\131\1\132\2\uffff\1\121",
+            "\1\uffff",
+            "\1\134\6\uffff\1\136\3\uffff\1\135",
+            "\1\137",
+            "\151\140\1\141\1\142\15\140",
+            "\1\143",
+            "\1\144\3\uffff\1\145\1\146\3\uffff\2\145\11\uffff\1\147\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\150\3\uffff\1\145\1\151\3\uffff\2\145\12\uffff\2\145",
+            "\1\152",
+            "\1\uffff",
+            "",
+            "",
+            "\1\156\1\155\3\uffff\1\166\1\172\1\32\3\uffff\1\171\1\170\1"+
+            "\167\1\157\1\160\1\161\1\162\1\163\1\164\1\165\2\uffff\1\154",
+            "\151\103\1\104\1\105\15\103",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA48_eot = DFA.unpackEncodedString(DFA48_eotS);
+    static final short[] DFA48_eof = DFA.unpackEncodedString(DFA48_eofS);
+    static final char[] DFA48_min = DFA.unpackEncodedStringToUnsignedChars(DFA48_minS);
+    static final char[] DFA48_max = DFA.unpackEncodedStringToUnsignedChars(DFA48_maxS);
+    static final short[] DFA48_accept = DFA.unpackEncodedString(DFA48_acceptS);
+    static final short[] DFA48_special = DFA.unpackEncodedString(DFA48_specialS);
+    static final short[][] DFA48_transition;
+
+    static {
+        int numStates = DFA48_transitionS.length;
+        DFA48_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA48_transition[i] = DFA.unpackEncodedString(DFA48_transitionS[i]);
+        }
+    }
+
+    class DFA48 extends DFA {
+
+        public DFA48(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 48;
+            this.eot = DFA48_eot;
+            this.eof = DFA48_eof;
+            this.min = DFA48_min;
+            this.max = DFA48_max;
+            this.accept = DFA48_accept;
+            this.special = DFA48_special;
+            this.transition = DFA48_transition;
+        }
+        public String getDescription() {
+            return "521:3: ( ( LEFT_PAREN ( or_key | and_key ) )=> lhs_or | LEFT_PAREN lhs_or RIGHT_PAREN | lhs_pattern )";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA48_25 = input.LA(1);
+
+                         
+                        int index48_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 45;}
+
+                         
+                        input.seek(index48_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA48_4 = input.LA(1);
+
+                         
+                        int index48_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index48_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA48_3 = input.LA(1);
+
+                         
+                        int index48_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index48_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA48_31 = input.LA(1);
+
+                         
+                        int index48_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 64;}
+
+                         
+                        input.seek(index48_31);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA48_50 = input.LA(1);
+
+                         
+                        int index48_50 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 91;}
+
+                         
+                        input.seek(index48_50);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA48_2 = input.LA(1);
+
+                         
+                        int index48_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA48_2==COLON) ) {s = 5;}
+
+                        else if ( (LA48_2==LEFT_PAREN) ) {s = 6;}
+
+                        else if ( (LA48_2==ID) && (((synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifi!
 erKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))))) {s = 7;}
+
+                        else if ( (LA48_2==DOT) ) {s = 8;}
+
+                        else if ( (LA48_2==LEFT_SQUARE) ) {s = 9;}
+
+                         
+                        input.seek(index48_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA48_26 = input.LA(1);
+
+                         
+                        int index48_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 46;}
+
+                         
+                        input.seek(index48_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA48_6 = input.LA(1);
+
+                         
+                        int index48_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((synpred7()||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EVAL)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.EXISTS)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.NOT)))||(synpred7()&&(validateIdentifierKey(DroolsSoftKeywords.FORALL))))) ) {s = 7;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index48_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA48_63 = input.LA(1);
+
+                         
+                        int index48_63 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 107;}
+
+                         
+                        input.seek(index48_63);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA48_32 = input.LA(1);
+
+                         
+                        int index48_32 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 65;}
+
+                         
+                        input.seek(index48_32);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA48_44 = input.LA(1);
+
+                         
+                        int index48_44 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 7;}
+
+                        else if ( (true) ) {s = 78;}
+
+                         
+                        input.seek(index48_44);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 48, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA53_eotS =
+        "\13\uffff";
+    static final String DFA53_eofS =
+        "\13\uffff";
+    static final String DFA53_minS =
+        "\1\126\1\133\2\4\1\0\1\126\1\0\4\uffff";
+    static final String DFA53_maxS =
+        "\1\126\1\133\2\173\1\0\1\135\1\0\4\uffff";
+    static final String DFA53_acceptS =
+        "\7\uffff\1\1\2\2\1\1";
+    static final String DFA53_specialS =
+        "\4\uffff\1\1\1\0\1\2\4\uffff}>";
+    static final String[] DFA53_transitionS = {
+            "\1\1",
+            "\1\2",
+            "\127\3\1\4\1\3\1\5\36\3",
+            "\127\3\1\6\1\3\1\5\36\3",
+            "\1\uffff",
+            "\1\12\5\uffff\1\12\1\11",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA53_eot = DFA.unpackEncodedString(DFA53_eotS);
+    static final short[] DFA53_eof = DFA.unpackEncodedString(DFA53_eofS);
+    static final char[] DFA53_min = DFA.unpackEncodedStringToUnsignedChars(DFA53_minS);
+    static final char[] DFA53_max = DFA.unpackEncodedStringToUnsignedChars(DFA53_maxS);
+    static final short[] DFA53_accept = DFA.unpackEncodedString(DFA53_acceptS);
+    static final short[] DFA53_special = DFA.unpackEncodedString(DFA53_specialS);
+    static final short[][] DFA53_transition;
+
+    static {
+        int numStates = DFA53_transitionS.length;
+        DFA53_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA53_transition[i] = DFA.unpackEncodedString(DFA53_transitionS[i]);
+        }
+    }
+
+    class DFA53 extends DFA {
+
+        public DFA53(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 53;
+            this.eot = DFA53_eot;
+            this.eof = DFA53_eof;
+            this.min = DFA53_min;
+            this.max = DFA53_max;
+            this.accept = DFA53_accept;
+            this.special = DFA53_special;
+            this.transition = DFA53_transition;
+        }
+        public String getDescription() {
+            return "555:3: ( accumulate_init_clause | accumulate_id_clause )";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA53_5 = input.LA(1);
+
+                         
+                        int index53_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA53_5==RIGHT_PAREN) ) {s = 9;}
+
+                        else if ( (LA53_5==ID||LA53_5==COMMA) && ((validateIdentifierKey(DroolsSoftKeywords.INIT)))) {s = 10;}
+
+                         
+                        input.seek(index53_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA53_4 = input.LA(1);
+
+                         
+                        int index53_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.INIT))) ) {s = 7;}
+
+                        else if ( (true) ) {s = 8;}
+
+                         
+                        input.seek(index53_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA53_6 = input.LA(1);
+
+                         
+                        int index53_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.INIT))) ) {s = 10;}
+
+                        else if ( (true) ) {s = 9;}
+
+                         
+                        input.seek(index53_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 53, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA57_eotS =
+        "\13\uffff";
+    static final String DFA57_eofS =
+        "\13\uffff";
+    static final String DFA57_minS =
+        "\1\126\1\133\2\4\1\0\1\126\1\0\4\uffff";
+    static final String DFA57_maxS =
+        "\1\126\1\133\2\173\1\0\1\135\1\0\4\uffff";
+    static final String DFA57_acceptS =
+        "\7\uffff\1\1\1\2\1\1\1\2";
+    static final String DFA57_specialS =
+        "\1\4\1\2\1\1\1\0\1\5\1\6\1\3\4\uffff}>";
+    static final String[] DFA57_transitionS = {
+            "\1\1",
+            "\1\2",
+            "\127\3\1\4\1\3\1\5\36\3",
+            "\127\3\1\6\1\3\1\5\36\3",
+            "\1\uffff",
+            "\1\11\5\uffff\1\11\1\12",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA57_eot = DFA.unpackEncodedString(DFA57_eotS);
+    static final short[] DFA57_eof = DFA.unpackEncodedString(DFA57_eofS);
+    static final char[] DFA57_min = DFA.unpackEncodedStringToUnsignedChars(DFA57_minS);
+    static final char[] DFA57_max = DFA.unpackEncodedStringToUnsignedChars(DFA57_maxS);
+    static final short[] DFA57_accept = DFA.unpackEncodedString(DFA57_acceptS);
+    static final short[] DFA57_special = DFA.unpackEncodedString(DFA57_specialS);
+    static final short[][] DFA57_transition;
+
+    static {
+        int numStates = DFA57_transitionS.length;
+        DFA57_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA57_transition[i] = DFA.unpackEncodedString(DFA57_transitionS[i]);
+        }
+    }
+
+    class DFA57 extends DFA {
+
+        public DFA57(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 57;
+            this.eot = DFA57_eot;
+            this.eof = DFA57_eof;
+            this.min = DFA57_min;
+            this.max = DFA57_max;
+            this.accept = DFA57_accept;
+            this.special = DFA57_special;
+            this.transition = DFA57_transition;
+        }
+        public String getDescription() {
+            return "566:2: ( reverse_key pc3= paren_chunk ( COMMA )? )?";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA57_3 = input.LA(1);
+
+                         
+                        int index57_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_3==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 5;}
+
+                        else if ( ((LA57_3>=VT_COMPILATION_UNIT && LA57_3<=STRING)||LA57_3==COMMA||(LA57_3>=COLON && LA57_3<=MULTI_LINE_COMMENT)) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 3;}
+
+                        else if ( (LA57_3==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 6;}
+
+                         
+                        input.seek(index57_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA57_2 = input.LA(1);
+
+                         
+                        int index57_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((LA57_2>=VT_COMPILATION_UNIT && LA57_2<=STRING)||LA57_2==COMMA||(LA57_2>=COLON && LA57_2<=MULTI_LINE_COMMENT)) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 3;}
+
+                        else if ( (LA57_2==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 4;}
+
+                        else if ( (LA57_2==RIGHT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 5;}
+
+                         
+                        input.seek(index57_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA57_1 = input.LA(1);
+
+                         
+                        int index57_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_1==LEFT_PAREN) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 2;}
+
+                         
+                        input.seek(index57_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA57_6 = input.LA(1);
+
+                         
+                        int index57_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.REVERSE))) ) {s = 9;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RESULT))) ) {s = 10;}
+
+                         
+                        input.seek(index57_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA57_0 = input.LA(1);
+
+                         
+                        int index57_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_0==ID) && (((validateIdentifierKey(DroolsSoftKeywords.REVERSE))||(validateIdentifierKey(DroolsSoftKeywords.RESULT))))) {s = 1;}
+
+                         
+                        input.seek(index57_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA57_4 = input.LA(1);
+
+                         
+                        int index57_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( ((validateIdentifierKey(DroolsSoftKeywords.REVERSE))) ) {s = 7;}
+
+                        else if ( ((validateIdentifierKey(DroolsSoftKeywords.RESULT))) ) {s = 8;}
+
+                         
+                        input.seek(index57_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA57_5 = input.LA(1);
+
+                         
+                        int index57_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_5==ID||LA57_5==COMMA) && ((validateIdentifierKey(DroolsSoftKeywords.REVERSE)))) {s = 9;}
+
+                        else if ( (LA57_5==RIGHT_PAREN) && ((validateIdentifierKey(DroolsSoftKeywords.RESULT)))) {s = 10;}
+
+                         
+                        input.seek(index57_5);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 57, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA74_eotS =
+        "\45\uffff";
+    static final String DFA74_eofS =
+        "\45\uffff";
+    static final String DFA74_minS =
+        "\1\134\1\uffff\2\126\7\uffff\1\0\1\126\1\uffff\1\0\1\126\2\0\1\4"+
+        "\6\uffff\1\155\1\4\2\0\1\4\7\0";
+    static final String DFA74_maxS =
+        "\1\142\1\uffff\1\152\1\155\7\uffff\1\0\1\155\1\uffff\1\0\1\126\2"+
+        "\0\1\173\6\uffff\1\155\1\173\2\0\1\173\7\0";
+    static final String DFA74_acceptS =
+        "\1\uffff\1\2\2\uffff\7\1\2\uffff\1\1\5\uffff\6\1\14\uffff";
+    static final String DFA74_specialS =
+        "\2\uffff\1\7\1\6\7\uffff\1\1\1\2\1\uffff\1\3\1\uffff\1\0\1\4\11"+
+        "\uffff\1\10\1\5\10\uffff}>";
+    static final String[] DFA74_transitionS = {
+            "\2\1\3\uffff\1\2\1\1",
+            "",
+            "\1\3\4\uffff\1\13\10\uffff\1\4\1\5\1\6\1\7\1\10\1\11\1\12",
+            "\1\14\1\1\2\uffff\1\15\1\16\2\uffff\1\1\2\15\3\uffff\6\1\1\17"+
+            "\2\15\1\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\20\1\24\2\uffff\1\21\1\22\1\27\1\30\1\uffff\2\21\1\26\1\25"+
+            "\7\uffff\1\1\2\21\1\23",
+            "",
+            "\1\uffff",
+            "\1\31",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\36\1\32\3\36\1\35\1\33\1\36\1\34\1\36\2\35\12\36\2\35\17"+
+            "\36",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\37",
+            "\123\36\1\41\3\36\1\44\1\42\1\43\17\36\1\40\16\36",
+            "\1\uffff",
+            "\1\uffff",
+            "\127\36\1\44\1\42\1\43\36\36",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA74_eot = DFA.unpackEncodedString(DFA74_eotS);
+    static final short[] DFA74_eof = DFA.unpackEncodedString(DFA74_eofS);
+    static final char[] DFA74_min = DFA.unpackEncodedStringToUnsignedChars(DFA74_minS);
+    static final char[] DFA74_max = DFA.unpackEncodedStringToUnsignedChars(DFA74_maxS);
+    static final short[] DFA74_accept = DFA.unpackEncodedString(DFA74_acceptS);
+    static final short[] DFA74_special = DFA.unpackEncodedString(DFA74_specialS);
+    static final short[][] DFA74_transition;
+
+    static {
+        int numStates = DFA74_transitionS.length;
+        DFA74_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA74_transition[i] = DFA.unpackEncodedString(DFA74_transitionS[i]);
+        }
+    }
+
+    class DFA74 extends DFA {
+
+        public DFA74(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 74;
+            this.eot = DFA74_eot;
+            this.eof = DFA74_eof;
+            this.min = DFA74_min;
+            this.max = DFA74_max;
+            this.accept = DFA74_accept;
+            this.special = DFA74_special;
+            this.transition = DFA74_transition;
+        }
+        public String getDescription() {
+            return "()* loopback of 675:25: ( ( DOUBLE_PIPE )=> DOUBLE_PIPE and_restr_connective )*";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA74_16 = input.LA(1);
+
+                         
+                        int index74_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 24;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA74_11 = input.LA(1);
+
+                         
+                        int index74_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 13;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA74_12 = input.LA(1);
+
+                         
+                        int index74_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA74_12==ID) ) {s = 16;}
+
+                        else if ( (LA74_12==STRING||(LA74_12>=BOOL && LA74_12<=INT)||(LA74_12>=FLOAT && LA74_12<=NULL)) ) {s = 17;}
+
+                        else if ( (LA74_12==LEFT_PAREN) ) {s = 18;}
+
+                        else if ( (LA74_12==LEFT_SQUARE) && (synpred11())) {s = 19;}
+
+                        else if ( (LA74_12==DOT) && (synpred11())) {s = 20;}
+
+                        else if ( (LA74_12==DOUBLE_AMPER) && (synpred11())) {s = 21;}
+
+                        else if ( (LA74_12==DOUBLE_PIPE) && (synpred11())) {s = 22;}
+
+                        else if ( (LA74_12==COMMA) && (synpred11())) {s = 23;}
+
+                        else if ( (LA74_12==RIGHT_PAREN) && (synpred11())) {s = 24;}
+
+                        else if ( (LA74_12==GRAVE_ACCENT) ) {s = 1;}
+
+                         
+                        input.seek(index74_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA74_14 = input.LA(1);
+
+                         
+                        int index74_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 24;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA74_17 = input.LA(1);
+
+                         
+                        int index74_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 24;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA74_28 = input.LA(1);
+
+                         
+                        int index74_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 24;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA74_3 = input.LA(1);
+
+                         
+                        int index74_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA74_3==DOT||LA74_3==COLON||(LA74_3>=EQUAL && LA74_3<=NOT_EQUAL)||LA74_3==LEFT_SQUARE) ) {s = 1;}
+
+                        else if ( (LA74_3==ID) ) {s = 12;}
+
+                        else if ( (LA74_3==STRING||(LA74_3>=BOOL && LA74_3<=INT)||(LA74_3>=FLOAT && LA74_3<=NULL)) && (synpred11())) {s = 13;}
+
+                        else if ( (LA74_3==LEFT_PAREN) ) {s = 14;}
+
+                        else if ( (LA74_3==GRAVE_ACCENT) ) {s = 15;}
+
+                         
+                        input.seek(index74_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA74_2 = input.LA(1);
+
+                         
+                        int index74_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA74_2==ID) ) {s = 3;}
+
+                        else if ( (LA74_2==EQUAL) && (synpred11())) {s = 4;}
+
+                        else if ( (LA74_2==GREATER) && (synpred11())) {s = 5;}
+
+                        else if ( (LA74_2==GREATER_EQUAL) && (synpred11())) {s = 6;}
+
+                        else if ( (LA74_2==LESS) && (synpred11())) {s = 7;}
+
+                        else if ( (LA74_2==LESS_EQUAL) && (synpred11())) {s = 8;}
+
+                        else if ( (LA74_2==NOT_EQUAL) && (synpred11())) {s = 9;}
+
+                        else if ( (LA74_2==GRAVE_ACCENT) && (synpred11())) {s = 10;}
+
+                        else if ( (LA74_2==LEFT_PAREN) ) {s = 11;}
+
+                         
+                        input.seek(index74_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA74_27 = input.LA(1);
+
+                         
+                        int index74_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred11()) ) {s = 24;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index74_27);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 74, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String DFA75_eotS =
+        "\102\uffff";
+    static final String DFA75_eofS =
+        "\102\uffff";
+    static final String DFA75_minS =
+        "\1\134\1\uffff\2\126\7\uffff\2\126\1\uffff\1\4\2\126\1\0\7\uffff"+
+        "\2\0\1\4\6\uffff\1\4\2\0\2\4\13\0\1\uffff\17\0";
+    static final String DFA75_maxS =
+        "\1\142\1\uffff\1\152\1\155\7\uffff\1\152\1\155\1\uffff\1\173\1\126"+
+        "\1\155\1\0\7\uffff\2\0\1\173\6\uffff\1\173\2\0\2\173\13\0\1\uffff"+
+        "\17\0";
+    static final String DFA75_acceptS =
+        "\1\uffff\1\2\2\uffff\7\1\2\uffff\1\1\4\uffff\7\1\3\uffff\6\1\20"+
+        "\uffff\1\1\17\uffff";
+    static final String DFA75_specialS =
+        "\2\uffff\1\0\1\5\7\uffff\1\10\1\11\3\uffff\1\4\1\1\7\uffff\1\7\1"+
+        "\2\10\uffff\1\6\1\3\35\uffff}>";
+    static final String[] DFA75_transitionS = {
+            "\2\1\3\uffff\1\1\1\2",
+            "",
+            "\1\3\4\uffff\1\13\10\uffff\1\4\1\5\1\6\1\7\1\10\1\11\1\12",
+            "\1\14\1\1\2\uffff\1\15\1\16\2\uffff\1\1\2\15\3\uffff\6\1\1\17"+
+            "\2\15\1\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\20\4\uffff\1\21\10\uffff\1\22\1\23\1\24\1\25\1\26\1\27\1"+
+            "\30",
+            "\1\31\1\35\2\uffff\1\32\1\33\1\40\1\41\1\uffff\2\32\1\36\1\37"+
+            "\7\uffff\1\1\2\32\1\34",
+            "",
+            "\122\55\1\42\3\55\1\54\1\43\1\55\1\44\1\55\2\54\3\55\1\45\1"+
+            "\46\1\47\1\50\1\51\1\52\1\53\2\54\17\55",
+            "\1\56",
+            "\1\57\1\1\2\uffff\1\62\1\61\2\uffff\1\1\2\62\3\uffff\6\1\1\60"+
+            "\2\62\1\1",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\67\1\63\3\67\1\66\1\64\1\67\1\65\1\67\2\66\12\67\2\66\17"+
+            "\67",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\122\55\1\70\1\74\2\55\1\71\1\72\1\75\1\76\1\55\2\71\11\55\1"+
+            "\77\2\71\1\73\16\55",
+            "\1\uffff",
+            "\1\uffff",
+            "\122\55\1\100\3\55\1\71\1\101\1\55\1\44\1\55\2\71\12\55\2\71"+
+            "\17\55",
+            "\122\55\1\100\3\55\1\71\1\101\1\55\1\44\1\55\2\71\12\55\2\71"+
+            "\17\55",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff"
+    };
+
+    static final short[] DFA75_eot = DFA.unpackEncodedString(DFA75_eotS);
+    static final short[] DFA75_eof = DFA.unpackEncodedString(DFA75_eofS);
+    static final char[] DFA75_min = DFA.unpackEncodedStringToUnsignedChars(DFA75_minS);
+    static final char[] DFA75_max = DFA.unpackEncodedStringToUnsignedChars(DFA75_maxS);
+    static final short[] DFA75_accept = DFA.unpackEncodedString(DFA75_acceptS);
+    static final short[] DFA75_special = DFA.unpackEncodedString(DFA75_specialS);
+    static final short[][] DFA75_transition;
+
+    static {
+        int numStates = DFA75_transitionS.length;
+        DFA75_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA75_transition[i] = DFA.unpackEncodedString(DFA75_transitionS[i]);
+        }
+    }
+
+    class DFA75 extends DFA {
+
+        public DFA75(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 75;
+            this.eot = DFA75_eot;
+            this.eof = DFA75_eof;
+            this.min = DFA75_min;
+            this.max = DFA75_max;
+            this.accept = DFA75_accept;
+            this.special = DFA75_special;
+            this.transition = DFA75_transition;
+        }
+        public String getDescription() {
+            return "()* loopback of 679:26: ( ( DOUBLE_AMPER )=> DOUBLE_AMPER constraint_expression )*";
+        }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA75_2 = input.LA(1);
+
+                         
+                        int index75_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA75_2==ID) ) {s = 3;}
+
+                        else if ( (LA75_2==EQUAL) && (synpred12())) {s = 4;}
+
+                        else if ( (LA75_2==GREATER) && (synpred12())) {s = 5;}
+
+                        else if ( (LA75_2==GREATER_EQUAL) && (synpred12())) {s = 6;}
+
+                        else if ( (LA75_2==LESS) && (synpred12())) {s = 7;}
+
+                        else if ( (LA75_2==LESS_EQUAL) && (synpred12())) {s = 8;}
+
+                        else if ( (LA75_2==NOT_EQUAL) && (synpred12())) {s = 9;}
+
+                        else if ( (LA75_2==GRAVE_ACCENT) && (synpred12())) {s = 10;}
+
+                        else if ( (LA75_2==LEFT_PAREN) ) {s = 11;}
+
+                         
+                        input.seek(index75_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA75_17 = input.LA(1);
+
+                         
+                        int index75_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred12()) ) {s = 50;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index75_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA75_26 = input.LA(1);
+
+                         
+                        int index75_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred12()) ) {s = 50;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index75_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA75_36 = input.LA(1);
+
+                         
+                        int index75_36 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred12()) ) {s = 50;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index75_36);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA75_16 = input.LA(1);
+
+                         
+                        int index75_16 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA75_16==DOT||LA75_16==COLON||(LA75_16>=EQUAL && LA75_16<=NOT_EQUAL)||LA75_16==LEFT_SQUARE) ) {s = 1;}
+
+                        else if ( (LA75_16==ID) ) {s = 47;}
+
+                        else if ( (LA75_16==GRAVE_ACCENT) ) {s = 48;}
+
+                        else if ( (LA75_16==LEFT_PAREN) ) {s = 49;}
+
+                        else if ( (LA75_16==STRING||(LA75_16>=BOOL && LA75_16<=INT)||(LA75_16>=FLOAT && LA75_16<=NULL)) && (synpred12())) {s = 50;}
+
+                         
+                        input.seek(index75_16);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA75_3 = input.LA(1);
+
+                         
+                        int index75_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA75_3==DOT||LA75_3==COLON||(LA75_3>=EQUAL && LA75_3<=NOT_EQUAL)||LA75_3==LEFT_SQUARE) ) {s = 1;}
+
+                        else if ( (LA75_3==ID) ) {s = 12;}
+
+                        else if ( (LA75_3==STRING||(LA75_3>=BOOL && LA75_3<=INT)||(LA75_3>=FLOAT && LA75_3<=NULL)) && (synpred12())) {s = 13;}
+
+                        else if ( (LA75_3==LEFT_PAREN) ) {s = 14;}
+
+                        else if ( (LA75_3==GRAVE_ACCENT) ) {s = 15;}
+
+                         
+                        input.seek(index75_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA75_35 = input.LA(1);
+
+                         
+                        int index75_35 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred12()) ) {s = 50;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index75_35);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA75_25 = input.LA(1);
+
+                         
+                        int index75_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred12()) ) {s = 50;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index75_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA75_11 = input.LA(1);
+
+                         
+                        int index75_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA75_11==ID) ) {s = 16;}
+
+                        else if ( (LA75_11==LEFT_PAREN) ) {s = 17;}
+
+                        else if ( (LA75_11==EQUAL) && (synpred12())) {s = 18;}
+
+                        else if ( (LA75_11==GREATER) && (synpred12())) {s = 19;}
+
+                        else if ( (LA75_11==GREATER_EQUAL) && (synpred12())) {s = 20;}
+
+                        else if ( (LA75_11==LESS) && (synpred12())) {s = 21;}
+
+                        else if ( (LA75_11==LESS_EQUAL) && (synpred12())) {s = 22;}
+
+                        else if ( (LA75_11==NOT_EQUAL) && (synpred12())) {s = 23;}
+
+                        else if ( (LA75_11==GRAVE_ACCENT) && (synpred12())) {s = 24;}
+
+                         
+                        input.seek(index75_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA75_12 = input.LA(1);
+
+                         
+                        int index75_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA75_12==ID) ) {s = 25;}
+
+                        else if ( (LA75_12==STRING||(LA75_12>=BOOL && LA75_12<=INT)||(LA75_12>=FLOAT && LA75_12<=NULL)) ) {s = 26;}
+
+                        else if ( (LA75_12==LEFT_PAREN) ) {s = 27;}
+
+                        else if ( (LA75_12==GRAVE_ACCENT) ) {s = 1;}
+
+                        else if ( (LA75_12==LEFT_SQUARE) && (synpred12())) {s = 28;}
+
+                        else if ( (LA75_12==DOT) && (synpred12())) {s = 29;}
+
+                        else if ( (LA75_12==DOUBLE_PIPE) && (synpred12())) {s = 30;}
+
+                        else if ( (LA75_12==DOUBLE_AMPER) && (synpred12())) {s = 31;}
+
+                        else if ( (LA75_12==COMMA) && (synpred12())) {s = 32;}
+
+                        else if ( (LA75_12==RIGHT_PAREN) && (synpred12())) {s = 33;}
+
+                         
+                        input.seek(index75_12);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 75, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    public static final BitSet FOLLOW_package_statement_in_compilation_unit400 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_statement_in_compilation_unit405 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_EOF_in_compilation_unit410 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_package_key_in_package_statement461 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_package_id_in_package_statement463 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_package_statement465 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_package_id489 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_DOT_in_package_id495 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_package_id499 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_rule_attribute_in_statement527 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_import_statement_in_statement534 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_statement_in_statement540 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_global_in_statement546 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_in_statement552 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_template_in_statement557 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule_in_statement562 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_in_statement567 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_key_in_import_statement589 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_import_name_in_import_statement591 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_import_statement594 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_key_in_function_import_statement629 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_function_key_in_function_import_statement631 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_import_name_in_function_import_statement633 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_function_import_statement636 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_import_name665 = new BitSet(new long[]{0x0000000000000002L,0x0000000001800000L});
+    public static final BitSet FOLLOW_DOT_in_import_name671 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_import_name675 = new BitSet(new long[]{0x0000000000000002L,0x0000000001800000L});
+    public static final BitSet FOLLOW_DOT_STAR_in_import_name682 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_global_key_in_global722 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_data_type_in_global724 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_global_id_in_global726 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_global728 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_global_id754 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_key_in_function786 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_data_type_in_function788 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_function_id_in_function791 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_parameters_in_function793 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000000L});
+    public static final BitSet FOLLOW_curly_chunk_in_function795 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_function_id825 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_key_in_query857 = new BitSet(new long[]{0x0000000000000000L,0x0000000004400000L});
+    public static final BitSet FOLLOW_query_id_in_query859 = new BitSet(new long[]{0x0000000000000000L,0x000000000A400000L});
+    public static final BitSet FOLLOW_parameters_in_query861 = new BitSet(new long[]{0x0000000000000000L,0x000000000A400000L});
+    public static final BitSet FOLLOW_normal_lhs_block_in_query864 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_END_in_query866 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_query868 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_query_id900 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_query_id916 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_parameters935 = new BitSet(new long[]{0x0000000000000000L,0x0000000020400000L});
+    public static final BitSet FOLLOW_param_definition_in_parameters942 = new BitSet(new long[]{0x0000000000000000L,0x0000000030000000L});
+    public static final BitSet FOLLOW_COMMA_in_parameters945 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_param_definition_in_parameters947 = new BitSet(new long[]{0x0000000000000000L,0x0000000030000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_parameters956 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_data_type_in_param_definition980 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_argument_in_param_definition983 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_argument994 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_dimension_definition_in_argument996 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_template_key_in_template1020 = new BitSet(new long[]{0x0000000000000000L,0x0000000004400000L});
+    public static final BitSet FOLLOW_template_id_in_template1022 = new BitSet(new long[]{0x0000000000000000L,0x0000000000600000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_template1024 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_template_slot_in_template1029 = new BitSet(new long[]{0x0000000000000000L,0x0000000002400000L});
+    public static final BitSet FOLLOW_END_in_template1034 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_template1036 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_template_id1066 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_template_id1082 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_data_type_in_template_slot1102 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_slot_id_in_template_slot1104 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_template_slot1106 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_slot_id1131 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule_key_in_rule1160 = new BitSet(new long[]{0x0000000000000000L,0x0000000004400000L});
+    public static final BitSet FOLLOW_rule_id_in_rule1162 = new BitSet(new long[]{0x0000000000000000L,0x0000800000400000L});
+    public static final BitSet FOLLOW_rule_attributes_in_rule1164 = new BitSet(new long[]{0x0000000000000000L,0x0000800000400000L});
+    public static final BitSet FOLLOW_when_part_in_rule1167 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000000L});
+    public static final BitSet FOLLOW_rhs_chunk_in_rule1170 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_when_key_in_when_part1199 = new BitSet(new long[]{0x0000000000000002L,0x0000000048400000L});
+    public static final BitSet FOLLOW_COLON_in_when_part1201 = new BitSet(new long[]{0x0000000000000002L,0x0000000008400000L});
+    public static final BitSet FOLLOW_normal_lhs_block_in_when_part1204 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_rule_id1225 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_rule_id1241 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_attributes_key_in_rule_attributes1262 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_COLON_in_rule_attributes1264 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1269 = new BitSet(new long[]{0x0000000000000002L,0x0000000010400000L});
+    public static final BitSet FOLLOW_COMMA_in_rule_attributes1273 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1278 = new BitSet(new long[]{0x0000000000000002L,0x0000000010400000L});
+    public static final BitSet FOLLOW_salience_in_rule_attribute1317 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_no_loop_in_rule_attribute1323 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_agenda_group_in_rule_attribute1330 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_duration_in_rule_attribute1337 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_activation_group_in_rule_attribute1344 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_auto_focus_in_rule_attribute1350 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_effective_in_rule_attribute1356 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_expires_in_rule_attribute1362 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_enabled_in_rule_attribute1368 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleflow_group_in_rule_attribute1374 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lock_on_active_in_rule_attribute1380 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_dialect_in_rule_attribute1385 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_effective_key_in_date_effective1397 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_date_effective1400 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_expires_key_in_date_expires1411 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_date_expires1414 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_enabled_key_in_enabled1428 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
+    public static final BitSet FOLLOW_BOOL_in_enabled1431 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_salience_key_in_salience1443 = new BitSet(new long[]{0x0000000000000000L,0x0000000108000000L});
+    public static final BitSet FOLLOW_INT_in_salience1450 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_in_salience1459 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_no_loop_key_in_no_loop1475 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
+    public static final BitSet FOLLOW_BOOL_in_no_loop1478 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_auto_focus_key_in_auto_focus1490 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
+    public static final BitSet FOLLOW_BOOL_in_auto_focus1493 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_activation_group_key_in_activation_group1507 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_activation_group1510 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleflow_group_key_in_ruleflow_group1521 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_ruleflow_group1524 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_agenda_group_key_in_agenda_group1535 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_agenda_group1538 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_duration_key_in_duration1549 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_INT_in_duration1552 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_dialect_key_in_dialect1566 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_STRING_in_dialect1569 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lock_on_active_key_in_lock_on_active1587 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
+    public static final BitSet FOLLOW_BOOL_in_lock_on_active1590 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_in_normal_lhs_block1602 = new BitSet(new long[]{0x0000000000000002L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs1623 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_or1644 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_or_key_in_lhs_or1648 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1650 = new BitSet(new long[]{0x0000000000000000L,0x0000000028400000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_or1653 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1674 = new BitSet(new long[]{0x0000000000000002L,0x0000000200400000L});
+    public static final BitSet FOLLOW_or_key_in_lhs_or1696 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_lhs_or1703 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1708 = new BitSet(new long[]{0x0000000000000002L,0x0000000200400000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_and1746 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_and_key_in_lhs_and1750 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1752 = new BitSet(new long[]{0x0000000000000000L,0x0000000028400000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_and1755 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1776 = new BitSet(new long[]{0x0000000000000002L,0x0000000400400000L});
+    public static final BitSet FOLLOW_and_key_in_lhs_and1798 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_lhs_and1805 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1810 = new BitSet(new long[]{0x0000000000000002L,0x0000000400400000L});
+    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary1848 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_lhs_not_in_lhs_unary1854 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary1860 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_lhs_forall_in_lhs_unary1866 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_unary1872 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_unary1875 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_unary1877 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_pattern_source_in_lhs_unary1883 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_lhs_unary1897 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_exists_key_in_lhs_exist1911 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_exist1935 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_exist1942 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_exist1944 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_exist1946 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_exist1959 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_not_key_in_lhs_not2005 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_not2022 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_not2029 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_not2031 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_not2033 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_not2041 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_eval_key_in_lhs_eval2080 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_lhs_eval2084 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_forall_key_in_lhs_forall2108 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_forall2110 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2112 = new BitSet(new long[]{0x0000000000000000L,0x0000000020400000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_forall2115 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_pattern_source2147 = new BitSet(new long[]{0x0000000000000002L,0x0000000000400000L});
+    public static final BitSet FOLLOW_from_key_in_pattern_source2156 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_accumulate_statement_in_pattern_source2172 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_collect_statement_in_pattern_source2188 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_entrypoint_statement_in_pattern_source2205 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_from_source_in_pattern_source2221 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accumulate_key_in_accumulate_statement2249 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_accumulate_statement2253 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_lhs_or_in_accumulate_statement2255 = new BitSet(new long[]{0x0000000000000000L,0x0000000010400000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2257 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_accumulate_init_clause_in_accumulate_statement2265 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_accumulate_id_clause_in_accumulate_statement2271 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_accumulate_statement2279 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_init_key_in_accumulate_init_clause2308 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_init_clause2313 = new BitSet(new long[]{0x0000000000000000L,0x0000000010400000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_init_clause2315 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_action_key_in_accumulate_init_clause2319 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_init_clause2323 = new BitSet(new long[]{0x0000000000000000L,0x0000000010400000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_init_clause2325 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_reverse_key_in_accumulate_init_clause2331 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_init_clause2335 = new BitSet(new long[]{0x0000000000000000L,0x0000000010400000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_init_clause2337 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_result_key_in_accumulate_init_clause2343 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_init_clause2347 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_accumulate_id_clause2396 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_id_clause2400 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_collect_key_in_collect_statement2422 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_collect_statement2426 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_pattern_source_in_collect_statement2428 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_collect_statement2430 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_entry_point_key_in_entrypoint_statement2452 = new BitSet(new long[]{0x0000000000000000L,0x0000000004400000L});
+    public static final BitSet FOLLOW_entrypoint_id_in_entrypoint_statement2454 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_entrypoint_id2477 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_entrypoint_id2490 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_from_source2506 = new BitSet(new long[]{0x0000000000000002L,0x0000000008800000L});
+    public static final BitSet FOLLOW_paren_chunk_in_from_source2519 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_expression_chain_in_from_source2526 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOT_in_expression_chain2558 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_expression_chain2560 = new BitSet(new long[]{0x0000000000000002L,0x0000200008800000L});
+    public static final BitSet FOLLOW_square_chunk_in_expression_chain2580 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_paren_chunk_in_expression_chain2602 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_expression_chain_in_expression_chain2613 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_binding_in_lhs_pattern2646 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_in_lhs_pattern2659 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_label_in_fact_binding2679 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_fact_in_fact_binding2685 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_fact_binding2692 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_fact_binding_expression_in_fact_binding2694 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact_binding2696 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_in_fact_binding_expression2735 = new BitSet(new long[]{0x0000000000000002L,0x0000000200400000L});
+    public static final BitSet FOLLOW_or_key_in_fact_binding_expression2747 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_fact_binding_expression2753 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_fact_in_fact_binding_expression2758 = new BitSet(new long[]{0x0000000000000002L,0x0000000200400000L});
+    public static final BitSet FOLLOW_pattern_type_in_fact2798 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_fact2800 = new BitSet(new long[]{0x0000000000000000L,0x0000000028400000L});
+    public static final BitSet FOLLOW_constraints_in_fact2802 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact2805 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_constraint_in_constraints2830 = new BitSet(new long[]{0x0000000000000002L,0x0000000010000000L});
+    public static final BitSet FOLLOW_COMMA_in_constraints2834 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_constraint_in_constraints2837 = new BitSet(new long[]{0x0000000000000002L,0x0000000010000000L});
+    public static final BitSet FOLLOW_or_constr_in_constraint2851 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_constr_in_or_constr2862 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_constr2866 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_and_constr_in_or_constr2869 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+    public static final BitSet FOLLOW_unary_constr_in_and_constr2884 = new BitSet(new long[]{0x0000000000000002L,0x0000000400000000L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_constr2888 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_unary_constr_in_and_constr2891 = new BitSet(new long[]{0x0000000000000002L,0x0000000400000000L});
+    public static final BitSet FOLLOW_eval_key_in_unary_constr2912 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_unary_constr2915 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_field_constraint_in_unary_constr2920 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_unary_constr2925 = new BitSet(new long[]{0x0000000000000000L,0x0000000008400000L});
+    public static final BitSet FOLLOW_or_constr_in_unary_constr2928 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_unary_constr2930 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_label_in_field_constraint2944 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_accessor_path_in_field_constraint2946 = new BitSet(new long[]{0x0000000000000002L,0x000007F808400000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint2950 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ARROW_in_field_constraint2956 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_paren_chunk_in_field_constraint2958 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accessor_path_in_field_constraint3012 = new BitSet(new long[]{0x0000000000000000L,0x000007F008400000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint3014 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_label3038 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_COLON_in_label3040 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3056 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_restr_connective3064 = new BitSet(new long[]{0x0000000000000000L,0x000007F008400000L});
+    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3067 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3082 = new BitSet(new long[]{0x0000000000000002L,0x0000000400000000L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_restr_connective3090 = new BitSet(new long[]{0x0000000000000000L,0x000007F008400000L});
+    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3093 = new BitSet(new long[]{0x0000000000000002L,0x0000000400000000L});
+    public static final BitSet FOLLOW_compound_operator_in_constraint_expression3115 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_operator_in_constraint_expression3120 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_constraint_expression3125 = new BitSet(new long[]{0x0000000000000000L,0x000007F008400000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_constraint_expression3128 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_constraint_expression3130 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EQUAL_in_simple_operator3142 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_GREATER_in_simple_operator3148 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_GREATER_EQUAL_in_simple_operator3154 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_LESS_in_simple_operator3160 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_LESS_EQUAL_in_simple_operator3166 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_NOT_EQUAL_in_simple_operator3172 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_not_key_in_simple_operator3178 = new BitSet(new long[]{0x0000000000000000L,0x0000040000400000L});
+    public static final BitSet FOLLOW_contains_key_in_simple_operator3181 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_soundslike_key_in_simple_operator3184 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_matches_key_in_simple_operator3187 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_memberof_key_in_simple_operator3190 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_ID_in_simple_operator3194 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_GRAVE_ACCENT_in_simple_operator3199 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_simple_operator3202 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
+    public static final BitSet FOLLOW_square_chunk_in_simple_operator3205 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_contains_key_in_simple_operator3211 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_excludes_key_in_simple_operator3217 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_matches_key_in_simple_operator3223 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_soundslike_key_in_simple_operator3229 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_memberof_key_in_simple_operator3235 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_ID_in_simple_operator3241 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_GRAVE_ACCENT_in_simple_operator3247 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_simple_operator3250 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
+    public static final BitSet FOLLOW_square_chunk_in_simple_operator3253 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_expression_value_in_simple_operator3257 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_in_key_in_compound_operator3272 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_not_key_in_compound_operator3277 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_in_key_in_compound_operator3279 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_compound_operator3284 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_expression_value_in_compound_operator3287 = new BitSet(new long[]{0x0000000000000000L,0x0000000030000000L});
+    public static final BitSet FOLLOW_COMMA_in_compound_operator3291 = new BitSet(new long[]{0x0000000000000000L,0x000018018C400000L});
+    public static final BitSet FOLLOW_expression_value_in_compound_operator3294 = new BitSet(new long[]{0x0000000000000000L,0x0000000030000000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_compound_operator3299 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accessor_path_in_expression_value3310 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_literal_constraint_in_expression_value3315 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_in_expression_value3321 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_set_in_literal_constraint0 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_pattern_type3365 = new BitSet(new long[]{0x0000000000000002L,0x0000200000800000L});
+    public static final BitSet FOLLOW_DOT_in_pattern_type3371 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_pattern_type3375 = new BitSet(new long[]{0x0000000000000002L,0x0000200000800000L});
+    public static final BitSet FOLLOW_dimension_definition_in_pattern_type3390 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_ID_in_data_type3416 = new BitSet(new long[]{0x0000000000000002L,0x0000200000800000L});
+    public static final BitSet FOLLOW_DOT_in_data_type3420 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_data_type3422 = new BitSet(new long[]{0x0000000000000002L,0x0000200000800000L});
+    public static final BitSet FOLLOW_dimension_definition_in_data_type3427 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_dimension_definition3453 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_dimension_definition3455 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accessor_element_in_accessor_path3466 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_DOT_in_accessor_path3470 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_accessor_element_in_accessor_path3472 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_ID_in_accessor_element3496 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_square_chunk_in_accessor_element3498 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_rhs_chunk_data_in_rhs_chunk3527 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_THEN_in_rhs_chunk_data3546 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_set_in_rhs_chunk_data3550 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_END_in_rhs_chunk_data3556 = new BitSet(new long[]{0x0000000000000002L,0x0000000000200000L});
+    public static final BitSet FOLLOW_SEMICOLON_in_rhs_chunk_data3558 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_curly_chunk_data_in_curly_chunk3575 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_CURLY_in_curly_chunk_data3594 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_set_in_curly_chunk_data3597 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_curly_chunk_data_in_curly_chunk_data3611 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_RIGHT_CURLY_in_curly_chunk_data3616 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_data_in_paren_chunk3632 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_paren_chunk_data3652 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_set_in_paren_chunk_data3655 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_paren_chunk_data_in_paren_chunk_data3669 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_paren_chunk_data3674 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_square_chunk_data_in_square_chunk3691 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_square_chunk_data3710 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_set_in_square_chunk_data3713 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_square_chunk_data_in_square_chunk_data3727 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0FFFFFFFFFFFFFFFL});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_square_chunk_data3732 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_date_effective_key3751 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_date_effective_key3753 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_date_effective_key3755 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_date_expires_key3781 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_date_expires_key3783 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_date_expires_key3785 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_lock_on_active_key3811 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_lock_on_active_key3813 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_lock_on_active_key3815 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_lock_on_active_key3817 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_lock_on_active_key3819 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_no_loop_key3845 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_no_loop_key3847 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_no_loop_key3849 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_auto_focus_key3875 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_auto_focus_key3877 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_auto_focus_key3879 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_activation_group_key3905 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_activation_group_key3907 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_activation_group_key3909 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_agenda_group_key3935 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_agenda_group_key3937 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_agenda_group_key3939 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_ruleflow_group_key3965 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_ruleflow_group_key3967 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_ruleflow_group_key3969 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_duration_key3994 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_package_key4016 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_import_key4038 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_dialect_key4060 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_salience_key4082 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_enabled_key4104 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_attributes_key4126 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_when_key4148 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_rule_key4170 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_template_key4192 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_query_key4214 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_declare_key4236 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_function_key4258 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_global_key4280 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_eval_key4302 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_contains_key4324 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_matches_key4346 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_excludes_key4368 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_soundslike_key4390 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_memberof_key4412 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_not_key4434 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_in_key4456 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_or_key4478 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_and_key4500 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_exists_key4522 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_forall_key4544 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_from_key4566 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_entry_point_key4589 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_MISC_in_entry_point_key4591 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_ID_in_entry_point_key4593 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_accumulate_key4618 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_init_key4640 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_action_key4662 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_reverse_key4684 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_result_key4706 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_collect_key4728 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred11638 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_or_key_in_synpred11640 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_or_key_in_synpred21687 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_synpred21689 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred31740 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_and_key_in_synpred31742 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_key_in_synpred41789 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_synpred41791 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SEMICOLON_in_synpred51893 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred61925 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_or_key_in_synpred61928 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_key_in_synpred61930 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred72012 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_or_key_in_synpred72015 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_key_in_synpred72017 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred82513 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_synpred92574 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred102596 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_synpred113060 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_synpred123086 = new BitSet(new long[]{0x0000000000000002L});
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DescrBuilderTree.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,4274 @@
+// $ANTLR 3.0.1 /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g 2008-06-05 13:52:43
+
+	package org.drools.lang;
+
+	import java.util.HashMap;
+	import java.util.Map;
+	import java.util.LinkedList;
+	import org.drools.lang.descr.DescrFactory;
+	import org.drools.lang.descr.BaseDescr;
+	import org.drools.lang.descr.PackageDescr;
+	import org.drools.lang.descr.AttributeDescr;
+	import org.drools.lang.descr.ImportDescr;
+	import org.drools.lang.descr.FunctionImportDescr;
+	import org.drools.lang.descr.GlobalDescr;
+	import org.drools.lang.descr.FunctionDescr;
+	import org.drools.lang.descr.FactTemplateDescr;
+	import org.drools.lang.descr.FieldTemplateDescr;
+	import org.drools.lang.descr.AndDescr;
+	import org.drools.lang.descr.QueryDescr;
+	import org.drools.lang.descr.RuleDescr;
+	import org.drools.lang.descr.PatternSourceDescr;
+	import org.drools.lang.descr.AccumulateDescr;
+	import org.drools.lang.descr.AccessorDescr;
+	import org.drools.lang.descr.DeclarativeInvokerDescr;
+	import org.drools.lang.descr.FromDescr;
+	import org.drools.lang.descr.FieldConstraintDescr;
+
+
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+public class DescrBuilderTree extends TreeParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VT_COMPILATION_UNIT", "VT_FUNCTION_IMPORT", "VT_FACT", "VT_CONSTRAINTS", "VT_LABEL", "VT_QUERY_ID", "VT_TEMPLATE_ID", "VT_RULE_ID", "VT_ENTRYPOINT_ID", "VT_SLOT_ID", "VT_SLOT", "VT_RULE_ATTRIBUTES", "VT_RHS_CHUNK", "VT_CURLY_CHUNK", "VT_SQUARE_CHUNK", "VT_PAREN_CHUNK", "VT_AND_IMPLICIT", "VT_AND_PREFIX", "VT_OR_PREFIX", "VT_AND_INFIX", "VT_OR_INFIX", "VT_ACCUMULATE_INIT_CLAUSE", "VT_ACCUMULATE_ID_CLAUSE", "VT_FROM_SOURCE", "VT_EXPRESSION_CHAIN", "VT_PATTERN", "VT_FACT_BINDING", "VT_FACT_OR", "VT_BIND_FIELD", "VT_FIELD", "VT_ACCESSOR_PATH", "VT_ACCESSOR_ELEMENT", "VT_DATA_TYPE", "VT_PATTERN_TYPE", "VT_PACKAGE_ID", "VT_IMPORT_ID", "VT_GLOBAL_ID", "VT_FUNCTION_ID", "VT_PARAM_LIST", "VK_DATE_EFFECTIVE", "VK_DATE_EXPIRES", "VK_LOCK_ON_ACTIVE", "VK_NO_LOOP", "VK_AUTO_FOCUS", "VK_ACTIVATION_GROUP", "VK_AGENDA_GROUP", "VK_RULEFLOW_GROUP", "VK_DURATION", "VK_DIALECT", "VK_SALIENCE", "VK_ENABLED", "VK_ATTRIBUTES", "VK_WHEN", "VK_RULE",!
  "VK_IMPORT", "VK_PACKAGE", "VK_TEMPLATE", "VK_QUERY", "VK_DECLARE", "VK_FUNCTION", "VK_GLOBAL", "VK_EVAL", "VK_CONTAINS", "VK_MATCHES", "VK_EXCLUDES", "VK_SOUNDSLIKE", "VK_MEMBEROF", "VK_ENTRY_POINT", "VK_NOT", "VK_IN", "VK_OR", "VK_AND", "VK_EXISTS", "VK_FORALL", "VK_FROM", "VK_ACCUMULATE", "VK_INIT", "VK_ACTION", "VK_REVERSE", "VK_RESULT", "VK_COLLECT", "SEMICOLON", "ID", "DOT", "DOT_STAR", "END", "STRING", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "COLON", "BOOL", "INT", "DOUBLE_PIPE", "DOUBLE_AMPER", "ARROW", "EQUAL", "GREATER", "GREATER_EQUAL", "LESS", "LESS_EQUAL", "NOT_EQUAL", "GRAVE_ACCENT", "FLOAT", "NULL", "LEFT_SQUARE", "RIGHT_SQUARE", "THEN", "LEFT_CURLY", "RIGHT_CURLY", "MISC", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT"
+    };
+    public static final int COMMA=92;
+    public static final int VT_PATTERN_TYPE=37;
+    public static final int VT_ACCUMULATE_ID_CLAUSE=26;
+    public static final int VK_DIALECT=52;
+    public static final int VK_FUNCTION=63;
+    public static final int END=89;
+    public static final int HexDigit=118;
+    public static final int VK_ATTRIBUTES=55;
+    public static final int VT_EXPRESSION_CHAIN=28;
+    public static final int VK_ACCUMULATE=79;
+    public static final int MISC=114;
+    public static final int VT_AND_PREFIX=21;
+    public static final int VK_QUERY=61;
+    public static final int THEN=111;
+    public static final int VK_AUTO_FOCUS=47;
+    public static final int DOT=87;
+    public static final int VK_IMPORT=58;
+    public static final int VT_SLOT=14;
+    public static final int VT_PACKAGE_ID=38;
+    public static final int LEFT_SQUARE=109;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=121;
+    public static final int VT_DATA_TYPE=36;
+    public static final int VK_MATCHES=67;
+    public static final int VT_FACT=6;
+    public static final int LEFT_CURLY=112;
+    public static final int LEFT_PAREN=91;
+    public static final int DOUBLE_AMPER=98;
+    public static final int VT_QUERY_ID=9;
+    public static final int VT_ACCESSOR_PATH=34;
+    public static final int VT_LABEL=8;
+    public static final int VT_ENTRYPOINT_ID=12;
+    public static final int VK_SOUNDSLIKE=69;
+    public static final int VK_SALIENCE=53;
+    public static final int VT_FIELD=33;
+    public static final int WS=116;
+    public static final int STRING=90;
+    public static final int VK_AND=75;
+    public static final int VT_ACCESSOR_ELEMENT=35;
+    public static final int VK_GLOBAL=64;
+    public static final int VT_ACCUMULATE_INIT_CLAUSE=25;
+    public static final int VK_REVERSE=82;
+    public static final int GRAVE_ACCENT=106;
+    public static final int VK_DURATION=51;
+    public static final int VT_SQUARE_CHUNK=18;
+    public static final int VK_FORALL=77;
+    public static final int VT_COMPILATION_UNIT=4;
+    public static final int VT_PAREN_CHUNK=19;
+    public static final int VK_ENABLED=54;
+    public static final int VK_RESULT=83;
+    public static final int UnicodeEscape=119;
+    public static final int VK_PACKAGE=59;
+    public static final int VT_RULE_ID=11;
+    public static final int EQUAL=100;
+    public static final int VK_NO_LOOP=46;
+    public static final int SEMICOLON=85;
+    public static final int VK_TEMPLATE=60;
+    public static final int VT_AND_IMPLICIT=20;
+    public static final int NULL=108;
+    public static final int COLON=94;
+    public static final int MULTI_LINE_COMMENT=123;
+    public static final int VT_RULE_ATTRIBUTES=15;
+    public static final int RIGHT_SQUARE=110;
+    public static final int VK_AGENDA_GROUP=49;
+    public static final int VT_FACT_OR=31;
+    public static final int VK_NOT=72;
+    public static final int VK_DATE_EXPIRES=44;
+    public static final int ARROW=99;
+    public static final int FLOAT=107;
+    public static final int VT_SLOT_ID=13;
+    public static final int VT_CURLY_CHUNK=17;
+    public static final int VT_OR_PREFIX=22;
+    public static final int DOUBLE_PIPE=97;
+    public static final int LESS=103;
+    public static final int VT_PATTERN=29;
+    public static final int VK_DATE_EFFECTIVE=43;
+    public static final int EscapeSequence=117;
+    public static final int VK_EXISTS=76;
+    public static final int INT=96;
+    public static final int VT_BIND_FIELD=32;
+    public static final int VK_RULE=57;
+    public static final int VK_EVAL=65;
+    public static final int VK_COLLECT=84;
+    public static final int GREATER=101;
+    public static final int VT_FACT_BINDING=30;
+    public static final int ID=86;
+    public static final int NOT_EQUAL=105;
+    public static final int RIGHT_CURLY=113;
+    public static final int VK_ENTRY_POINT=71;
+    public static final int VT_AND_INFIX=23;
+    public static final int VT_PARAM_LIST=42;
+    public static final int BOOL=95;
+    public static final int VT_FROM_SOURCE=27;
+    public static final int VK_CONTAINS=66;
+    public static final int VK_LOCK_ON_ACTIVE=45;
+    public static final int VT_FUNCTION_IMPORT=5;
+    public static final int VK_IN=73;
+    public static final int VT_RHS_CHUNK=16;
+    public static final int VK_MEMBEROF=70;
+    public static final int GREATER_EQUAL=102;
+    public static final int VT_OR_INFIX=24;
+    public static final int DOT_STAR=88;
+    public static final int VK_OR=74;
+    public static final int VT_GLOBAL_ID=40;
+    public static final int LESS_EQUAL=104;
+    public static final int VK_WHEN=56;
+    public static final int VK_RULEFLOW_GROUP=50;
+    public static final int VT_FUNCTION_ID=41;
+    public static final int EOF=-1;
+    public static final int VT_CONSTRAINTS=7;
+    public static final int VT_IMPORT_ID=39;
+    public static final int EOL=115;
+    public static final int VK_INIT=80;
+    public static final int VK_ACTIVATION_GROUP=48;
+    public static final int OctalEscape=120;
+    public static final int VK_ACTION=81;
+    public static final int VK_FROM=78;
+    public static final int VK_EXCLUDES=68;
+    public static final int RIGHT_PAREN=93;
+    public static final int VT_TEMPLATE_ID=10;
+    public static final int VK_DECLARE=62;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=122;
+
+        public DescrBuilderTree(TreeNodeStream input) {
+            super(input);
+        }
+        
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "/Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g"; }
+
+
+    	DescrFactory factory = new DescrFactory();
+    	PackageDescr packageDescr = null;
+    	
+    	public PackageDescr getPackageDescr() {
+    		return packageDescr;
+    	}
+
+
+
+    // $ANTLR start compilation_unit
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:45:1: compilation_unit : ^( VT_COMPILATION_UNIT package_statement ( statement )* ) ;
+    public final void compilation_unit() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:46:2: ( ^( VT_COMPILATION_UNIT package_statement ( statement )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:46:4: ^( VT_COMPILATION_UNIT package_statement ( statement )* )
+            {
+            match(input,VT_COMPILATION_UNIT,FOLLOW_VT_COMPILATION_UNIT_in_compilation_unit49); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                pushFollow(FOLLOW_package_statement_in_compilation_unit51);
+                package_statement();
+                _fsp--;
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:46:44: ( statement )*
+                loop1:
+                do {
+                    int alt1=2;
+                    int LA1_0 = input.LA(1);
+
+                    if ( (LA1_0==VT_FUNCTION_IMPORT||(LA1_0>=VK_DATE_EFFECTIVE && LA1_0<=VK_ENABLED)||(LA1_0>=VK_RULE && LA1_0<=VK_IMPORT)||(LA1_0>=VK_TEMPLATE && LA1_0<=VK_QUERY)||(LA1_0>=VK_FUNCTION && LA1_0<=VK_GLOBAL)) ) {
+                        alt1=1;
+                    }
+
+
+                    switch (alt1) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:46:44: statement
+                	    {
+                	    pushFollow(FOLLOW_statement_in_compilation_unit53);
+                	    statement();
+                	    _fsp--;
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop1;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end compilation_unit
+
+
+    // $ANTLR start package_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:49:1: package_statement returns [String packageName] : ( ^( VK_PACKAGE packageId= package_id ) | );
+    public final String package_statement() throws RecognitionException {
+        String packageName = null;
+
+        List packageId = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:50:2: ( ^( VK_PACKAGE packageId= package_id ) | )
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0==VK_PACKAGE) ) {
+                alt2=1;
+            }
+            else if ( (LA2_0==UP||LA2_0==VT_FUNCTION_IMPORT||(LA2_0>=VK_DATE_EFFECTIVE && LA2_0<=VK_ENABLED)||(LA2_0>=VK_RULE && LA2_0<=VK_IMPORT)||(LA2_0>=VK_TEMPLATE && LA2_0<=VK_QUERY)||(LA2_0>=VK_FUNCTION && LA2_0<=VK_GLOBAL)) ) {
+                alt2=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("49:1: package_statement returns [String packageName] : ( ^( VK_PACKAGE packageId= package_id ) | );", 2, 0, input);
+
+                throw nvae;
+            }
+            switch (alt2) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:50:4: ^( VK_PACKAGE packageId= package_id )
+                    {
+                    match(input,VK_PACKAGE,FOLLOW_VK_PACKAGE_in_package_statement71); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_package_id_in_package_statement75);
+                    packageId=package_id();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	this.packageDescr = factory.createPackage(packageId);	
+                    		packageName = packageDescr.getName();	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:54:2: 
+                    {
+                    	this.packageDescr = factory.createPackage(null);	
+                    		packageName = "";	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return packageName;
+    }
+    // $ANTLR end package_statement
+
+
+    // $ANTLR start package_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:58:1: package_id returns [List idList] : ^( VT_PACKAGE_ID (tempList+= ID )+ ) ;
+    public final List package_id() throws RecognitionException {
+        List idList = null;
+
+        DroolsTree tempList=null;
+        List list_tempList=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:59:2: ( ^( VT_PACKAGE_ID (tempList+= ID )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:59:4: ^( VT_PACKAGE_ID (tempList+= ID )+ )
+            {
+            match(input,VT_PACKAGE_ID,FOLLOW_VT_PACKAGE_ID_in_package_id102); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:59:28: (tempList+= ID )+
+            int cnt3=0;
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( (LA3_0==ID) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:59:28: tempList+= ID
+            	    {
+            	    tempList=(DroolsTree)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_package_id106); 
+            	    if (list_tempList==null) list_tempList=new ArrayList();
+            	    list_tempList.add(tempList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
+                }
+                cnt3++;
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+            	idList = list_tempList;	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return idList;
+    }
+    // $ANTLR end package_id
+
+
+    // $ANTLR start statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:63:1: statement : (a= rule_attribute | fi= function_import_statement | is= import_statement | gl= global | fn= function | tp= template | rl= rule | qr= query );
+    public final void statement() throws RecognitionException {
+        AttributeDescr a = null;
+
+        FunctionImportDescr fi = null;
+
+        ImportDescr is = null;
+
+        global_return gl = null;
+
+        function_return fn = null;
+
+        template_return tp = null;
+
+        rule_return rl = null;
+
+        query_return qr = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:64:2: (a= rule_attribute | fi= function_import_statement | is= import_statement | gl= global | fn= function | tp= template | rl= rule | qr= query )
+            int alt4=8;
+            switch ( input.LA(1) ) {
+            case VK_DATE_EFFECTIVE:
+            case VK_DATE_EXPIRES:
+            case VK_LOCK_ON_ACTIVE:
+            case VK_NO_LOOP:
+            case VK_AUTO_FOCUS:
+            case VK_ACTIVATION_GROUP:
+            case VK_AGENDA_GROUP:
+            case VK_RULEFLOW_GROUP:
+            case VK_DURATION:
+            case VK_DIALECT:
+            case VK_SALIENCE:
+            case VK_ENABLED:
+                {
+                alt4=1;
+                }
+                break;
+            case VT_FUNCTION_IMPORT:
+                {
+                alt4=2;
+                }
+                break;
+            case VK_IMPORT:
+                {
+                alt4=3;
+                }
+                break;
+            case VK_GLOBAL:
+                {
+                alt4=4;
+                }
+                break;
+            case VK_FUNCTION:
+                {
+                alt4=5;
+                }
+                break;
+            case VK_TEMPLATE:
+                {
+                alt4=6;
+                }
+                break;
+            case VK_RULE:
+                {
+                alt4=7;
+                }
+                break;
+            case VK_QUERY:
+                {
+                alt4=8;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("63:1: statement : (a= rule_attribute | fi= function_import_statement | is= import_statement | gl= global | fn= function | tp= template | rl= rule | qr= query );", 4, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt4) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:64:4: a= rule_attribute
+                    {
+                    pushFollow(FOLLOW_rule_attribute_in_statement124);
+                    a=rule_attribute();
+                    _fsp--;
+
+                    	this.packageDescr.addAttribute(a);	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:66:4: fi= function_import_statement
+                    {
+                    pushFollow(FOLLOW_function_import_statement_in_statement134);
+                    fi=function_import_statement();
+                    _fsp--;
+
+                    	this.packageDescr.addFunctionImport(fi);	
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:68:4: is= import_statement
+                    {
+                    pushFollow(FOLLOW_import_statement_in_statement144);
+                    is=import_statement();
+                    _fsp--;
+
+                    	this.packageDescr.addImport(is);	
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:70:4: gl= global
+                    {
+                    pushFollow(FOLLOW_global_in_statement155);
+                    gl=global();
+                    _fsp--;
+
+                    	this.packageDescr.addGlobal(gl.globalDescr);	
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:72:4: fn= function
+                    {
+                    pushFollow(FOLLOW_function_in_statement165);
+                    fn=function();
+                    _fsp--;
+
+                    	this.packageDescr.addFunction(fn.functionDescr);	
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:74:4: tp= template
+                    {
+                    pushFollow(FOLLOW_template_in_statement175);
+                    tp=template();
+                    _fsp--;
+
+                    	this.packageDescr.addFactTemplate(tp.factTemplateDescr);	
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:76:4: rl= rule
+                    {
+                    pushFollow(FOLLOW_rule_in_statement185);
+                    rl=rule();
+                    _fsp--;
+
+                    	this.packageDescr.addRule(rl.ruleDescr);	
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:78:4: qr= query
+                    {
+                    pushFollow(FOLLOW_query_in_statement195);
+                    qr=query();
+                    _fsp--;
+
+                    	this.packageDescr.addRule(qr.queryDescr);	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end statement
+
+
+    // $ANTLR start import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:82:1: import_statement returns [ImportDescr importDescr] : ^(importStart= VK_IMPORT importId= import_name ) ;
+    public final ImportDescr import_statement() throws RecognitionException {
+        ImportDescr importDescr = null;
+
+        DroolsTree importStart=null;
+        import_name_return importId = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:83:2: ( ^(importStart= VK_IMPORT importId= import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:83:4: ^(importStart= VK_IMPORT importId= import_name )
+            {
+            importStart=(DroolsTree)input.LT(1);
+            match(input,VK_IMPORT,FOLLOW_VK_IMPORT_in_import_statement216); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_import_name_in_import_statement220);
+            importId=import_name();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+            	importDescr = factory.createImport(importStart, importId.idList, importId.dotStar);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return importDescr;
+    }
+    // $ANTLR end import_statement
+
+
+    // $ANTLR start function_import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:87:1: function_import_statement returns [FunctionImportDescr functionImportDescr] : ^(importStart= VT_FUNCTION_IMPORT VK_FUNCTION importId= import_name ) ;
+    public final FunctionImportDescr function_import_statement() throws RecognitionException {
+        FunctionImportDescr functionImportDescr = null;
+
+        DroolsTree importStart=null;
+        import_name_return importId = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:88:2: ( ^(importStart= VT_FUNCTION_IMPORT VK_FUNCTION importId= import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:88:4: ^(importStart= VT_FUNCTION_IMPORT VK_FUNCTION importId= import_name )
+            {
+            importStart=(DroolsTree)input.LT(1);
+            match(input,VT_FUNCTION_IMPORT,FOLLOW_VT_FUNCTION_IMPORT_in_function_import_statement242); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VK_FUNCTION,FOLLOW_VK_FUNCTION_in_function_import_statement244); 
+            pushFollow(FOLLOW_import_name_in_function_import_statement248);
+            importId=import_name();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+            	functionImportDescr = factory.createFunctionImport(importStart, importId.idList, importId.dotStar);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return functionImportDescr;
+    }
+    // $ANTLR end function_import_statement
+
+    public static class import_name_return extends TreeRuleReturnScope {
+        public List idList;
+        public DroolsTree dotStar;
+    };
+
+    // $ANTLR start import_name
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:92:1: import_name returns [List idList, DroolsTree dotStar] : ^( VT_IMPORT_ID (tempList+= ID )+ (tempDotStar= DOT_STAR )? ) ;
+    public final import_name_return import_name() throws RecognitionException {
+        import_name_return retval = new import_name_return();
+        retval.start = input.LT(1);
+
+        DroolsTree tempDotStar=null;
+        DroolsTree tempList=null;
+        List list_tempList=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:2: ( ^( VT_IMPORT_ID (tempList+= ID )+ (tempDotStar= DOT_STAR )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:4: ^( VT_IMPORT_ID (tempList+= ID )+ (tempDotStar= DOT_STAR )? )
+            {
+            match(input,VT_IMPORT_ID,FOLLOW_VT_IMPORT_ID_in_import_name267); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:27: (tempList+= ID )+
+            int cnt5=0;
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( (LA5_0==ID) ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:27: tempList+= ID
+            	    {
+            	    tempList=(DroolsTree)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_import_name271); 
+            	    if (list_tempList==null) list_tempList=new ArrayList();
+            	    list_tempList.add(tempList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt5 >= 1 ) break loop5;
+                        EarlyExitException eee =
+                            new EarlyExitException(5, input);
+                        throw eee;
+                }
+                cnt5++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:44: (tempDotStar= DOT_STAR )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==DOT_STAR) ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:93:44: tempDotStar= DOT_STAR
+                    {
+                    tempDotStar=(DroolsTree)input.LT(1);
+                    match(input,DOT_STAR,FOLLOW_DOT_STAR_in_import_name276); 
+
+                    }
+                    break;
+
+            }
+
+
+            match(input, Token.UP, null); 
+            	retval.idList = list_tempList;
+            		retval.dotStar = tempDotStar;	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end import_name
+
+    public static class global_return extends TreeRuleReturnScope {
+        public GlobalDescr globalDescr;
+    };
+
+    // $ANTLR start global
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:98:1: global returns [GlobalDescr globalDescr] : ^(start= VK_GLOBAL dt= data_type globalId= VT_GLOBAL_ID ) ;
+    public final global_return global() throws RecognitionException {
+        global_return retval = new global_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree globalId=null;
+        BaseDescr dt = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:99:2: ( ^(start= VK_GLOBAL dt= data_type globalId= VT_GLOBAL_ID ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:99:4: ^(start= VK_GLOBAL dt= data_type globalId= VT_GLOBAL_ID )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_GLOBAL,FOLLOW_VK_GLOBAL_in_global299); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_data_type_in_global303);
+            dt=data_type();
+            _fsp--;
+
+            globalId=(DroolsTree)input.LT(1);
+            match(input,VT_GLOBAL_ID,FOLLOW_VT_GLOBAL_ID_in_global307); 
+
+            match(input, Token.UP, null); 
+            	retval.globalDescr = factory.createGlobal(start,dt, globalId);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end global
+
+    public static class function_return extends TreeRuleReturnScope {
+        public FunctionDescr functionDescr;
+    };
+
+    // $ANTLR start function
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:103:1: function returns [FunctionDescr functionDescr] : ^(start= VK_FUNCTION (dt= data_type )? functionId= VT_FUNCTION_ID params= parameters content= VT_CURLY_CHUNK ) ;
+    public final function_return function() throws RecognitionException {
+        function_return retval = new function_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree functionId=null;
+        DroolsTree content=null;
+        BaseDescr dt = null;
+
+        List params = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:104:2: ( ^(start= VK_FUNCTION (dt= data_type )? functionId= VT_FUNCTION_ID params= parameters content= VT_CURLY_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:104:4: ^(start= VK_FUNCTION (dt= data_type )? functionId= VT_FUNCTION_ID params= parameters content= VT_CURLY_CHUNK )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_FUNCTION,FOLLOW_VK_FUNCTION_in_function329); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:104:26: (dt= data_type )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==VT_DATA_TYPE) ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:104:26: dt= data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_function333);
+                    dt=data_type();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            functionId=(DroolsTree)input.LT(1);
+            match(input,VT_FUNCTION_ID,FOLLOW_VT_FUNCTION_ID_in_function338); 
+            pushFollow(FOLLOW_parameters_in_function342);
+            params=parameters();
+            _fsp--;
+
+            content=(DroolsTree)input.LT(1);
+            match(input,VT_CURLY_CHUNK,FOLLOW_VT_CURLY_CHUNK_in_function346); 
+
+            match(input, Token.UP, null); 
+            	retval.functionDescr = factory.createFunction(start, dt, functionId, params, content);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end function
+
+    public static class template_return extends TreeRuleReturnScope {
+        public FactTemplateDescr factTemplateDescr;
+    };
+
+    // $ANTLR start template
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:108:1: template returns [FactTemplateDescr factTemplateDescr] : ^(start= VK_TEMPLATE id= VT_TEMPLATE_ID (ts= template_slot )+ end= END ) ;
+    public final template_return template() throws RecognitionException {
+        template_return retval = new template_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree id=null;
+        DroolsTree end=null;
+        FieldTemplateDescr ts = null;
+
+
+
+        	List slotList = new LinkedList<FieldTemplateDescr>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:111:3: ( ^(start= VK_TEMPLATE id= VT_TEMPLATE_ID (ts= template_slot )+ end= END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:111:5: ^(start= VK_TEMPLATE id= VT_TEMPLATE_ID (ts= template_slot )+ end= END )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_TEMPLATE,FOLLOW_VK_TEMPLATE_in_template371); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,VT_TEMPLATE_ID,FOLLOW_VT_TEMPLATE_ID_in_template375); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:112:4: (ts= template_slot )+
+            int cnt8=0;
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0==VT_SLOT) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:112:6: ts= template_slot
+            	    {
+            	    pushFollow(FOLLOW_template_slot_in_template384);
+            	    ts=template_slot();
+            	    _fsp--;
+
+            	    slotList.add(ts);
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt8 >= 1 ) break loop8;
+                        EarlyExitException eee =
+                            new EarlyExitException(8, input);
+                        throw eee;
+                }
+                cnt8++;
+            } while (true);
+
+            end=(DroolsTree)input.LT(1);
+            match(input,END,FOLLOW_END_in_template392); 
+
+            match(input, Token.UP, null); 
+            	retval.factTemplateDescr = factory.createFactTemplate(start, id, slotList, end);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end template
+
+
+    // $ANTLR start template_slot
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:116:1: template_slot returns [FieldTemplateDescr fieldTemplateDescr] : ^( VT_SLOT dt= data_type id= VT_SLOT_ID ) ;
+    public final FieldTemplateDescr template_slot() throws RecognitionException {
+        FieldTemplateDescr fieldTemplateDescr = null;
+
+        DroolsTree id=null;
+        BaseDescr dt = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:117:2: ( ^( VT_SLOT dt= data_type id= VT_SLOT_ID ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:117:4: ^( VT_SLOT dt= data_type id= VT_SLOT_ID )
+            {
+            match(input,VT_SLOT,FOLLOW_VT_SLOT_in_template_slot412); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_data_type_in_template_slot416);
+            dt=data_type();
+            _fsp--;
+
+            id=(DroolsTree)input.LT(1);
+            match(input,VT_SLOT_ID,FOLLOW_VT_SLOT_ID_in_template_slot420); 
+
+            match(input, Token.UP, null); 
+            	fieldTemplateDescr = factory.createFieldTemplate(dt, id);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return fieldTemplateDescr;
+    }
+    // $ANTLR end template_slot
+
+    public static class query_return extends TreeRuleReturnScope {
+        public QueryDescr queryDescr;
+    };
+
+    // $ANTLR start query
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:121:1: query returns [QueryDescr queryDescr] : ^(start= VK_QUERY id= VT_QUERY_ID (params= parameters )? lb= lhs_block end= END ) ;
+    public final query_return query() throws RecognitionException {
+        query_return retval = new query_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree id=null;
+        DroolsTree end=null;
+        List params = null;
+
+        AndDescr lb = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:122:2: ( ^(start= VK_QUERY id= VT_QUERY_ID (params= parameters )? lb= lhs_block end= END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:122:4: ^(start= VK_QUERY id= VT_QUERY_ID (params= parameters )? lb= lhs_block end= END )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_QUERY,FOLLOW_VK_QUERY_in_query442); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,VT_QUERY_ID,FOLLOW_VT_QUERY_ID_in_query446); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:122:42: (params= parameters )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==VT_PARAM_LIST) ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:122:42: params= parameters
+                    {
+                    pushFollow(FOLLOW_parameters_in_query450);
+                    params=parameters();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_lhs_block_in_query455);
+            lb=lhs_block();
+            _fsp--;
+
+            end=(DroolsTree)input.LT(1);
+            match(input,END,FOLLOW_END_in_query459); 
+
+            match(input, Token.UP, null); 
+            	retval.queryDescr = factory.createQuery(start, id, params, lb, end);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end query
+
+    public static class rule_return extends TreeRuleReturnScope {
+        public RuleDescr ruleDescr;
+    };
+
+    // $ANTLR start rule
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:126:1: rule returns [RuleDescr ruleDescr] : ^(start= VK_RULE id= VT_RULE_ID (ra= rule_attributes )? (wn= when_part )? content= VT_RHS_CHUNK ) ;
+    public final rule_return rule() throws RecognitionException {
+        rule_return retval = new rule_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree id=null;
+        DroolsTree content=null;
+        List ra = null;
+
+        AndDescr wn = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:2: ( ^(start= VK_RULE id= VT_RULE_ID (ra= rule_attributes )? (wn= when_part )? content= VT_RHS_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:4: ^(start= VK_RULE id= VT_RULE_ID (ra= rule_attributes )? (wn= when_part )? content= VT_RHS_CHUNK )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_RULE,FOLLOW_VK_RULE_in_rule481); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,VT_RULE_ID,FOLLOW_VT_RULE_ID_in_rule485); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:36: (ra= rule_attributes )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==VT_RULE_ATTRIBUTES) ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:36: ra= rule_attributes
+                    {
+                    pushFollow(FOLLOW_rule_attributes_in_rule489);
+                    ra=rule_attributes();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:56: (wn= when_part )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==VK_WHEN) ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:127:56: wn= when_part
+                    {
+                    pushFollow(FOLLOW_when_part_in_rule494);
+                    wn=when_part();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            content=(DroolsTree)input.LT(1);
+            match(input,VT_RHS_CHUNK,FOLLOW_VT_RHS_CHUNK_in_rule499); 
+
+            match(input, Token.UP, null); 
+            	retval.ruleDescr = factory.createRule(start, id, ra, wn, content);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end rule
+
+
+    // $ANTLR start when_part
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:131:1: when_part returns [AndDescr andDescr] : VK_WHEN lh= lhs_block ;
+    public final AndDescr when_part() throws RecognitionException {
+        AndDescr andDescr = null;
+
+        AndDescr lh = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:132:2: ( VK_WHEN lh= lhs_block )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:132:4: VK_WHEN lh= lhs_block
+            {
+            match(input,VK_WHEN,FOLLOW_VK_WHEN_in_when_part518); 
+            pushFollow(FOLLOW_lhs_block_in_when_part522);
+            lh=lhs_block();
+            _fsp--;
+
+            	andDescr = lh;	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return andDescr;
+    }
+    // $ANTLR end when_part
+
+
+    // $ANTLR start rule_attributes
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:136:1: rule_attributes returns [List attrList] : ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? (rl= rule_attribute )+ ) ;
+    public final List rule_attributes() throws RecognitionException {
+        List attrList = null;
+
+        AttributeDescr rl = null;
+
+
+
+        	attrList = new LinkedList<AttributeDescr>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:3: ( ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? (rl= rule_attribute )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:5: ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? (rl= rule_attribute )+ )
+            {
+            match(input,VT_RULE_ATTRIBUTES,FOLLOW_VT_RULE_ATTRIBUTES_in_rule_attributes544); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:26: ( VK_ATTRIBUTES )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==VK_ATTRIBUTES) ) {
+                alt12=1;
+            }
+            switch (alt12) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:26: VK_ATTRIBUTES
+                    {
+                    match(input,VK_ATTRIBUTES,FOLLOW_VK_ATTRIBUTES_in_rule_attributes546); 
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:41: (rl= rule_attribute )+
+            int cnt13=0;
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( ((LA13_0>=VK_DATE_EFFECTIVE && LA13_0<=VK_ENABLED)) ) {
+                    alt13=1;
+                }
+
+
+                switch (alt13) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:139:42: rl= rule_attribute
+            	    {
+            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes552);
+            	    rl=rule_attribute();
+            	    _fsp--;
+
+            	    attrList.add(rl);
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt13 >= 1 ) break loop13;
+                        EarlyExitException eee =
+                            new EarlyExitException(13, input);
+                        throw eee;
+                }
+                cnt13++;
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return attrList;
+    }
+    // $ANTLR end rule_attributes
+
+
+    // $ANTLR start parameters
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:142:1: parameters returns [List paramList] : ^( VT_PARAM_LIST (p= param_definition )* ) ;
+    public final List parameters() throws RecognitionException {
+        List paramList = null;
+
+        Map p = null;
+
+
+
+        	paramList = new LinkedList<Map<BaseDescr, BaseDescr>>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:145:3: ( ^( VT_PARAM_LIST (p= param_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:145:5: ^( VT_PARAM_LIST (p= param_definition )* )
+            {
+            match(input,VT_PARAM_LIST,FOLLOW_VT_PARAM_LIST_in_parameters576); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:145:21: (p= param_definition )*
+                loop14:
+                do {
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0==VT_DATA_TYPE||LA14_0==ID) ) {
+                        alt14=1;
+                    }
+
+
+                    switch (alt14) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:145:22: p= param_definition
+                	    {
+                	    pushFollow(FOLLOW_param_definition_in_parameters581);
+                	    p=param_definition();
+                	    _fsp--;
+
+                	    paramList.add(p);
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop14;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return paramList;
+    }
+    // $ANTLR end parameters
+
+
+    // $ANTLR start param_definition
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:148:1: param_definition returns [Map param] : (dt= data_type )? a= argument ;
+    public final Map param_definition() throws RecognitionException {
+        Map param = null;
+
+        BaseDescr dt = null;
+
+        BaseDescr a = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:149:2: ( (dt= data_type )? a= argument )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:149:4: (dt= data_type )? a= argument
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:149:6: (dt= data_type )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==VT_DATA_TYPE) ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:149:6: dt= data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_param_definition603);
+                    dt=data_type();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_argument_in_param_definition608);
+            a=argument();
+            _fsp--;
+
+            	param = new HashMap<BaseDescr, BaseDescr>();
+            		param.put(a, dt);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return param;
+    }
+    // $ANTLR end param_definition
+
+
+    // $ANTLR start argument
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:154:1: argument returns [BaseDescr arg] : id= ID ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* ;
+    public final BaseDescr argument() throws RecognitionException {
+        BaseDescr arg = null;
+
+        DroolsTree id=null;
+        DroolsTree rightList=null;
+        List list_rightList=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:155:2: (id= ID ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:155:4: id= ID ( LEFT_SQUARE rightList+= RIGHT_SQUARE )*
+            {
+            id=(DroolsTree)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_argument628); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:155:10: ( LEFT_SQUARE rightList+= RIGHT_SQUARE )*
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( (LA16_0==LEFT_SQUARE) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:155:11: LEFT_SQUARE rightList+= RIGHT_SQUARE
+            	    {
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_argument631); 
+            	    rightList=(DroolsTree)input.LT(1);
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_argument635); 
+            	    if (list_rightList==null) list_rightList=new ArrayList();
+            	    list_rightList.add(rightList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop16;
+                }
+            } while (true);
+
+            	arg = factory.createArgument(id, list_rightList);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return arg;
+    }
+    // $ANTLR end argument
+
+
+    // $ANTLR start rule_attribute
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:159:1: rule_attribute returns [AttributeDescr attributeDescr] : ( ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) ) | ^(attrName= VK_NO_LOOP (value= BOOL )? ) | ^(attrName= VK_AGENDA_GROUP value= STRING ) | ^(attrName= VK_DURATION value= INT ) | ^(attrName= VK_ACTIVATION_GROUP value= STRING ) | ^(attrName= VK_AUTO_FOCUS (value= BOOL )? ) | ^(attrName= VK_DATE_EFFECTIVE value= STRING ) | ^(attrName= VK_DATE_EXPIRES value= STRING ) | ^(attrName= VK_ENABLED value= BOOL ) | ^(attrName= VK_RULEFLOW_GROUP value= STRING ) | ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? ) | ^(attrName= VK_DIALECT value= STRING ) ) ;
+    public final AttributeDescr rule_attribute() throws RecognitionException {
+        AttributeDescr attributeDescr = null;
+
+        DroolsTree attrName=null;
+        DroolsTree value=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:2: ( ( ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) ) | ^(attrName= VK_NO_LOOP (value= BOOL )? ) | ^(attrName= VK_AGENDA_GROUP value= STRING ) | ^(attrName= VK_DURATION value= INT ) | ^(attrName= VK_ACTIVATION_GROUP value= STRING ) | ^(attrName= VK_AUTO_FOCUS (value= BOOL )? ) | ^(attrName= VK_DATE_EFFECTIVE value= STRING ) | ^(attrName= VK_DATE_EXPIRES value= STRING ) | ^(attrName= VK_ENABLED value= BOOL ) | ^(attrName= VK_RULEFLOW_GROUP value= STRING ) | ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? ) | ^(attrName= VK_DIALECT value= STRING ) ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:4: ( ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) ) | ^(attrName= VK_NO_LOOP (value= BOOL )? ) | ^(attrName= VK_AGENDA_GROUP value= STRING ) | ^(attrName= VK_DURATION value= INT ) | ^(attrName= VK_ACTIVATION_GROUP value= STRING ) | ^(attrName= VK_AUTO_FOCUS (value= BOOL )? ) | ^(attrName= VK_DATE_EFFECTIVE value= STRING ) | ^(attrName= VK_DATE_EXPIRES value= STRING ) | ^(attrName= VK_ENABLED value= BOOL ) | ^(attrName= VK_RULEFLOW_GROUP value= STRING ) | ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? ) | ^(attrName= VK_DIALECT value= STRING ) )
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:4: ( ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) ) | ^(attrName= VK_NO_LOOP (value= BOOL )? ) | ^(attrName= VK_AGENDA_GROUP value= STRING ) | ^(attrName= VK_DURATION value= INT ) | ^(attrName= VK_ACTIVATION_GROUP value= STRING ) | ^(attrName= VK_AUTO_FOCUS (value= BOOL )? ) | ^(attrName= VK_DATE_EFFECTIVE value= STRING ) | ^(attrName= VK_DATE_EXPIRES value= STRING ) | ^(attrName= VK_ENABLED value= BOOL ) | ^(attrName= VK_RULEFLOW_GROUP value= STRING ) | ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? ) | ^(attrName= VK_DIALECT value= STRING ) )
+            int alt21=12;
+            switch ( input.LA(1) ) {
+            case VK_SALIENCE:
+                {
+                alt21=1;
+                }
+                break;
+            case VK_NO_LOOP:
+                {
+                alt21=2;
+                }
+                break;
+            case VK_AGENDA_GROUP:
+                {
+                alt21=3;
+                }
+                break;
+            case VK_DURATION:
+                {
+                alt21=4;
+                }
+                break;
+            case VK_ACTIVATION_GROUP:
+                {
+                alt21=5;
+                }
+                break;
+            case VK_AUTO_FOCUS:
+                {
+                alt21=6;
+                }
+                break;
+            case VK_DATE_EFFECTIVE:
+                {
+                alt21=7;
+                }
+                break;
+            case VK_DATE_EXPIRES:
+                {
+                alt21=8;
+                }
+                break;
+            case VK_ENABLED:
+                {
+                alt21=9;
+                }
+                break;
+            case VK_RULEFLOW_GROUP:
+                {
+                alt21=10;
+                }
+                break;
+            case VK_LOCK_ON_ACTIVE:
+                {
+                alt21=11;
+                }
+                break;
+            case VK_DIALECT:
+                {
+                alt21=12;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("160:4: ( ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) ) | ^(attrName= VK_NO_LOOP (value= BOOL )? ) | ^(attrName= VK_AGENDA_GROUP value= STRING ) | ^(attrName= VK_DURATION value= INT ) | ^(attrName= VK_ACTIVATION_GROUP value= STRING ) | ^(attrName= VK_AUTO_FOCUS (value= BOOL )? ) | ^(attrName= VK_DATE_EFFECTIVE value= STRING ) | ^(attrName= VK_DATE_EXPIRES value= STRING ) | ^(attrName= VK_ENABLED value= BOOL ) | ^(attrName= VK_RULEFLOW_GROUP value= STRING ) | ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? ) | ^(attrName= VK_DIALECT value= STRING ) )", 21, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt21) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:5: ^(attrName= VK_SALIENCE (value= INT | value= VT_PAREN_CHUNK ) )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_SALIENCE,FOLLOW_VK_SALIENCE_in_rule_attribute659); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:28: (value= INT | value= VT_PAREN_CHUNK )
+                    int alt17=2;
+                    int LA17_0 = input.LA(1);
+
+                    if ( (LA17_0==INT) ) {
+                        alt17=1;
+                    }
+                    else if ( (LA17_0==VT_PAREN_CHUNK) ) {
+                        alt17=2;
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("160:28: (value= INT | value= VT_PAREN_CHUNK )", 17, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt17) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:29: value= INT
+                            {
+                            value=(DroolsTree)input.LT(1);
+                            match(input,INT,FOLLOW_INT_in_rule_attribute664); 
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:160:39: value= VT_PAREN_CHUNK
+                            {
+                            value=(DroolsTree)input.LT(1);
+                            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_rule_attribute668); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:161:4: ^(attrName= VK_NO_LOOP (value= BOOL )? )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_NO_LOOP,FOLLOW_VK_NO_LOOP_in_rule_attribute679); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:161:31: (value= BOOL )?
+                        int alt18=2;
+                        int LA18_0 = input.LA(1);
+
+                        if ( (LA18_0==BOOL) ) {
+                            alt18=1;
+                        }
+                        switch (alt18) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:161:31: value= BOOL
+                                {
+                                value=(DroolsTree)input.LT(1);
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute683); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:162:4: ^(attrName= VK_AGENDA_GROUP value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_AGENDA_GROUP,FOLLOW_VK_AGENDA_GROUP_in_rule_attribute695); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute699); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:163:4: ^(attrName= VK_DURATION value= INT )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_DURATION,FOLLOW_VK_DURATION_in_rule_attribute710); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,INT,FOLLOW_INT_in_rule_attribute714); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:164:4: ^(attrName= VK_ACTIVATION_GROUP value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_ACTIVATION_GROUP,FOLLOW_VK_ACTIVATION_GROUP_in_rule_attribute726); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute730); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:165:4: ^(attrName= VK_AUTO_FOCUS (value= BOOL )? )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_AUTO_FOCUS,FOLLOW_VK_AUTO_FOCUS_in_rule_attribute740); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:165:34: (value= BOOL )?
+                        int alt19=2;
+                        int LA19_0 = input.LA(1);
+
+                        if ( (LA19_0==BOOL) ) {
+                            alt19=1;
+                        }
+                        switch (alt19) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:165:34: value= BOOL
+                                {
+                                value=(DroolsTree)input.LT(1);
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute744); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:166:4: ^(attrName= VK_DATE_EFFECTIVE value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_DATE_EFFECTIVE,FOLLOW_VK_DATE_EFFECTIVE_in_rule_attribute755); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute759); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:167:4: ^(attrName= VK_DATE_EXPIRES value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_DATE_EXPIRES,FOLLOW_VK_DATE_EXPIRES_in_rule_attribute769); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute773); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:168:4: ^(attrName= VK_ENABLED value= BOOL )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_ENABLED,FOLLOW_VK_ENABLED_in_rule_attribute783); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_rule_attribute787); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:169:4: ^(attrName= VK_RULEFLOW_GROUP value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_RULEFLOW_GROUP,FOLLOW_VK_RULEFLOW_GROUP_in_rule_attribute797); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute801); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:170:4: ^(attrName= VK_LOCK_ON_ACTIVE (value= BOOL )? )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_LOCK_ON_ACTIVE,FOLLOW_VK_LOCK_ON_ACTIVE_in_rule_attribute811); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:170:38: (value= BOOL )?
+                        int alt20=2;
+                        int LA20_0 = input.LA(1);
+
+                        if ( (LA20_0==BOOL) ) {
+                            alt20=1;
+                        }
+                        switch (alt20) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:170:38: value= BOOL
+                                {
+                                value=(DroolsTree)input.LT(1);
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute815); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:171:4: ^(attrName= VK_DIALECT value= STRING )
+                    {
+                    attrName=(DroolsTree)input.LT(1);
+                    match(input,VK_DIALECT,FOLLOW_VK_DIALECT_in_rule_attribute825); 
+
+                    match(input, Token.DOWN, null); 
+                    value=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute829); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+
+            }
+
+            	attributeDescr = factory.createAttribute(attrName, value);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return attributeDescr;
+    }
+    // $ANTLR end rule_attribute
+
+
+    // $ANTLR start lhs_block
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:175:1: lhs_block returns [AndDescr andDescr] : ^( VT_AND_IMPLICIT (dt= lhs )* ) ;
+    public final AndDescr lhs_block() throws RecognitionException {
+        AndDescr andDescr = null;
+
+        lhs_return dt = null;
+
+
+
+        	andDescr = new AndDescr();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:178:3: ( ^( VT_AND_IMPLICIT (dt= lhs )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:178:5: ^( VT_AND_IMPLICIT (dt= lhs )* )
+            {
+            match(input,VT_AND_IMPLICIT,FOLLOW_VT_AND_IMPLICIT_in_lhs_block854); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:178:23: (dt= lhs )*
+                loop22:
+                do {
+                    int alt22=2;
+                    int LA22_0 = input.LA(1);
+
+                    if ( ((LA22_0>=VT_AND_PREFIX && LA22_0<=VT_OR_INFIX)||LA22_0==VT_PATTERN||LA22_0==VK_EVAL||LA22_0==VK_NOT||(LA22_0>=VK_EXISTS && LA22_0<=VK_FROM)) ) {
+                        alt22=1;
+                    }
+
+
+                    switch (alt22) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:178:24: dt= lhs
+                	    {
+                	    pushFollow(FOLLOW_lhs_in_lhs_block859);
+                	    dt=lhs();
+                	    _fsp--;
+
+                	    andDescr.addDescr(dt.baseDescr);
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop22;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return andDescr;
+    }
+    // $ANTLR end lhs_block
+
+    public static class lhs_return extends TreeRuleReturnScope {
+        public BaseDescr baseDescr;
+    };
+
+    // $ANTLR start lhs
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:181:1: lhs returns [BaseDescr baseDescr] : ( ^(start= VT_OR_PREFIX (dt= lhs )+ ) | ^(start= VT_OR_INFIX dt1= lhs dt2= lhs ) | ^(start= VT_AND_PREFIX (dt= lhs )+ ) | ^(start= VT_AND_INFIX dt1= lhs dt2= lhs ) | ^(start= VK_EXISTS dt= lhs ) | ^(start= VK_NOT dt= lhs ) | ^(start= VK_EVAL pc= VT_PAREN_CHUNK ) | ^(start= VK_FORALL (dt= lhs )+ ) | ^( VK_FROM pn= lhs_pattern fe= from_elements ) | pn= lhs_pattern );
+    public final lhs_return lhs() throws RecognitionException {
+        lhs_return retval = new lhs_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree pc=null;
+        lhs_return dt = null;
+
+        lhs_return dt1 = null;
+
+        lhs_return dt2 = null;
+
+        BaseDescr pn = null;
+
+        from_elements_return fe = null;
+
+
+
+        	List<BaseDescr> lhsList = new LinkedList<BaseDescr>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:184:3: ( ^(start= VT_OR_PREFIX (dt= lhs )+ ) | ^(start= VT_OR_INFIX dt1= lhs dt2= lhs ) | ^(start= VT_AND_PREFIX (dt= lhs )+ ) | ^(start= VT_AND_INFIX dt1= lhs dt2= lhs ) | ^(start= VK_EXISTS dt= lhs ) | ^(start= VK_NOT dt= lhs ) | ^(start= VK_EVAL pc= VT_PAREN_CHUNK ) | ^(start= VK_FORALL (dt= lhs )+ ) | ^( VK_FROM pn= lhs_pattern fe= from_elements ) | pn= lhs_pattern )
+            int alt26=10;
+            switch ( input.LA(1) ) {
+            case VT_OR_PREFIX:
+                {
+                alt26=1;
+                }
+                break;
+            case VT_OR_INFIX:
+                {
+                alt26=2;
+                }
+                break;
+            case VT_AND_PREFIX:
+                {
+                alt26=3;
+                }
+                break;
+            case VT_AND_INFIX:
+                {
+                alt26=4;
+                }
+                break;
+            case VK_EXISTS:
+                {
+                alt26=5;
+                }
+                break;
+            case VK_NOT:
+                {
+                alt26=6;
+                }
+                break;
+            case VK_EVAL:
+                {
+                alt26=7;
+                }
+                break;
+            case VK_FORALL:
+                {
+                alt26=8;
+                }
+                break;
+            case VK_FROM:
+                {
+                alt26=9;
+                }
+                break;
+            case VT_PATTERN:
+                {
+                alt26=10;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("181:1: lhs returns [BaseDescr baseDescr] : ( ^(start= VT_OR_PREFIX (dt= lhs )+ ) | ^(start= VT_OR_INFIX dt1= lhs dt2= lhs ) | ^(start= VT_AND_PREFIX (dt= lhs )+ ) | ^(start= VT_AND_INFIX dt1= lhs dt2= lhs ) | ^(start= VK_EXISTS dt= lhs ) | ^(start= VK_NOT dt= lhs ) | ^(start= VK_EVAL pc= VT_PAREN_CHUNK ) | ^(start= VK_FORALL (dt= lhs )+ ) | ^( VK_FROM pn= lhs_pattern fe= from_elements ) | pn= lhs_pattern );", 26, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt26) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:184:5: ^(start= VT_OR_PREFIX (dt= lhs )+ )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VT_OR_PREFIX,FOLLOW_VT_OR_PREFIX_in_lhs885); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:184:26: (dt= lhs )+
+                    int cnt23=0;
+                    loop23:
+                    do {
+                        int alt23=2;
+                        int LA23_0 = input.LA(1);
+
+                        if ( ((LA23_0>=VT_AND_PREFIX && LA23_0<=VT_OR_INFIX)||LA23_0==VT_PATTERN||LA23_0==VK_EVAL||LA23_0==VK_NOT||(LA23_0>=VK_EXISTS && LA23_0<=VK_FROM)) ) {
+                            alt23=1;
+                        }
+
+
+                        switch (alt23) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:184:27: dt= lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs890);
+                    	    dt=lhs();
+                    	    _fsp--;
+
+                    	    	lhsList.add(dt.baseDescr);	
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt23 >= 1 ) break loop23;
+                                EarlyExitException eee =
+                                    new EarlyExitException(23, input);
+                                throw eee;
+                        }
+                        cnt23++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createOr(start, lhsList);	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:186:4: ^(start= VT_OR_INFIX dt1= lhs dt2= lhs )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VT_OR_INFIX,FOLLOW_VT_OR_INFIX_in_lhs906); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs910);
+                    dt1=lhs();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_lhs_in_lhs914);
+                    dt2=lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	lhsList.add(dt1.baseDescr);
+                    		lhsList.add(dt2.baseDescr);
+                    		retval.baseDescr = factory.createOr(start, lhsList);	
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:190:4: ^(start= VT_AND_PREFIX (dt= lhs )+ )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VT_AND_PREFIX,FOLLOW_VT_AND_PREFIX_in_lhs926); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:190:26: (dt= lhs )+
+                    int cnt24=0;
+                    loop24:
+                    do {
+                        int alt24=2;
+                        int LA24_0 = input.LA(1);
+
+                        if ( ((LA24_0>=VT_AND_PREFIX && LA24_0<=VT_OR_INFIX)||LA24_0==VT_PATTERN||LA24_0==VK_EVAL||LA24_0==VK_NOT||(LA24_0>=VK_EXISTS && LA24_0<=VK_FROM)) ) {
+                            alt24=1;
+                        }
+
+
+                        switch (alt24) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:190:27: dt= lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs931);
+                    	    dt=lhs();
+                    	    _fsp--;
+
+                    	    	lhsList.add(dt.baseDescr);	
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt24 >= 1 ) break loop24;
+                                EarlyExitException eee =
+                                    new EarlyExitException(24, input);
+                                throw eee;
+                        }
+                        cnt24++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createAnd(start, lhsList);	
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:192:4: ^(start= VT_AND_INFIX dt1= lhs dt2= lhs )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VT_AND_INFIX,FOLLOW_VT_AND_INFIX_in_lhs947); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs951);
+                    dt1=lhs();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_lhs_in_lhs955);
+                    dt2=lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	lhsList.add(dt1.baseDescr);
+                    		lhsList.add(dt2.baseDescr);
+                    		retval.baseDescr = factory.createAnd(start, lhsList);	
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:196:4: ^(start= VK_EXISTS dt= lhs )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_EXISTS,FOLLOW_VK_EXISTS_in_lhs967); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs971);
+                    dt=lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createExists(start, dt.baseDescr);	
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:198:4: ^(start= VK_NOT dt= lhs )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_NOT,FOLLOW_VK_NOT_in_lhs983); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs987);
+                    dt=lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createNot(start, dt.baseDescr);	
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:200:4: ^(start= VK_EVAL pc= VT_PAREN_CHUNK )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_EVAL,FOLLOW_VK_EVAL_in_lhs999); 
+
+                    match(input, Token.DOWN, null); 
+                    pc=(DroolsTree)input.LT(1);
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_lhs1003); 
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createEval(start, pc);	
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:202:4: ^(start= VK_FORALL (dt= lhs )+ )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_FORALL,FOLLOW_VK_FORALL_in_lhs1015); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:202:22: (dt= lhs )+
+                    int cnt25=0;
+                    loop25:
+                    do {
+                        int alt25=2;
+                        int LA25_0 = input.LA(1);
+
+                        if ( ((LA25_0>=VT_AND_PREFIX && LA25_0<=VT_OR_INFIX)||LA25_0==VT_PATTERN||LA25_0==VK_EVAL||LA25_0==VK_NOT||(LA25_0>=VK_EXISTS && LA25_0<=VK_FROM)) ) {
+                            alt25=1;
+                        }
+
+
+                        switch (alt25) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:202:23: dt= lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs1020);
+                    	    dt=lhs();
+                    	    _fsp--;
+
+                    	    	lhsList.add(dt.baseDescr);	
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt25 >= 1 ) break loop25;
+                                EarlyExitException eee =
+                                    new EarlyExitException(25, input);
+                                throw eee;
+                        }
+                        cnt25++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.createForAll(start, lhsList);	
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:204:4: ^( VK_FROM pn= lhs_pattern fe= from_elements )
+                    {
+                    match(input,VK_FROM,FOLLOW_VK_FROM_in_lhs1034); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs1038);
+                    pn=lhs_pattern();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_from_elements_in_lhs1042);
+                    fe=from_elements();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.baseDescr = factory.setupFrom(pn, fe.patternSourceDescr);	
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:206:4: pn= lhs_pattern
+                    {
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs1053);
+                    pn=lhs_pattern();
+                    _fsp--;
+
+                    	retval.baseDescr = pn;	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end lhs
+
+    public static class from_elements_return extends TreeRuleReturnScope {
+        public PatternSourceDescr patternSourceDescr;
+    };
+
+    // $ANTLR start from_elements
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:210:1: from_elements returns [PatternSourceDescr patternSourceDescr] : ( ^(start= VK_ACCUMULATE dt= lhs ret= accumulate_parts[$patternSourceDescr] ) | ^(start= VK_COLLECT dt= lhs ) | ^(start= VK_ENTRY_POINT entryId= VT_ENTRYPOINT_ID ) | fs= from_source_clause );
+    public final from_elements_return from_elements() throws RecognitionException {
+        from_elements_return retval = new from_elements_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree entryId=null;
+        lhs_return dt = null;
+
+        AccumulateDescr ret = null;
+
+        from_source_clause_return fs = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:211:2: ( ^(start= VK_ACCUMULATE dt= lhs ret= accumulate_parts[$patternSourceDescr] ) | ^(start= VK_COLLECT dt= lhs ) | ^(start= VK_ENTRY_POINT entryId= VT_ENTRYPOINT_ID ) | fs= from_source_clause )
+            int alt27=4;
+            switch ( input.LA(1) ) {
+            case VK_ACCUMULATE:
+                {
+                alt27=1;
+                }
+                break;
+            case VK_COLLECT:
+                {
+                alt27=2;
+                }
+                break;
+            case VK_ENTRY_POINT:
+                {
+                alt27=3;
+                }
+                break;
+            case VT_FROM_SOURCE:
+                {
+                alt27=4;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("210:1: from_elements returns [PatternSourceDescr patternSourceDescr] : ( ^(start= VK_ACCUMULATE dt= lhs ret= accumulate_parts[$patternSourceDescr] ) | ^(start= VK_COLLECT dt= lhs ) | ^(start= VK_ENTRY_POINT entryId= VT_ENTRYPOINT_ID ) | fs= from_source_clause );", 27, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt27) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:211:4: ^(start= VK_ACCUMULATE dt= lhs ret= accumulate_parts[$patternSourceDescr] )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_ACCUMULATE,FOLLOW_VK_ACCUMULATE_in_from_elements1074); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_from_elements1078);
+                    dt=lhs();
+                    _fsp--;
+
+                    	retval.patternSourceDescr = factory.createAccumulate(start, dt.baseDescr);	
+                    pushFollow(FOLLOW_accumulate_parts_in_from_elements1088);
+                    ret=accumulate_parts(retval.patternSourceDescr);
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.patternSourceDescr = ret;	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:215:4: ^(start= VK_COLLECT dt= lhs )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_COLLECT,FOLLOW_VK_COLLECT_in_from_elements1101); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_from_elements1105);
+                    dt=lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.patternSourceDescr = factory.createCollect(start, dt.baseDescr);	
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:217:4: ^(start= VK_ENTRY_POINT entryId= VT_ENTRYPOINT_ID )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VK_ENTRY_POINT,FOLLOW_VK_ENTRY_POINT_in_from_elements1117); 
+
+                    match(input, Token.DOWN, null); 
+                    entryId=(DroolsTree)input.LT(1);
+                    match(input,VT_ENTRYPOINT_ID,FOLLOW_VT_ENTRYPOINT_ID_in_from_elements1121); 
+
+                    match(input, Token.UP, null); 
+                    	retval.patternSourceDescr = factory.createEntryPoint(start, entryId);	
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:219:4: fs= from_source_clause
+                    {
+                    pushFollow(FOLLOW_from_source_clause_in_from_elements1132);
+                    fs=from_source_clause();
+                    _fsp--;
+
+                    	retval.patternSourceDescr = fs.fromDescr;	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end from_elements
+
+
+    // $ANTLR start accumulate_parts
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:223:1: accumulate_parts[PatternSourceDescr patternSourceDescr] returns [AccumulateDescr accumulateDescr] : (ac1= accumulate_init_clause[$patternSourceDescr] | ac2= accumulate_id_clause[$patternSourceDescr] );
+    public final AccumulateDescr accumulate_parts(PatternSourceDescr patternSourceDescr) throws RecognitionException {
+        AccumulateDescr accumulateDescr = null;
+
+        accumulate_init_clause_return ac1 = null;
+
+        AccumulateDescr ac2 = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:224:2: (ac1= accumulate_init_clause[$patternSourceDescr] | ac2= accumulate_id_clause[$patternSourceDescr] )
+            int alt28=2;
+            int LA28_0 = input.LA(1);
+
+            if ( (LA28_0==VT_ACCUMULATE_INIT_CLAUSE) ) {
+                alt28=1;
+            }
+            else if ( (LA28_0==VT_ACCUMULATE_ID_CLAUSE) ) {
+                alt28=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("223:1: accumulate_parts[PatternSourceDescr patternSourceDescr] returns [AccumulateDescr accumulateDescr] : (ac1= accumulate_init_clause[$patternSourceDescr] | ac2= accumulate_id_clause[$patternSourceDescr] );", 28, 0, input);
+
+                throw nvae;
+            }
+            switch (alt28) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:224:4: ac1= accumulate_init_clause[$patternSourceDescr]
+                    {
+                    pushFollow(FOLLOW_accumulate_init_clause_in_accumulate_parts1153);
+                    ac1=accumulate_init_clause(patternSourceDescr);
+                    _fsp--;
+
+                    	accumulateDescr = ac1.accumulateDescr;	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:226:4: ac2= accumulate_id_clause[$patternSourceDescr]
+                    {
+                    pushFollow(FOLLOW_accumulate_id_clause_in_accumulate_parts1164);
+                    ac2=accumulate_id_clause(patternSourceDescr);
+                    _fsp--;
+
+                    	accumulateDescr = ac2;	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return accumulateDescr;
+    }
+    // $ANTLR end accumulate_parts
+
+    public static class accumulate_init_clause_return extends TreeRuleReturnScope {
+        public AccumulateDescr accumulateDescr;
+    };
+
+    // $ANTLR start accumulate_init_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:230:1: accumulate_init_clause[PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr] : ^( VT_ACCUMULATE_INIT_CLAUSE ^(start= VK_INIT pc1= VT_PAREN_CHUNK ) ^( VK_ACTION pc2= VT_PAREN_CHUNK ) (rev= accumulate_init_reverse_clause )? ^( VK_RESULT pc3= VT_PAREN_CHUNK ) ) ;
+    public final accumulate_init_clause_return accumulate_init_clause(PatternSourceDescr accumulateParam) throws RecognitionException {
+        accumulate_init_clause_return retval = new accumulate_init_clause_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree pc1=null;
+        DroolsTree pc2=null;
+        DroolsTree pc3=null;
+        accumulate_init_reverse_clause_return rev = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:231:2: ( ^( VT_ACCUMULATE_INIT_CLAUSE ^(start= VK_INIT pc1= VT_PAREN_CHUNK ) ^( VK_ACTION pc2= VT_PAREN_CHUNK ) (rev= accumulate_init_reverse_clause )? ^( VK_RESULT pc3= VT_PAREN_CHUNK ) ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:231:4: ^( VT_ACCUMULATE_INIT_CLAUSE ^(start= VK_INIT pc1= VT_PAREN_CHUNK ) ^( VK_ACTION pc2= VT_PAREN_CHUNK ) (rev= accumulate_init_reverse_clause )? ^( VK_RESULT pc3= VT_PAREN_CHUNK ) )
+            {
+            match(input,VT_ACCUMULATE_INIT_CLAUSE,FOLLOW_VT_ACCUMULATE_INIT_CLAUSE_in_accumulate_init_clause1187); 
+
+            match(input, Token.DOWN, null); 
+            start=(DroolsTree)input.LT(1);
+            match(input,VK_INIT,FOLLOW_VK_INIT_in_accumulate_init_clause1196); 
+
+            match(input, Token.DOWN, null); 
+            pc1=(DroolsTree)input.LT(1);
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1200); 
+
+            match(input, Token.UP, null); 
+            match(input,VK_ACTION,FOLLOW_VK_ACTION_in_accumulate_init_clause1208); 
+
+            match(input, Token.DOWN, null); 
+            pc2=(DroolsTree)input.LT(1);
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1212); 
+
+            match(input, Token.UP, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:234:7: (rev= accumulate_init_reverse_clause )?
+            int alt29=2;
+            int LA29_0 = input.LA(1);
+
+            if ( (LA29_0==VK_REVERSE) ) {
+                alt29=1;
+            }
+            switch (alt29) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:234:7: rev= accumulate_init_reverse_clause
+                    {
+                    pushFollow(FOLLOW_accumulate_init_reverse_clause_in_accumulate_init_clause1221);
+                    rev=accumulate_init_reverse_clause();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            match(input,VK_RESULT,FOLLOW_VK_RESULT_in_accumulate_init_clause1228); 
+
+            match(input, Token.DOWN, null); 
+            pc3=(DroolsTree)input.LT(1);
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1232); 
+
+            match(input, Token.UP, null); 
+
+            match(input, Token.UP, null); 
+            	if (null == rev){
+            			retval.accumulateDescr = factory.setupAccumulateInit(accumulateParam, start, pc1, pc2, pc3, null);
+            		} else {
+            			retval.accumulateDescr = factory.setupAccumulateInit(accumulateParam, start, pc1, pc2, pc3, rev.vkReverseChunk);
+            		}	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_init_clause
+
+    public static class accumulate_init_reverse_clause_return extends TreeRuleReturnScope {
+        public DroolsTree vkReverse;
+        public DroolsTree vkReverseChunk;
+    };
+
+    // $ANTLR start accumulate_init_reverse_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:243:1: accumulate_init_reverse_clause returns [DroolsTree vkReverse, DroolsTree vkReverseChunk] : ^(vk= VK_REVERSE pc= VT_PAREN_CHUNK ) ;
+    public final accumulate_init_reverse_clause_return accumulate_init_reverse_clause() throws RecognitionException {
+        accumulate_init_reverse_clause_return retval = new accumulate_init_reverse_clause_return();
+        retval.start = input.LT(1);
+
+        DroolsTree vk=null;
+        DroolsTree pc=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:244:2: ( ^(vk= VK_REVERSE pc= VT_PAREN_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:244:4: ^(vk= VK_REVERSE pc= VT_PAREN_CHUNK )
+            {
+            vk=(DroolsTree)input.LT(1);
+            match(input,VK_REVERSE,FOLLOW_VK_REVERSE_in_accumulate_init_reverse_clause1255); 
+
+            match(input, Token.DOWN, null); 
+            pc=(DroolsTree)input.LT(1);
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_reverse_clause1259); 
+
+            match(input, Token.UP, null); 
+            	retval.vkReverse = vk;
+            		retval.vkReverseChunk = pc;	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end accumulate_init_reverse_clause
+
+
+    // $ANTLR start accumulate_id_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:249:1: accumulate_id_clause[PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr] : ^( VT_ACCUMULATE_ID_CLAUSE id= ID pc= VT_PAREN_CHUNK ) ;
+    public final AccumulateDescr accumulate_id_clause(PatternSourceDescr accumulateParam) throws RecognitionException {
+        AccumulateDescr accumulateDescr = null;
+
+        DroolsTree id=null;
+        DroolsTree pc=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:250:2: ( ^( VT_ACCUMULATE_ID_CLAUSE id= ID pc= VT_PAREN_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:250:4: ^( VT_ACCUMULATE_ID_CLAUSE id= ID pc= VT_PAREN_CHUNK )
+            {
+            match(input,VT_ACCUMULATE_ID_CLAUSE,FOLLOW_VT_ACCUMULATE_ID_CLAUSE_in_accumulate_id_clause1281); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_accumulate_id_clause1285); 
+            pc=(DroolsTree)input.LT(1);
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_id_clause1289); 
+
+            match(input, Token.UP, null); 
+            	accumulateDescr = factory.setupAccumulateId(accumulateParam, id, pc);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return accumulateDescr;
+    }
+    // $ANTLR end accumulate_id_clause
+
+    protected static class from_source_clause_scope {
+        AccessorDescr accessorDescr;
+    }
+    protected Stack from_source_clause_stack = new Stack();
+
+    public static class from_source_clause_return extends TreeRuleReturnScope {
+        public FromDescr fromDescr;
+        public AccessorDescr retAccessorDescr;
+    };
+
+    // $ANTLR start from_source_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:254:1: from_source_clause returns [FromDescr fromDescr, AccessorDescr retAccessorDescr] : ^( VT_FROM_SOURCE id= ID (pc= VT_PAREN_CHUNK )? ( expression_chain )? ) ;
+    public final from_source_clause_return from_source_clause() throws RecognitionException {
+        from_source_clause_stack.push(new from_source_clause_scope());
+        from_source_clause_return retval = new from_source_clause_return();
+        retval.start = input.LT(1);
+
+        DroolsTree id=null;
+        DroolsTree pc=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:257:3: ( ^( VT_FROM_SOURCE id= ID (pc= VT_PAREN_CHUNK )? ( expression_chain )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:257:5: ^( VT_FROM_SOURCE id= ID (pc= VT_PAREN_CHUNK )? ( expression_chain )? )
+            {
+            match(input,VT_FROM_SOURCE,FOLLOW_VT_FROM_SOURCE_in_from_source_clause1311); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_from_source_clause1315); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:257:30: (pc= VT_PAREN_CHUNK )?
+            int alt30=2;
+            int LA30_0 = input.LA(1);
+
+            if ( (LA30_0==VT_PAREN_CHUNK) ) {
+                alt30=1;
+            }
+            switch (alt30) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:257:30: pc= VT_PAREN_CHUNK
+                    {
+                    pc=(DroolsTree)input.LT(1);
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_from_source_clause1319); 
+
+                    }
+                    break;
+
+            }
+
+            	((from_source_clause_scope)from_source_clause_stack.peek()).accessorDescr = factory.createAccessor(id, pc);	
+            		retval.retAccessorDescr = ((from_source_clause_scope)from_source_clause_stack.peek()).accessorDescr;	
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:260:3: ( expression_chain )?
+            int alt31=2;
+            int LA31_0 = input.LA(1);
+
+            if ( (LA31_0==VT_EXPRESSION_CHAIN) ) {
+                alt31=1;
+            }
+            switch (alt31) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:260:3: expression_chain
+                    {
+                    pushFollow(FOLLOW_expression_chain_in_from_source_clause1328);
+                    expression_chain();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+
+            match(input, Token.UP, null); 
+            	retval.fromDescr = factory.createFromSource(factory.setupAccessorOffset(((from_source_clause_scope)from_source_clause_stack.peek()).accessorDescr)); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+            from_source_clause_stack.pop();
+        }
+        return retval;
+    }
+    // $ANTLR end from_source_clause
+
+    public static class expression_chain_return extends TreeRuleReturnScope {
+    };
+
+    // $ANTLR start expression_chain
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:264:1: expression_chain : ^(start= VT_EXPRESSION_CHAIN id= ID (sc= VT_SQUARE_CHUNK )? (pc= VT_PAREN_CHUNK )? ( expression_chain )? ) ;
+    public final expression_chain_return expression_chain() throws RecognitionException {
+        expression_chain_return retval = new expression_chain_return();
+        retval.start = input.LT(1);
+
+        DroolsTree start=null;
+        DroolsTree id=null;
+        DroolsTree sc=null;
+        DroolsTree pc=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:2: ( ^(start= VT_EXPRESSION_CHAIN id= ID (sc= VT_SQUARE_CHUNK )? (pc= VT_PAREN_CHUNK )? ( expression_chain )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:4: ^(start= VT_EXPRESSION_CHAIN id= ID (sc= VT_SQUARE_CHUNK )? (pc= VT_PAREN_CHUNK )? ( expression_chain )? )
+            {
+            start=(DroolsTree)input.LT(1);
+            match(input,VT_EXPRESSION_CHAIN,FOLLOW_VT_EXPRESSION_CHAIN_in_expression_chain1347); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_expression_chain1351); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:40: (sc= VT_SQUARE_CHUNK )?
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==VT_SQUARE_CHUNK) ) {
+                alt32=1;
+            }
+            switch (alt32) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:40: sc= VT_SQUARE_CHUNK
+                    {
+                    sc=(DroolsTree)input.LT(1);
+                    match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_expression_chain1355); 
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:60: (pc= VT_PAREN_CHUNK )?
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==VT_PAREN_CHUNK) ) {
+                alt33=1;
+            }
+            switch (alt33) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:265:60: pc= VT_PAREN_CHUNK
+                    {
+                    pc=(DroolsTree)input.LT(1);
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_expression_chain1360); 
+
+                    }
+                    break;
+
+            }
+
+            	DeclarativeInvokerDescr declarativeInvokerResult = factory.createExpressionChain(start, id, sc, pc);	
+            		((from_source_clause_scope)from_source_clause_stack.peek()).accessorDescr.addInvoker(declarativeInvokerResult);	
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:268:3: ( expression_chain )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==VT_EXPRESSION_CHAIN) ) {
+                alt34=1;
+            }
+            switch (alt34) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:268:3: expression_chain
+                    {
+                    pushFollow(FOLLOW_expression_chain_in_expression_chain1368);
+                    expression_chain();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end expression_chain
+
+
+    // $ANTLR start lhs_pattern
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:271:1: lhs_pattern returns [BaseDescr baseDescr] : ^( VT_PATTERN fe= fact_expression ) ;
+    public final BaseDescr lhs_pattern() throws RecognitionException {
+        BaseDescr baseDescr = null;
+
+        fact_expression_return fe = null;
+
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:272:2: ( ^( VT_PATTERN fe= fact_expression ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:272:4: ^( VT_PATTERN fe= fact_expression )
+            {
+            match(input,VT_PATTERN,FOLLOW_VT_PATTERN_in_lhs_pattern1386); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_fact_expression_in_lhs_pattern1390);
+            fe=fact_expression();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+            	baseDescr = fe.descr;	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return baseDescr;
+    }
+    // $ANTLR end lhs_pattern
+
+    public static class fact_expression_return extends TreeRuleReturnScope {
+        public BaseDescr descr;
+    };
+
+    // $ANTLR start fact_expression
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:276:1: fact_expression returns [BaseDescr descr] : ( ^( VT_FACT pt= pattern_type (fe= fact_expression )* ) | ^( VT_FACT_BINDING label= VT_LABEL fact= fact_expression ) | ^(start= VT_FACT_OR left= fact_expression right= fact_expression ) | ^( VT_FIELD field= field_element (fe= fact_expression )? ) | ^( VT_BIND_FIELD label= VT_LABEL fe= fact_expression ) | ^( VK_EVAL pc= VT_PAREN_CHUNK ) | ^(op= EQUAL fe= fact_expression ) | ^(op= NOT_EQUAL fe= fact_expression ) | ^(op= GREATER fe= fact_expression ) | ^(op= GREATER_EQUAL fe= fact_expression ) | ^(op= LESS fe= fact_expression ) | ^(op= LESS_EQUAL fe= fact_expression ) | ^(op= VK_CONTAINS (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_EXCLUDES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MATCHES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_SOUNDSLIKE (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MEMBERO!
 F (not= VK_NOT )? fe= fact_expression ) | ^(op= ID (not= VK_NOT )? (param= VT_SQUARE_CHUNK )? fe= fact_expression ) | ^( VK_IN (not= VK_NOT )? (fe= fact_expression )+ ) | ^( DOUBLE_PIPE left= fact_expression right= fact_expression ) | ^( DOUBLE_AMPER left= fact_expression right= fact_expression ) | ^( VT_ACCESSOR_PATH (ae= accessor_element )+ ) | s= STRING | i= INT | f= FLOAT | b= BOOL | n= NULL | pc= VT_PAREN_CHUNK );
+    public final fact_expression_return fact_expression() throws RecognitionException {
+        fact_expression_return retval = new fact_expression_return();
+        retval.start = input.LT(1);
+
+        DroolsTree label=null;
+        DroolsTree start=null;
+        DroolsTree pc=null;
+        DroolsTree op=null;
+        DroolsTree not=null;
+        DroolsTree param=null;
+        DroolsTree s=null;
+        DroolsTree i=null;
+        DroolsTree f=null;
+        DroolsTree b=null;
+        DroolsTree n=null;
+        BaseDescr pt = null;
+
+        fact_expression_return fe = null;
+
+        fact_expression_return fact = null;
+
+        fact_expression_return left = null;
+
+        fact_expression_return right = null;
+
+        FieldConstraintDescr field = null;
+
+        BaseDescr ae = null;
+
+
+
+        	List<BaseDescr> exprList = new LinkedList<BaseDescr>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:279:3: ( ^( VT_FACT pt= pattern_type (fe= fact_expression )* ) | ^( VT_FACT_BINDING label= VT_LABEL fact= fact_expression ) | ^(start= VT_FACT_OR left= fact_expression right= fact_expression ) | ^( VT_FIELD field= field_element (fe= fact_expression )? ) | ^( VT_BIND_FIELD label= VT_LABEL fe= fact_expression ) | ^( VK_EVAL pc= VT_PAREN_CHUNK ) | ^(op= EQUAL fe= fact_expression ) | ^(op= NOT_EQUAL fe= fact_expression ) | ^(op= GREATER fe= fact_expression ) | ^(op= GREATER_EQUAL fe= fact_expression ) | ^(op= LESS fe= fact_expression ) | ^(op= LESS_EQUAL fe= fact_expression ) | ^(op= VK_CONTAINS (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_EXCLUDES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MATCHES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_SOUNDSLIKE (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MEMBEROF (not= VK_NOT )? fe= fact_expressio!
 n ) | ^(op= ID (not= VK_NOT )? (param= VT_SQUARE_CHUNK )? fe= fact_expression ) | ^( VK_IN (not= VK_NOT )? (fe= fact_expression )+ ) | ^( DOUBLE_PIPE left= fact_expression right= fact_expression ) | ^( DOUBLE_AMPER left= fact_expression right= fact_expression ) | ^( VT_ACCESSOR_PATH (ae= accessor_element )+ ) | s= STRING | i= INT | f= FLOAT | b= BOOL | n= NULL | pc= VT_PAREN_CHUNK )
+            int alt47=28;
+            switch ( input.LA(1) ) {
+            case VT_FACT:
+                {
+                alt47=1;
+                }
+                break;
+            case VT_FACT_BINDING:
+                {
+                alt47=2;
+                }
+                break;
+            case VT_FACT_OR:
+                {
+                alt47=3;
+                }
+                break;
+            case VT_FIELD:
+                {
+                alt47=4;
+                }
+                break;
+            case VT_BIND_FIELD:
+                {
+                alt47=5;
+                }
+                break;
+            case VK_EVAL:
+                {
+                alt47=6;
+                }
+                break;
+            case EQUAL:
+                {
+                alt47=7;
+                }
+                break;
+            case NOT_EQUAL:
+                {
+                alt47=8;
+                }
+                break;
+            case GREATER:
+                {
+                alt47=9;
+                }
+                break;
+            case GREATER_EQUAL:
+                {
+                alt47=10;
+                }
+                break;
+            case LESS:
+                {
+                alt47=11;
+                }
+                break;
+            case LESS_EQUAL:
+                {
+                alt47=12;
+                }
+                break;
+            case VK_CONTAINS:
+                {
+                alt47=13;
+                }
+                break;
+            case VK_EXCLUDES:
+                {
+                alt47=14;
+                }
+                break;
+            case VK_MATCHES:
+                {
+                alt47=15;
+                }
+                break;
+            case VK_SOUNDSLIKE:
+                {
+                alt47=16;
+                }
+                break;
+            case VK_MEMBEROF:
+                {
+                alt47=17;
+                }
+                break;
+            case ID:
+                {
+                alt47=18;
+                }
+                break;
+            case VK_IN:
+                {
+                alt47=19;
+                }
+                break;
+            case DOUBLE_PIPE:
+                {
+                alt47=20;
+                }
+                break;
+            case DOUBLE_AMPER:
+                {
+                alt47=21;
+                }
+                break;
+            case VT_ACCESSOR_PATH:
+                {
+                alt47=22;
+                }
+                break;
+            case STRING:
+                {
+                alt47=23;
+                }
+                break;
+            case INT:
+                {
+                alt47=24;
+                }
+                break;
+            case FLOAT:
+                {
+                alt47=25;
+                }
+                break;
+            case BOOL:
+                {
+                alt47=26;
+                }
+                break;
+            case NULL:
+                {
+                alt47=27;
+                }
+                break;
+            case VT_PAREN_CHUNK:
+                {
+                alt47=28;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("276:1: fact_expression returns [BaseDescr descr] : ( ^( VT_FACT pt= pattern_type (fe= fact_expression )* ) | ^( VT_FACT_BINDING label= VT_LABEL fact= fact_expression ) | ^(start= VT_FACT_OR left= fact_expression right= fact_expression ) | ^( VT_FIELD field= field_element (fe= fact_expression )? ) | ^( VT_BIND_FIELD label= VT_LABEL fe= fact_expression ) | ^( VK_EVAL pc= VT_PAREN_CHUNK ) | ^(op= EQUAL fe= fact_expression ) | ^(op= NOT_EQUAL fe= fact_expression ) | ^(op= GREATER fe= fact_expression ) | ^(op= GREATER_EQUAL fe= fact_expression ) | ^(op= LESS fe= fact_expression ) | ^(op= LESS_EQUAL fe= fact_expression ) | ^(op= VK_CONTAINS (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_EXCLUDES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MATCHES (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_SOUNDSLIKE (not= VK_NOT )? fe= fact_expression ) | ^(op= VK_MEMBEROF (not= VK_NOT )? fe= fact_expression ) | ^(op= ID (not= VK_NOT )? (!
 param= VT_SQUARE_CHUNK )? fe= fact_expression ) | ^( VK_IN (not= VK_NOT )? (fe= fact_expression )+ ) | ^( DOUBLE_PIPE left= fact_expression right= fact_expression ) | ^( DOUBLE_AMPER left= fact_expression right= fact_expression ) | ^( VT_ACCESSOR_PATH (ae= accessor_element )+ ) | s= STRING | i= INT | f= FLOAT | b= BOOL | n= NULL | pc= VT_PAREN_CHUNK );", 47, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt47) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:279:5: ^( VT_FACT pt= pattern_type (fe= fact_expression )* )
+                    {
+                    match(input,VT_FACT,FOLLOW_VT_FACT_in_fact_expression1413); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_pattern_type_in_fact_expression1417);
+                    pt=pattern_type();
+                    _fsp--;
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:279:31: (fe= fact_expression )*
+                    loop35:
+                    do {
+                        int alt35=2;
+                        int LA35_0 = input.LA(1);
+
+                        if ( (LA35_0==VT_FACT||LA35_0==VT_PAREN_CHUNK||(LA35_0>=VT_FACT_BINDING && LA35_0<=VT_ACCESSOR_PATH)||(LA35_0>=VK_EVAL && LA35_0<=VK_MEMBEROF)||LA35_0==VK_IN||LA35_0==ID||LA35_0==STRING||(LA35_0>=BOOL && LA35_0<=DOUBLE_AMPER)||(LA35_0>=EQUAL && LA35_0<=NOT_EQUAL)||(LA35_0>=FLOAT && LA35_0<=NULL)) ) {
+                            alt35=1;
+                        }
+
+
+                        switch (alt35) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:279:32: fe= fact_expression
+                    	    {
+                    	    pushFollow(FOLLOW_fact_expression_in_fact_expression1422);
+                    	    fe=fact_expression();
+                    	    _fsp--;
+
+                    	    exprList.add(fe.descr);
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop35;
+                        }
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createPattern(pt, exprList);	
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:281:4: ^( VT_FACT_BINDING label= VT_LABEL fact= fact_expression )
+                    {
+                    match(input,VT_FACT_BINDING,FOLLOW_VT_FACT_BINDING_in_fact_expression1436); 
+
+                    match(input, Token.DOWN, null); 
+                    label=(DroolsTree)input.LT(1);
+                    match(input,VT_LABEL,FOLLOW_VT_LABEL_in_fact_expression1440); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1444);
+                    fact=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupPatternBiding(label, fact.descr);	
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:283:4: ^(start= VT_FACT_OR left= fact_expression right= fact_expression )
+                    {
+                    start=(DroolsTree)input.LT(1);
+                    match(input,VT_FACT_OR,FOLLOW_VT_FACT_OR_in_fact_expression1456); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1460);
+                    left=fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1464);
+                    right=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createFactOr(start, left.descr, right.descr);	
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:286:4: ^( VT_FIELD field= field_element (fe= fact_expression )? )
+                    {
+                    match(input,VT_FIELD,FOLLOW_VT_FIELD_in_fact_expression1475); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_field_element_in_fact_expression1479);
+                    field=field_element();
+                    _fsp--;
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:286:37: (fe= fact_expression )?
+                    int alt36=2;
+                    int LA36_0 = input.LA(1);
+
+                    if ( (LA36_0==VT_FACT||LA36_0==VT_PAREN_CHUNK||(LA36_0>=VT_FACT_BINDING && LA36_0<=VT_ACCESSOR_PATH)||(LA36_0>=VK_EVAL && LA36_0<=VK_MEMBEROF)||LA36_0==VK_IN||LA36_0==ID||LA36_0==STRING||(LA36_0>=BOOL && LA36_0<=DOUBLE_AMPER)||(LA36_0>=EQUAL && LA36_0<=NOT_EQUAL)||(LA36_0>=FLOAT && LA36_0<=NULL)) ) {
+                        alt36=1;
+                    }
+                    switch (alt36) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:286:37: fe= fact_expression
+                            {
+                            pushFollow(FOLLOW_fact_expression_in_fact_expression1483);
+                            fe=fact_expression();
+                            _fsp--;
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    match(input, Token.UP, null); 
+                    	if (null != fe){
+                    			retval.descr = factory.setupFieldConstraint(field, fe.descr);
+                    		} else {
+                    			retval.descr = factory.setupFieldConstraint(field, null);
+                    		}	
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:292:4: ^( VT_BIND_FIELD label= VT_LABEL fe= fact_expression )
+                    {
+                    match(input,VT_BIND_FIELD,FOLLOW_VT_BIND_FIELD_in_fact_expression1494); 
+
+                    match(input, Token.DOWN, null); 
+                    label=(DroolsTree)input.LT(1);
+                    match(input,VT_LABEL,FOLLOW_VT_LABEL_in_fact_expression1498); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1502);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createFieldBinding(label, fe.descr);	
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:295:4: ^( VK_EVAL pc= VT_PAREN_CHUNK )
+                    {
+                    match(input,VK_EVAL,FOLLOW_VK_EVAL_in_fact_expression1513); 
+
+                    match(input, Token.DOWN, null); 
+                    pc=(DroolsTree)input.LT(1);
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_fact_expression1517); 
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createPredicate(pc);	
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:298:4: ^(op= EQUAL fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,EQUAL,FOLLOW_EQUAL_in_fact_expression1530); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1534);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:300:4: ^(op= NOT_EQUAL fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,NOT_EQUAL,FOLLOW_NOT_EQUAL_in_fact_expression1546); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1550);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:302:4: ^(op= GREATER fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,GREATER,FOLLOW_GREATER_in_fact_expression1562); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1566);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:304:4: ^(op= GREATER_EQUAL fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,GREATER_EQUAL,FOLLOW_GREATER_EQUAL_in_fact_expression1578); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1582);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:306:4: ^(op= LESS fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,LESS,FOLLOW_LESS_in_fact_expression1594); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1598);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:308:4: ^(op= LESS_EQUAL fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,LESS_EQUAL,FOLLOW_LESS_EQUAL_in_fact_expression1610); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1614);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, null, fe.descr);	
+
+                    }
+                    break;
+                case 13 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:310:4: ^(op= VK_CONTAINS (not= VK_NOT )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,VK_CONTAINS,FOLLOW_VK_CONTAINS_in_fact_expression1626); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:310:24: (not= VK_NOT )?
+                    int alt37=2;
+                    int LA37_0 = input.LA(1);
+
+                    if ( (LA37_0==VK_NOT) ) {
+                        alt37=1;
+                    }
+                    switch (alt37) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:310:24: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1630); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1635);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr);	
+
+                    }
+                    break;
+                case 14 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:312:4: ^(op= VK_EXCLUDES (not= VK_NOT )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,VK_EXCLUDES,FOLLOW_VK_EXCLUDES_in_fact_expression1647); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:312:24: (not= VK_NOT )?
+                    int alt38=2;
+                    int LA38_0 = input.LA(1);
+
+                    if ( (LA38_0==VK_NOT) ) {
+                        alt38=1;
+                    }
+                    switch (alt38) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:312:24: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1651); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1656);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr);	
+
+                    }
+                    break;
+                case 15 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:314:4: ^(op= VK_MATCHES (not= VK_NOT )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,VK_MATCHES,FOLLOW_VK_MATCHES_in_fact_expression1668); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:314:23: (not= VK_NOT )?
+                    int alt39=2;
+                    int LA39_0 = input.LA(1);
+
+                    if ( (LA39_0==VK_NOT) ) {
+                        alt39=1;
+                    }
+                    switch (alt39) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:314:23: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1672); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1677);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr);	
+
+                    }
+                    break;
+                case 16 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:316:4: ^(op= VK_SOUNDSLIKE (not= VK_NOT )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,VK_SOUNDSLIKE,FOLLOW_VK_SOUNDSLIKE_in_fact_expression1689); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:316:26: (not= VK_NOT )?
+                    int alt40=2;
+                    int LA40_0 = input.LA(1);
+
+                    if ( (LA40_0==VK_NOT) ) {
+                        alt40=1;
+                    }
+                    switch (alt40) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:316:26: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1693); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1698);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr);	
+
+                    }
+                    break;
+                case 17 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:318:4: ^(op= VK_MEMBEROF (not= VK_NOT )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,VK_MEMBEROF,FOLLOW_VK_MEMBEROF_in_fact_expression1710); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:318:24: (not= VK_NOT )?
+                    int alt41=2;
+                    int LA41_0 = input.LA(1);
+
+                    if ( (LA41_0==VK_NOT) ) {
+                        alt41=1;
+                    }
+                    switch (alt41) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:318:24: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1714); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1719);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr);	
+
+                    }
+                    break;
+                case 18 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:320:4: ^(op= ID (not= VK_NOT )? (param= VT_SQUARE_CHUNK )? fe= fact_expression )
+                    {
+                    op=(DroolsTree)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_fact_expression1731); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:320:15: (not= VK_NOT )?
+                    int alt42=2;
+                    int LA42_0 = input.LA(1);
+
+                    if ( (LA42_0==VK_NOT) ) {
+                        alt42=1;
+                    }
+                    switch (alt42) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:320:15: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1735); 
+
+                            }
+                            break;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:320:29: (param= VT_SQUARE_CHUNK )?
+                    int alt43=2;
+                    int LA43_0 = input.LA(1);
+
+                    if ( (LA43_0==VT_SQUARE_CHUNK) ) {
+                        alt43=1;
+                    }
+                    switch (alt43) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:320:29: param= VT_SQUARE_CHUNK
+                            {
+                            param=(DroolsTree)input.LT(1);
+                            match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_fact_expression1740); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1745);
+                    fe=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.setupRestriction(op, not, fe.descr, param);	
+
+                    }
+                    break;
+                case 19 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:323:4: ^( VK_IN (not= VK_NOT )? (fe= fact_expression )+ )
+                    {
+                    match(input,VK_IN,FOLLOW_VK_IN_in_fact_expression1756); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:323:15: (not= VK_NOT )?
+                    int alt44=2;
+                    int LA44_0 = input.LA(1);
+
+                    if ( (LA44_0==VK_NOT) ) {
+                        alt44=1;
+                    }
+                    switch (alt44) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:323:15: not= VK_NOT
+                            {
+                            not=(DroolsTree)input.LT(1);
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression1760); 
+
+                            }
+                            break;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:323:24: (fe= fact_expression )+
+                    int cnt45=0;
+                    loop45:
+                    do {
+                        int alt45=2;
+                        int LA45_0 = input.LA(1);
+
+                        if ( (LA45_0==VT_FACT||LA45_0==VT_PAREN_CHUNK||(LA45_0>=VT_FACT_BINDING && LA45_0<=VT_ACCESSOR_PATH)||(LA45_0>=VK_EVAL && LA45_0<=VK_MEMBEROF)||LA45_0==VK_IN||LA45_0==ID||LA45_0==STRING||(LA45_0>=BOOL && LA45_0<=DOUBLE_AMPER)||(LA45_0>=EQUAL && LA45_0<=NOT_EQUAL)||(LA45_0>=FLOAT && LA45_0<=NULL)) ) {
+                            alt45=1;
+                        }
+
+
+                        switch (alt45) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:323:25: fe= fact_expression
+                    	    {
+                    	    pushFollow(FOLLOW_fact_expression_in_fact_expression1766);
+                    	    fe=fact_expression();
+                    	    _fsp--;
+
+                    	    exprList.add(fe.descr);
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt45 >= 1 ) break loop45;
+                                EarlyExitException eee =
+                                    new EarlyExitException(45, input);
+                                throw eee;
+                        }
+                        cnt45++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createRestrictionConnective(not, exprList);	
+
+                    }
+                    break;
+                case 20 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:326:4: ^( DOUBLE_PIPE left= fact_expression right= fact_expression )
+                    {
+                    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_fact_expression1781); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1785);
+                    left=fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1789);
+                    right=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createOrRestrictionConnective(left.descr, right.descr);	
+
+                    }
+                    break;
+                case 21 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:328:4: ^( DOUBLE_AMPER left= fact_expression right= fact_expression )
+                    {
+                    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_fact_expression1799); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1803);
+                    left=fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1807);
+                    right=fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createAndRestrictionConnective(left.descr, right.descr);	
+
+                    }
+                    break;
+                case 22 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:331:4: ^( VT_ACCESSOR_PATH (ae= accessor_element )+ )
+                    {
+                    match(input,VT_ACCESSOR_PATH,FOLLOW_VT_ACCESSOR_PATH_in_fact_expression1818); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:331:23: (ae= accessor_element )+
+                    int cnt46=0;
+                    loop46:
+                    do {
+                        int alt46=2;
+                        int LA46_0 = input.LA(1);
+
+                        if ( (LA46_0==VT_ACCESSOR_ELEMENT) ) {
+                            alt46=1;
+                        }
+
+
+                        switch (alt46) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:331:24: ae= accessor_element
+                    	    {
+                    	    pushFollow(FOLLOW_accessor_element_in_fact_expression1823);
+                    	    ae=accessor_element();
+                    	    _fsp--;
+
+                    	    exprList.add(ae);
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt46 >= 1 ) break loop46;
+                                EarlyExitException eee =
+                                    new EarlyExitException(46, input);
+                                throw eee;
+                        }
+                        cnt46++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+                    	retval.descr = factory.createAccessorPath(exprList);	
+
+                    }
+                    break;
+                case 23 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:333:4: s= STRING
+                    {
+                    s=(DroolsTree)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_fact_expression1838); 
+                    	retval.descr = factory.createStringLiteralRestriction(s);	
+
+                    }
+                    break;
+                case 24 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:335:4: i= INT
+                    {
+                    i=(DroolsTree)input.LT(1);
+                    match(input,INT,FOLLOW_INT_in_fact_expression1848); 
+                    	retval.descr = factory.createIntLiteralRestriction(i);	
+
+                    }
+                    break;
+                case 25 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:337:4: f= FLOAT
+                    {
+                    f=(DroolsTree)input.LT(1);
+                    match(input,FLOAT,FOLLOW_FLOAT_in_fact_expression1858); 
+                    	retval.descr = factory.createFloatLiteralRestriction(f);	
+
+                    }
+                    break;
+                case 26 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:339:4: b= BOOL
+                    {
+                    b=(DroolsTree)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_fact_expression1868); 
+                    	retval.descr = factory.createBoolLiteralRestriction(b);	
+
+                    }
+                    break;
+                case 27 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:341:4: n= NULL
+                    {
+                    n=(DroolsTree)input.LT(1);
+                    match(input,NULL,FOLLOW_NULL_in_fact_expression1878); 
+                    	retval.descr = factory.createNullLiteralRestriction(n);	
+
+                    }
+                    break;
+                case 28 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:343:4: pc= VT_PAREN_CHUNK
+                    {
+                    pc=(DroolsTree)input.LT(1);
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_fact_expression1888); 
+                    	retval.descr = factory.createReturnValue(pc);	
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end fact_expression
+
+
+    // $ANTLR start field_element
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:347:1: field_element returns [FieldConstraintDescr element] : ^( VT_ACCESSOR_PATH (ae= accessor_element )+ ) ;
+    public final FieldConstraintDescr field_element() throws RecognitionException {
+        FieldConstraintDescr element = null;
+
+        BaseDescr ae = null;
+
+
+
+        	List<BaseDescr> aeList = new LinkedList<BaseDescr>();
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:350:3: ( ^( VT_ACCESSOR_PATH (ae= accessor_element )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:350:5: ^( VT_ACCESSOR_PATH (ae= accessor_element )+ )
+            {
+            match(input,VT_ACCESSOR_PATH,FOLLOW_VT_ACCESSOR_PATH_in_field_element1910); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:350:24: (ae= accessor_element )+
+            int cnt48=0;
+            loop48:
+            do {
+                int alt48=2;
+                int LA48_0 = input.LA(1);
+
+                if ( (LA48_0==VT_ACCESSOR_ELEMENT) ) {
+                    alt48=1;
+                }
+
+
+                switch (alt48) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:350:25: ae= accessor_element
+            	    {
+            	    pushFollow(FOLLOW_accessor_element_in_field_element1915);
+            	    ae=accessor_element();
+            	    _fsp--;
+
+            	    aeList.add(ae);
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt48 >= 1 ) break loop48;
+                        EarlyExitException eee =
+                            new EarlyExitException(48, input);
+                        throw eee;
+                }
+                cnt48++;
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+            	element = factory.createFieldConstraint(aeList);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return element;
+    }
+    // $ANTLR end field_element
+
+
+    // $ANTLR start accessor_element
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:354:1: accessor_element returns [BaseDescr element] : ^( VT_ACCESSOR_ELEMENT id= ID (sc+= VT_SQUARE_CHUNK )* ) ;
+    public final BaseDescr accessor_element() throws RecognitionException {
+        BaseDescr element = null;
+
+        DroolsTree id=null;
+        DroolsTree sc=null;
+        List list_sc=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:355:2: ( ^( VT_ACCESSOR_ELEMENT id= ID (sc+= VT_SQUARE_CHUNK )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:355:4: ^( VT_ACCESSOR_ELEMENT id= ID (sc+= VT_SQUARE_CHUNK )* )
+            {
+            match(input,VT_ACCESSOR_ELEMENT,FOLLOW_VT_ACCESSOR_ELEMENT_in_accessor_element1939); 
+
+            match(input, Token.DOWN, null); 
+            id=(DroolsTree)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_accessor_element1943); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:355:34: (sc+= VT_SQUARE_CHUNK )*
+            loop49:
+            do {
+                int alt49=2;
+                int LA49_0 = input.LA(1);
+
+                if ( (LA49_0==VT_SQUARE_CHUNK) ) {
+                    alt49=1;
+                }
+
+
+                switch (alt49) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:355:34: sc+= VT_SQUARE_CHUNK
+            	    {
+            	    sc=(DroolsTree)input.LT(1);
+            	    match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_accessor_element1947); 
+            	    if (list_sc==null) list_sc=new ArrayList();
+            	    list_sc.add(sc);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop49;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+            	element = factory.createAccessorElement(id, list_sc);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return element;
+    }
+    // $ANTLR end accessor_element
+
+
+    // $ANTLR start pattern_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:359:1: pattern_type returns [BaseDescr dataType] : ^( VT_PATTERN_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* ) ;
+    public final BaseDescr pattern_type() throws RecognitionException {
+        BaseDescr dataType = null;
+
+        DroolsTree idList=null;
+        DroolsTree rightList=null;
+        List list_idList=null;
+        List list_rightList=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:2: ( ^( VT_PATTERN_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:4: ^( VT_PATTERN_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* )
+            {
+            match(input,VT_PATTERN_TYPE,FOLLOW_VT_PATTERN_TYPE_in_pattern_type1968); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:28: (idList+= ID )+
+            int cnt50=0;
+            loop50:
+            do {
+                int alt50=2;
+                int LA50_0 = input.LA(1);
+
+                if ( (LA50_0==ID) ) {
+                    alt50=1;
+                }
+
+
+                switch (alt50) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:28: idList+= ID
+            	    {
+            	    idList=(DroolsTree)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_pattern_type1972); 
+            	    if (list_idList==null) list_idList=new ArrayList();
+            	    list_idList.add(idList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt50 >= 1 ) break loop50;
+                        EarlyExitException eee =
+                            new EarlyExitException(50, input);
+                        throw eee;
+                }
+                cnt50++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:34: ( LEFT_SQUARE rightList+= RIGHT_SQUARE )*
+            loop51:
+            do {
+                int alt51=2;
+                int LA51_0 = input.LA(1);
+
+                if ( (LA51_0==LEFT_SQUARE) ) {
+                    alt51=1;
+                }
+
+
+                switch (alt51) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:360:35: LEFT_SQUARE rightList+= RIGHT_SQUARE
+            	    {
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_pattern_type1976); 
+            	    rightList=(DroolsTree)input.LT(1);
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_pattern_type1980); 
+            	    if (list_rightList==null) list_rightList=new ArrayList();
+            	    list_rightList.add(rightList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop51;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+            	dataType = factory.createDataType(list_idList, list_rightList);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return dataType;
+    }
+    // $ANTLR end pattern_type
+
+
+    // $ANTLR start data_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:364:1: data_type returns [BaseDescr dataType] : ^( VT_DATA_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* ) ;
+    public final BaseDescr data_type() throws RecognitionException {
+        BaseDescr dataType = null;
+
+        DroolsTree idList=null;
+        DroolsTree rightList=null;
+        List list_idList=null;
+        List list_rightList=null;
+
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:2: ( ^( VT_DATA_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:4: ^( VT_DATA_TYPE (idList+= ID )+ ( LEFT_SQUARE rightList+= RIGHT_SQUARE )* )
+            {
+            match(input,VT_DATA_TYPE,FOLLOW_VT_DATA_TYPE_in_data_type2002); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:25: (idList+= ID )+
+            int cnt52=0;
+            loop52:
+            do {
+                int alt52=2;
+                int LA52_0 = input.LA(1);
+
+                if ( (LA52_0==ID) ) {
+                    alt52=1;
+                }
+
+
+                switch (alt52) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:25: idList+= ID
+            	    {
+            	    idList=(DroolsTree)input.LT(1);
+            	    match(input,ID,FOLLOW_ID_in_data_type2006); 
+            	    if (list_idList==null) list_idList=new ArrayList();
+            	    list_idList.add(idList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt52 >= 1 ) break loop52;
+                        EarlyExitException eee =
+                            new EarlyExitException(52, input);
+                        throw eee;
+                }
+                cnt52++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:31: ( LEFT_SQUARE rightList+= RIGHT_SQUARE )*
+            loop53:
+            do {
+                int alt53=2;
+                int LA53_0 = input.LA(1);
+
+                if ( (LA53_0==LEFT_SQUARE) ) {
+                    alt53=1;
+                }
+
+
+                switch (alt53) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g:365:32: LEFT_SQUARE rightList+= RIGHT_SQUARE
+            	    {
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_data_type2010); 
+            	    rightList=(DroolsTree)input.LT(1);
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_data_type2014); 
+            	    if (list_rightList==null) list_rightList=new ArrayList();
+            	    list_rightList.add(rightList);
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop53;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+            	dataType = factory.createDataType(list_idList, list_rightList);	
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return dataType;
+    }
+    // $ANTLR end data_type
+
+
+ 
+
+    public static final BitSet FOLLOW_VT_COMPILATION_UNIT_in_compilation_unit49 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_package_statement_in_compilation_unit51 = new BitSet(new long[]{0xB67FF80000000028L,0x0000000000000001L});
+    public static final BitSet FOLLOW_statement_in_compilation_unit53 = new BitSet(new long[]{0xB67FF80000000028L,0x0000000000000001L});
+    public static final BitSet FOLLOW_VK_PACKAGE_in_package_statement71 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_package_id_in_package_statement75 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PACKAGE_ID_in_package_id102 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_package_id106 = new BitSet(new long[]{0x0000000000000008L,0x0000000000400000L});
+    public static final BitSet FOLLOW_rule_attribute_in_statement124 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_import_statement_in_statement134 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_statement_in_statement144 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_global_in_statement155 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_in_statement165 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_template_in_statement175 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule_in_statement185 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_in_statement195 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VK_IMPORT_in_import_statement216 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_import_name_in_import_statement220 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FUNCTION_IMPORT_in_function_import_statement242 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_FUNCTION_in_function_import_statement244 = new BitSet(new long[]{0x0000008000000000L});
+    public static final BitSet FOLLOW_import_name_in_function_import_statement248 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_IMPORT_ID_in_import_name267 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_import_name271 = new BitSet(new long[]{0x0000000000000008L,0x0000000001400000L});
+    public static final BitSet FOLLOW_DOT_STAR_in_import_name276 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_GLOBAL_in_global299 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_global303 = new BitSet(new long[]{0x0000010000000000L});
+    public static final BitSet FOLLOW_VT_GLOBAL_ID_in_global307 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_FUNCTION_in_function329 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_function333 = new BitSet(new long[]{0x0000020000000000L});
+    public static final BitSet FOLLOW_VT_FUNCTION_ID_in_function338 = new BitSet(new long[]{0x0000040000000000L});
+    public static final BitSet FOLLOW_parameters_in_function342 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_VT_CURLY_CHUNK_in_function346 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_TEMPLATE_in_template371 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_TEMPLATE_ID_in_template375 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_template_slot_in_template384 = new BitSet(new long[]{0x0000000000004000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_END_in_template392 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_SLOT_in_template_slot412 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_template_slot416 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_VT_SLOT_ID_in_template_slot420 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_QUERY_in_query442 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_QUERY_ID_in_query446 = new BitSet(new long[]{0x0000040000100000L});
+    public static final BitSet FOLLOW_parameters_in_query450 = new BitSet(new long[]{0x0000000000100000L});
+    public static final BitSet FOLLOW_lhs_block_in_query455 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_END_in_query459 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_RULE_in_rule481 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_RULE_ID_in_rule485 = new BitSet(new long[]{0x0100000000018000L});
+    public static final BitSet FOLLOW_rule_attributes_in_rule489 = new BitSet(new long[]{0x0100000000010000L});
+    public static final BitSet FOLLOW_when_part_in_rule494 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_VT_RHS_CHUNK_in_rule499 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_WHEN_in_when_part518 = new BitSet(new long[]{0x0000000000100000L});
+    public static final BitSet FOLLOW_lhs_block_in_when_part522 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_RULE_ATTRIBUTES_in_rule_attributes544 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_ATTRIBUTES_in_rule_attributes546 = new BitSet(new long[]{0x007FF80000000000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes552 = new BitSet(new long[]{0x007FF80000000008L});
+    public static final BitSet FOLLOW_VT_PARAM_LIST_in_parameters576 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_param_definition_in_parameters581 = new BitSet(new long[]{0x0000001000000008L,0x0000000000400000L});
+    public static final BitSet FOLLOW_data_type_in_param_definition603 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_argument_in_param_definition608 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_argument628 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_argument631 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_argument635 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_VK_SALIENCE_in_rule_attribute659 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_INT_in_rule_attribute664 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_rule_attribute668 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_NO_LOOP_in_rule_attribute679 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute683 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_AGENDA_GROUP_in_rule_attribute695 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute699 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DURATION_in_rule_attribute710 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_INT_in_rule_attribute714 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ACTIVATION_GROUP_in_rule_attribute726 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute730 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_AUTO_FOCUS_in_rule_attribute740 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute744 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DATE_EFFECTIVE_in_rule_attribute755 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute759 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DATE_EXPIRES_in_rule_attribute769 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute773 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ENABLED_in_rule_attribute783 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute787 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_RULEFLOW_GROUP_in_rule_attribute797 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute801 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_LOCK_ON_ACTIVE_in_rule_attribute811 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute815 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DIALECT_in_rule_attribute825 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute829 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_AND_IMPLICIT_in_lhs_block854 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs_block859 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_OR_PREFIX_in_lhs885 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs890 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_OR_INFIX_in_lhs906 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs910 = new BitSet(new long[]{0x0000000021E00000L,0x0000000000007102L});
+    public static final BitSet FOLLOW_lhs_in_lhs914 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_AND_PREFIX_in_lhs926 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs931 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_AND_INFIX_in_lhs947 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs951 = new BitSet(new long[]{0x0000000021E00000L,0x0000000000007102L});
+    public static final BitSet FOLLOW_lhs_in_lhs955 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EXISTS_in_lhs967 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs971 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_NOT_in_lhs983 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs987 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EVAL_in_lhs999 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_lhs1003 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_FORALL_in_lhs1015 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs1020 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VK_FROM_in_lhs1034 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs1038 = new BitSet(new long[]{0x0000000008000000L,0x0000000000108080L});
+    public static final BitSet FOLLOW_from_elements_in_lhs1042 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs1053 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VK_ACCUMULATE_in_from_elements1074 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_from_elements1078 = new BitSet(new long[]{0x0000000006000000L});
+    public static final BitSet FOLLOW_accumulate_parts_in_from_elements1088 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_COLLECT_in_from_elements1101 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_from_elements1105 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ENTRY_POINT_in_from_elements1117 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_ENTRYPOINT_ID_in_from_elements1121 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_from_source_clause_in_from_elements1132 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accumulate_init_clause_in_accumulate_parts1153 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accumulate_id_clause_in_accumulate_parts1164 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_ACCUMULATE_INIT_CLAUSE_in_accumulate_init_clause1187 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_INIT_in_accumulate_init_clause1196 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1200 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ACTION_in_accumulate_init_clause1208 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1212 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_accumulate_init_reverse_clause_in_accumulate_init_clause1221 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080000L});
+    public static final BitSet FOLLOW_VK_RESULT_in_accumulate_init_clause1228 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause1232 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_REVERSE_in_accumulate_init_reverse_clause1255 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_reverse_clause1259 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_ACCUMULATE_ID_CLAUSE_in_accumulate_id_clause1281 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_accumulate_id_clause1285 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_id_clause1289 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FROM_SOURCE_in_from_source_clause1311 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_from_source_clause1315 = new BitSet(new long[]{0x0000000010080008L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_from_source_clause1319 = new BitSet(new long[]{0x0000000010000008L});
+    public static final BitSet FOLLOW_expression_chain_in_from_source_clause1328 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_EXPRESSION_CHAIN_in_expression_chain1347 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_expression_chain1351 = new BitSet(new long[]{0x00000000100C0008L});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_expression_chain1355 = new BitSet(new long[]{0x0000000010080008L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_expression_chain1360 = new BitSet(new long[]{0x0000000010000008L});
+    public static final BitSet FOLLOW_expression_chain_in_expression_chain1368 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PATTERN_in_lhs_pattern1386 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_lhs_pattern1390 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FACT_in_fact_expression1413 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_pattern_type_in_fact_expression1417 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1422 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_VT_FACT_BINDING_in_fact_expression1436 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_LABEL_in_fact_expression1440 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1444 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FACT_OR_in_fact_expression1456 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1460 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1464 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FIELD_in_fact_expression1475 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_field_element_in_fact_expression1479 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1483 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_BIND_FIELD_in_fact_expression1494 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_LABEL_in_fact_expression1498 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1502 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EVAL_in_fact_expression1513 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_fact_expression1517 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_EQUAL_in_fact_expression1530 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1534 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_NOT_EQUAL_in_fact_expression1546 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1550 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_GREATER_in_fact_expression1562 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1566 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_GREATER_EQUAL_in_fact_expression1578 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1582 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_LESS_in_fact_expression1594 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1598 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_LESS_EQUAL_in_fact_expression1610 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1614 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_CONTAINS_in_fact_expression1626 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1630 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1635 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EXCLUDES_in_fact_expression1647 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1651 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1656 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_MATCHES_in_fact_expression1668 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1672 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1677 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_SOUNDSLIKE_in_fact_expression1689 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1693 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1698 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_MEMBEROF_in_fact_expression1710 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1714 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1719 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_ID_in_fact_expression1731 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1735 = new BitSet(new long[]{0x00000007C00C0040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_fact_expression1740 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1745 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_IN_in_fact_expression1756 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression1760 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1766 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_fact_expression1781 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1785 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1789 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_fact_expression1799 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1803 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1807 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_ACCESSOR_PATH_in_fact_expression1818 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_accessor_element_in_fact_expression1823 = new BitSet(new long[]{0x0000000800000008L});
+    public static final BitSet FOLLOW_STRING_in_fact_expression1838 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_INT_in_fact_expression1848 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FLOAT_in_fact_expression1858 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_BOOL_in_fact_expression1868 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NULL_in_fact_expression1878 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_fact_expression1888 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_ACCESSOR_PATH_in_field_element1910 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_accessor_element_in_field_element1915 = new BitSet(new long[]{0x0000000800000008L});
+    public static final BitSet FOLLOW_VT_ACCESSOR_ELEMENT_in_accessor_element1939 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_accessor_element1943 = new BitSet(new long[]{0x0000000000040008L});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_accessor_element1947 = new BitSet(new long[]{0x0000000000040008L});
+    public static final BitSet FOLLOW_VT_PATTERN_TYPE_in_pattern_type1968 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_pattern_type1972 = new BitSet(new long[]{0x0000000000000008L,0x0000200000400000L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_pattern_type1976 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_pattern_type1980 = new BitSet(new long[]{0x0000000000000008L,0x0000200000000000L});
+    public static final BitSet FOLLOW_VT_DATA_TYPE_in_data_type2002 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_data_type2006 = new BitSet(new long[]{0x0000000000000008L,0x0000200000400000L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_data_type2010 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_data_type2014 = new BitSet(new long[]{0x0000000000000008L,0x0000200000000000L});
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsEditorType.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsEditorType.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsEditorType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsEditorType.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,20 @@
+package org.drools.lang;
+
+/**
+ * Simple holder class identifying a DroolsTree editor type. This is stored in
+ * DroolsTree to be used on editor for syntax highlighting.
+ * 
+ * @author porcelli
+ */
+public class DroolsEditorType {
+	public static int KEYWORD = 0;
+	public static int CODE_CHUNK = 1;
+	public static int SYMBOL = 2;
+	public static int NUMERIC_CONST = 3;
+	public static int BOOLEAN_CONST = 4;
+	public static int STRING_CONST = 5;
+	public static int NULL_CONST = 6;
+	public static int IDENTIFIER = 7;
+	public static int IDENTIFIER_TYPE = 8;
+	public static int IDENTIFIER_PATTERN = 9;
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParaphareseTypes.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsParaphareseTypes.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParaphareseTypes.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParaphareseTypes.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,20 @@
+package org.drools.lang;
+
+/**
+ * Simple holder class identifying a paraphrase types. This is stored in
+ * DRLParser paraphrase internal structure to be used on error messages.
+ * 
+ * @author porcelli
+ */
+public class DroolsParaphareseTypes {
+	public static int PACKAGE = 0;
+	public static int IMPORT = 1;
+	public static int FUNCTION_IMPORT = 2;
+	public static int GLOBAL = 3;
+	public static int FUNCTION = 4;
+	public static int QUERY = 5;
+	public static int TEMPLATE = 6;
+	public static int RULE = 7;
+	public static int RULE_ATTRIBUTE = 8;
+	public static int PATTERN = 9;
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParserExceptionFactory.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsParserExceptionFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParserExceptionFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsParserExceptionFactory.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,314 @@
+package org.drools.lang;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+import java.util.Map.Entry;
+
+import org.antlr.runtime.EarlyExitException;
+import org.antlr.runtime.FailedPredicateException;
+import org.antlr.runtime.MismatchedNotSetException;
+import org.antlr.runtime.MismatchedSetException;
+import org.antlr.runtime.MismatchedTokenException;
+import org.antlr.runtime.MismatchedTreeNodeException;
+import org.antlr.runtime.NoViableAltException;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.Token;
+import org.drools.compiler.DroolsParserException;
+
+/**
+ * Helper class that generates DroolsParserException with user friendly error
+ * messages.
+ * 
+ * @author porcelli
+ * @see DroolsParserException
+ */
+public class DroolsParserExceptionFactory {
+	public final static String MISMATCHED_TOKEN_MESSAGE_COMPLETE = "Line %1$d:%2$d mismatched input '%3$s' expecting '%4$s'%5$s";
+	public final static String MISMATCHED_TOKEN_MESSAGE_PART = "Line %1$d:%2$d mismatched input '%3$s'%4$s";
+	public final static String MISMATCHED_TREE_NODE_MESSAGE_COMPLETE = "Line %1$d:%2$d mismatched tree node '%3$s' expecting '%4$s'%5$s";
+	public final static String MISMATCHED_TREE_NODE_MESSAGE_PART = "Line %1$d:%2$d mismatched tree node '%3$s'%4$s";
+	public final static String NO_VIABLE_ALT_MESSAGE = "Line %1$d:%2$d no viable alternative at input '%3$s'%4$s";
+	public final static String EARLY_EXIT_MESSAGE = "Line %1$d:%2$d required (...)+ loop did not match anything at input '%3$s'%4$s";
+	public final static String MISMATCHED_SET_MESSAGE = "Line %1$d:%2$d mismatched input '%3$' expecting set '%4$s'%5$s.";
+	public final static String MISMATCHED_NOT_SET_MESSAGE = "Line %1$d:%2$d mismatched input '%3$' expecting set '%4$s'%5$s";
+	public final static String FAILED_PREDICATE_MESSAGE = "Line %1$d:%2$d rule '%3$s' failed predicate: {%4$s}?%5$s";
+	public final static String TRAILING_SEMI_COLON_NOT_ALLOWED_MESSAGE = "Line %1$d:%2$d trailing semi-colon not allowed%3$s";
+	public final static String PARSER_LOCATION_MESSAGE_COMPLETE = " in %1$s %2$s";
+	public final static String PARSER_LOCATION_MESSAGE_PART = " in %1$s";
+
+	public static final String[] parserLocations = new String[] { "package",
+			"import", "function import", "global", "function", "query",
+			"template", "rule", "rule attribute", "pattern" };
+
+	private String[] tokenNames = null;
+	private Stack<Map<Integer, String>> paraphrases = null;
+
+	/**
+	 * DroolsParserErrorMessages constructor.
+	 * 
+	 * @param tokenNames
+	 *            tokenNames generated by ANTLR
+	 * @param paraphrases
+	 *            paraphrases parser structure
+	 */
+	public DroolsParserExceptionFactory(String[] tokenNames,
+			Stack<Map<Integer, String>> paraphrases) {
+		this.tokenNames = tokenNames;
+		this.paraphrases = paraphrases;
+	}
+
+	/**
+	 * This method creates a DroolsParserException for trailing semicolon
+	 * exception, full of information.
+	 * 
+	 * @param line
+	 *            line number
+	 * @param column
+	 *            column position
+	 * @param offset
+	 *            char offset
+	 * @return DroolsParserException filled.
+	 */
+	public DroolsParserException createTrailingSemicolonException(int line,
+			int column, int offset) {
+		String message = String
+				.format(
+						DroolsParserExceptionFactory.TRAILING_SEMI_COLON_NOT_ALLOWED_MESSAGE,
+						line, column, formatParserLocation());
+
+		return new DroolsParserException("ERR 108", message, line, column,
+				offset, null);
+	}
+
+	/**
+	 * This method creates a DroolsParserException full of information.
+	 * 
+	 * @param e
+	 *            original exception
+	 * @return DroolsParserException filled.
+	 */
+	public DroolsParserException createDroolsException(RecognitionException e) {
+		List<String> codeAndMessage = createErrorMessage(e);
+		return new DroolsParserException(codeAndMessage.get(1), codeAndMessage
+				.get(0), e.line, e.charPositionInLine, e.index, e);
+	}
+
+	/**
+	 * This will take a RecognitionException, and create a sensible error
+	 * message out of it
+	 */
+	private List<String> createErrorMessage(RecognitionException e) {
+		List<String> codeAndMessage = new ArrayList<String>(2);
+		String message = "";
+		if (e instanceof MismatchedTokenException) {
+			MismatchedTokenException mte = (MismatchedTokenException) e;
+			if (mte.expecting >= 0 && mte.expecting < tokenNames.length) {
+				message = String
+						.format(
+								DroolsParserExceptionFactory.MISMATCHED_TOKEN_MESSAGE_COMPLETE,
+								e.line, e.charPositionInLine,
+								getBetterToken(e.token),
+								getBetterToken(mte.expecting),
+								formatParserLocation());
+				codeAndMessage.add(message);
+				codeAndMessage.add("ERR 101");
+			} else {
+				message = String
+						.format(
+								DroolsParserExceptionFactory.MISMATCHED_TOKEN_MESSAGE_PART,
+								e.line, e.charPositionInLine,
+								getBetterToken(e.token), formatParserLocation());
+				codeAndMessage.add(message);
+				codeAndMessage.add("ERR 101");
+			}
+		} else if (e instanceof MismatchedTreeNodeException) {
+			MismatchedTreeNodeException mtne = (MismatchedTreeNodeException) e;
+			if (mtne.expecting >= 0 && mtne.expecting < tokenNames.length) {
+				message = String
+						.format(
+								DroolsParserExceptionFactory.MISMATCHED_TREE_NODE_MESSAGE_COMPLETE,
+								e.line, e.charPositionInLine,
+								getBetterToken(e.token),
+								getBetterToken(mtne.expecting),
+								formatParserLocation());
+				codeAndMessage.add(message);
+				codeAndMessage.add("ERR 102");
+			} else {
+				message = String
+						.format(
+								DroolsParserExceptionFactory.MISMATCHED_TREE_NODE_MESSAGE_PART,
+								e.line, e.charPositionInLine,
+								getBetterToken(e.token), formatParserLocation());
+				codeAndMessage.add(message);
+				codeAndMessage.add("ERR 102");
+			}
+		} else if (e instanceof NoViableAltException) {
+			// NoViableAltException nvae = (NoViableAltException) e;
+			message = String.format(
+					DroolsParserExceptionFactory.NO_VIABLE_ALT_MESSAGE, e.line,
+					e.charPositionInLine, getBetterToken(e.token),
+					formatParserLocation());
+			codeAndMessage.add(message);
+			codeAndMessage.add("ERR 103");
+		} else if (e instanceof EarlyExitException) {
+			// EarlyExitException eee = (EarlyExitException) e;
+			message = String.format(
+					DroolsParserExceptionFactory.EARLY_EXIT_MESSAGE, e.line,
+					e.charPositionInLine, getBetterToken(e.token),
+					formatParserLocation());
+			codeAndMessage.add(message);
+			codeAndMessage.add("ERR 104");
+		} else if (e instanceof MismatchedSetException) {
+			MismatchedSetException mse = (MismatchedSetException) e;
+			message = String.format(
+					DroolsParserExceptionFactory.MISMATCHED_SET_MESSAGE, e.line,
+					e.charPositionInLine, getBetterToken(e.token),
+					mse.expecting, formatParserLocation());
+			codeAndMessage.add(message);
+			codeAndMessage.add("ERR 105");
+		} else if (e instanceof MismatchedNotSetException) {
+			MismatchedNotSetException mse = (MismatchedNotSetException) e;
+			message = String.format(
+					DroolsParserExceptionFactory.MISMATCHED_NOT_SET_MESSAGE,
+					e.line, e.charPositionInLine, getBetterToken(e.token),
+					mse.expecting, formatParserLocation());
+			codeAndMessage.add(message);
+			codeAndMessage.add("ERR 106");
+		} else if (e instanceof FailedPredicateException) {
+			FailedPredicateException fpe = (FailedPredicateException) e;
+			message = String.format(
+					DroolsParserExceptionFactory.FAILED_PREDICATE_MESSAGE, e.line,
+					e.charPositionInLine, fpe.ruleName, fpe.predicateText,
+					formatParserLocation());
+			codeAndMessage.add(message);
+			codeAndMessage.add("ERR 107");
+		}
+		if (codeAndMessage.get(0).length() == 0) {
+			codeAndMessage.add("?????");
+		}
+		return codeAndMessage;
+	}
+
+	/**
+	 * This will take Paraphrases stack, and create a sensible location
+	 */
+	private String formatParserLocation() {
+		StringBuilder sb = new StringBuilder();
+		for (Map<Integer, String> map : paraphrases) {
+			for (Entry<Integer, String> activeEntry : map.entrySet()) {
+				if (activeEntry.getValue().length() == 0) {
+					sb.append(String.format(PARSER_LOCATION_MESSAGE_PART,
+							parserLocations[activeEntry.getKey()]));
+				} else {
+					sb.append(String.format(PARSER_LOCATION_MESSAGE_COMPLETE,
+							parserLocations[activeEntry.getKey()], activeEntry
+									.getValue()));
+				}
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Helper method that creates a user friendly token definition
+	 * 
+	 * @param token
+	 *            token
+	 * @return user friendly token definition
+	 */
+	private String getBetterToken(Token token) {
+		return getBetterToken(token.getType(), token.getText());
+	}
+
+	/**
+	 * Helper method that creates a user friendly token definition
+	 * 
+	 * @param tokenType
+	 *            token type
+	 * @return user friendly token definition
+	 */
+	private String getBetterToken(int tokenType) {
+		return getBetterToken(tokenType, null);
+	}
+
+	/**
+	 * Helper method that creates a user friendly token definition
+	 * 
+	 * @param tokenType
+	 *            token type
+	 * @param defaultValue
+	 *            default value for identifier token, may be null
+	 * @return user friendly token definition
+	 */
+	private String getBetterToken(int tokenType, String defaultValue) {
+		switch (tokenType) {
+		case DRLLexer.INT:
+			return defaultValue == null ? "int" : defaultValue;
+		case DRLLexer.FLOAT:
+			return defaultValue == null ? "float" : defaultValue;
+		case DRLLexer.STRING:
+			return defaultValue == null ? "string" : defaultValue;
+		case DRLLexer.BOOL:
+			return defaultValue == null ? "boolean" : defaultValue;
+		case DRLLexer.NULL:
+			return "null";
+		case DRLLexer.THEN:
+			return "then";
+		case DRLLexer.END:
+			return "end";
+		case DRLLexer.GRAVE_ACCENT:
+			return "`";
+		case DRLLexer.SEMICOLON:
+			return ";";
+		case DRLLexer.DOT_STAR:
+			return ".*";
+		case DRLLexer.COLON:
+			return ":";
+		case DRLLexer.EQUAL:
+			return "==";
+		case DRLLexer.NOT_EQUAL:
+			return "!=";
+		case DRLLexer.GREATER:
+			return ">";
+		case DRLLexer.GREATER_EQUAL:
+			return ">=";
+		case DRLLexer.LESS:
+			return "<";
+		case DRLLexer.LESS_EQUAL:
+			return "<=";
+		case DRLLexer.ARROW:
+			return "->";
+		case DRLLexer.ID:
+			return defaultValue == null ? "identifier" : defaultValue;
+		case DRLLexer.LEFT_PAREN:
+			return "(";
+		case DRLLexer.RIGHT_PAREN:
+			return ")";
+		case DRLLexer.LEFT_SQUARE:
+			return "[";
+		case DRLLexer.RIGHT_SQUARE:
+			return "]";
+		case DRLLexer.LEFT_CURLY:
+			return "{";
+		case DRLLexer.RIGHT_CURLY:
+			return "}";
+		case DRLLexer.COMMA:
+			return ",";
+		case DRLLexer.DOT:
+			return ".";
+		case DRLLexer.DOUBLE_AMPER:
+			return "&&";
+		case DRLLexer.DOUBLE_PIPE:
+			return "||";
+		case DRLLexer.MISC:
+			return defaultValue == null ? "misc" : defaultValue;
+		case DRLLexer.EOF:
+			return "<eof>";
+		default:
+			return tokenType > tokenNames.length ? "unknown"
+					: tokenNames[tokenType];
+		}
+	}
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsSoftKeywords.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsSoftKeywords.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsSoftKeywords.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsSoftKeywords.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,59 @@
+package org.drools.lang;
+
+/**
+ * Simple holder class identifying all the DRL soft keywords. This is used by
+ * DRLParser.
+ * 
+ * @author porcelli
+ */
+public class DroolsSoftKeywords {
+	public static final String DATE = "date";
+	public static final String EFFECTIVE = "effective";
+	public static final String EXPIRES = "expires";
+	public static final String LOCK = "lock";
+	public static final String ON = "on";
+	public static final String ACTIVE = "active";
+	public static final String NO = "no";
+	public static final String LOOP = "loop";
+	public static final String AUTO = "auto";
+	public static final String FOCUS = "focus";
+	public static final String ACTIVATION = "activation";
+	public static final String GROUP = "group";
+	public static final String AGENDA = "agenda";
+	public static final String RULEFLOW = "ruleflow";
+	public static final String DURATION = "duration";
+	public static final String PACKAGE = "package";
+	public static final String IMPORT = "import";
+	public static final String DIALECT = "dialect";
+	public static final String SALIENCE = "salience";
+	public static final String ENABLED = "enabled";
+	public static final String ATTRIBUTES = "attributes";
+	public static final String WHEN = "when";
+	public static final String RULE = "rule";
+	public static final String TEMPLATE = "template";
+	public static final String QUERY = "query";
+	public static final String DECLARE = "declare";
+	public static final String FUNCTION = "function";
+	public static final String GLOBAL = "global";
+	public static final String EVAL = "eval";
+	public static final String CONTAINS = "contains";
+	public static final String MATCHES = "matches";
+	public static final String EXCLUDES = "excludes";
+	public static final String SOUNDSLIKE = "soundslike";
+	public static final String MEMBEROF = "memberof";
+	public static final String NOT = "not";
+	public static final String IN = "in";
+	public static final String OR = "or";
+	public static final String AND = "and";
+	public static final String EXISTS = "exists";
+	public static final String FORALL = "forall";
+	public static final String FROM = "from";
+	public static final String ENTRY = "entry";
+	public static final String POINT = "point";
+	public static final String ACCUMULATE = "accumulate";
+	public static final String INIT = "init";
+	public static final String ACTION = "action";
+	public static final String REVERSE = "reverse";
+	public static final String RESULT = "result";
+	public static final String COLLECT = "collect";
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsToken.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsToken.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsToken.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsToken.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,45 @@
+package org.drools.lang;
+
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.Token;
+
+/**
+ * An extension of the CommonToken class that keeps the char offset
+ * information
+ * 
+ * @author porcelli
+ * 
+ */
+public class DroolsToken extends CommonToken {
+
+	private static final long serialVersionUID = 3635806195731072579L;
+
+	public DroolsToken(int type) {
+		super(type);
+	}
+
+	public DroolsToken(CharStream input, int type, int channel, int start,
+			int stop) {
+		super(input, type, channel, start, stop);
+	}
+
+	public DroolsToken(int type, String text) {
+		super(type, text);
+	}
+
+	/**
+	 * Constructor that preserves the char offset
+	 * 
+	 * @param oldToken
+	 */
+	public DroolsToken(Token oldToken) {
+		super(oldToken);
+		if (null != oldToken
+				&& (oldToken.getClass().equals(CommonToken.class) || oldToken
+						.getClass().equals(DroolsToken.class))) {
+			start = ((CommonToken) oldToken).getStartIndex();
+			stop = ((CommonToken) oldToken).getStopIndex();
+		}
+	}
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTree.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,103 @@
+package org.drools.lang;
+
+import org.antlr.runtime.Token;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.Tree;
+
+/**
+ * An extension of the CommonTree class that keeps the char offset information.
+ * 
+ * @author porcelli
+ * 
+ */
+public class DroolsTree extends CommonTree {
+
+	/**
+	 * start char offset
+	 */
+	int startCharOffset = -1;
+
+	/**
+	 * end char offset
+	 */
+	int endCharOffset = -1;
+
+	/**
+	 * editor type
+	 * 
+	 * @see DroolsEditorType
+	 */
+	int editorElementType = -1;
+
+	public DroolsTree(DroolsTree node) {
+		super(node);
+		this.token = node.token;
+	}
+
+	public DroolsTree(Token token) {
+		super(token);
+	}
+
+	public Tree dupNode() {
+		return new DroolsTree(this);
+	}
+
+	/**
+	 * getter for start char offset
+	 * 
+	 * @return start char offset
+	 */
+	public int getStartCharOffset() {
+		return startCharOffset;
+	}
+
+	/**
+	 * setter for start char offset
+	 * 
+	 * @param startCharOffset
+	 *            start char offset
+	 */
+	public void setStartCharOffset(int startCharOffset) {
+		this.startCharOffset = startCharOffset;
+	}
+
+	/**
+	 * getter of end char offset
+	 * 
+	 * @return end char offset
+	 */
+	public int getEndCharOffset() {
+		return endCharOffset;
+	}
+
+	/**
+	 * setter of end char offset
+	 * 
+	 * @param endCharOffset
+	 *            end char offset
+	 */
+	public void setEndCharOffset(int endCharOffset) {
+		this.endCharOffset = endCharOffset;
+	}
+
+	/**
+	 * getter of editor type
+	 * 
+	 * @return editor type
+	 * @see DroolsEditorType
+	 */
+	public int getEditorElementType() {
+		return editorElementType;
+	}
+
+	/**
+	 * setter of editor type
+	 * 
+	 * @param editorElementType
+	 *            editor type
+	 * @see DroolsEditorType
+	 */
+	public void setEditorElementType(int editorElementType) {
+		this.editorElementType = editorElementType;
+	}
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTreeAdaptor.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/java/org/drools/lang/DroolsTreeAdaptor.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTreeAdaptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DroolsTreeAdaptor.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,196 @@
+package org.drools.lang;
+
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.tree.CommonTreeAdaptor;
+import org.antlr.runtime.tree.Tree;
+
+/**
+ * This tree adaptor is a factory for DroolsTree.
+ * 
+ * DRLParser must use this tree adaptor.
+ * 
+ * @author porcelli
+ */
+public class DroolsTreeAdaptor extends CommonTreeAdaptor {
+
+	/**
+	 * Based on token parameter it returns a new DroolsTree. Also set the char
+	 * offset info and editor type based on token type.
+	 * 
+	 * @param token
+	 *            token
+	 * @return DroolsTree object with char offset and editor type info
+	 */
+	public Object create(Token token) {
+		DroolsTree tree = new DroolsTree(token);
+		if (null != token
+				&& (token.getClass().equals(CommonToken.class) || token
+						.getClass().equals(DroolsToken.class))) {
+			tree.setStartCharOffset(((CommonToken) token).getStartIndex());
+			tree.setEndCharOffset(((CommonToken) token).getStopIndex());
+
+			if (token.getType() == DRLLexer.END
+					|| token.getType() == DRLLexer.THEN
+					|| token.getType() == DRLLexer.VK_ACCUMULATE
+					|| token.getType() == DRLLexer.VK_ACTION
+					|| token.getType() == DRLLexer.VK_ACTIVATION_GROUP
+					|| token.getType() == DRLLexer.VK_AGENDA_GROUP
+					|| token.getType() == DRLLexer.VK_AND
+					|| token.getType() == DRLLexer.VK_ATTRIBUTES
+					|| token.getType() == DRLLexer.VK_AUTO_FOCUS
+					|| token.getType() == DRLLexer.VK_COLLECT
+					|| token.getType() == DRLLexer.VK_CONTAINS
+					|| token.getType() == DRLLexer.VK_DATE_EFFECTIVE
+					|| token.getType() == DRLLexer.VK_DATE_EXPIRES
+					|| token.getType() == DRLLexer.VK_DECLARE
+					|| token.getType() == DRLLexer.VK_DIALECT
+					|| token.getType() == DRLLexer.VK_DURATION
+					|| token.getType() == DRLLexer.VK_ENABLED
+					|| token.getType() == DRLLexer.VK_ENTRY_POINT
+					|| token.getType() == DRLLexer.VK_EVAL
+					|| token.getType() == DRLLexer.VK_EXCLUDES
+					|| token.getType() == DRLLexer.VK_EXISTS
+					|| token.getType() == DRLLexer.VK_FORALL
+					|| token.getType() == DRLLexer.VK_FROM
+					|| token.getType() == DRLLexer.VK_FUNCTION
+					|| token.getType() == DRLLexer.VK_GLOBAL
+					|| token.getType() == DRLLexer.VK_IMPORT
+					|| token.getType() == DRLLexer.VK_IN
+					|| token.getType() == DRLLexer.VK_INIT
+					|| token.getType() == DRLLexer.VK_LOCK_ON_ACTIVE
+					|| token.getType() == DRLLexer.VK_MATCHES
+					|| token.getType() == DRLLexer.VK_MEMBEROF
+					|| token.getType() == DRLLexer.VK_NO_LOOP
+					|| token.getType() == DRLLexer.VK_NOT
+					|| token.getType() == DRLLexer.VK_OR
+					|| token.getType() == DRLLexer.VK_PACKAGE
+					|| token.getType() == DRLLexer.VK_QUERY
+					|| token.getType() == DRLLexer.VK_RESULT
+					|| token.getType() == DRLLexer.VK_REVERSE
+					|| token.getType() == DRLLexer.VK_RULE
+					|| token.getType() == DRLLexer.VK_RULEFLOW_GROUP
+					|| token.getType() == DRLLexer.VK_SALIENCE
+					|| token.getType() == DRLLexer.VK_SOUNDSLIKE
+					|| token.getType() == DRLLexer.VK_TEMPLATE
+					|| token.getType() == DRLLexer.VK_WHEN) {
+				tree.setEditorElementType(DroolsEditorType.KEYWORD);
+			} else if (token.getType() == DRLLexer.FLOAT
+					|| token.getType() == DRLLexer.INT) {
+				tree.setEditorElementType(DroolsEditorType.NUMERIC_CONST);
+			} else if (token.getType() == DRLLexer.STRING) {
+				tree.setEditorElementType(DroolsEditorType.STRING_CONST);
+			} else if (token.getType() == DRLLexer.BOOL) {
+				tree.setEditorElementType(DroolsEditorType.BOOLEAN_CONST);
+			} else if (token.getType() == DRLLexer.NULL) {
+				tree.setEditorElementType(DroolsEditorType.NULL_CONST);
+			} else if (token.getType() == DRLLexer.VT_SQUARE_CHUNK
+					|| token.getType() == DRLLexer.VT_PAREN_CHUNK
+					|| token.getType() == DRLLexer.VT_CURLY_CHUNK
+					|| token.getType() == DRLLexer.VT_RHS_CHUNK) {
+				tree.setEditorElementType(DroolsEditorType.CODE_CHUNK);
+			} else if (token.getType() == DRLLexer.MISC
+					|| token.getType() == DRLLexer.DOUBLE_PIPE
+					|| token.getType() == DRLLexer.DOUBLE_AMPER
+					|| token.getType() == DRLLexer.DOT
+					|| token.getType() == DRLLexer.COMMA
+					|| token.getType() == DRLLexer.RIGHT_CURLY
+					|| token.getType() == DRLLexer.LEFT_CURLY
+					|| token.getType() == DRLLexer.RIGHT_SQUARE
+					|| token.getType() == DRLLexer.LEFT_SQUARE
+					|| token.getType() == DRLLexer.RIGHT_PAREN
+					|| token.getType() == DRLLexer.LEFT_PAREN
+					|| token.getType() == DRLLexer.ARROW
+					|| token.getType() == DRLLexer.LESS_EQUAL
+					|| token.getType() == DRLLexer.LESS
+					|| token.getType() == DRLLexer.GREATER_EQUAL
+					|| token.getType() == DRLLexer.GREATER
+					|| token.getType() == DRLLexer.NOT_EQUAL
+					|| token.getType() == DRLLexer.EQUAL
+					|| token.getType() == DRLLexer.COLON
+					|| token.getType() == DRLLexer.SEMICOLON) {
+				tree.setEditorElementType(DroolsEditorType.SYMBOL);
+			} else if (token.getType() == DRLLexer.ID
+					|| token.getType() == DRLLexer.DOT_STAR
+					|| token.getType() == DRLLexer.VT_GLOBAL_ID
+					|| token.getType() == DRLLexer.VT_FUNCTION_ID
+					|| token.getType() == DRLLexer.VT_QUERY_ID
+					|| token.getType() == DRLLexer.VT_TEMPLATE_ID
+					|| token.getType() == DRLLexer.VT_SLOT_ID
+					|| token.getType() == DRLLexer.VT_RULE_ID
+					|| token.getType() == DRLLexer.VT_ENTRYPOINT_ID) {
+				tree.setEditorElementType(DroolsEditorType.IDENTIFIER);
+			} else if (token.getType() == DRLLexer.VT_DATA_TYPE) {
+				tree.setEditorElementType(DroolsEditorType.IDENTIFIER_TYPE);
+			} else if (token.getType() == DRLLexer.VT_PATTERN_TYPE) {
+				tree.setEditorElementType(DroolsEditorType.IDENTIFIER_PATTERN);
+			}
+
+		}
+		return tree;
+	}
+
+	/**
+	 * Create a DroolsTree and keeps the char offset info.
+	 */
+	public Object create(int tokenType, Token fromToken, String text) {
+		if (fromToken instanceof DroolsToken) {
+			DroolsTree result = (DroolsTree) super.create(tokenType, fromToken,
+					text);
+			result
+					.setStartCharOffset(((DroolsToken) fromToken)
+							.getStartIndex());
+			result
+					.setEndCharOffset(result.getStartCharOffset()
+							+ text.length());
+			return result;
+		}
+		return super.create(tokenType, fromToken, text);
+	}
+
+	/**
+	 * Add a child to the tree t. If t does not have start offset info, it set t
+	 * start offset info from child. And always set t end char offset from
+	 * child.
+	 * 
+	 * The exception is RIGHT_PAREN, it is used just to keep the char set info
+	 * but not added on t.
+	 * 
+	 * @param t
+	 *            parent tree
+	 * @param child
+	 *            child tree
+	 */
+	public void addChild(Object t, Object child) {
+		if (t != null && child != null) {
+			DroolsTree tParent = (DroolsTree) t;
+			DroolsTree tChild = (DroolsTree) child;
+
+			if (0 >= tParent.getStartCharOffset()) {
+				tParent.setStartCharOffset(tChild.getStartCharOffset());
+				tParent.setEndCharOffset(tChild.getEndCharOffset());
+			}
+			if (0 < tParent.getChildCount()) {
+				tParent.setEndCharOffset(tChild.getEndCharOffset());
+			}
+
+			if (DRLLexer.RIGHT_PAREN != tChild.getType()) {
+				((Tree) t).addChild((Tree) child);
+			}
+		}
+	}
+
+	/**
+	 * Overrides createToken, returning a DroolsToken instead of CommonToken
+	 */
+	public Token createToken(int tokenType, String text) {
+		return new DroolsToken(tokenType, text);
+	}
+
+	/**
+	 * Overrides createToken, returning a DroolsToken instead of CommonToken
+	 */
+	public Token createToken(Token fromToken) {
+		return new DroolsToken(fromToken);
+	}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AccumulateDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AccumulateDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AccumulateDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -16,11 +16,11 @@
 
 package org.drools.lang.descr;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collections;
 import java.util.List;
-import java.io.ObjectOutput;
-import java.io.IOException;
-import java.io.ObjectInput;
 
 /**
  * A descr class for accumulate node

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,71 +1,1439 @@
 package org.drools.lang.descr;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.lang.DroolsTree;
+
 /**
- * This is the factory for ALL descriptors (eventually).
- * This will be tied in a with a package builder session, so it can add in context information for 
- * validation when parsing.
+ * This is the factory for ALL descriptors.
  * 
- * @author Michael Neale
- *
+ * @author porcelli
+ * 
  */
 public class DescrFactory {
 
-    public PackageDescr createPackage(final String packageName) {
-        return new PackageDescr( packageName );
-    }
+	/**
+	 * Factory method that creates a PackageDescr based on a identifier list.
+	 * 
+	 * @param idList
+	 *            identifier list that composes package, may be null
+	 * @return PackageDescr filled
+	 * @see PackageDescr
+	 */
+	public PackageDescr createPackage(List<DroolsTree> idList) {
+		PackageDescr packageDescr = new PackageDescr(
+				createDotedIdFromList(idList));
 
-    public GlobalDescr createGlobal() {
-        return new GlobalDescr();
-    }
+		if (null != idList && idList.size() > 0) {
+			packageDescr.setLocation(getLineLocation(idList.get(0)),
+					getColumnLocation(idList.get(0)));
+			packageDescr
+					.setStartCharacter(getStartOffsetLocation(idList.get(0)));
+			packageDescr.setEndLocation(getLineLocation(idList.get(0)),
+					getEndOffsetLocation(idList.get(0)));
+			packageDescr.setEndCharacter(getEndOffsetLocation(idList.get(0)));
+		}
 
-    public FromDescr createFrom() {
-        return new FromDescr();
-    }
+		return packageDescr;
+	}
 
-    public AccumulateDescr createAccumulate() {
-        return new AccumulateDescr();
-    }
+	/**
+	 * Factory method that creates an AttributeDescr based on name and value.
+	 * 
+	 * If value is single or double quoted, the quotes are removed. And if value
+	 * is null AttributeDescr is setted to true (boolean value).
+	 * 
+	 * @param attributeName
+	 *            attribute name
+	 * @param value
+	 *            attribute value, may be null (default value is true)
+	 * @return AttributeDescr filled
+	 * @see AttributeDescr
+	 */
+	public AttributeDescr createAttribute(DroolsTree attributeName,
+			DroolsTree value) {
+		AttributeDescr attributeDescr = new AttributeDescr(attributeName
+				.getText());
+		attributeDescr.setLocation(getLineLocation(attributeName),
+				getColumnLocation(attributeName));
 
-    public CollectDescr createCollect() {
-        return new CollectDescr();
-    }
+		attributeDescr.setStartCharacter(getStartOffsetLocation(attributeName));
 
-    public ForallDescr createForall() {
-        return new ForallDescr();
-    }
+		if (null != value) {
+			attributeDescr.setValue(getCleanId(value));
+			attributeDescr.setEndLocation(getLineLocation(value),
+					getEndOffsetLocation(value));
+			attributeDescr.setEndCharacter(getEndOffsetLocation(value));
+		} else {
+			attributeDescr.setEndLocation(getLineLocation(attributeName),
+					getEndOffsetLocation(attributeName));
+			attributeDescr.setEndCharacter(getEndOffsetLocation(attributeName));
+			attributeDescr.setValue("true");
+		}
 
-    public ImportDescr createImport() {
-        return new ImportDescr();
-    }
+		return attributeDescr;
+	}
 
-    public FunctionImportDescr createFunctionImport() {
-        return new FunctionImportDescr();
-    }
+	/**
+	 * Factory method that creates a FunctionImportDescr.
+	 * 
+	 * @param importStart
+	 *            import statement, used to get offset location
+	 * @param idList
+	 *            identifier list that composes imported function
+	 * @param dotStar
+	 *            token that represents a ".*", may be null
+	 * @return FunctionImportDescr filled
+	 * @see FunctionImportDescr
+	 */
+	public FunctionImportDescr createFunctionImport(DroolsTree importStart,
+			List<DroolsTree> idList, DroolsTree dotStar) {
 
-    public QueryDescr createQuery(final String queryName) {
-        return new QueryDescr( queryName,
-                               "" );
-    }
+		return (FunctionImportDescr) createGenericImport(
+				new FunctionImportDescr(), importStart, idList, dotStar);
+	}
 
-    public FunctionDescr createFunction(final String functionName,
-                                        final String returnType) {
-        return new FunctionDescr( functionName,
-                                  returnType );
-    }
+	/**
+	 * Factory method that creates an ImportDescr.
+	 * 
+	 * @param importStart
+	 *            import statement, used to get offset location
+	 * @param idList
+	 *            identifier list that composes import
+	 * @param dotStar
+	 *            token that represents a ".*", may be null
+	 * @return ImportDescr filled
+	 * @see ImportDescr
+	 */
+	public ImportDescr createImport(DroolsTree importStart,
+			List<DroolsTree> idList, DroolsTree dotStar) {
 
-    public FactTemplateDescr createFactTemplate(final String templateName) {
-        return new FactTemplateDescr( templateName );
-    }
+		return createGenericImport(new ImportDescr(), importStart, idList,
+				dotStar);
+	}
 
-    public FieldTemplateDescr createFieldTemplate() {
-        return new FieldTemplateDescr();
-    }
+	/**
+	 * Generic method that creates import
+	 * 
+	 * @param importDescr
+	 *            import descriptor (FunctionImportDescr or ImportDescr)
+	 * @param importStart
+	 *            import statement, used to get offset location
+	 * @param idList
+	 *            identifier list that composes imported name
+	 * @param dotStar
+	 *            token that represents a ".*", may be null
+	 * @return ImportDescr filled
+	 * @see FunctionImportDescr
+	 * @see ImportDescr
+	 */
+	private ImportDescr createGenericImport(ImportDescr importDescr,
+			DroolsTree importStart, List<DroolsTree> idList, DroolsTree dotStar) {
+		ImportDescr genericImport = importDescr;
 
-    public EntryPointDescr createEntryPoint() {
-        return new EntryPointDescr();
-    }
-    
-    public TypeDeclarationDescr createTypeDeclaration() {
-        return new TypeDeclarationDescr();
-    }
-}
+		genericImport.setLocation(getLineLocation(importStart),
+				getColumnLocation(importStart));
+		genericImport.setStartCharacter(getStartOffsetLocation(importStart));
+
+		genericImport.setEndLocation(getLineLocation(idList
+				.get(idList.size() - 1)), getEndOffsetLocation(idList
+				.get(idList.size() - 1)));
+
+		genericImport.setEndCharacter(getEndOffsetLocation(idList.get(idList
+				.size() - 1)));
+
+		StringBuilder sb = new StringBuilder();
+		sb.append(createDotedIdFromList(idList));
+		if (null != dotStar) {
+			sb.append(".*");
+			genericImport.setEndLocation(getLineLocation(dotStar),
+					getEndOffsetLocation(dotStar));
+			genericImport.setEndCharacter(getEndOffsetLocation(dotStar));
+		}
+		genericImport.setTarget(sb.toString());
+
+		return genericImport;
+	}
+
+	/**
+	 * Factory method that creates a GlobalDescr.
+	 * 
+	 * @param start
+	 *            global statement, used to get offset location
+	 * @param dataType
+	 *            dataType descriptor (generated by createDataType method)
+	 * @param globalId
+	 *            global identifier
+	 * @return GlobalDescr filled
+	 * @see GlobalDescr
+	 */
+	public GlobalDescr createGlobal(DroolsTree start, BaseDescr dataType,
+			DroolsTree globalId) {
+		GlobalDescr globalDescr = new GlobalDescr();
+
+		globalDescr.setIdentifier(globalId.getText());
+		globalDescr.setType(dataType.getText());
+
+		globalDescr.setLocation(getLineLocation(start),
+				getColumnLocation(start));
+		globalDescr.setEndLocation(getLineLocation(globalId),
+				getEndOffsetLocation(globalId));
+		globalDescr.setEndCharacter(getEndOffsetLocation(globalId));
+
+		return globalDescr;
+	}
+
+	/**
+	 * Factory method that creates a FunctionDescr.
+	 * 
+	 * @param start
+	 *            function statement, used to get offset location
+	 * @param dataType
+	 *            dataType descriptor (generated by createDataType method), may
+	 *            be null
+	 * @param functionId
+	 *            function identifier
+	 * @param params
+	 *            a list, that contains pair of parameter name and data type
+	 * @param content
+	 *            chunk data
+	 * @return FunctionDescr filled
+	 * @see FunctionDescr
+	 */
+	public FunctionDescr createFunction(DroolsTree start, BaseDescr dataType,
+			DroolsTree functionId, List<Map<BaseDescr, BaseDescr>> params,
+			DroolsTree content) {
+		String type = null;
+		if (null != dataType) {
+			type = dataType.getText();
+		}
+
+		FunctionDescr functionDescr = new FunctionDescr(functionId.getText(),
+				type);
+
+		for (Map<BaseDescr, BaseDescr> map : params) {
+			for (Entry<BaseDescr, BaseDescr> entry : map.entrySet()) {
+				functionDescr.addParameter(entry.getValue().getText(), entry
+						.getKey().getText());
+			}
+		}
+
+		functionDescr.setText(content.getText().substring(1,
+				content.getText().length() - 1));
+
+		functionDescr.setLocation(getLineLocation(start),
+				getColumnLocation(start));
+		functionDescr.setEndCharacter(getEndOffsetLocation(content));
+
+		return functionDescr;
+	}
+
+	/**
+	 * Factory method that creates a FactTemplateDescr.
+	 * 
+	 * @param start
+	 *            template statement, used to get offset location
+	 * @param id
+	 *            template identifier
+	 * @param slotList
+	 *            a slot list
+	 * @param end
+	 *            end statement, used to get offset location
+	 * @return FactTemplateDescr filled
+	 * @see FactTemplateDescr
+	 */
+	public FactTemplateDescr createFactTemplate(DroolsTree start,
+			DroolsTree id, List<FieldTemplateDescr> slotList, DroolsTree end) {
+		FactTemplateDescr factTemplateDescr = new FactTemplateDescr(
+				getCleanId(id));
+		for (FieldTemplateDescr fieldTemplateDescr : slotList) {
+			factTemplateDescr.addFieldTemplate(fieldTemplateDescr);
+		}
+
+		factTemplateDescr.setLocation(getLineLocation(start),
+				getColumnLocation(start));
+		factTemplateDescr.setEndLocation(getLineLocation(end),
+				getEndOffsetLocation(end));
+		factTemplateDescr.setEndCharacter(getEndOffsetLocation(end));
+
+		return factTemplateDescr;
+	}
+
+	/**
+	 * Factory method that creates a FieldTemplateDescr.
+	 * 
+	 * @param dataType
+	 *            dataType descriptor (generated by createDataType method)
+	 * @param id
+	 *            field template identifier
+	 * @return FieldTemplateDescr filled
+	 * @see FieldTemplateDescr
+	 */
+	public FieldTemplateDescr createFieldTemplate(BaseDescr dataType,
+			DroolsTree id) {
+		FieldTemplateDescr fieldTemplateDescr = new FieldTemplateDescr();
+		fieldTemplateDescr.setClassType(dataType.getText());
+		fieldTemplateDescr.setName(id.getText());
+
+		fieldTemplateDescr
+				.setLocation(dataType.getLine(), dataType.getColumn());
+		fieldTemplateDescr.setEndLocation(getLineLocation(id),
+				getEndOffsetLocation(id));
+		fieldTemplateDescr.setEndCharacter(getEndOffsetLocation(id));
+
+		return fieldTemplateDescr;
+	}
+
+	/**
+	 * Factory method that creates a QueryDescr.
+	 * 
+	 * @param start
+	 *            query statement, used to get offset location
+	 * @param id
+	 *            query identifier
+	 * @param params
+	 *            a list, that contains pair of parameter name and data type,
+	 *            may be null. Parameter without data type Object is assumed.
+	 * @param andDescr
+	 *            AndDescr returned by lhs block
+	 * @param end
+	 *            end statement, used to get offset location
+	 * @return QueryDescr filled
+	 * @see QueryDescr
+	 * @see AndDescr
+	 */
+	public QueryDescr createQuery(DroolsTree start, DroolsTree id,
+			List<Map<BaseDescr, BaseDescr>> params, AndDescr andDescr,
+			DroolsTree end) {
+
+		QueryDescr queryDescr = new QueryDescr(getCleanId(id), "");
+
+		if (null != params && params.size() > 0) {
+			ArrayList<String> paramList = new ArrayList<String>(params.size());
+			ArrayList<String> dataTypeList = new ArrayList<String>(params
+					.size());
+			for (Map<BaseDescr, BaseDescr> map : params) {
+				for (Entry<BaseDescr, BaseDescr> entry : map.entrySet()) {
+					paramList.add(entry.getKey().getText());
+					if (null == entry.getValue()) {
+						dataTypeList.add("Object");
+					} else {
+						dataTypeList.add(entry.getValue().getText());
+					}
+				}
+			}
+			queryDescr.setParameters(paramList.toArray(new String[paramList
+					.size()]));
+			queryDescr.setParameterTypes(dataTypeList
+					.toArray(new String[dataTypeList.size()]));
+		}
+
+		queryDescr.setLhs(andDescr);
+		queryDescr
+				.setLocation(getLineLocation(start), getColumnLocation(start));
+		queryDescr.setEndLocation(getLineLocation(end),
+				getEndOffsetLocation(end));
+		queryDescr.setEndCharacter(getEndOffsetLocation(end));
+
+		return queryDescr;
+	}
+
+	/**
+	 * Factory method that creates a RuleDescr.
+	 * 
+	 * @param start
+	 *            rule statement, used to get offset location
+	 * @param id
+	 *            rule identifier
+	 * @param attributeList
+	 *            attribute list
+	 * @param andDescr
+	 *            AndDescr returned by lhs block, may be null
+	 * @param content
+	 *            chunk data
+	 * @return RuleDescr filled
+	 * @see RuleDescr
+	 */
+	public RuleDescr createRule(DroolsTree start, DroolsTree id,
+			List<AttributeDescr> attributeList, AndDescr andDescr,
+			DroolsTree content) {
+
+		RuleDescr ruleDescr = new RuleDescr(getCleanId(id), null);
+
+		if (null != attributeList && attributeList.size() > 0) {
+			for (AttributeDescr attributeDescr : attributeList) {
+				ruleDescr.addAttribute(attributeDescr);
+			}
+		}
+
+		if (null == andDescr) {
+			ruleDescr.setLhs(new AndDescr());
+		} else {
+			ruleDescr.setLhs(andDescr);
+		}
+
+		// ignoring first line in the consequence
+		String buf = content.getText();
+		// removing final END keyword
+		int idx = 4;
+		while (idx < buf.length() - 3
+				&& (buf.charAt(idx) == ' ' || buf.charAt(idx) == '\t')) {
+			idx++;
+		}
+		if (idx < buf.length() - 3 && buf.charAt(idx) == '\r')
+			idx++;
+		if (idx < buf.length() - 3 && buf.charAt(idx) == '\n')
+			idx++;
+		buf = buf.substring(idx, buf.length() - 3);
+		ruleDescr.setConsequence(buf);
+		ruleDescr.setConsequenceLocation(getLineLocation(content),
+				getColumnLocation(content));
+
+		ruleDescr.setLocation(getLineLocation(start), getColumnLocation(start));
+		ruleDescr.setEndCharacter(getEndOffsetLocation(content));
+
+		return ruleDescr;
+	}
+
+	/**
+	 * Factory method that creates an Argument.
+	 * 
+	 * @param id
+	 *            argument identifier
+	 * @param rightList
+	 *            right square list
+	 * @return BaseDescr (argument info) filled.
+	 */
+	public BaseDescr createArgument(DroolsTree id, List<DroolsTree> rightList) {
+		List<DroolsTree> idList = new ArrayList<DroolsTree>(1);
+		idList.add(id);
+		return createGenericBaseDescr(idList, rightList);
+	}
+
+	// LHS Start
+	/**
+	 * Factory method that creates an OrDescr. This method handles prefixed and
+	 * infixed formats.
+	 * 
+	 * @param start
+	 *            "or" statement or symbol, used to get offset location
+	 * @param lhsList
+	 *            binded descriptor list
+	 * @return OrDescr filled.
+	 * @see OrDescr
+	 */
+	public OrDescr createOr(DroolsTree start, List<BaseDescr> lhsList) {
+		OrDescr or = new OrDescr();
+		or.setLocation(getColumnLocation(start), getColumnLocation(start));
+		or.setStartCharacter(getStartOffsetLocation(start));
+		or.setEndLocation(lhsList.get(lhsList.size() - 1).getEndLine(), lhsList
+				.get(lhsList.size() - 1).getEndColumn());
+		or.setEndCharacter(lhsList.get(lhsList.size() - 1).getEndCharacter());
+		for (BaseDescr baseDescr : lhsList) {
+			or.addDescr(baseDescr);
+		}
+		return or;
+	}
+
+	/**
+	 * Factory method that creates an AndDescr. This method handles prefixed and
+	 * infixed formats.
+	 * 
+	 * @param start
+	 *            "and" statement or symbol, used to get offset location
+	 * @param lhsList
+	 *            binded descriptor list
+	 * @return AndDescr filled.
+	 * @see AndDescr
+	 */
+	public AndDescr createAnd(DroolsTree start, List<BaseDescr> lhsList) {
+		AndDescr and = new AndDescr();
+		and.setLocation(getColumnLocation(start), getColumnLocation(start));
+		and.setStartCharacter(getStartOffsetLocation(start));
+		and.setEndLocation(lhsList.get(lhsList.size() - 1).getEndLine(),
+				lhsList.get(lhsList.size() - 1).getEndColumn());
+		and.setEndCharacter(lhsList.get(lhsList.size() - 1).getEndCharacter());
+		for (BaseDescr baseDescr : lhsList) {
+			and.addDescr(baseDescr);
+		}
+		return and;
+	}
+
+	/**
+	 * Factory method that creates an ExistsDescr.
+	 * 
+	 * @param start
+	 *            exists statement, used to get offset location
+	 * @param baseDescr
+	 *            binded descriptor
+	 * @return ExistsDescr filled.
+	 * @see ExistsDescr
+	 */
+	public ExistsDescr createExists(DroolsTree start, BaseDescr baseDescr) {
+		ExistsDescr exists = new ExistsDescr();
+		exists.setLocation(getColumnLocation(start), getColumnLocation(start));
+		exists.setStartCharacter(getStartOffsetLocation(start));
+		exists.setEndLocation(baseDescr.getEndLine(), baseDescr.getEndColumn());
+		exists.setEndCharacter(baseDescr.getEndCharacter());
+		exists.addDescr(baseDescr);
+		return exists;
+	}
+
+	/**
+	 * Factory method that creates a NotDescr.
+	 * 
+	 * @param start
+	 *            not statement, used to get offset location
+	 * @param baseDescr
+	 *            binded descriptor
+	 * @return NotDescr filled.
+	 * @see NotDescr
+	 */
+	public NotDescr createNot(DroolsTree start, BaseDescr baseDescr) {
+		NotDescr not = new NotDescr();
+		not.setLocation(getColumnLocation(start), getColumnLocation(start));
+		not.setStartCharacter(getStartOffsetLocation(start));
+		not.setEndLocation(baseDescr.getEndLine(), baseDescr.getEndColumn());
+		not.setEndCharacter(baseDescr.getEndCharacter());
+		not.addDescr(baseDescr);
+		return not;
+	}
+
+	/**
+	 * Factory method that creates an EvalDescr.
+	 * 
+	 * @param start
+	 *            eval statement, used to get offset location
+	 * @param content
+	 *            chunk data
+	 * @return EvalDescr filled.
+	 * @see EvalDescr
+	 */
+	public EvalDescr createEval(DroolsTree start, DroolsTree content) {
+		EvalDescr eval = new EvalDescr();
+		eval.setLocation(getColumnLocation(start), getColumnLocation(start));
+		eval.setStartCharacter(getStartOffsetLocation(start));
+		eval.setEndCharacter(getEndOffsetLocation(content));
+		eval.setContent(content.getText().substring(1,
+				content.getText().length() - 1));
+		return eval;
+	}
+
+	/**
+	 * Factory method that creates a ForallDescr.
+	 * 
+	 * @param start
+	 *            forall statement, used to get offset location
+	 * @param lhsList
+	 *            binded descriptor list
+	 * @return ForallDescr filled.
+	 * @see ForallDescr
+	 */
+	public ForallDescr createForAll(DroolsTree start, List<BaseDescr> lhsList) {
+		ForallDescr forAll = new ForallDescr();
+		forAll.setLocation(getColumnLocation(start), getColumnLocation(start));
+		forAll.setStartCharacter(getStartOffsetLocation(start));
+		forAll.setEndLocation(lhsList.get(lhsList.size() - 1).getEndLine(),
+				lhsList.get(lhsList.size() - 1).getEndColumn());
+		forAll.setEndCharacter(lhsList.get(lhsList.size() - 1)
+				.getEndCharacter());
+		for (BaseDescr baseDescr : lhsList) {
+			forAll.addDescr(baseDescr);
+		}
+		return forAll;
+	}
+
+	/**
+	 * Factory method that creates a PatternDescr.
+	 * 
+	 * @param from
+	 *            lhs pattern
+	 * @param fromSource
+	 *            generic pattern source
+	 * @return PatternDescr filled.
+	 * @see PatternDescr
+	 */
+	public PatternDescr setupFrom(BaseDescr from, PatternSourceDescr fromSource) {
+		PatternDescr tempFrom = (PatternDescr) from;
+		tempFrom.setSource(fromSource);
+		return tempFrom;
+	}
+
+	/**
+	 * Factory method that creates an empty AccumulateDescr.
+	 */
+	public AccumulateDescr createAccumulate() {
+		return new AccumulateDescr();
+	}
+
+	/**
+	 * Factory method that creates an AccumulateDescr.
+	 * 
+	 * @param start
+	 *            accumulate statement, used to get offset location
+	 * @param baseDescr
+	 *            binded descriptor
+	 * @return AccumulateDescr filled.
+	 * @see AccumulateDescr
+	 */
+	public AccumulateDescr createAccumulate(DroolsTree start,
+			BaseDescr baseDescr) {
+		AccumulateDescr accumulate = new AccumulateDescr();
+		accumulate.setLocation(getColumnLocation(start),
+				getColumnLocation(start));
+		accumulate.setStartCharacter(getStartOffsetLocation(start));
+		accumulate.setInput(baseDescr);
+
+		return accumulate;
+	}
+
+	/**
+	 * Factory method that creates a CollectDescr.
+	 * 
+	 * @param start
+	 *            collect statement, used to get offset location
+	 * @param baseDescr
+	 *            binded descriptor
+	 * @return CollectDescr filled.
+	 * @see CollectDescr
+	 */
+	public CollectDescr createCollect(DroolsTree start, BaseDescr baseDescr) {
+		CollectDescr collect = new CollectDescr();
+		collect.setLocation(getColumnLocation(start), getColumnLocation(start));
+		collect.setStartCharacter(getStartOffsetLocation(start));
+		collect
+				.setEndLocation(baseDescr.getEndLine(), baseDescr
+						.getEndColumn());
+		collect.setEndCharacter(baseDescr.getEndCharacter());
+		collect.setInputPattern((PatternDescr) baseDescr);
+		return collect;
+	}
+
+	/**
+	 * Factory method that creates an EntryPointDescr.
+	 * 
+	 * @param start
+	 *            entry point statement, used to get offset location
+	 * @param entryId
+	 *            entry point identifier
+	 * @return EntryPointDescr filled.
+	 * @see EntryPointDescr
+	 */
+	public EntryPointDescr createEntryPoint(DroolsTree start, DroolsTree entryId) {
+		EntryPointDescr entryPoint = new EntryPointDescr();
+		entryPoint.setLocation(getColumnLocation(start),
+				getColumnLocation(start));
+		entryPoint.setStartCharacter(getStartOffsetLocation(start));
+		entryPoint.setEndLocation(getLineLocation(entryId),
+				getColumnLocation(entryId));
+		entryPoint.setEndCharacter(getEndOffsetLocation(entryId));
+		entryPoint.setEntryId(entryId.getText());
+		return entryPoint;
+	}
+
+	/**
+	 * Method that setups the AccumulateDescr, setting all the chunk data
+	 * 
+	 * @param accumulateParam
+	 *            accumulate descriptor
+	 * @param start
+	 *            start (init) statement, used to get offset location
+	 * @param initChunk
+	 *            init chunk data
+	 * @param actionChunk
+	 *            action chunk data
+	 * @param resultChunk
+	 *            result chunk data
+	 * @param reverseChunk
+	 *            reverse chunk data, may be null
+	 * @return AccumulateDescr filled
+	 * @see AccumulateDescr
+	 */
+	public AccumulateDescr setupAccumulateInit(
+			PatternSourceDescr accumulateParam, DroolsTree start,
+			DroolsTree initChunk, DroolsTree actionChunk,
+			DroolsTree resultChunk, DroolsTree reverseChunk) {
+		AccumulateDescr accumulate = (AccumulateDescr) accumulateParam;
+		accumulate.setEndCharacter(getEndOffsetLocation(resultChunk));
+		accumulate.setInitCode(initChunk.getText().substring(1,
+				initChunk.getText().length() - 1));
+		accumulate.setActionCode(actionChunk.getText().substring(1,
+				actionChunk.getText().length() - 1));
+		accumulate.setResultCode(resultChunk.getText().substring(1,
+				resultChunk.getText().length() - 1));
+		if (reverseChunk != null) {
+			accumulate.setReverseCode(reverseChunk.getText().substring(1,
+					reverseChunk.getText().length() - 1));
+		}
+
+		return accumulate;
+	}
+
+	/**
+	 * Method that setups the AccumulateDescr, setting identifier and expression
+	 * chunk data
+	 * 
+	 * @param accumulateParam
+	 *            accumulate descriptor
+	 * @param id
+	 *            accumulate identifier
+	 * @param expressionChunk
+	 *            chunk data
+	 * @return AccumulateDescr filled
+	 * @see AccumulateDescr
+	 */
+	public AccumulateDescr setupAccumulateId(
+			PatternSourceDescr accumulateParam, DroolsTree id,
+			DroolsTree expressionChunk) {
+		AccumulateDescr accumulate = (AccumulateDescr) accumulateParam;
+		accumulate.setEndCharacter(getEndOffsetLocation(expressionChunk));
+
+		accumulate.setExternalFunction(true);
+		accumulate.setFunctionIdentifier(id.getText());
+		accumulate.setExpression(expressionChunk.getText().substring(1,
+				expressionChunk.getText().length() - 1));
+		return accumulate;
+	}
+
+	/**
+	 * Factory method that creates an AccessorDescr.
+	 * 
+	 * @param id
+	 *            accessor identifier
+	 * @param chunk
+	 *            chunk data, may be null
+	 * @return AccessorDescr filled
+	 * @see AccessorDescr
+	 */
+	public AccessorDescr createAccessor(DroolsTree id, DroolsTree chunk) {
+		AccessorDescr accessor = new AccessorDescr(id.getText());
+		accessor.setLocation(getLineLocation(id), getColumnLocation(id));
+		accessor.setStartCharacter(getStartOffsetLocation(id));
+		accessor.setEndCharacter(getEndOffsetLocation(id));
+		if (chunk != null) {
+			accessor.setVariableName(null);
+			FunctionCallDescr functionCall = new FunctionCallDescr(id.getText());
+			functionCall
+					.setLocation(getLineLocation(id), getColumnLocation(id));
+			functionCall.setStartCharacter(getStartOffsetLocation(id));
+			functionCall.setEndCharacter(getEndOffsetLocation(chunk));
+			functionCall.setArguments(chunk.getText());
+			accessor.addInvoker(functionCall);
+		}
+		return accessor;
+	}
+
+	/**
+	 * Setup the char offset for AccessorDescr.
+	 * 
+	 * @param accessorDescr
+	 *            descriptor
+	 * @return AccessorDescr with char offset filled
+	 */
+	public AccessorDescr setupAccessorOffset(AccessorDescr accessorDescr) {
+		if (null != accessorDescr.getInvokers()
+				&& accessorDescr.getInvokers().size() > 0) {
+			BaseDescr desc = (BaseDescr) accessorDescr.getInvokers().get(
+					accessorDescr.getInvokers().size() - 1);
+			accessorDescr.setEndCharacter(desc.getEndCharacter());
+		}
+		return accessorDescr;
+	}
+
+	/**
+	 * Factory method that based on parenChunk parameter defines if it creates a
+	 * FieldAccessDescr or a MethodAccessDescr.
+	 * 
+	 * @param start
+	 *            start (dot) token, used to get offset location
+	 * @param id
+	 *            identifier
+	 * @param squareChunk
+	 *            square chunk data, may be null
+	 * @param parenChunk
+	 *            paren chunk data, may be null
+	 * @return DeclarativeInvokerDescr filled.
+	 * @see DeclarativeInvokerDescr
+	 * @see FieldAccessDescr
+	 * @see MethodAccessDescr
+	 */
+	public DeclarativeInvokerDescr createExpressionChain(DroolsTree start,
+			DroolsTree id, DroolsTree squareChunk, DroolsTree parenChunk) {
+		DeclarativeInvokerDescr declarativeInvoker = null;
+		if (null == parenChunk) {
+			FieldAccessDescr field = new FieldAccessDescr(id.getText());
+			field.setLocation(getLineLocation(id), getColumnLocation(id));
+			field.setStartCharacter(getStartOffsetLocation(id));
+			field.setEndCharacter(getEndOffsetLocation(id));
+			if (null != squareChunk) {
+				field.setArgument(squareChunk.getText());
+				field.setEndCharacter(getEndOffsetLocation(squareChunk));
+			}
+			declarativeInvoker = field;
+		} else {
+			MethodAccessDescr method = new MethodAccessDescr(id.getText(),
+					parenChunk.getText());
+			method.setLocation(getLineLocation(id), getColumnLocation(id));
+			method.setStartCharacter(getStartOffsetLocation(id));
+			method.setEndCharacter(getEndOffsetLocation(parenChunk));
+			declarativeInvoker = method;
+		}
+
+		return declarativeInvoker;
+	}
+
+	/**
+	 * Factory method that creates a FromDescr.
+	 * 
+	 * @param accessor
+	 *            binded accessor descriptor
+	 * @return FromDescr filled
+	 */
+	public FromDescr createFromSource(AccessorDescr accessor) {
+		FromDescr from = new FromDescr();
+		from.setDataSource(accessor);
+		from.setEndCharacter(accessor.getEndCharacter());
+		return from;
+	}
+
+	/**
+	 * Factory method that creates a PatternDescr.
+	 * 
+	 * FieldBindingDescr holds the original field descriptor, first it is
+	 * necessary add the field and later the bindind field info.
+	 * 
+	 * @param dataType
+	 *            pattern data type
+	 * @param exprList
+	 *            binded expression list, may be null or empty
+	 * @return
+	 */
+	public PatternDescr createPattern(BaseDescr dataType,
+			List<BaseDescr> exprList) {
+		PatternDescr pattern = new PatternDescr();
+		pattern.setLocation(dataType.getEndLine(), dataType.getEndColumn());
+		pattern.setEndLocation(dataType.getEndLine(), dataType.getEndColumn());
+		pattern.setEndCharacter(dataType.getEndCharacter());
+		pattern.setObjectType(dataType.getText());
+
+		if (null != exprList && exprList.size() > 0) {
+			if (exprList.size() == 1) {
+				if (exprList.get(0) instanceof FieldBindingDescr
+						&& ((FieldBindingDescr) exprList.get(0))
+								.getFieldConstraint().getRestriction()
+								.getRestrictions().size() > 0) {
+					pattern.getConstraint().addDescr(exprList.get(0));
+					pattern.getConstraint().addDescr(
+							((FieldBindingDescr) exprList.get(0))
+									.getFieldConstraint());
+				} else {
+					pattern.getConstraint().addOrMerge(exprList.get(0));
+				}
+			} else {
+				for (BaseDescr constraint : exprList) {
+					pattern.getConstraint().addDescr(constraint);
+					if (constraint instanceof FieldBindingDescr
+							&& ((FieldBindingDescr) constraint)
+									.getFieldConstraint().getRestriction()
+									.getRestrictions().size() > 0) {
+						pattern.getConstraint().addDescr(
+								((FieldBindingDescr) constraint)
+										.getFieldConstraint());
+					}
+				}
+			}
+			pattern.setEndCharacter(exprList.get(exprList.size() - 1)
+					.getEndCharacter());
+		}
+
+		return pattern;
+	}
+
+	/**
+	 * Method that setups a pattern binding.
+	 * 
+	 * The fact may be an or descriptor and the or elements should be binded.
+	 * 
+	 * @param label
+	 *            bind identifier
+	 * @param fact
+	 *            fact descriptor
+	 * @return fact binded.
+	 * @see PatternDescr
+	 * @see OrDescr
+	 */
+	public BaseDescr setupPatternBiding(DroolsTree label, BaseDescr fact) {
+		fact.setStartCharacter(getStartOffsetLocation(label));
+		if (fact instanceof OrDescr) {
+			((PatternDescr) ((OrDescr) fact).getDescrs().get(0))
+					.setIdentifier(label.getText());
+			((PatternDescr) ((OrDescr) fact).getDescrs().get(1))
+					.setIdentifier(label.getText());
+		} else {
+			((PatternDescr) fact).setIdentifier(label.getText());
+		}
+		return fact;
+	}
+
+	/**
+	 * Factory method that creates an OrDescr.
+	 * 
+	 * @param start
+	 *            "or" statement or symbol, used to get offset location
+	 * @param left
+	 *            left descriptor
+	 * @param right
+	 *            right descriptor
+	 * @return OrDescr filled.
+	 * @see OrDescr
+	 */
+	public OrDescr createFactOr(DroolsTree start, BaseDescr left,
+			BaseDescr right) {
+		OrDescr or = new OrDescr();
+		or.addDescr(left);
+		or.addDescr(right);
+		return or;
+	}
+
+	/**
+	 * Setup FieldConstraintDescr
+	 * 
+	 * @param field
+	 *            field descriptor
+	 * @param descr
+	 *            binded descriptor
+	 * @return FieldConstraintDescr filled
+	 * @see FieldConstraintDescr
+	 */
+	public FieldConstraintDescr setupFieldConstraint(
+			FieldConstraintDescr field, BaseDescr descr) {
+		if (null != descr && descr instanceof RestrictionDescr) {
+			field.getRestriction().addOrMerge((RestrictionDescr) descr);
+		}
+		return field;
+	}
+
+	/**
+	 * Factory method that creates a FieldBindingDescr.
+	 * 
+	 * @param label
+	 *            bind identifier
+	 * @param descr
+	 *            binded field constraint descriptor
+	 * @return FieldBindingDescr filled
+	 * @see FieldBindingDescr
+	 */
+	public FieldBindingDescr createFieldBinding(DroolsTree label,
+			BaseDescr descr) {
+		FieldBindingDescr fieldBiding = new FieldBindingDescr();
+		fieldBiding.setLocation(getLineLocation(label),
+				getColumnLocation(label));
+		fieldBiding.setStartCharacter(getStartOffsetLocation(label));
+		FieldConstraintDescr fieldConstraint = (FieldConstraintDescr) descr;
+		fieldBiding.setIdentifier(label.getText());
+		fieldBiding.setFieldName(fieldConstraint.getFieldName());
+		fieldBiding.setFieldConstraint(fieldConstraint);
+		return fieldBiding;
+	}
+
+	/**
+	 * Factory method that creates a PredicateDescr.
+	 * 
+	 * @param pc
+	 *            chunk data
+	 * @return PredicateDescr filled
+	 * @see PredicateDescr
+	 */
+	public PredicateDescr createPredicate(DroolsTree pc) {
+		PredicateDescr predicate = new PredicateDescr();
+		predicate.setContent(pc.getText().subSequence(1,
+				pc.getText().length() - 1));
+		predicate.setEndCharacter(getEndOffsetLocation(pc));
+		return predicate;
+	}
+
+	/**
+	 * Method that setups descriptor with operator and negated information.
+	 * 
+	 * This method just setups EvaluatorBasedRestrictionDescr descriptors.
+	 * 
+	 * @param operator
+	 *            operator
+	 * @param not
+	 *            negated operator
+	 * @param descr
+	 *            descriptor
+	 * @return descriptor setted.
+	 * @see EvaluatorBasedRestrictionDescr
+	 */
+	public BaseDescr setupRestriction(DroolsTree operator, DroolsTree not,
+			BaseDescr descr) {
+		if (descr instanceof EvaluatorBasedRestrictionDescr) {
+			EvaluatorBasedRestrictionDescr evaluator = (EvaluatorBasedRestrictionDescr) descr;
+			evaluator.setEvaluator(operator.getText());
+			if (null == not) {
+				evaluator.setNegated(false);
+			} else {
+				evaluator.setNegated(true);
+			}
+		}
+		return descr;
+	}
+
+	/**
+	 * Method that setups descriptor with operator and negated information.
+	 * 
+	 * This method just setups EvaluatorBasedRestrictionDescr descriptors.
+	 * 
+	 * @param operator
+	 *            operator
+	 * @param not
+	 *            negated operator
+	 * @param descr
+	 *            descriptor
+	 * @param param
+	 *            parameter
+	 * @return descriptor setted.
+	 * @see EvaluatorBasedRestrictionDescr
+	 */
+	public BaseDescr setupRestriction(DroolsTree operator, DroolsTree not,
+			BaseDescr descr, DroolsTree param) {
+		BaseDescr retDescr = setupRestriction(operator, not, descr);
+		if (null != param && descr instanceof EvaluatorBasedRestrictionDescr) {
+			EvaluatorBasedRestrictionDescr evaluator = (EvaluatorBasedRestrictionDescr) descr;
+			evaluator.setParameterText(param.getText().substring(1,
+					param.getText().length() - 1));
+		}
+		return retDescr;
+	}
+
+	/**
+	 * Factory method that creates a RestrictionConnectiveDescr.
+	 * 
+	 * RestrictionConnectiveDescr is just a syntax suggar to implement severals
+	 * "ORs" or "ANDs".
+	 * 
+	 * @param not
+	 *            negated operator
+	 * @param exprList
+	 *            binded expression descriptor list
+	 * @return RestrictionConnectiveDescr filled.
+	 * @see RestrictionConnectiveDescr
+	 */
+	public RestrictionConnectiveDescr createRestrictionConnective(
+			DroolsTree not, List<BaseDescr> exprList) {
+
+		RestrictionConnectiveDescr group;
+		String op = null;
+
+		if (null == not) {
+			op = "==";
+			group = new RestrictionConnectiveDescr(
+					RestrictionConnectiveDescr.OR);
+		} else {
+			op = "!=";
+			group = new RestrictionConnectiveDescr(
+					RestrictionConnectiveDescr.AND);
+		}
+
+		for (BaseDescr baseDescr : exprList) {
+			if (baseDescr instanceof EvaluatorBasedRestrictionDescr) {
+				EvaluatorBasedRestrictionDescr evaluator = (EvaluatorBasedRestrictionDescr) baseDescr;
+				evaluator.setEvaluator(op);
+				evaluator.setNegated(false);
+				group.addRestriction(evaluator);
+			}
+		}
+
+		return group;
+	}
+
+	/**
+	 * Factory method that creates a RestrictionConnectiveDescr of type OR or an
+	 * OrDescr (based on left paramater).
+	 * 
+	 * If left parameter is a kind of RestrictionDescr (except for
+	 * PredicateDescr), this method creates a RestrictionConnectiveDescr, if not
+	 * creates an OrDescr.
+	 * 
+	 * @param left
+	 *            left descriptor
+	 * @param right
+	 *            right descriptor
+	 * @return RestrictionConnectiveDescr or OrDescr filled.
+	 * @see RestrictionConnectiveDescr
+	 * @see OrDescr
+	 */
+	public BaseDescr createOrRestrictionConnective(BaseDescr left,
+			BaseDescr right) {
+		BaseDescr or = null;
+		if (left instanceof RestrictionDescr
+				&& !(left instanceof PredicateDescr)) {
+			RestrictionConnectiveDescr restOr = new RestrictionConnectiveDescr(
+					RestrictionConnectiveDescr.OR);
+			restOr.addOrMerge((RestrictionDescr) left);
+			restOr.addOrMerge((RestrictionDescr) right);
+			or = restOr;
+		} else {
+			OrDescr consOr = new OrDescr();
+			consOr.addOrMerge(left);
+			consOr.addOrMerge(right);
+			or = consOr;
+		}
+
+		return or;
+
+	}
+
+	/**
+	 * Factory method that creates a RestrictionConnectiveDescr of type AND or
+	 * an AndDescr (based on left paramater).
+	 * 
+	 * If left parameter is a kind of RestrictionDescr (except for
+	 * PredicateDescr), this method creates a RestrictionConnectiveDescr, if not
+	 * creates an AndDescr.
+	 * 
+	 * @param left
+	 *            left descriptor
+	 * @param right
+	 *            right descriptor
+	 * @return RestrictionConnectiveDescr or AndDescr filled.
+	 * @see RestrictionConnectiveDescr
+	 * @see AndDescr
+	 */
+	public BaseDescr createAndRestrictionConnective(BaseDescr left,
+			BaseDescr right) {
+		BaseDescr and = null;
+		if (left instanceof RestrictionDescr
+				&& !(left instanceof PredicateDescr)) {
+			RestrictionConnectiveDescr restAnd = new RestrictionConnectiveDescr(
+					RestrictionConnectiveDescr.AND);
+			restAnd.addOrMerge((RestrictionDescr) left);
+			restAnd.addOrMerge((RestrictionDescr) right);
+			and = restAnd;
+		} else {
+			AndDescr consAnd = new AndDescr();
+			consAnd.addOrMerge(left);
+			consAnd.addOrMerge(right);
+			and = consAnd;
+		}
+
+		return and;
+	}
+
+	/**
+	 * Factory method that creates an EvaluatorBasedRestrictionDescr.
+	 * 
+	 * @param aeList
+	 *            accessor element list
+	 * @return EvaluatorBasedRestrictionDescr filled.
+	 * @see EvaluatorBasedRestrictionDescr
+	 */
+	public BaseDescr createAccessorPath(List<BaseDescr> aeList) {
+		StringBuilder sb = new StringBuilder();
+		sb.append(aeList.get(0).getText());
+		if (aeList.size() > 1) {
+			for (int i = 1; i < aeList.size(); i++) {
+				sb.append(".");
+				sb.append(aeList.get(i).getText());
+			}
+		}
+
+		EvaluatorBasedRestrictionDescr evaluator;
+		String name = sb.toString();
+		if (name.indexOf('.') > -1 || name.indexOf('[') > -1) {
+			evaluator = new QualifiedIdentifierRestrictionDescr();
+		} else {
+			evaluator = new VariableRestrictionDescr();
+		}
+		evaluator.setText(name);
+
+		return evaluator;
+	}
+
+	/**
+	 * Factory method that creates a LiteralRestrictionDescr of String type,
+	 * also remove the quotes.
+	 * 
+	 * @param s
+	 *            string data
+	 * @return LiteralRestrictionDescr filled
+	 * @see LiteralRestrictionDescr
+	 */
+	public LiteralRestrictionDescr createStringLiteralRestriction(DroolsTree s) {
+		LiteralRestrictionDescr stringLit = new LiteralRestrictionDescr();
+		stringLit.setType(LiteralRestrictionDescr.TYPE_STRING);
+		stringLit.setText(s.getText().substring(1, s.getText().length() - 1));
+		return stringLit;
+	}
+
+	/**
+	 * Factory method that creates a LiteralRestrictionDescr of Number type.
+	 * 
+	 * @param i
+	 *            integer data
+	 * @return LiteralRestrictionDescr filled
+	 * @see LiteralRestrictionDescr
+	 */
+	public LiteralRestrictionDescr createIntLiteralRestriction(DroolsTree i) {
+		LiteralRestrictionDescr intLit = new LiteralRestrictionDescr();
+		intLit.setType(LiteralRestrictionDescr.TYPE_NUMBER);
+		intLit.setText(i.getText());
+		return intLit;
+	}
+
+	/**
+	 * Factory method that creates a LiteralRestrictionDescr of Number type.
+	 * 
+	 * @param f
+	 *            float data
+	 * @return LiteralRestrictionDescr filled
+	 * @see LiteralRestrictionDescr
+	 */
+	public LiteralRestrictionDescr createFloatLiteralRestriction(DroolsTree f) {
+		LiteralRestrictionDescr floatLit = new LiteralRestrictionDescr();
+		floatLit.setType(LiteralRestrictionDescr.TYPE_NUMBER);
+		floatLit.setText(f.getText());
+		return floatLit;
+	}
+
+	/**
+	 * Factory method that creates a LiteralRestrictionDescr of Boolean type.
+	 * 
+	 * @param b
+	 *            boolean data
+	 * @return LiteralRestrictionDescr filled
+	 * @see LiteralRestrictionDescr
+	 */
+	public LiteralRestrictionDescr createBoolLiteralRestriction(DroolsTree b) {
+		LiteralRestrictionDescr boolLit = new LiteralRestrictionDescr();
+		boolLit.setType(LiteralRestrictionDescr.TYPE_BOOLEAN);
+		boolLit.setText(b.getText());
+		return boolLit;
+	}
+
+	/**
+	 * Factory method that creates a LiteralRestrictionDescr of Null type.
+	 * 
+	 * @param n
+	 *            null data
+	 * @return LiteralRestrictionDescr filled
+	 * @see LiteralRestrictionDescr
+	 */
+	public LiteralRestrictionDescr createNullLiteralRestriction(DroolsTree n) {
+		LiteralRestrictionDescr nullLit = new LiteralRestrictionDescr();
+		nullLit.setType(LiteralRestrictionDescr.TYPE_NULL);
+		nullLit.setText(null);
+		return nullLit;
+	}
+
+	/**
+	 * Factory method that creates a ReturnValueRestrictionDescr.
+	 * 
+	 * @param pc
+	 *            chunk data
+	 * @return ReturnValueRestrictionDescr filled
+	 * @see ReturnValueRestrictionDescr
+	 */
+	public ReturnValueRestrictionDescr createReturnValue(DroolsTree pc) {
+		ReturnValueRestrictionDescr returnValue = new ReturnValueRestrictionDescr();
+		returnValue.setContent(pc.getText().substring(1,
+				pc.getText().length() - 1));
+		returnValue.setLocation(getLineLocation(pc), getColumnLocation(pc));
+		returnValue.setStartCharacter(getStartOffsetLocation(pc));
+		returnValue.setEndCharacter(getEndOffsetLocation(pc));
+		return returnValue;
+	}
+
+	/**
+	 * Factory method that creates a FieldConstraintDescr.
+	 * 
+	 * @param aeList
+	 *            accessor element descriptor list
+	 * @return FieldConstraintDescr filled.
+	 */
+	public FieldConstraintDescr createFieldConstraint(List<BaseDescr> aeList) {
+		StringBuilder sb = new StringBuilder();
+		sb.append(aeList.get(0).getText());
+		if (aeList.size() > 1) {
+			for (int i = 1; i < aeList.size(); i++) {
+				sb.append(".");
+				sb.append(aeList.get(i).getText());
+			}
+		}
+		FieldConstraintDescr fieldConstraint = new FieldConstraintDescr(sb
+				.toString());
+		fieldConstraint.setLocation(aeList.get(0).getLine(), aeList.get(0)
+				.getColumn());
+		fieldConstraint.setStartCharacter(aeList.get(0).getStartCharacter());
+		fieldConstraint.setEndCharacter(aeList.get(aeList.size() - 1)
+				.getEndCharacter());
+
+		return fieldConstraint;
+	}
+
+	/**
+	 * Factory method that creates an accessor element descriptor.
+	 * 
+	 * @param id
+	 *            accessor identifier
+	 * @param squareChunk
+	 *            chunk data
+	 * @return BaseDescr accessor descriptor filled.
+	 */
+	public BaseDescr createAccessorElement(DroolsTree id,
+			List<DroolsTree> squareChunk) {
+		BaseDescr element = new BaseDescr();
+		element.setLocation(getLineLocation(id), getColumnLocation(id));
+		element.setStartCharacter(getStartOffsetLocation(id));
+		element.setEndCharacter(getEndOffsetLocation(id));
+		StringBuilder sb = new StringBuilder();
+		sb.append(id.getText());
+		if (null != squareChunk && squareChunk.size() > 0) {
+			for (DroolsTree chunk : squareChunk) {
+				sb.append(chunk.getText());
+			}
+			element.setEndCharacter(getEndOffsetLocation(squareChunk
+					.get(squareChunk.size() - 1)));
+		}
+		element.setText(sb.toString());
+		return element;
+	}
+
+	/**
+	 * A factory method that returns a data type descriptor.
+	 * 
+	 * @param idList
+	 *            identifier list
+	 * @param rightList
+	 *            right square list, may be null
+	 * @return BaseDescr data type filled.
+	 */
+	public BaseDescr createDataType(List<DroolsTree> idList,
+			List<DroolsTree> rightList) {
+		return createGenericBaseDescr(idList, rightList);
+	}
+
+	/**
+	 * Helper method that creates a full identifier descriptor with correct char
+	 * offset.
+	 * 
+	 * @param idList
+	 *            identifiers
+	 * @param rightList
+	 *            right square list, may be null
+	 * @return BaseDescr filled.
+	 */
+	private BaseDescr createGenericBaseDescr(List<DroolsTree> idList,
+			List<DroolsTree> rightList) {
+		int endLine = getLineLocation(idList.get(idList.size() - 1));
+		int endColumn = getEndOffsetLocation(idList.get(idList.size() - 1));
+		int endChar = getEndOffsetLocation(idList.get(idList.size() - 1));
+
+		StringBuilder text = new StringBuilder();
+		text.append(createDotedIdFromList(idList));
+
+		if (null != rightList && rightList.size() > 0) {
+			for (int i = 0; i < rightList.size(); i++) {
+				text.append("[]");
+			}
+
+			endLine = getLineLocation(rightList.get(idList.size() - 1));
+			endColumn = getEndOffsetLocation(rightList.get(idList.size() - 1));
+			endChar = getEndOffsetLocation(rightList.get(idList.size() - 1));
+		}
+
+		BaseDescr baseDescr = new BaseDescr();
+		baseDescr.setText(text.toString());
+		baseDescr.setLocation(getLineLocation(idList.get(0)),
+				getColumnLocation(idList.get(0)));
+		baseDescr.setEndLocation(endLine, endColumn);
+		baseDescr.setEndCharacter(endChar);
+
+		return baseDescr;
+	}
+
+	/**
+	 * Helper method returns a dotted identifier based on identifier list.
+	 * 
+	 * @param idList
+	 *            identifiers
+	 * @return dotted identifier
+	 */
+	private String createDotedIdFromList(List<DroolsTree> idList) {
+		StringBuilder sb = new StringBuilder();
+
+		if (null != idList && idList.size() > 0) {
+			for (DroolsTree commonTree : idList) {
+				sb.append(commonTree.getText());
+				sb.append(".");
+			}
+			sb.deleteCharAt(sb.length() - 1);
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * Helper method that returns a tree text without initial and final quotes
+	 * (if it starts with).
+	 * 
+	 * @param tree
+	 *            tree
+	 * @return text without quotes
+	 */
+	private String getCleanId(DroolsTree id) {
+		String cleanedId = id.getText();
+		if (cleanedId.startsWith("\"") || cleanedId.startsWith("'")) {
+			cleanedId = cleanedId.substring(1, cleanedId.length() - 1);
+		}
+		return cleanedId;
+	}
+
+	/**
+	 * Helper method that returns line location
+	 * 
+	 * @param tree
+	 *            tree
+	 * @return line location
+	 */
+	private int getLineLocation(DroolsTree tree) {
+		return tree.getLine();
+	}
+
+	/**
+	 * Helper method that returns column location
+	 * 
+	 * @param tree
+	 *            tree
+	 * @return column location
+	 */
+	private int getColumnLocation(DroolsTree tree) {
+		return tree.getCharPositionInLine();
+	}
+
+	/**
+	 * Helper method that returns start char offset
+	 * 
+	 * @param tree
+	 *            tree
+	 * @return start char offset
+	 */
+	private int getStartOffsetLocation(DroolsTree tree) {
+		return tree.getStartCharOffset();
+	}
+
+	/**
+	 * Helper method that returns end char offset
+	 * 
+	 * @param tree
+	 *            tree
+	 * @return end char offset
+	 */
+	private int getEndOffsetLocation(DroolsTree tree) {
+		return tree.getEndCharOffset();
+	}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -31,6 +31,12 @@
     private boolean           negated;
     private String            parameterText;
 
+	/**
+     * Creates a new EvaluatorBasedRestriction
+     */
+    public EvaluatorBasedRestrictionDescr(){    	
+    }
+
     /**
      * Creates a new EvaluatorBasedRestriction
      * 
@@ -76,8 +82,34 @@
         return parameterText;
     }
     
+    /**
+     * Sets the evaluator ID for this restriction
+     */
+    public void setEvaluator(String evaluator) {
+		this.evaluator = evaluator;
+	}
+    /**
+     * Sets if this evaluator is negated.
+     * Example: "contains" is boolean negated if you want to check the elements that are not contained ("not contains")
+     * 
+     * @param negated the negated
+     */
+	public void setNegated(boolean negated) {
+		this.negated = negated;
+	}
+
+    /**
+     * Set any parameter text.
+     * A parameter text is evaluator parameters like "after[1,10]". In the previous example,
+     * the parameter text will be "1,10".
+     * 
+     * @return parameterText the parameterText
+     */
+	public void setParameterText(String parameterText) {
+		this.parameterText = parameterText;
+	}
+
     public String toString() {
         return ( this.isNegated() ? "not " : "" ) + this.getEvaluator() + ( this.getParameterText() != null ? "["+this.getParameterText()+"]" : "");
     }
-
-}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FieldBindingDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FieldBindingDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/FieldBindingDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -21,8 +21,9 @@
      * 
      */
     private static final long serialVersionUID = 400L;
-    private String            fieldName;
-    private String            identifier;
+    private String               fieldName;
+    private String               identifier;
+    private FieldConstraintDescr fieldConstraint = null;
 
     public FieldBindingDescr() {
         this( null,
@@ -51,8 +52,15 @@
         return this.identifier;
     }
 
+	public FieldConstraintDescr getFieldConstraint() {
+		return fieldConstraint;
+	}
+
+	public void setFieldConstraint(FieldConstraintDescr fieldConstraint) {
+		this.fieldConstraint = fieldConstraint;
+	}
+
     public String toString() {
         return "[FieldBinding: field=" + this.fieldName + "; identifier=" + this.identifier + "]";
     }
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -33,6 +33,9 @@
     private static final long serialVersionUID = 400L;
     private int               type;
 
+    public LiteralRestrictionDescr(){
+    }
+
     public LiteralRestrictionDescr(final String evaluator,
                                    final String text) {
         this( evaluator,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PackageDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -16,13 +16,13 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
 
 import org.drools.rule.Dialectable;
 import org.drools.rule.Namespaceable;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -26,6 +26,9 @@
 
     private static final long serialVersionUID = 400L;
 
+    public QualifiedIdentifierRestrictionDescr(){
+    }
+
     public QualifiedIdentifierRestrictionDescr(final String evaluator,
                                                final boolean isNegated,
                                                final String parameterText,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -23,6 +23,9 @@
     private String[]          declarations;
     private String            classMethodName;
 
+    public ReturnValueRestrictionDescr(){
+    }
+
     public ReturnValueRestrictionDescr(final String evaluator ) {
         super( evaluator,
                false,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -20,6 +20,9 @@
 
     private static final long serialVersionUID = 400L;
 
+    public VariableRestrictionDescr(){    	
+    }
+
     public VariableRestrictionDescr(final String evaluator,
                                     final String identifier ) {
         super( evaluator,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/rules/ExpressionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/rules/ExpressionHandler.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/rules/ExpressionHandler.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -23,10 +23,14 @@
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.RecognitionException;
 import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.antlr.runtime.tree.Tree;
+import org.drools.lang.DescrBuilderTree;
+import org.drools.lang.DroolsTreeAdaptor;
 import org.drools.lang.DRLLexer;
 import org.drools.lang.DRLParser;
+import org.drools.lang.DescrBuilderTree.from_source_clause_return;
 import org.drools.lang.descr.BaseDescr;
-import org.drools.lang.descr.DeclarativeInvokerDescr;
 import org.drools.lang.descr.FromDescr;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
@@ -82,17 +86,27 @@
         
         emptyContentCheck( localName, expression, parser );
 
-        final Object parent = parser.getParent();
+        FromDescr parent = (FromDescr) parser.getParent();
 
-        final FromDescr fromSource = (FromDescr) parent;
         final CharStream charStream = new ANTLRStringStream( expression.trim() );
         final DRLLexer lexer = new DRLLexer( charStream );
         final TokenStream tokenStream = new CommonTokenStream( lexer );
         final DRLParser drlParser = new DRLParser( tokenStream );
+        drlParser.setTreeAdaptor(new DroolsTreeAdaptor());
 
         try {
-            final DeclarativeInvokerDescr declarativeInvoker = drlParser.from_source( fromSource );
-            fromSource.setDataSource( declarativeInvoker );
+        	Tree fromSourceTree = (Tree) drlParser.from_source().getTree();
+        	if (!drlParser.hasErrors()){
+				CommonTreeNodeStream nodes = new CommonTreeNodeStream(fromSourceTree);
+				nodes.setTokenStream(tokenStream);
+            	DescrBuilderTree walker = new DescrBuilderTree(nodes);
+            	from_source_clause_return fromReturn = walker.from_source_clause();
+            	parent.setDataSource(fromReturn.retAccessorDescr);
+            	parent = fromReturn.fromDescr;
+        	} else {
+                throw new SAXParseException( "<" + localName + "> must have a valid expression content ",
+                        parser.getLocator() );        		
+        	}
         } catch ( final RecognitionException e ) {
             throw new SAXParseException( "<" + localName + "> must have a valid expression content ",
                                          parser.getLocator() );
@@ -100,5 +114,4 @@
 
         return null;
     }
-
-}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,1772 +1,995 @@
-grammar DRL; 
+grammar DRL;
 
+options {
+	output=AST;
+}
+
+tokens {
+	VT_COMPILATION_UNIT;
+	VT_FUNCTION_IMPORT;
+
+	VT_FACT;
+	VT_CONSTRAINTS;
+	VT_LABEL;
+
+	VT_QUERY_ID;
+	VT_TEMPLATE_ID;
+	VT_RULE_ID;
+	VT_ENTRYPOINT_ID;
+	VT_SLOT_ID;
+	
+	VT_SLOT;
+	VT_RULE_ATTRIBUTES;
+
+	VT_RHS_CHUNK;
+	VT_CURLY_CHUNK;
+	VT_SQUARE_CHUNK;
+	VT_PAREN_CHUNK;
+
+	VT_AND_IMPLICIT;
+	VT_AND_PREFIX;
+	VT_OR_PREFIX;
+	VT_AND_INFIX;
+	VT_OR_INFIX;
+
+	VT_ACCUMULATE_INIT_CLAUSE;
+	VT_ACCUMULATE_ID_CLAUSE;
+	VT_FROM_SOURCE;
+	VT_EXPRESSION_CHAIN;
+
+	VT_PATTERN;
+	VT_FACT_BINDING;
+	VT_FACT_OR;
+	VT_BIND_FIELD;
+	VT_FIELD;
+
+	VT_ACCESSOR_PATH;
+	VT_ACCESSOR_ELEMENT;
+	
+	VT_DATA_TYPE;
+	VT_PATTERN_TYPE;
+	VT_PACKAGE_ID;
+	VT_IMPORT_ID;
+	VT_GLOBAL_ID;
+	VT_FUNCTION_ID;
+	VT_PARAM_LIST;
+
+	VK_DATE_EFFECTIVE;
+	VK_DATE_EXPIRES;
+	VK_LOCK_ON_ACTIVE;
+	VK_NO_LOOP;
+	VK_AUTO_FOCUS;
+	VK_ACTIVATION_GROUP;
+	VK_AGENDA_GROUP;
+	VK_RULEFLOW_GROUP;
+	VK_DURATION;
+	VK_DIALECT;
+	VK_SALIENCE;
+	VK_ENABLED;
+	VK_ATTRIBUTES;
+	VK_WHEN;
+	VK_RULE;
+	VK_IMPORT;
+	VK_PACKAGE;
+	VK_TEMPLATE;
+	VK_QUERY;
+	VK_DECLARE;
+	VK_FUNCTION;
+	VK_GLOBAL;
+	VK_EVAL;
+	VK_CONTAINS;
+	VK_MATCHES;
+	VK_EXCLUDES;
+	VK_SOUNDSLIKE;
+	VK_MEMBEROF;
+	VK_ENTRY_POINT;
+	VK_NOT;
+	VK_IN;
+	VK_OR;
+	VK_AND;
+	VK_EXISTS;
+	VK_FORALL;
+	VK_FROM;
+	VK_ACCUMULATE;
+	VK_INIT;
+	VK_ACTION;
+	VK_REVERSE;
+	VK_RESULT;
+	VK_COLLECT;
+}
+
 @parser::header {
 	package org.drools.lang;
-	import java.util.List;
-	import java.util.ArrayList;
-	import java.util.Iterator;
-	import java.util.HashMap;	
-	import java.util.StringTokenizer;
-	import org.drools.lang.descr.*;
+	
+	import org.drools.compiler.DroolsParserException;
 }
 
+ at lexer::header {
+	package org.drools.lang;
+}
+
+
+ at lexer::members {
+	/** The standard method called to automatically emit a token at the
+	 *  outermost lexical rule.  The token object should point into the
+	 *  char buffer start..stop.  If there is a text override in 'text',
+	 *  use that to set the token's text.  Override this method to emit
+	 *  custom Token objects.
+	 */
+	public Token emit() {
+		Token t = new DroolsToken(input, type, channel, tokenStartCharIndex, getCharIndex()-1);
+		t.setLine(tokenStartLine);
+		t.setText(text);
+		t.setCharPositionInLine(tokenStartCharPositionInLine);
+		emit(t);
+		return t;
+	}
+}
+
 @parser::members {
-	private PackageDescr packageDescr;
-	private List errors = new ArrayList();
+	private Stack<Map<Integer, String>> paraphrases = new Stack<Map<Integer, String>>();
+	private List<DroolsParserException> errors = new ArrayList<DroolsParserException>();
+	private DroolsParserExceptionFactory errorMessageFactory = new DroolsParserExceptionFactory(tokenNames, paraphrases);
 	private String source = "unknown";
-	private int lineOffset = 0;
-	private DescrFactory factory = new DescrFactory();
-	private boolean parserDebug = false;
-	private Location location = new Location( Location.LOCATION_UNKNOWN );
+
+	private boolean validateLT(int LTNumber, String text) {
+		if (null == input)
+			return false;
+		if (null == input.LT(LTNumber))
+			return false;
+		if (null == input.LT(LTNumber).getText())
+			return false;
 	
-	// THE FOLLOWING LINES ARE DUMMY ATTRIBUTES TO WORK AROUND AN ANTLR BUG
-	private BaseDescr from = null;
-	private FieldConstraintDescr fc = null;
-	private RestrictionConnectiveDescr and = null;
-	private RestrictionConnectiveDescr or = null;
-	private ConditionalElementDescr base = null;
-	
-	public void setParserDebug(boolean parserDebug) {
-		this.parserDebug = parserDebug;
+		String text2Validate = input.LT(LTNumber).getText();
+		return text2Validate.equalsIgnoreCase(text);
 	}
 	
-	public void debug(String message) {
-		if ( parserDebug ) 
-			System.err.println( "drl parser: " + message );
+	private boolean validateIdentifierKey(String text) {
+		return validateLT(1, text);
 	}
 	
-	public void setSource(String source) {
-		this.source = source;
+	void checkTrailingSemicolon(String text, Token token) {
+		if (text.trim().endsWith(";")) {
+			errors.add(errorMessageFactory
+					.createTrailingSemicolonException(((DroolsToken) token)
+							.getLine(), ((DroolsToken) token)
+							.getCharPositionInLine(), ((DroolsToken) token)
+							.getStopIndex()));
+		}
 	}
-	public DescrFactory getFactory() {
-		return factory;
-	}	
-
-	public String getSource() {
-		return this.source;
-	}
 	
-	public PackageDescr getPackageDescr() {
-		return packageDescr;
+	private String safeSubstring(String text, int start, int end) {
+		return text.substring(Math.min(start, text.length()), Math.min(Math
+				.max(start, end), text.length()));
 	}
 	
-	private int offset(int line) {
-		return line + lineOffset;
-	}
+	public void reportError(RecognitionException ex) {
+		// if we've already reported an error and have not matched a token
+		// yet successfully, don't report any errors.
+		if (errorRecovery) {
+			return;
+		}
+		errorRecovery = true;
 	
-	/**
-	 * This will set the offset to record when reparsing. Normally is zero of course 
-	 */
-	public void setLineOffset(int i) {
-	 	this.lineOffset = i;
+		errors.add(errorMessageFactory.createDroolsException(ex));
 	}
 	
-	private String getString(String token) {
-		return safeSubstring( token, 1, token.length() -1 );
+	/** return the raw DroolsParserException errors */
+	public List<DroolsParserException> getErrors() {
+		return errors;
 	}
 	
-	private String cleanupSpaces( String input ) {
-                return input.replaceAll( "\\s", "" );
-        }
+	/** Return a list of pretty strings summarising the errors */
+	public List<String> getErrorMessages() {
+		List<String> messages = new ArrayList<String>(errors.size());
 	
+		for (DroolsParserException activeException : errors) {
+			messages.add(activeException.getMessage());
+		}
 	
-	public void reportError(RecognitionException ex) {
-	        // if we've already reported an error and have not matched a token
-                // yet successfully, don't report any errors.
-                if ( errorRecovery ) {
-                        return;
-                }
-                errorRecovery = true;
+		return messages;
+	}
+	
+	/** return true if any parser errors were accumulated */
+	public boolean hasErrors() {
+		return !errors.isEmpty();
+	}
 
-		ex.line = offset(ex.line); //add the offset if there is one
-		errors.add( ex ); 
+	/**
+	 * Method that adds a paraphrase type into paraphrases stack.
+	 * 
+	 * @param type
+	 *            paraphrase type
+	 */
+	private void pushParaphrases(int type) {
+		Map<Integer, String> activeMap = new HashMap<Integer, String>();
+		activeMap.put(type, "");
+		paraphrases.push(activeMap);
 	}
-     	
-     	/** return the raw RecognitionException errors */
-     	public List getErrors() {
-     		return errors;
-     	}
-     	
-     	/** Return a list of pretty strings summarising the errors */
-     	public List getErrorMessages() {
-     		List messages = new ArrayList();
- 		for ( Iterator errorIter = errors.iterator() ; errorIter.hasNext() ; ) {
-     	     		messages.add( createErrorMessage( (RecognitionException) errorIter.next() ) );
-     	     	}
-     	     	return messages;
-     	}
-     	
-     	/** return true if any parser errors were accumulated */
-     	public boolean hasErrors() {
-  		return ! errors.isEmpty();
-     	}
-     	
-     	/** This will take a RecognitionException, and create a sensible error message out of it */
-     	public String createErrorMessage(RecognitionException e)
-        {
-		StringBuffer message = new StringBuffer();		
-                message.append( source + ":"+e.line+":"+e.charPositionInLine+" ");
-                if ( e instanceof MismatchedTokenException ) {
-                        MismatchedTokenException mte = (MismatchedTokenException)e;
-                        if( mte.expecting >=0 && mte.expecting < tokenNames.length ) {
-	                        message.append("mismatched token: "+
-                                                           e.token+
-                                                           "; expecting type "+
-                                                           tokenNames[mte.expecting]);
-                        } else {
-	                        message.append("mismatched token: "+
-                                                           e.token+
-                                                           ";");
-                        }
-                }
-                else if ( e instanceof MismatchedTreeNodeException ) {
-                        MismatchedTreeNodeException mtne = (MismatchedTreeNodeException)e;
-                        if( mtne.expecting >=0 && mtne.expecting < tokenNames.length ) {
-	                        message.append("mismatched tree node: "+
-                                                           mtne.toString() +
-                                                           "; expecting type "+
-                                                           tokenNames[mtne.expecting]);
-                        } else {
-	                        message.append("mismatched tree node: "+
-                                                           mtne.toString() +
-                                                           ";");
-                        }
-                }
-                else if ( e instanceof NoViableAltException ) {
-                        NoViableAltException nvae = (NoViableAltException)e;
-			message.append( "Unexpected token '" + e.token.getText() + "'" );
-                        /*
-                        message.append("decision=<<"+nvae.grammarDecisionDescription+">>"+
-                                                           " state "+nvae.stateNumber+
-                                                           " (decision="+nvae.decisionNumber+
-                                                           ") no viable alt; token="+
-                                                           e.token);
-                                                           */
-                }
-                else if ( e instanceof EarlyExitException ) {
-                        EarlyExitException eee = (EarlyExitException)e;
-                        message.append("required (...)+ loop (decision="+
-                                                           eee.decisionNumber+
-                                                           ") did not match anything; token="+
-                                                           e.token);
-                }
-                else if ( e instanceof MismatchedSetException ) {
-                        MismatchedSetException mse = (MismatchedSetException)e;
-                        message.append("mismatched token '"+
-                                                           e.token+
-                                                           "' expecting set "+mse.expecting);
-                }
-                else if ( e instanceof MismatchedNotSetException ) {
-                        MismatchedNotSetException mse = (MismatchedNotSetException)e;
-                        message.append("mismatched token '"+
-                                                           e.token+
-                                                           "' expecting set "+mse.expecting);
-                }
-                else if ( e instanceof FailedPredicateException ) {
-                        FailedPredicateException fpe = (FailedPredicateException)e;
-                        message.append("rule "+fpe.ruleName+" failed predicate: {"+
-                                                           fpe.predicateText+"}?");
-                } else if (e instanceof GeneralParseException) {
-			message.append(" " + e.getMessage());
+
+	/**
+	 * Method that sets paraphrase value for a type into paraphrases stack.
+	 * 
+	 * @param type
+	 *            paraphrase type
+	 * @param value
+	 *            paraphrase value
+	 */
+	private void setParaphrasesValue(int type, String value) {
+		paraphrases.peek().put(type, value);
+	}
+
+	/**
+	 * Helper method that creates a string from a token list.
+	 * 
+	 * @param tokenList
+	 *            token list
+	 * @return string
+	 */
+	private String buildStringFromTokens(List<Token> tokenList) {
+		StringBuilder sb = new StringBuilder();
+		if (null != tokenList) {
+			for (Token activeToken : tokenList) {
+				if (null != activeToken) {
+					sb.append(activeToken.getText());
+				}
+			}
 		}
-               	return message.toString();
-        }   
-        
-        void checkTrailingSemicolon(String text, int line) {
-        	if (text.trim().endsWith( ";" ) ) {
-        		this.errors.add( new GeneralParseException( "Trailing semi-colon not allowed", offset(line) ) );
-        	}
-        }
-        
-        public Location getLocation() {
-                return this.location;
-        }
-        
-        private String safeSubstring( String text, int start, int end ) {
-            	return text.substring( Math.min( start, text.length() ), Math.min( Math.max( start, end ), text.length() ) );
-        }
-      
+		return sb.toString();
+	}
 }
 
- at lexer::header {
-	package org.drools.lang;
-}
-
-opt_semicolon
-	: ';'?
-	;
-
 compilation_unit
-	@init {
-		// reset Location information
-		this.location = new Location( Location.LOCATION_UNKNOWN );
-	}
-	:	prolog 
+	:	package_statement?
 		statement*
 		EOF
+		-> ^(VT_COMPILATION_UNIT package_statement? statement*) 
 	;
 	catch [ RecognitionException e ] {
 		reportError( e );
 	}
-	
-prolog
-	@init {
-		String packageName = "";
+	catch [ RewriteEmptyStreamException e ] {
 	}
-	:	( pkgstmt=package_statement { packageName = $pkgstmt.packageName; } )?
-		{ 
-			this.packageDescr = factory.createPackage( packageName ); 
-		}	
+
+package_statement
+ at init  { pushParaphrases(DroolsParaphareseTypes.PACKAGE); }
+ at after { paraphrases.pop(); }
+	:	package_key package_id SEMICOLON?
+		-> ^(package_key package_id)
 	;
-	
 
+package_id
+	:	id+=ID ( id+=DOT id+=ID )*
+	{	setParaphrasesValue(DroolsParaphareseTypes.PACKAGE, buildStringFromTokens($id));	}
+		-> ^(VT_PACKAGE_ID ID+)
+	;
+
 statement
-	:	a=rule_attribute { this.packageDescr.addAttribute( a ); }
-	|	function_import_statement 
+	:	rule_attribute
+	|{(validateLT(1, "import") && validateLT(2, "function") )}?=> function_import_statement 
 	|	import_statement 
 	|	global 
-	|	function 
-	|       t=template { this.packageDescr.addFactTemplate( $t.template ); }
-	|	r=rule { this.packageDescr.addRule( $r.rule ); }			
-	|	q=query	{ this.packageDescr.addRule( $q.query ); }
-	|       d=type_declaration { this.packageDescr.addTypeDeclaration( $d.declaration ); }
+	|	function
+	|	template
+	|	rule
+	|	query
 	;
-	
-package_statement returns [String packageName]
-	@init{
-		$packageName = null;
-	}
-	:	
-		PACKAGE n=dotted_name opt_semicolon
-		{
-			$packageName = $n.text;
-		}
-	;
 
-	
-
 import_statement
-        @init {
-        	ImportDescr importDecl = null;
-        }
-	:	IMPORT 
-	        {
-	            importDecl = factory.createImport( );
-	            importDecl.setStartCharacter( ((CommonToken)$IMPORT).getStartIndex() );
-		    if (packageDescr != null) {
-			packageDescr.addImport( importDecl );
-		    }
-	        }
-	        import_name[importDecl] opt_semicolon
+ at init  { pushParaphrases(DroolsParaphareseTypes.IMPORT); }
+ at after { paraphrases.pop(); }
+	:	import_key import_name[DroolsParaphareseTypes.IMPORT] SEMICOLON?
+		-> ^(import_key import_name)
 	;
 
 function_import_statement
-        @init {
-        	FunctionImportDescr importDecl = null;
-        }
-	:	IMPORT FUNCTION 
-	        {
-	            importDecl = factory.createFunctionImport();
-	            importDecl.setStartCharacter( ((CommonToken)$IMPORT).getStartIndex() );
-		    if (packageDescr != null) {
-			packageDescr.addFunctionImport( importDecl );
-		    }
-	        }
-	        import_name[importDecl] opt_semicolon
+ at init  { pushParaphrases(DroolsParaphareseTypes.FUNCTION_IMPORT); }
+ at after { paraphrases.pop(); }
+	:	imp=import_key function_key import_name[DroolsParaphareseTypes.FUNCTION_IMPORT] SEMICOLON?
+		-> ^(VT_FUNCTION_IMPORT[$imp.start] function_key import_name)
 	;
 
-import_name[ImportDescr importDecl] returns [String name]
-	@init {
-		$name = null;
-	}
-	:	
-		ID 
-		{ 
-		    $name=$ID.text; 
-		    $importDecl.setTarget( name );
-		    $importDecl.setEndCharacter( ((CommonToken)$ID).getStopIndex() );
-		} 
-		( DOT id=identifier 
-		    { 
-		        $name = $name + $DOT.text + $id.text; 
-			$importDecl.setTarget( $name );
-		        $importDecl.setEndCharacter( ((CommonToken)$id.start).getStopIndex() );
-		    } 
-		)* 
-		( star='.*' 
-		    { 
-		        $name = $name + $star.text; 
-			$importDecl.setTarget( $name );
-		        $importDecl.setEndCharacter( ((CommonToken)$star).getStopIndex() );
-		    }
-		)?
+import_name [int importType]
+	:	id+=ID ( id+=DOT id+=ID )* id+=DOT_STAR?
+	{	setParaphrasesValue($importType, buildStringFromTokens($id));	}
+		-> ^(VT_IMPORT_ID ID+ DOT_STAR?)
 	;
 
-
 global
-	@init {
-	    GlobalDescr global = null;
-	}
-	:
-		GLOBAL 
-		{
-		    global = factory.createGlobal();
-	            global.setStartCharacter( ((CommonToken)$GLOBAL).getStartIndex() );
-		    packageDescr.addGlobal( global );
-		}
-		type=dotted_name 
-		{
-		    global.setType( $type.text );
-		}
-		id=identifier opt_semicolon
-		{
-		    global.setIdentifier( $id.text );
-		    global.setEndCharacter( ((CommonToken)$id.start).getStopIndex() );
-		}
+ at init  { pushParaphrases(DroolsParaphareseTypes.GLOBAL); }
+ at after { paraphrases.pop(); }
+	:	global_key data_type global_id SEMICOLON?
+		-> ^(global_key data_type global_id)
 	;
-	
 
+global_id
+	:	id=ID
+	{	setParaphrasesValue(DroolsParaphareseTypes.GLOBAL, $id.text);	}
+		-> VT_GLOBAL_ID[$id]
+	;
+
 function
-	@init {
-		FunctionDescr f = null;
-		String type = null;
-	}
-	:
-		FUNCTION retType=dotted_name? id=identifier
-		{
-			//System.err.println( "function :: " + n.getText() );
-			type = retType != null ? $retType.text : null;
-			f = factory.createFunction( $id.text, type );
-			f.setLocation(offset($FUNCTION.line), $FUNCTION.pos);
-	        	f.setStartCharacter( ((CommonToken)$FUNCTION).getStartIndex() );
-			packageDescr.addFunction( f );
-		} 
-		LEFT_PAREN
-			(	paramType=dotted_name? paramName=argument
-				{
-					type = paramType != null ? $paramType.text : null;
-					f.addParameter( type, $paramName.name );
-				}
-				(	COMMA paramType=dotted_name? paramName=argument
-					{
-						type = paramType != null ? $paramType.text : null;
-						f.addParameter( type, $paramName.name );
-					}
-				)*
-			)?
+ at init  { pushParaphrases(DroolsParaphareseTypes.FUNCTION); }
+ at after { paraphrases.pop(); }
+	:	function_key data_type? function_id parameters curly_chunk
+		-> ^(function_key data_type? function_id parameters curly_chunk)
+	;
+
+function_id
+	:	id=ID
+	{	setParaphrasesValue(DroolsParaphareseTypes.FUNCTION, $id.text);	}
+		-> VT_FUNCTION_ID[$id]
+	;
+
+query
+ at init  { pushParaphrases(DroolsParaphareseTypes.QUERY); }
+ at after { paraphrases.pop(); }
+	:	query_key query_id parameters? normal_lhs_block END SEMICOLON?
+		-> ^(query_key query_id parameters? normal_lhs_block END)
+	;
+
+query_id
+	: 	id=ID
+	{	setParaphrasesValue(DroolsParaphareseTypes.QUERY, $id.text);	} -> VT_QUERY_ID[$id]
+	| 	id=STRING
+	{	setParaphrasesValue(DroolsParaphareseTypes.QUERY, $id.text);	} -> VT_QUERY_ID[$id]
+	;
+
+parameters
+	:	LEFT_PAREN
+			( param_definition (COMMA param_definition)* )?
 		RIGHT_PAREN
-		body=curly_chunk
-		{
-			//strip out '{','}'
-			f.setText( safeSubstring( $body.text, 1, $body.text.length()-1 ) );
-			f.setEndCharacter( ((CommonToken)$body.stop).getStopIndex() );
-			f.setEndLocation(offset($body.stop.getLine()), $body.stop.getCharPositionInLine());
-		}
+		-> ^(VT_PARAM_LIST param_definition* RIGHT_PAREN)
 	;
 
-argument returns [String name]
-	@init {
-		$name = null;
-	}
-	:	id=identifier { $name=$id.text; } ( '[' ']' { $name += "[]";})*
+param_definition
+	:	data_type? argument
 	;
-	
-type_declaration returns [TypeDeclarationDescr declaration]
-        @init {
-                $declaration = factory.createTypeDeclaration();
-        }
-        :	DECLARE id=identifier 
-                        {
-                            $declaration.setTypeName( $id.text );
-                        }
-                        decl_metadata[$declaration]*
-                        decl_field[$declaration]*
-                END
-        ;
-        
-decl_metadata[BaseDescr declaration]
-        :	AT att=identifier val=paren_chunk
-                {
-                    if( $declaration instanceof TypeDeclarationDescr )
-                        ((TypeDeclarationDescr)$declaration).addMetaAttribute( $att.text, getString( $val.text ).trim() );
-                    else
-                        ((TypeFieldDescr)$declaration).addMetaAttribute( $att.text, getString( $val.text ).trim() );
-                }
-        ;    
-        
-decl_field[TypeDeclarationDescr declaration]
- at init {
-        TypeFieldDescr field = null;
-}
-	:      id=identifier init=initialization? COLON type=qualified_id 
-		{
-		    field = new TypeFieldDescr( $id.text );
-		    if( init != null )
-		        field.setInitExpr( $init.expr );
-		    field.setPattern( new PatternDescr($type.text) );
-		    $declaration.addField( field );
-		}
-		decl_metadata[field]* 
-	;   
-	
-initialization returns [String expr]
-	:      EQUALS val=paren_chunk
-	       {
-	           $expr = getString( $val.text ).trim();
-	       }
-	;	
 
-query returns [QueryDescr query]
-	@init {
-		$query = null;
-		AndDescr lhs = null;
-		List params = null;
-		List types = null;		
- 
-	}
-	:
-		QUERY queryName=name
-		{ 
-			$query = factory.createQuery( $queryName.name ); 
-			$query.setLocation( offset($QUERY.line), $QUERY.pos );
-			$query.setStartCharacter( ((CommonToken)$QUERY).getStartIndex() );
-			lhs = new AndDescr(); $query.setLhs( lhs ); 
-			lhs.setLocation( offset($QUERY.line), $QUERY.pos );
-                        location.setType( Location.LOCATION_RULE_HEADER );
-		}
-		( LEFT_PAREN
-		        ( { params = new ArrayList(); types = new ArrayList();}
- 
-		            (paramType=qualified_id? paramName=ID { params.add( $paramName.text ); String type = (paramType != null) ? $paramType.text : "Object"; types.add( type ); } )
-		            (COMMA paramType=qualified_id? paramName=ID { params.add( $paramName.text );  String type = (paramType != null) ? $paramType.text : "Object"; types.add( type );  } )*
- 
-		            {	$query.setParameters( (String[]) params.toArray( new String[params.size()] ) ); 
-		            	$query.setParameterTypes( (String[]) types.toArray( new String[types.size()] ) ); 
-		            }
-		         )?
-	          RIGHT_PAREN
-	        )?		
-	        {
-                        location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-	        }
-		normal_lhs_block[lhs]
-		END opt_semicolon
-		{
-			$query.setEndCharacter( ((CommonToken)$END).getStopIndex() );
-		}
+argument
+	:	ID dimension_definition*
 	;
-	
-template returns [FactTemplateDescr template]
-	@init {
-		$template = null;		
-	}
-	:
-		TEMPLATE templateName=name opt_semicolon
-		{
-			$template = new FactTemplateDescr($templateName.name);
-			$template.setLocation( offset($TEMPLATE.line), $TEMPLATE.pos );			
-			$template.setStartCharacter( ((CommonToken)$TEMPLATE).getStartIndex() );
-		}
-		(
-			slot=template_slot 
-			{
-				template.addFieldTemplate( $slot.field );
-			}
-		)+
-		END opt_semicolon 
-		{
-			template.setEndCharacter( ((CommonToken)$END).getStopIndex() );
-		}		
+
+
+template
+ at init  { pushParaphrases(DroolsParaphareseTypes.TEMPLATE); }
+ at after { paraphrases.pop(); }
+	:	template_key template_id SEMICOLON?
+		template_slot+
+		END SEMICOLON?
+		-> ^(template_key template_id template_slot+ END)
 	;
-	
-template_slot returns [FieldTemplateDescr field]
-	@init {
-		$field = null;
-	}
-	:
-	         {
-			$field = factory.createFieldTemplate();
-	         }
-		 fieldType=qualified_id
-		 {
-		        $field.setClassType( $fieldType.text );
-			$field.setStartCharacter( ((CommonToken)$fieldType.start).getStartIndex() );
-			$field.setEndCharacter( ((CommonToken)$fieldType.stop).getStopIndex() );
-		 }
-		 
-		 id=identifier opt_semicolon
-		 {
-		        $field.setName( $id.text );
-			$field.setLocation( offset($id.start.getLine()), $id.start.getCharPositionInLine() );
-			$field.setEndCharacter( ((CommonToken)$id.start).getStopIndex() );
-		 } 
-	;	
-	
-rule returns [RuleDescr rule]
-	@init {
-		$rule = null;
-		AndDescr lhs = null;
-	}
-	:
-		RULE ruleName=name 
-		{ 
-			location.setType( Location.LOCATION_RULE_HEADER );
-			debug( "start rule: " + $ruleName.name );
-			$rule = new RuleDescr( $ruleName.name, null ); 
-			$rule.setLocation( offset($RULE.line), $RULE.pos );
-			$rule.setStartCharacter( ((CommonToken)$RULE).getStartIndex() );
-			lhs = new AndDescr(); 
-			$rule.setLhs( lhs ); 
-		}
-		rule_attributes[$rule]?
-		(	
-			WHEN COLON?
-			{ 
-				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-				lhs.setLocation( offset($WHEN.line), $WHEN.pos );
-				lhs.setStartCharacter( ((CommonToken)$WHEN).getStartIndex() );
-			}
-			normal_lhs_block[lhs]
-		)?
-		rhs_chunk[$rule]
+
+template_id
+	: 	id=ID
+	{	setParaphrasesValue(DroolsParaphareseTypes.TEMPLATE, $id.text);	} -> VT_TEMPLATE_ID[$id]
+	| 	id=STRING
+	{	setParaphrasesValue(DroolsParaphareseTypes.TEMPLATE, $id.text);	} -> VT_TEMPLATE_ID[$id]
 	;
-	
 
+template_slot
+	:	 data_type slot_id SEMICOLON?
+		-> ^(VT_SLOT data_type slot_id)
+	;
 
-rule_attributes[RuleDescr rule]
-	: 
-	( ATTRIBUTES COLON )?
-	attr=rule_attribute { $rule.addAttribute( $attr.attr ); }
-	( ','? attr=rule_attribute { $rule.addAttribute( $attr.attr ); } )*
+slot_id	:	id=ID
+		-> VT_SLOT_ID[$id]
 	;
 
+rule
+ at init  { pushParaphrases(DroolsParaphareseTypes.RULE); }
+ at after { paraphrases.pop(); }
+	:	rule_key rule_id rule_attributes? when_part? rhs_chunk
+		-> ^(rule_key rule_id rule_attributes? when_part? rhs_chunk)
+	;
 
-	
-rule_attribute returns [AttributeDescr attr]
-	@init {
-		$attr = null;
-	}
-	@after {
-		$attr = $a.descr;
-	}
-	:	a=salience 
-	|	a=no_loop  
-	|	a=agenda_group  
-	|	a=duration  
-	|	a=activation_group 
-	|	a=auto_focus 
-	|	a=date_effective 
-	|	a=date_expires 
-	|	a=enabled 
-	|	a=ruleflow_group 
-	|	a=lock_on_active
-	|	a=dialect 
+when_part
+	:	when_key COLON? normal_lhs_block
+	->	when_key normal_lhs_block
 	;
-	
-date_effective returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}	
-	:
-		DATE_EFFECTIVE STRING  
-		{
-			$descr = new AttributeDescr( "date-effective", getString( $STRING.text ) );
-			$descr.setLocation( offset( $DATE_EFFECTIVE.line ), $DATE_EFFECTIVE.pos );
-			$descr.setStartCharacter( ((CommonToken)$DATE_EFFECTIVE).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
 
+rule_id
+	: 	id=ID
+	{	setParaphrasesValue(DroolsParaphareseTypes.RULE, $id.text);	} -> VT_RULE_ID[$id]
+	| 	id=STRING
+	{	setParaphrasesValue(DroolsParaphareseTypes.RULE, $id.text);	} -> VT_RULE_ID[$id]
 	;
 
-date_expires returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}	
-	:	DATE_EXPIRES STRING  
-		{
-			$descr = new AttributeDescr( "date-expires", getString( $STRING.text ) );
-			$descr.setLocation( offset($DATE_EXPIRES.line), $DATE_EXPIRES.pos );
-			$descr.setStartCharacter( ((CommonToken)$DATE_EXPIRES).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
+rule_attributes
+	:	( attributes_key COLON )? rule_attribute ( COMMA? attr=rule_attribute )*
+		-> ^(VT_RULE_ATTRIBUTES attributes_key? rule_attribute+)
 	;
+
+rule_attribute
+ at init  { pushParaphrases(DroolsParaphareseTypes.RULE_ATTRIBUTE); }
+ at after { paraphrases.pop(); }
+	:	salience 
+	|	no_loop  
+	|	agenda_group  
+	|	duration  
+	|	activation_group 
+	|	auto_focus 
+	|	date_effective 
+	|	date_expires 
+	|	enabled 
+	|	ruleflow_group 
+	|	lock_on_active
+	|	dialect 
+	;
+
+date_effective
+	:	date_effective_key^ STRING
+	;
+
+date_expires
+	:	date_expires_key^ STRING  
+	;
 	
-enabled returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:		ENABLED BOOL   
-			{
-				$descr = new AttributeDescr( "enabled", $BOOL.text );
-				$descr.setLocation( offset($ENABLED.line), $ENABLED.pos );
-				$descr.setStartCharacter( ((CommonToken)$ENABLED).getStartIndex() );
-				$descr.setEndCharacter( ((CommonToken)$BOOL).getStopIndex() );
-			}
+enabled
+	:	enabled_key^ BOOL
 	;	
 
-salience returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	
-		SALIENCE 
-		{
-			$descr = new AttributeDescr( "salience" );
-			$descr.setLocation( offset($SALIENCE.line), $SALIENCE.pos );
-			$descr.setStartCharacter( ((CommonToken)$SALIENCE).getStartIndex() );
-		}
+salience
+	:	salience_key^
 		( INT   
-		{
-			$descr.setValue( $INT.text );
-			$descr.setEndCharacter( ((CommonToken)$INT).getStopIndex() );
-		}
-		| txt=paren_chunk
-		{
-			$descr.setValue( $txt.text );
-			$descr.setEndCharacter( ((CommonToken)$txt.stop).getStopIndex() );
-		}
+		| paren_chunk
 		)
 	;
 	
-no_loop returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	NO_LOOP   
-		{
-			$descr = new AttributeDescr( "no-loop", "true" );
-			$descr.setLocation( offset($NO_LOOP.line), $NO_LOOP.pos );
-			$descr.setStartCharacter( ((CommonToken)$NO_LOOP).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$NO_LOOP).getStopIndex() );
-		}
-		( BOOL   
-			{
-				$descr.setValue( $BOOL.text );
-				$descr.setEndCharacter( ((CommonToken)$BOOL).getStopIndex() );
-			}
-		)?
+no_loop
+	:	no_loop_key^ BOOL?
 	;
-	
-auto_focus returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	AUTO_FOCUS   
-		{
-			$descr = new AttributeDescr( "auto-focus", "true" );
-			$descr.setLocation( offset($AUTO_FOCUS.line), $AUTO_FOCUS.pos );
-			$descr.setStartCharacter( ((CommonToken)$AUTO_FOCUS).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$AUTO_FOCUS).getStopIndex() );
-		}
-		( BOOL   
-			{
-				$descr.setValue( $BOOL.text );
-				$descr.setEndCharacter( ((CommonToken)$BOOL).getStopIndex() );
-			}
-		)?
+
+auto_focus
+	:	auto_focus_key^ BOOL?
 	;	
 	
-activation_group returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	ACTIVATION_GROUP STRING   
-		{
-			$descr = new AttributeDescr( "activation-group", getString( $STRING.text ) );
-			$descr.setLocation( offset($ACTIVATION_GROUP.line), $ACTIVATION_GROUP.pos );
-			$descr.setStartCharacter( ((CommonToken)$ACTIVATION_GROUP).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
+activation_group
+	:	activation_group_key^ STRING
 	;
 
-ruleflow_group returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	RULEFLOW_GROUP STRING   
-		{
-			$descr = new AttributeDescr( "ruleflow-group", getString( $STRING.text ) );
-			$descr.setLocation( offset($RULEFLOW_GROUP.line), $RULEFLOW_GROUP.pos );
-			$descr.setStartCharacter( ((CommonToken)$RULEFLOW_GROUP).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
+ruleflow_group
+	:	ruleflow_group_key^ STRING
 	;
 
-agenda_group returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	AGENDA_GROUP STRING   
-		{
-			$descr = new AttributeDescr( "agenda-group", getString( $STRING.text ) );
-			$descr.setLocation( offset($AGENDA_GROUP.line), $AGENDA_GROUP.pos );
-			$descr.setStartCharacter( ((CommonToken)$AGENDA_GROUP).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
+agenda_group
+	:	agenda_group_key^ STRING
 	;
 
-duration returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	DURATION INT 
-		{
-			$descr = new AttributeDescr( "duration", $INT.text );
-			$descr.setLocation( offset($DURATION.line), $DURATION.pos );
-			$descr.setStartCharacter( ((CommonToken)$DURATION).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$INT).getStopIndex() );
-		}
+duration
+	:	duration_key^ INT 
 	;	
 	
-dialect returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	DIALECT STRING   
-		{
-			$descr = new AttributeDescr( "dialect", getString( $STRING.text ) );
-			$descr.setLocation( offset($DIALECT.line), $DIALECT.pos );
-			$descr.setStartCharacter( ((CommonToken)$DIALECT).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$STRING).getStopIndex() );
-		}
+dialect
+	:	dialect_key^ STRING   
 	;			
 	
-lock_on_active returns [AttributeDescr descr]
-	@init {
-		$descr = null;
-	}
-	:	LOCK_ON_ACTIVE   
-		{
-			$descr = new AttributeDescr( "lock-on-active", "true" );
-			$descr.setLocation( offset($LOCK_ON_ACTIVE.line), $LOCK_ON_ACTIVE.pos );
-			$descr.setStartCharacter( ((CommonToken)$LOCK_ON_ACTIVE).getStartIndex() );
-			$descr.setEndCharacter( ((CommonToken)$LOCK_ON_ACTIVE).getStopIndex() );
-		}
-		( BOOL   
-			{
-				$descr.setValue( $BOOL.text );
-				$descr.setEndCharacter( ((CommonToken)$BOOL).getStopIndex() );
-			}
-		)?
-	;		
+lock_on_active
+	:	lock_on_active_key^ BOOL?
+	;
 
-normal_lhs_block[AndDescr descr]
-	@init {
-		location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-	}
-	:
-		(	d=lhs[$descr]
-			{ if( $d.d != null) $descr.addDescr( $d.d ); }
-		)*
+normal_lhs_block
+	:	lhs*
+	->	^(VT_AND_IMPLICIT lhs*)
 	;
 
-	
-lhs[ConditionalElementDescr ce] returns [BaseDescr d]
-	@init {
-		$d=null;
-	}
-	:	l=lhs_or { $d = $l.d; } 
+lhs	:	lhs_or
 	;
 
-	
-lhs_or returns [BaseDescr d]
-	@init{
-		$d = null;
-		OrDescr or = null;
-	}
-	:	LEFT_PAREN OR 
-		{
-			or = new OrDescr();
-			$d = or;
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-		}
-		( lhsand=lhs_and 
-		{
-			or.addDescr( $lhsand.d );
-		})+
-		RIGHT_PAREN // PREFIX
-	|	
-	        left=lhs_and { $d = $left.d; }
-		( (OR|DOUBLE_PIPE)
-			{
-				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-			}
-			right=lhs_and
-			{
-				if ( or == null ) {
-					or = new OrDescr();
-					or.addDescr( $left.d );
-					$d = or;
-				}
-				
-				or.addDescr( $right.d );
-			}
-		)*
+lhs_or
+ at init{
+	Token orToken = null;
+}	:	(LEFT_PAREN or_key)=> LEFT_PAREN or=or_key lhs_and+ RIGHT_PAREN // PREFIX
+		-> ^(VT_OR_PREFIX[$or.start] lhs_and+ RIGHT_PAREN)
+	|	(lhs_and -> lhs_and) 
+		( (or_key|DOUBLE_PIPE)=> (value=or_key {orToken = $value.start;} |pipe=DOUBLE_PIPE {orToken = $pipe;}) lhs_and 
+		-> ^(VT_OR_INFIX[orToken] $lhs_or lhs_and))*
 	;
-	
-lhs_and returns [BaseDescr d]
-	@init{
-		$d = null;
-		AndDescr and = null;
-	}
-	:	LEFT_PAREN AND 
-		{
-			and = new AndDescr();
-			$d = and;
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-		}
-		(lhsunary=lhs_unary
-		{
-			and.addDescr( $lhsunary.d );
-		})+
-		RIGHT_PAREN 
-	|	
-	        left=lhs_unary { $d = $left.d; }
-		( (AND|DOUBLE_AMPER)
-			{
-				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
-			}
-			right=lhs_unary
-			{
-				if ( and == null ) {
-					and = new AndDescr();
-					and.addDescr( $left.d );
-					$d = and;
-				}
-				
-				and.addDescr( $right.d );
-			}
-		)* 
+
+lhs_and
+ at init{
+	Token andToken = null;
+}	:	(LEFT_PAREN and_key)=> LEFT_PAREN and=and_key lhs_unary+ RIGHT_PAREN // PREFIX
+		-> ^(VT_AND_PREFIX[$and.start] lhs_unary+ RIGHT_PAREN)
+	|	(lhs_unary -> lhs_unary) 
+		( (and_key|DOUBLE_AMPER)=> (value=and_key {andToken = $value.start;} |amper=DOUBLE_AMPER {andToken = $amper;}) lhs_unary 
+		-> ^(VT_AND_INFIX[andToken] $lhs_and lhs_unary) )*
 	;
-	
-lhs_unary returns [BaseDescr d]
-	@init {
-		$d = null;
-	}
-	:	(	( EXISTS ) => u=lhs_exist { $d = $u.d; }
-		|	( NOT ) => u=lhs_not  { $d = $u.d; }
-		|	( EVAL ) => u=lhs_eval  { $d = $u.d; }
-		|	( FORALL ) => u=lhs_forall  { $d = $u.d; }
-		|	( LEFT_PAREN ) => LEFT_PAREN u=lhs_or RIGHT_PAREN  { $d = $u.d; }
-		|	ps=pattern_source  { $d = (BaseDescr) $ps.d; }
-		) 
-		opt_semicolon
+
+lhs_unary
+options{backtrack=true;}
+	:	(	lhs_exist
+		|	lhs_not
+		|	lhs_eval
+		|	lhs_forall
+		|	LEFT_PAREN! lhs_or RIGHT_PAREN
+		|	pattern_source
+		)
+		((SEMICOLON)=> SEMICOLON!)?
 	;
+
+lhs_exist
+	:	exists_key
+	        ( (LEFT_PAREN (or_key|and_key))=> lhs_or //prevent "((" 
+		| LEFT_PAREN lhs_or RIGHT_PAREN
+	        | lhs_pattern
+	        )
+	        -> ^(exists_key lhs_or? lhs_pattern? RIGHT_PAREN?)
+	;
 	
-pattern_source returns [BaseDescr d]
-	@init {
-		$d = null;
-	}
-	:	
-		u=lhs_pattern { $d = $u.d; } 
-		(       OVER 
-		(WINDOW COLON type=identifier param=paren_chunk
-		        {
-		                SlidingWindowDescr window = new SlidingWindowDescr( $type.text, getString( $param.text ).trim() );
-		                ((PatternDescr)$d).addBehavior( window );
-		        } 
-		)+
-		)?
+lhs_not	:	not_key
+		( (LEFT_PAREN (or_key|and_key))=> lhs_or //prevent "((" 
+		|	LEFT_PAREN lhs_or RIGHT_PAREN 
+		| 	lhs_pattern )
+	        -> ^(not_key lhs_or? lhs_pattern? RIGHT_PAREN?)
+	;
+
+lhs_eval
+	:	ev=eval_key pc=paren_chunk
+	{	String body = safeSubstring( $pc.text, 1, $pc.text.length()-1 );
+		checkTrailingSemicolon( body, $ev.start );	}
+		-> ^(eval_key paren_chunk)
+	;
+
+lhs_forall
+	:	forall_key LEFT_PAREN lhs_pattern+ RIGHT_PAREN
+		-> ^(forall_key lhs_pattern+ RIGHT_PAREN)
+	;
+
+pattern_source
+options { k=3;}
+	:	lhs_pattern
 		(
-		        // THIS IS SIMPLY DUMB IMO, but it was the only way I could make it work... :( not sure if it is an 
-		        // ANTLR bug or if I'm doing something wrong.
-		        ( (FROM ENTRY_POINT) => FROM ep=entrypoint_statement { if( $d != null ) ((PatternDescr)$d).setSource((PatternSourceDescr) $ep.d); })
-		        |
-			FROM 
-		        {
-				location.setType(Location.LOCATION_LHS_FROM);
-				location.setProperty(Location.LOCATION_FROM_CONTENT, "");
-		        }
-		        ( options { k=1; backtrack=true;} :
-		          ( ac=accumulate_statement { if( $d != null ) ((PatternDescr)$d).setSource((PatternSourceDescr) $ac.d); })
-		          | ( cs=collect_statement { if( $d != null ) ((PatternDescr)$d).setSource((PatternSourceDescr) $cs.d); }) 
-		          //| ( ep=entrypoint_statement { if( $d != null ) ((PatternDescr)$d).setSource((PatternSourceDescr) $ep.d); })
-		          | ( fm=from_statement { if( $d != null ) ((PatternDescr)$d).setSource((PatternSourceDescr) $fm.d); }) 
+			from_key^
+		        (  accumulate_statement
+		          | collect_statement 
+		          | entrypoint_statement
+		          | from_source
 		        )
 		)?
 	;
-	
-lhs_exist returns [BaseDescr d]
-	@init {
-		$d = null;
-	}
-	:	EXISTS 
-		{
-			$d = new ExistsDescr( ); 
-			$d.setLocation( offset($EXISTS.line), $EXISTS.pos );
-			$d.setStartCharacter( ((CommonToken)$EXISTS).getStartIndex() );
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_EXISTS );
-		}
-	        ( ( LEFT_PAREN or=lhs_or 
-	           	{ if ( $or.d != null ) ((ExistsDescr)$d).addDescr( $or.d ); }
-	           RIGHT_PAREN 
-	                { $d.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() ); }
-	        )    
-	        | pattern=lhs_pattern
-	                {
-	                	if ( $pattern.d != null ) {
-	                		((ExistsDescr)$d).addDescr( $pattern.d );
-	                		$d.setEndCharacter( $pattern.d.getEndCharacter() );
-	                	}
-	                }
-	        )
-	;
-	
-lhs_not	returns [NotDescr d]
-	@init {
-		$d = null;
-	}
-	:	NOT 
-		{
-			$d = new NotDescr( ); 
-			$d.setLocation( offset($NOT.line), $NOT.pos );
-			$d.setStartCharacter( ((CommonToken)$NOT).getStartIndex() );
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_NOT );
-		}
-		( ( LEFT_PAREN or=lhs_or  
-	           	{ if ( $or.d != null ) $d.addDescr( $or.d ); }
-	           RIGHT_PAREN 
-	                { $d.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() ); }
-		  )
-		| 
-		pattern=lhs_pattern
-	                {
-	                	if ( $pattern.d != null ) {
-	                		$d.addDescr( $pattern.d );
-	                		$d.setEndCharacter( $pattern.d.getEndCharacter() );
-	                	}
-	                }
+
+accumulate_statement
+	:	accumulate_key
+		LEFT_PAREN lhs_or COMMA? 
+		(	accumulate_init_clause
+		|	accumulate_id_clause
 		)
+		RIGHT_PAREN
+		-> ^(accumulate_key lhs_or accumulate_init_clause? accumulate_id_clause? RIGHT_PAREN)
 	;
 
-lhs_eval returns [BaseDescr d]
-	@init {
-		$d = new EvalDescr( );
-	}
-	:
-		EVAL 
-		{
-			location.setType( Location.LOCATION_LHS_INSIDE_EVAL );
-		}
-		c=paren_chunk
-		{ 
-			$d.setStartCharacter( ((CommonToken)$EVAL).getStartIndex() );
-		        if( $c.text != null ) {
-	  		    this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-		            String body = safeSubstring( $c.text, 1, $c.text.length()-1 );
-			    checkTrailingSemicolon( body, offset($EVAL.line) );
-			    ((EvalDescr) $d).setContent( body );
-			    location.setProperty(Location.LOCATION_EVAL_CONTENT, body);
-			}
-			if( $c.stop != null ) {
-			    $d.setEndCharacter( ((CommonToken)$c.stop).getStopIndex() );
-			}
-		}
+accumulate_init_clause
+	:	init_key
+	pc1=paren_chunk COMMA?
+	action_key pc2=paren_chunk COMMA?
+	( reverse_key pc3=paren_chunk COMMA?)?
+	result_key pc4=paren_chunk
+	-> ^(VT_ACCUMULATE_INIT_CLAUSE ^(init_key $pc1) ^(action_key $pc2) ^(reverse_key $pc3)? ^(result_key $pc4))
 	;
-	
-lhs_forall returns [ForallDescr d]
-	@init {
-		$d = factory.createForall();
-	}
-	:	FORALL LEFT_PAREN base=lhs_pattern   
-		{
-			$d.setStartCharacter( ((CommonToken)$FORALL).getStartIndex() );
-		        // adding the base pattern
-		        $d.addDescr( $base.d );
-			$d.setLocation( offset($FORALL.line), $FORALL.pos );
-		}
-		( pattern=lhs_pattern
-		   {
-		        // adding additional patterns
-			$d.addDescr( $pattern.d );
-		   }
-		)*
-		RIGHT_PAREN
-		{
-		        $d.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() );
-		}
+
+accumulate_id_clause
+	:	id=ID text=paren_chunk
+	-> ^(VT_ACCUMULATE_ID_CLAUSE ID paren_chunk)
 	;
 
-lhs_pattern returns [BaseDescr d]
-	@init {
-		$d=null;
-	}
-	@after {
-		$d=$f.d;
-	}
-	:	f=fact_binding	
-	|	f=fact[null]		
+collect_statement
+	:	collect_key
+		LEFT_PAREN pattern_source RIGHT_PAREN
+	-> ^(collect_key pattern_source RIGHT_PAREN)
 	;
 
-from_statement returns [FromDescr d]
-	@init {
-		$d=factory.createFrom();
-	}
-	:
-	ds=from_source[$d]
-	{
-		$d.setDataSource( $ds.ds );
-	}
+entrypoint_statement
+	:	entry_point_key entrypoint_id
+	-> ^(entry_point_key entrypoint_id)
 	;
-	
 
-accumulate_statement returns [AccumulateDescr d]
-	@init {
-		$d = factory.createAccumulate();
-	} 
-	:
-	        ACCUMULATE 
-		{ 
-			$d.setLocation( offset($ACCUMULATE.line), $ACCUMULATE.pos );
-			$d.setStartCharacter( ((CommonToken)$ACCUMULATE).getStartIndex() );
-			location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE );
-		}	
-		LEFT_PAREN inputCE=lhs_or COMMA? 
-		{
-		        $d.setInput( $inputCE.d );
-		}
-		( ( 
-			INIT 
-			{
-				location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_INIT );
-			}
-			text=paren_chunk COMMA?
-			{
-				if( $text.text != null ) {
-				        $d.setInitCode( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-					location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT, $d.getInitCode());
-					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION );
-				}
-			}
-			ACTION text=paren_chunk COMMA?
-			{
-				if( $text.text != null ) {
-				        $d.setActionCode( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT, $d.getActionCode());
-					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE );
-				}
-			}
-			( REVERSE text=paren_chunk COMMA?
-			{
-				if( $text.text != null ) {
-				        $d.setReverseCode( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_REVERSE_CONTENT, $d.getReverseCode());
-					location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT );
-				}
-			}
-			)?
-			RESULT text=paren_chunk 
-			{
-				if( $text.text != null ) {
-				        $d.setResultCode( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-					location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT, $d.getResultCode());
-				}
-			}
-		) 
-		|
-		(
-			id=ID text=paren_chunk
-			{
-				if( $id.text != null ) {
-				        $d.setExternalFunction( true );
-					$d.setFunctionIdentifier( $id.text );
-				}
-				if( $text.text != null ) {
-				        $d.setExpression( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-	       				location.setProperty(Location.LOCATION_PROPERTY_FROM_ACCUMULATE_EXPRESSION_CONTENT, $d.getExpression());
-				}
-			}
-		)
-		)
-		RIGHT_PAREN
-		{
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-			d.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() );
-		} 
-	; 
+entrypoint_id
+	: 	value=ID	-> VT_ENTRYPOINT_ID[$value]
+	| 	value=STRING	-> VT_ENTRYPOINT_ID[$value]
+	;
+
+from_source
+	:	ID
+		( (LEFT_PAREN)=> args=paren_chunk )?
+		expression_chain?
+	->	^(VT_FROM_SOURCE ID paren_chunk? expression_chain?)
+	;
 	
-from_source[FromDescr from] returns [DeclarativeInvokerDescr ds]
-	@init {
-		$ds = null;
-		AccessorDescr ad = null;
-		FunctionCallDescr fc = null;
-	}
-	:	ident=identifier
-		{
-			ad = new AccessorDescr(ident.start.getText());	
-			ad.setLocation( offset(ident.start.getLine()), ident.start.getCharPositionInLine() );
-			ad.setStartCharacter( ((CommonToken)ident.start).getStartIndex() );
-			ad.setEndCharacter( ((CommonToken)ident.start).getStopIndex() );
-			$ds = ad;
-			location.setProperty(Location.LOCATION_FROM_CONTENT, ident.start.getText());
-		}
-		(	/* WARNING: $o : O() from x(y) could be also $o : O() from x followed
-			   by (y).  Resolve by always forcing (...) to be paren_chunk if
-			   after a from.  Setting k=1 will force this to happen.  No backtracking
-			   but you'll get a warning from ANTLR.  ANTLR resolves by choosing first
-			   alternative to win, which is the paren_chunk case not the loop exit.
-			*/
-			options {k=1;}
-		:	args=paren_chunk
-		{
-			if( $args.text != null ) {
-				ad.setVariableName( null );
-				fc = new FunctionCallDescr($ident.start.getText());
-				fc.setLocation( offset($ident.start.getLine()), $ident.start.getCharPositionInLine() );			
-				fc.setArguments($args.text);
-				fc.setStartCharacter( ((CommonToken)$ident.start).getStartIndex() );
-				fc.setEndCharacter( ((CommonToken)$ident.start).getStopIndex() );
-				location.setProperty(Location.LOCATION_FROM_CONTENT, $args.text);
-				$from.setEndCharacter( ((CommonToken)$args.stop).getStopIndex() );
-			}
-		}
-		)?
-		expression_chain[$from, ad]?
-	;	
-	finally {
-		if( ad != null ) {
-			if( fc != null ) {
-				ad.addFirstInvoker( fc );
-			}
-			location.setProperty(Location.LOCATION_FROM_CONTENT, ad.toString() );
-		}
-	}
-	
-expression_chain[FromDescr from, AccessorDescr as] 
-	@init {
-  		FieldAccessDescr fa = null;
-	    	MethodAccessDescr ma = null;	
-	}
+expression_chain
 	:
-	( DOT field=identifier  
-	    {
-	        fa = new FieldAccessDescr($field.start.getText());	
-		fa.setLocation( offset($field.start.getLine()), $field.start.getCharPositionInLine() );
-		fa.setStartCharacter( ((CommonToken)$field.start).getStartIndex() );
-		fa.setEndCharacter( ((CommonToken)$field.start).getStopIndex() );
-	    }
+	 startToken=DOT ID
 	  (
-	    ( LEFT_SQUARE ) => sqarg=square_chunk
-	      {
-	          fa.setArgument( $sqarg.text );	
-		  $from.setEndCharacter( ((CommonToken)$sqarg.stop).getStopIndex() );
-	      }
+	    ( LEFT_SQUARE ) => square_chunk
 	    |
-	    ( LEFT_PAREN ) => paarg=paren_chunk
-		{
-	    	  ma = new MethodAccessDescr( $field.start.getText(), $paarg.text );	
-		  ma.setLocation( offset($field.start.getLine()), $field.start.getCharPositionInLine() );
-		  ma.setStartCharacter( ((CommonToken)$field.start).getStartIndex() );
-		  $from.setEndCharacter( ((CommonToken)$paarg.stop).getStopIndex() );
-		}
+	    ( LEFT_PAREN ) => paren_chunk
 	  )?
-	  expression_chain[from, as]?
-	)  
-	;	
-	finally {
-		// must be added to the start, since it is a recursive rule
-		if( ma != null ) {
-			$as.addFirstInvoker( ma );
-		} else {
-			$as.addFirstInvoker( fa );
-		}
-	}
-	
-		
- 		
-collect_statement returns [CollectDescr d]
-	@init {
-		$d = factory.createCollect();
-	}
-	:
-	        COLLECT 
-		{ 
-			$d.setLocation( offset($COLLECT.line), $COLLECT.pos );
-			$d.setStartCharacter( ((CommonToken)$COLLECT).getStartIndex() );
-			location.setType( Location.LOCATION_LHS_FROM_COLLECT );
-		}	
-		LEFT_PAREN pattern=pattern_source RIGHT_PAREN
-		{
-		        $d.setInputPattern( (PatternDescr) $pattern.d );
-			$d.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() );
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-		}
-	; 		
+	  expression_chain?
+	  -> ^(VT_EXPRESSION_CHAIN[$startToken] ID square_chunk? paren_chunk? expression_chain?)
+	;
 
-entrypoint_statement returns [EntryPointDescr d]
-	@init {
-		$d = factory.createEntryPoint();
-	}
-	:
-	        ENTRY_POINT 
-		{ 
-			$d.setLocation( offset($ENTRY_POINT.line), $ENTRY_POINT.pos );
-			$d.setStartCharacter( ((CommonToken)$ENTRY_POINT).getStartIndex() );
-			location.setType( Location.LOCATION_LHS_FROM_ENTRY_POINT );
-		}	
-		id=name
-		{
-		        $d.setEntryId( $id.name );
-			$d.setEndCharacter( ((CommonToken)$id.stop).getStopIndex() );
-			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-		}
-	; 		
+lhs_pattern
+	:	fact_binding -> ^(VT_PATTERN fact_binding)
+	|	fact -> ^(VT_PATTERN fact)
+	;
 
-fact_binding returns [BaseDescr d]
-	@init {
-		$d=null;
-		OrDescr or = null;
-	}
- 	:
- 		ID COLON 
- 		{
- 		        // handling incomplete parsing
- 		        $d = new PatternDescr( );
- 		        ((PatternDescr) $d).setIdentifier( $ID.text );
- 		}
-		( fe=fact[$ID.text]
- 		{
- 		        // override previously instantiated pattern
- 			$d=$fe.d;
- 			if( $d != null ) {
-   			    $d.setStartCharacter( ((CommonToken)$ID).getStartIndex() );
-   			}
- 		}
- 		|
- 		LEFT_PAREN left=fact[$ID.text]
- 		{
- 		        // override previously instantiated pattern
- 			$d=$left.d;
- 			if( $d != null ) {
-   			    $d.setStartCharacter( ((CommonToken)$ID).getStartIndex() );
-   			}
- 		}
- 		( (OR|DOUBLE_PIPE)
- 			right=fact[$ID.text]
- 			{
-				if ( or == null ) {
-					or = new OrDescr();
-					or.addDescr( $left.d );
-					$d = or;
-				}
-				or.addDescr( $right.d );
- 			}
- 		)*
- 		RIGHT_PAREN
+fact_binding
+ 	:	label
+		( fact
+ 		| LEFT_PAREN fact_binding_expression RIGHT_PAREN
  		)
+ 	-> ^(VT_FACT_BINDING label fact? fact_binding_expression? RIGHT_PAREN?)
 	;
- 
-fact[String ident] returns [BaseDescr d] 
-	@init {
-		$d=null;
-		PatternDescr pattern = null;
-	}
- 	:	
- 	        {
- 			pattern = new PatternDescr( );
- 			if( $ident != null ) {
- 				pattern.setIdentifier( $ident );
- 			}
- 			$d = pattern; 
- 	        }
- 	        id=qualified_id
- 		{ 
- 			if( id != null ) {
-	 		        pattern.setObjectType( $id.text );
- 			        pattern.setEndCharacter( -1 );
-				pattern.setStartCharacter( ((CommonToken)$id.start).getStartIndex() );
- 			}
- 		}
- 		LEFT_PAREN 
- 		{
-		        location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START );
-            		location.setProperty( Location.LOCATION_PROPERTY_CLASS_NAME, $id.text );
- 				
- 			pattern.setLocation( offset($LEFT_PAREN.line), $LEFT_PAREN.pos );
- 			pattern.setLeftParentCharacter( ((CommonToken)$LEFT_PAREN).getStartIndex() );
- 		} 
- 		constraints[pattern]?
- 		RIGHT_PAREN
-		{
-		        if( ")".equals( $RIGHT_PAREN.text ) ) {
-				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-				pattern.setEndLocation( offset($RIGHT_PAREN.line), $RIGHT_PAREN.pos );	
-				pattern.setEndCharacter( ((CommonToken)$RIGHT_PAREN).getStopIndex() );
-		        	pattern.setRightParentCharacter( ((CommonToken)$RIGHT_PAREN).getStartIndex() );
-		        }
- 		}
- 		EOF? // this is needed for partial parsing
- 	;
-	
-	
-constraints[PatternDescr pattern]
-	:	(constraint[$pattern]|behaviors)
-		( COMMA { location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START ); } 
-		  (constraint[$pattern]|behaviors) 
-		)* 
+
+fact_binding_expression
+ at init{
+	Token orToken = null;
+}	:	(fact -> fact) ( (value=or_key {orToken = $value.start;}|pipe=DOUBLE_PIPE {orToken = $pipe;}) fact 
+		-> ^(VT_FACT_OR[orToken] $fact_binding_expression fact) )*
 	;
-	
-constraint[PatternDescr pattern]
-	@init {
-		ConditionalElementDescr top = null;
-		location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-		location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, input.LT(1).getText() );
-	}
-	:
-		{
-			top = $pattern.getConstraint();
-		}
-		or_constr[top]
-	;	
-	
-behaviors 
-	:	LEFT_SQUARE behavior ( COMMA behavior )* RIGHT_SQUARE
-	;	
-	
-behavior 
-	:	ID (COLON ID)? paren_chunk?
+
+fact
+ at init  { pushParaphrases(DroolsParaphareseTypes.PATTERN); }
+ at after { paraphrases.pop(); }
+	:	pattern_type LEFT_PAREN constraints? RIGHT_PAREN
+	->	^(VT_FACT pattern_type constraints? RIGHT_PAREN)
 	;
-	
-or_constr[ConditionalElementDescr base]
-	@init {
-		OrDescr or = new OrDescr();
-	}
-	:
-		and_constr[or] 
-		( DOUBLE_PIPE 
-		{
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-		}
-		and_constr[or] 
-		)*
-		{
-		        if( or.getDescrs().size() == 1 ) {
-		                $base.addOrMerge( (BaseDescr) or.getDescrs().get(0) );
-		        } else if ( or.getDescrs().size() > 1 ) {
-		        	$base.addDescr( or );
-		        }
-		}
+
+constraints
+	:	constraint ( COMMA! constraint )*
 	;
-	
-and_constr[ConditionalElementDescr base]
-	@init {
-		AndDescr and = new AndDescr();
-	}
-	:
-		unary_constr[and] 
-		( DOUBLE_AMPER 
-		{
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
-		}
-		unary_constr[and] 
-		)*
-		{
-		        if( and.getDescrs().size() == 1) {
-		                $base.addOrMerge( (BaseDescr) and.getDescrs().get(0) );
-		        } else if( and.getDescrs().size() > 1) {
-		        	$base.addDescr( and );
-		        }
-		}
+
+constraint
+	:	or_constr
 	;
-	
-unary_constr[ConditionalElementDescr base]
-	:
-		( field_constraint[$base] 
-		| LEFT_PAREN or_constr[$base] RIGHT_PAREN
-		| EVAL predicate[$base]
-		)
-	;	
-		
-field_constraint[ConditionalElementDescr base]
-	@init {
-		FieldBindingDescr fbd = null;
-		FieldConstraintDescr fc = null;
-		RestrictionConnectiveDescr top = null;
-	}
-	:
-	        (
-		ID COLON 
-		    { 
-			fbd = new FieldBindingDescr();
-			fbd.setIdentifier( $ID.text );
-			fbd.setLocation( offset($ID.line), $ID.pos );
-			fbd.setStartCharacter( ((CommonToken)$ID).getStartIndex() );
-			$base.addDescr( fbd );
 
-		    }
-		 
-		f=accessor_path	
-		{
-		    // use $f.start to get token matched in identifier
-		    // or use $f.text to get text.
-		    if( $f.text != null ) {
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-			location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, $f.text);
-		    
-			if ( fbd != null ) {
-			    fbd.setFieldName( $f.text );
-			    // may have been overwritten
-			    fbd.setStartCharacter( ((CommonToken)$ID).getStartIndex() );
-			} 
-			fc = new FieldConstraintDescr($f.text);
-			fc.setLocation( offset($f.start.getLine()), $f.start.getCharPositionInLine() );
-			fc.setStartCharacter( ((CommonToken)$f.start).getStartIndex() );
-			top = fc.getRestriction();
-			
-			// it must be a field constraint, as it is not a binding
-			if( $ID == null ) {
-			    $base.addDescr( fc );
-			}
-		    }
-		}
-		(
-			or_restr_connective[top]
-			{
-				// we must add now as we didn't before
-				if( $ID != null) {
-				    $base.addDescr( fc );
-				}
-			}
-		|
-			'->' predicate[$base] 
-		)?
-		) 
-		|
-		(
-		f=accessor_path	
-		{
-		    // use $f.start to get token matched in identifier
-		    // or use $f.text to get text.
-		    if( $f.text != null ) {
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-			location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, $f.text);
-		    
-			fc = new FieldConstraintDescr($f.text);
-			fc.setLocation( offset($f.start.getLine()), $f.start.getCharPositionInLine() );
-			fc.setStartCharacter( ((CommonToken)$f.start).getStartIndex() );
-			top = fc.getRestriction();
-			
-			$base.addDescr( fc );
-		    }
-		}
-		or_restr_connective[top]
-		)
+or_constr
+	:	and_constr ( DOUBLE_PIPE^ and_constr )* 
 	;
-	catch[ NoViableAltException nvae ] {
-	    if( input.LT(1) != null ) {
-	                // in case of incomplete parsing, build as much as possible of the AST
-	                // so that IDE requirements can be met
-			fc = new FieldConstraintDescr( input.LT(1).getText() );
-			fc.setLocation( offset(input.LT(1).getLine()), input.LT(1).getCharPositionInLine() );
-			fc.setStartCharacter( ((CommonToken)input.LT(1)).getStartIndex() );
-			$base.addDescr( fc );
-	    }
-	    throw nvae;
-	}
-	
 
-or_restr_connective[ RestrictionConnectiveDescr base ]
-	options { 
-		backtrack=true;
-	}
-	@init {
-		RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
-	}
-	:
-		and_restr_connective[or]
-		( 
-			options {backtrack=true;} : 
-			DOUBLE_PIPE 
-			{
-				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-			}
-			and_restr_connective[or] 
-		)*
+and_constr
+	:	unary_constr ( DOUBLE_AMPER^ unary_constr )*
 	;
-	finally {
-	        if( or.getRestrictions().size() == 1 ) {
-	                $base.addOrMerge( (RestrictionDescr) or.getRestrictions().get( 0 ) );
-	        } else if ( or.getRestrictions().size() > 1 ) {
-	        	$base.addRestriction( or );
-	        }
-	}
 
-and_restr_connective[ RestrictionConnectiveDescr base ]
-	@init {
-		RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
-	}
-	:
-		constraint_expression[and]
-		(	options {backtrack=true;}
-		:	t=DOUBLE_AMPER 
-			{
-				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-			}
-			constraint_expression[and] 
-		)*
+unary_constr
+options {k=2;}
+	:	eval_key^ paren_chunk
+	|	field_constraint
+	|	LEFT_PAREN! or_constr RIGHT_PAREN
 	;
-	finally {
-	        if( and.getRestrictions().size() == 1) {
-	                $base.addOrMerge( (RestrictionDescr) and.getRestrictions().get( 0 ) );
-	        } else if ( and.getRestrictions().size() > 1 ) {
-	        	$base.addRestriction( and );
-	        }
-	}
-	
-constraint_expression[RestrictionConnectiveDescr base]
-        :	
-		( compound_operator[$base]
-		| simple_operator[$base] 
-		| LEFT_PAREN 
-		{
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
-		}
-		or_restr_connective[$base]
-		RIGHT_PAREN
- 		)
-	;	
-	
-simple_operator[RestrictionConnectiveDescr base]
-	@init {
-		String op = null;
-		String paramText = null;
-		boolean isNegated = false;
-	}
-	:
-		(	t='=='
-		|	t='>'
-		|	t='>='
-		|	t='<'
-		|	t='<='
-		|	t='!='
-                |       t=CONTAINS
-                |       n=NOT t=CONTAINS
-                |       t=EXCLUDES
-                |       t=MATCHES
-                |       t=SOUNDSLIKE
-                |       n=NOT t=MATCHES
-                |       t=MEMBEROF
-                |       n=NOT t=MEMBEROF
-		|	TILDE t=ID param=square_chunk?
-		|	n=NOT TILDE t=ID param=square_chunk?
-		)
-		{
-  		    location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                    location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, $t.text);
- 	            op = $t.text;
- 	            isNegated = $n != null;
- 	            if( param != null ) {
-                        paramText = safeSubstring( $param.text, 1, $param.text.length()-1 );
- 	            } 
-		}
-		rd=expression_value[$base, op, isNegated, paramText]
-	;	
-	finally {
-		if ( $rd.rd == null && op != null ) {
-		        $base.addRestriction( new LiteralRestrictionDescr(op, false, null) );
-		}
-	}
-	
-compound_operator[RestrictionConnectiveDescr base]
-	@init {
-		String op = null;
-		RestrictionConnectiveDescr group = null;
-	}
-	:
-		( IN 
-			{
-			  op = "==";
-			  group = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
-			  $base.addRestriction( group );
-  		    	  location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                    	  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, "in");
-			}
-		| NOT IN 
-			{
-			  op = "!=";
-			  group = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
-			  $base.addRestriction( group );
-  		    	  location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
-                    	  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, "in");
-			}	
-		)
-		LEFT_PAREN rd=expression_value[group, op, false, null]
-		( COMMA rd=expression_value[group, op, false, null]	)* 
-		RIGHT_PAREN 
-		{
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
-		}
+
+field_constraint
+ at init{
+	boolean isArrow = false;
+}	:	label accessor_path ( or_restr_connective | arw=ARROW paren_chunk {isArrow = true;})?
+		-> {isArrow}? ^(VT_BIND_FIELD label ^(VT_FIELD accessor_path)) ^(VK_EVAL[$arw] paren_chunk)?
+		-> ^(VT_BIND_FIELD label ^(VT_FIELD accessor_path or_restr_connective?))
+	|	accessor_path or_restr_connective
+		-> ^(VT_FIELD accessor_path or_restr_connective)
 	;
-	
-expression_value[RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText] returns [RestrictionDescr rd]
-	@init {
-		$rd = null;
-	}
-	:
-		(	ap=accessor_path 
-			{ 
-			        if( $ap.text.indexOf( '.' ) > -1 || $ap.text.indexOf( '[' ) > -1) {
-					$rd = new QualifiedIdentifierRestrictionDescr($op, $isNegated, $paramText, $ap.text);
-				} else {
-					$rd = new VariableRestrictionDescr($op, $isNegated, $paramText, $ap.text);
-				}
-			}						
-		|	lc=literal_constraint 
-			{ 
-				$rd  = new LiteralRestrictionDescr($op, $isNegated, $paramText, $lc.text, $lc.type );
-			}
-		|	rvc=paren_chunk 
-			{ 
-				$rd = new ReturnValueRestrictionDescr($op, $isNegated, $paramText, safeSubstring( $rvc.text, 1, $rvc.text.length()-1) );							
-			} 
-		)	
-		{
-			if( $rd != null ) {
-				$base.addRestriction( $rd );
-			}
-			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
-		}
-	;	
-	
-literal_constraint returns [String text, int type]
-	@init {
-		$text = null;
-	}
-	:	(	t=STRING { $text = getString( $t.text ); $type = LiteralRestrictionDescr.TYPE_STRING; } 
-		|	t=INT    { $text = $t.text; $type = LiteralRestrictionDescr.TYPE_NUMBER; }
-		|	t=FLOAT	 { $text = $t.text; $type = LiteralRestrictionDescr.TYPE_NUMBER; }
-		|	t=BOOL 	 { $text = $t.text; $type = LiteralRestrictionDescr.TYPE_BOOLEAN; }
-		|	t=NULL   { $text = null; $type = LiteralRestrictionDescr.TYPE_NULL; }
-		)
+
+label	:	value=ID COLON -> VT_LABEL[$value]
 	;
-	
-predicate[ConditionalElementDescr base]
-        @init {
-		PredicateDescr d = null;
-        }
-	:
-		text=paren_chunk
-		{
-		        if( $text.text != null ) {
-				d = new PredicateDescr( );
-			        d.setContent( safeSubstring( $text.text, 1, $text.text.length()-1 ) );
-				d.setEndCharacter( ((CommonToken)$text.stop).getStopIndex() );
-				$base.addDescr( d );
-		        }
-		}
+
+or_restr_connective
+	:	and_restr_connective ((DOUBLE_PIPE)=> DOUBLE_PIPE^ and_restr_connective )* 
 	;
 
+and_restr_connective
+	:	constraint_expression ((DOUBLE_AMPER)=> DOUBLE_AMPER^ constraint_expression )*
+	;
 
+constraint_expression
+options{
+k=3;
+}	:	compound_operator
+	|	simple_operator
+	|	LEFT_PAREN! or_restr_connective RIGHT_PAREN
+	;
+
+simple_operator
+	:	(EQUAL^
+	|	GREATER^
+	|	GREATER_EQUAL^
+	|	LESS^
+	|	LESS_EQUAL^
+	|	NOT_EQUAL^
+	|	not_key (contains_key^|soundslike_key^|matches_key^|memberof_key^| ID^ | GRAVE_ACCENT! ID^ square_chunk)
+	|	contains_key^
+	|	excludes_key^
+	|	matches_key^
+	|	soundslike_key^
+	|	memberof_key^
+	|	ID^
+	|	GRAVE_ACCENT! ID^ square_chunk)
+	expression_value
+	;
+
+//Simple Syntax Sugar
+compound_operator 
+	:	( in_key^ | not_key in_key^ ) LEFT_PAREN! expression_value ( COMMA! expression_value )* RIGHT_PAREN
+	;
+
+expression_value
+	:	accessor_path
+	|	literal_constraint 
+	|	paren_chunk
+	;
+
+literal_constraint
+	:	STRING
+	|	INT
+	|	FLOAT
+	|	BOOL
+	|	NULL
+	;
+
+pattern_type
+	:	id+=ID ( id+=DOT id+=ID )* 
+	{	setParaphrasesValue(DroolsParaphareseTypes.PATTERN, buildStringFromTokens($id));	} 
+	    dimension_definition*
+		-> ^(VT_PATTERN_TYPE ID+ dimension_definition*)
+	;
+
+data_type
+	:	ID ( DOT ID )* dimension_definition*
+		-> ^(VT_DATA_TYPE ID+ dimension_definition*)
+	;
+
+dimension_definition
+	:	LEFT_SQUARE RIGHT_SQUARE
+	;
+
+accessor_path
+	:	accessor_element ( DOT accessor_element )*
+	-> ^(VT_ACCESSOR_PATH accessor_element+)
+	;
+
+accessor_element
+	:	ID square_chunk*
+	-> ^(VT_ACCESSOR_ELEMENT ID square_chunk*)
+	;
+
+rhs_chunk
+ at init{
+	String text = "";
+}	:	rc=rhs_chunk_data {text = $rc.text;}
+	-> VT_RHS_CHUNK[$rc.start,text]
+	;
+
+rhs_chunk_data
+	:	THEN ( ~END )* END SEMICOLON?
+	;
+
 curly_chunk
-	:
-		LEFT_CURLY ( ~(LEFT_CURLY|RIGHT_CURLY) | curly_chunk )* RIGHT_CURLY
+ at init{
+	String text = "";
+}	:	cc=curly_chunk_data {text = $cc.text;}
+	-> VT_CURLY_CHUNK[$cc.start,text]
 	;
-	
+
+curly_chunk_data
+	:	LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data )* RIGHT_CURLY
+	;
+
 paren_chunk
-	:
-		LEFT_PAREN ( ~(LEFT_PAREN|RIGHT_PAREN) | paren_chunk )* RIGHT_PAREN
+ at init{
+	String text = "";
+}	:	pc=paren_chunk_data {text = $pc.text;} 
+	-> VT_PAREN_CHUNK[$pc.start,text]
 	;
 
+paren_chunk_data
+	:	LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data )* RIGHT_PAREN 
+	;
+
 square_chunk
-	:
-		LEFT_SQUARE ( ~(LEFT_SQUARE|RIGHT_SQUARE) | square_chunk )* RIGHT_SQUARE
+ at init{
+	String text = "";
+}	:	sc=square_chunk_data {text = $sc.text;}
+	-> VT_SQUARE_CHUNK[$sc.start,text]
 	;
-	
-qualified_id returns [ String text ]
-	@init {
-	        StringBuffer buf = new StringBuffer();
-	}
-	@after {
-	        $text = buf != null ? buf.toString() : "";
-	}
-	: 	ID {buf.append($ID.text);} ( DOT identifier {buf.append("."+$identifier.text);} )* ( LEFT_SQUARE RIGHT_SQUARE {buf.append("[]");})*
+
+square_chunk_data
+	:	LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data )* RIGHT_SQUARE
 	;
-	
-dotted_name returns [ String text ]
-	@init {
-	        StringBuffer buf = new StringBuffer();
-	}
-	@after {
-	        $text = buf != null ? buf.toString() : "";
-	}
-	:	i=identifier {buf.append($i.text);} ( DOT i=identifier {buf.append("."+$i.text);} )* ( LEFT_SQUARE RIGHT_SQUARE {buf.append("[]");})*
+
+
+date_effective_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EFFECTIVE))}?=>  ID MISC ID {text = $text;}
+	->	VK_DATE_EFFECTIVE[$start, text]
 	;
-	
-accessor_path returns [ String text ]
-	@init {
-	        StringBuffer buf = new StringBuffer();
-	}
-	@after {
-	        $text = buf != null ? buf.toString() : "";
-	}
-	:	a=accessor_element {buf.append($a.text);} ( DOT a=accessor_element {buf.append("."+$a.text);} )* 
+
+date_expires_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.DATE) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.EXPIRES))}?=>  ID MISC ID {text = $text;}
+	->	VK_DATE_EXPIRES[$start, text]
 	;
-	
-accessor_element returns [ String text ]
-	@init {
-	        StringBuffer buf = new StringBuffer();
-	}
-	@after {
-	        $text = buf != null ? buf.toString() : "";
-	}
-	:
-		i=identifier {buf.append($i.text);} (s=square_chunk {buf.append($s.text);} )*
-	;	
-	
-rhs_chunk[RuleDescr rule]
-	:
-		THEN { location.setType( Location.LOCATION_RHS ); }
-		( ~END )*
-                loc=END opt_semicolon
-                {
-                    // ignoring first line in the consequence
-                    String buf = input.toString( $THEN, $loc );
-                    // removing final END keyword
-                    int idx=4;
-                    while( idx < buf.length()-3 && (buf.charAt(idx) == ' ' || buf.charAt(idx) == '\t') ) {
-                        idx++;
-                    }
-                    if( idx < buf.length()-3 && buf.charAt(idx) == '\r' ) idx++;
-                    if( idx < buf.length()-3 && buf.charAt(idx) == '\n' ) idx++;
-                    buf = safeSubstring( buf, idx, buf.length()-3 );
-		    $rule.setConsequence( buf );
-     		    $rule.setConsequenceLocation(offset($THEN.line), $THEN.pos);
- 		    $rule.setEndCharacter( ((CommonToken)$loc).getStopIndex() );
- 		    location.setProperty( Location.LOCATION_RHS_CONTENT, $rule.getConsequence() );
-                }
+
+lock_on_active_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.LOCK) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.ON) && validateLT(4, "-") && validateLT(5, DroolsSoftKeywords.ACTIVE))}?=>  ID MISC ID MISC ID {text = $text;}
+	->	VK_LOCK_ON_ACTIVE[$start, text]
 	;
 
-name returns [String name]
-	: 	ID { $name = $ID.text; }
-	| 	STRING { $name = getString( $STRING.text ); }
+no_loop_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.NO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.LOOP))}?=>  ID MISC ID {text = $text;}
+	->	VK_NO_LOOP[$start, text]
 	;
-	
-identifier
-	:       ID      
-	|	PACKAGE
-	|	FUNCTION
-	|	GLOBAL
-	|	IMPORT  
-	|	EVENT
-	|	RULE
-	|	QUERY 
-        |       TEMPLATE        
-        |       ATTRIBUTES      
-        |       ENABLED         
-        |       SALIENCE 	
-        |       DURATION 
-        |	DIALECT	
-        |       FROM	        
-        |       INIT	        
-        |       ACTION	        
-        |       REVERSE	        
-        |       RESULT	        
-        |       WHEN            
-        |       THEN	        
-        |       END     
-        |	IN        
+
+auto_focus_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.AUTO) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.FOCUS))}?=>  ID MISC ID {text = $text;}
+	->	VK_AUTO_FOCUS[$start, text]
 	;
-	
+
+activation_group_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.ACTIVATION) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))}?=>  ID MISC ID {text = $text;}
+	->	VK_ACTIVATION_GROUP[$start, text]
+	;
+
+agenda_group_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.AGENDA) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))}?=>  ID MISC ID {text = $text;}
+	->	VK_AGENDA_GROUP[$start, text]
+	;
+
+ruleflow_group_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.RULEFLOW) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.GROUP))}?=>  ID MISC ID {text = $text;}
+	->	VK_RULEFLOW_GROUP[$start, text]
+	;
+
+duration_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.DURATION))}?=>  id=ID	->	VK_DURATION[$id]
+	;
+
+package_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.PACKAGE))}?=>  id=ID	->	VK_PACKAGE[$id]
+	;
+
+import_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.IMPORT))}?=>  id=ID	->	VK_IMPORT[$id]
+	;
+
+dialect_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.DIALECT))}?=>  id=ID	->	VK_DIALECT[$id]
+	;
+
+salience_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.SALIENCE))}?=>  id=ID	->	VK_SALIENCE[$id]
+	;
+
+enabled_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.ENABLED))}?=>  id=ID	->	VK_ENABLED[$id]
+	;
+
+attributes_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.ATTRIBUTES))}?=>  id=ID	->	VK_ATTRIBUTES[$id]
+	;
+
+when_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.WHEN))}?=>  id=ID	->	VK_WHEN[$id]
+	;
+
+rule_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.RULE))}?=>  id=ID	->	VK_RULE[$id]
+	;
+
+template_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.TEMPLATE))}?=>  id=ID	->	VK_TEMPLATE[$id]
+	;
+
+query_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.QUERY))}?=>  id=ID	->	VK_QUERY[$id]
+	;
+
+declare_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.DECLARE))}?=>  id=ID	->	VK_DECLARE[$id]
+	;
+
+function_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.FUNCTION))}?=>  id=ID	->	VK_FUNCTION[$id]
+	;
+
+global_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.GLOBAL))}?=>  id=ID	->	VK_GLOBAL[$id]
+	;
+
+eval_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.EVAL))}?=>  id=ID	->	VK_EVAL[$id]
+	;
+
+contains_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.CONTAINS))}?=>  id=ID	->	VK_CONTAINS[$id]
+	;
+
+matches_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.MATCHES))}?=>  id=ID	->	VK_MATCHES[$id]
+	;
+
+excludes_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.EXCLUDES))}?=>  id=ID	->	VK_EXCLUDES[$id]
+	;
+
+soundslike_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.SOUNDSLIKE))}?=>  id=ID	->	VK_SOUNDSLIKE[$id]
+	;
+
+memberof_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.MEMBEROF))}?=>  id=ID	->	VK_MEMBEROF[$id]
+	;
+
+not_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.NOT))}?=>  id=ID	->	VK_NOT[$id]
+	;
+
+in_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.IN))}?=>  id=ID	->	VK_IN[$id]
+	;
+
+or_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.OR))}?=>  id=ID	->	VK_OR[$id]
+	;
+
+and_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.AND))}?=>  id=ID	->	VK_AND[$id]
+	;
+
+exists_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.EXISTS))}?=>  id=ID	->	VK_EXISTS[$id]
+	;
+
+forall_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.FORALL))}?=>  id=ID	->	VK_FORALL[$id]
+	;
+
+from_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.FROM))}?=>  id=ID	->	VK_FROM[$id]
+	;
+
+entry_point_key
+ at init{
+	String text = "";
+}	:	{(validateIdentifierKey(DroolsSoftKeywords.ENTRY) && validateLT(2, "-") && validateLT(3, DroolsSoftKeywords.POINT))}?=>  ID MISC ID {text = $text;}
+	->	VK_ENTRY_POINT[$start, text]
+	;
+
+accumulate_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE))}?=>  id=ID	->	VK_ACCUMULATE[$id]
+	;
+
+init_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.INIT))}?=>  id=ID	->	VK_INIT[$id]
+	;
+
+action_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.ACTION))}?=>  id=ID	->	VK_ACTION[$id]
+	;
+
+reverse_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.REVERSE))}?=>  id=ID	->	VK_REVERSE[$id]
+	;
+
+result_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.RESULT))}?=>  id=ID	->	VK_RESULT[$id]
+	;
+
+collect_key
+	:	{(validateIdentifierKey(DroolsSoftKeywords.COLLECT))}?=>  id=ID	->	VK_COLLECT[$id]
+	;
+
 WS      :       (	' '
                 |	'\t'
                 |	'\f'
@@ -1781,7 +1004,7 @@
                 |       '\r'    // Macintosh
                 |       '\n'    // Unix (the right way)
                 )
-        ;  
+        ;
         
 INT	
 	:	('-')?('0'..'9')+
@@ -1825,116 +1048,60 @@
 	:	('true'|'false') 
 	;	
 
-PACKAGE	:	'package';
+NULL	:	'null';
 
-IMPORT	:	'import';
 
-FUNCTION :	'function';
+THEN
+	:	'then'
+	;
 
-EVENT :		'event';
+END	:	'end'
+	;
 
-GLOBAL	:	'global';
-	
-DECLARE	:	'declare';
+GRAVE_ACCENT
+	:	'`'
+	;
 
-RULE    :	'rule';
+SEMICOLON
+	:	';'
+	;
 
-QUERY	:	'query';
+DOT_STAR
+	:	'.*'
+	;
 
-TEMPLATE :	'template';
+COLON
+	:	':'
+	;
 
-ATTRIBUTES :	'attributes';
-	
-DATE_EFFECTIVE 
-	:	'date-effective';
+EQUAL
+	:	'=='
+	;
 
-DATE_EXPIRES 
-	:	'date-expires';	
-	
-ENABLED :	'enabled';
+NOT_EQUAL
+	:	'!='
+	;
 
-SALIENCE 
-	:	'salience';
-	
-NO_LOOP :	'no-loop';
+GREATER
+	:	'>'
+	;
 
-AUTO_FOCUS 
-	:	'auto-focus';
-	
-ACTIVATION_GROUP 
-	:	'activation-group';
-	
-AGENDA_GROUP 
-	:	'agenda-group';
-	
-DIALECT 
-	:	'dialect';	
-	
-RULEFLOW_GROUP 
-	:	'ruleflow-group';
-	
-DURATION 
-	:	'duration';
-	
-LOCK_ON_ACTIVE
-	:	'lock-on-active';	
-	
-FROM	:	'from';
+GREATER_EQUAL
+	:	'>='
+	;
 
-ACCUMULATE 
-	:	'accumulate';
-	
-INIT	:	'init';
+LESS
+	:	'<'
+	;
 
-ACTION	:	'action';
+LESS_EQUAL
+	:	'<='
+	;
 
-REVERSE	:	'reverse';
+ARROW
+	:	'->'
+	;
 
-RESULT	:	'result';
-
-COLLECT :	'collect';
-
-ENTRY_POINT :	'entry-point';
-
-OR	:	'or';
-
-AND	:	'and';
-
-CONTAINS 
-       :       'contains';
-
-EXCLUDES 
-       :       'excludes';
-
-MEMBEROF
-       :       'memberOf';
-
-MATCHES :      'matches';
-
-SOUNDSLIKE :   'soundslike';
-
-IN	:	'in';
-
-NULL	:	'null';
-
-EXISTS	:	'exists';
-
-NOT	:	'not';
-
-EVAL	:	'eval';
-
-FORALL	:	'forall';							
-
-WHEN    :	'when'; 
-
-THEN	:    	'then';
-
-END     :	'end';
-
-OVER	:	'over';
-
-WINDOW	:	'window';
-
 ID	
 	:	('a'..'z'|'A'..'Z'|'_'|'$'|'\u00c0'..'\u00ff')('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff')* 
 	;
@@ -1975,16 +1142,8 @@
 	
 DOUBLE_PIPE
 	:	'||'
-	;				
-	
-TILDE	:	'~';	
+	;
 
-AT	:       '@';
-
-EQUALS  :	'=';
-
-COLON   :	':';
-	
 SH_STYLE_SINGLE_LINE_COMMENT	
 	:	'#' ( options{greedy=false;} : .)* EOL /* ('\r')? '\n'  */
                 { $channel=HIDDEN; setText("//"+getText().substring(1));}
@@ -2002,7 +1161,5 @@
 	;
 
 MISC 	:
-		'!' | '$' | '%' | '^' | '*' | '_' | '-' | '+'  | '?' | '/' | '\'' | '\\' | '|' | '&'
-	;
-
-
+		'!' | '@' | '$' | '%' | '^' | '*' | '_' | '-' | '+'  | '?' | '=' | '/' | '\'' | '\\' | '|' | '&'
+	;
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DescrBuilderTree.g	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,367 @@
+tree grammar DescrBuilderTree;
+
+options{
+	tokenVocab=DRL;
+	ASTLabelType=DroolsTree;
+	TokenLabelType=DroolsToken;
+}
+
+ at header {
+	package org.drools.lang;
+
+	import java.util.HashMap;
+	import java.util.Map;
+	import java.util.LinkedList;
+	import org.drools.lang.descr.DescrFactory;
+	import org.drools.lang.descr.BaseDescr;
+	import org.drools.lang.descr.PackageDescr;
+	import org.drools.lang.descr.AttributeDescr;
+	import org.drools.lang.descr.ImportDescr;
+	import org.drools.lang.descr.FunctionImportDescr;
+	import org.drools.lang.descr.GlobalDescr;
+	import org.drools.lang.descr.FunctionDescr;
+	import org.drools.lang.descr.FactTemplateDescr;
+	import org.drools.lang.descr.FieldTemplateDescr;
+	import org.drools.lang.descr.AndDescr;
+	import org.drools.lang.descr.QueryDescr;
+	import org.drools.lang.descr.RuleDescr;
+	import org.drools.lang.descr.PatternSourceDescr;
+	import org.drools.lang.descr.AccumulateDescr;
+	import org.drools.lang.descr.AccessorDescr;
+	import org.drools.lang.descr.DeclarativeInvokerDescr;
+	import org.drools.lang.descr.FromDescr;
+	import org.drools.lang.descr.FieldConstraintDescr;
+}
+
+ at members {
+	DescrFactory factory = new DescrFactory();
+	PackageDescr packageDescr = null;
+	
+	public PackageDescr getPackageDescr() {
+		return packageDescr;
+	}
+}
+
+compilation_unit
+	:	^(VT_COMPILATION_UNIT package_statement statement*)
+	;
+
+package_statement returns [String packageName]
+	:	^(VK_PACKAGE packageId=package_id)
+	{	this.packageDescr = factory.createPackage($packageId.idList);	
+		$packageName = packageDescr.getName();	}
+	|	
+	{	this.packageDescr = factory.createPackage(null);	
+		$packageName = "";	}
+	;
+
+package_id returns [List idList]
+	:	^(VT_PACKAGE_ID tempList+=ID+)
+	{	$idList = $tempList;	}
+	;
+
+statement
+	:	a=rule_attribute
+	{	this.packageDescr.addAttribute($a.attributeDescr);	}
+	|	fi=function_import_statement
+	{	this.packageDescr.addFunctionImport($fi.functionImportDescr);	}
+	|	is=import_statement 
+	{	this.packageDescr.addImport($is.importDescr);	}
+	|	gl=global
+	{	this.packageDescr.addGlobal($gl.globalDescr);	}
+	|	fn=function
+	{	this.packageDescr.addFunction($fn.functionDescr);	}
+	|	tp=template
+	{	this.packageDescr.addFactTemplate($tp.factTemplateDescr);	}
+	|	rl=rule
+	{	this.packageDescr.addRule($rl.ruleDescr);	}
+	|	qr=query
+	{	this.packageDescr.addRule($qr.queryDescr);	}
+	;
+
+import_statement returns [ImportDescr importDescr]
+	:	^(importStart=VK_IMPORT importId=import_name)
+	{	$importDescr = factory.createImport($importStart, $importId.idList, $importId.dotStar);	}
+	;
+
+function_import_statement returns [FunctionImportDescr functionImportDescr]
+	:	^(importStart=VT_FUNCTION_IMPORT VK_FUNCTION importId=import_name)
+	{	$functionImportDescr = factory.createFunctionImport($importStart, $importId.idList, $importId.dotStar);	}
+	;
+
+import_name returns[List idList, DroolsTree dotStar]
+	:	^(VT_IMPORT_ID tempList+=ID+ tempDotStar=DOT_STAR?)
+	{	$idList = $tempList;
+		$dotStar = $tempDotStar;	}
+	;
+
+global returns [GlobalDescr globalDescr]
+	:	^(start=VK_GLOBAL dt=data_type globalId=VT_GLOBAL_ID)
+	{	$globalDescr = factory.createGlobal($start,$dt.dataType, $globalId);	}
+	;
+
+function returns [FunctionDescr functionDescr]
+	:	^(start=VK_FUNCTION dt=data_type? functionId=VT_FUNCTION_ID params=parameters content=VT_CURLY_CHUNK)
+	{	$functionDescr = factory.createFunction($start, $dt.dataType, $functionId, $params.paramList, $content);	}
+	;
+
+template returns [FactTemplateDescr factTemplateDescr]
+ at init{
+	List slotList = new LinkedList<FieldTemplateDescr>();
+}	:	^(start=VK_TEMPLATE id=VT_TEMPLATE_ID
+			( ts=template_slot {slotList.add($ts.fieldTemplateDescr);})+ end=END)
+	{	$factTemplateDescr = factory.createFactTemplate($start, $id, slotList, $end);	}
+	;
+
+template_slot returns [FieldTemplateDescr fieldTemplateDescr]
+	:	^(VT_SLOT dt=data_type id=VT_SLOT_ID)
+	{	$fieldTemplateDescr = factory.createFieldTemplate($dt.dataType, $id);	}
+	;
+
+query returns [QueryDescr queryDescr]
+	:	^(start=VK_QUERY id=VT_QUERY_ID params=parameters? lb=lhs_block end=END)
+	{	$queryDescr = factory.createQuery($start, $id, $params.paramList, $lb.andDescr, $end);	}
+	;
+
+rule returns [RuleDescr ruleDescr]
+	:	^(start=VK_RULE id=VT_RULE_ID ra=rule_attributes? wn=when_part? content=VT_RHS_CHUNK)
+	{	$ruleDescr = factory.createRule($start, $id, $ra.attrList, $wn.andDescr, $content);	}
+	;
+
+when_part returns [AndDescr andDescr]
+	:	VK_WHEN lh=lhs_block
+	{	$andDescr = $lh.andDescr;	}
+	;
+
+rule_attributes returns [List attrList]
+ at init{
+	$attrList = new LinkedList<AttributeDescr>();
+}	:	^(VT_RULE_ATTRIBUTES VK_ATTRIBUTES? (rl=rule_attribute {attrList.add($rl.attributeDescr);})+)
+	;
+
+parameters returns [List paramList]
+ at init{
+	$paramList = new LinkedList<Map<BaseDescr, BaseDescr>>();
+}	:	^(VT_PARAM_LIST (p=param_definition {$paramList.add($p.param);})*)
+	;
+
+param_definition returns [Map param]
+	:	dt=data_type? a=argument
+	{	$param = new HashMap<BaseDescr, BaseDescr>();
+		$param.put($a.arg, $dt.dataType);	}
+	;
+
+argument returns [BaseDescr arg]
+	:	id=ID (LEFT_SQUARE rightList+=RIGHT_SQUARE)*
+	{	$arg = factory.createArgument($id, $rightList);	}
+	;
+
+rule_attribute returns [AttributeDescr attributeDescr]
+	:	(^(attrName=VK_SALIENCE (value=INT|value=VT_PAREN_CHUNK)) 
+	|	^(attrName=VK_NO_LOOP value=BOOL?)  
+	|	^(attrName=VK_AGENDA_GROUP value=STRING)  
+	|	^(attrName=VK_DURATION value=INT)   
+	|	^(attrName=VK_ACTIVATION_GROUP value=STRING) 
+	|	^(attrName=VK_AUTO_FOCUS value=BOOL?) 
+	|	^(attrName=VK_DATE_EFFECTIVE value=STRING) 
+	|	^(attrName=VK_DATE_EXPIRES value=STRING) 
+	|	^(attrName=VK_ENABLED value=BOOL) 
+	|	^(attrName=VK_RULEFLOW_GROUP value=STRING) 
+	|	^(attrName=VK_LOCK_ON_ACTIVE value=BOOL?)
+	|	^(attrName=VK_DIALECT value=STRING))
+	{	$attributeDescr = factory.createAttribute($attrName, $value);	}
+	;
+	
+lhs_block returns [AndDescr andDescr]
+ at init{
+	$andDescr = new AndDescr();
+}	:	^(VT_AND_IMPLICIT (dt=lhs {$andDescr.addDescr($dt.baseDescr);})*)
+	;
+
+lhs	returns [BaseDescr baseDescr]
+ at init{
+	List<BaseDescr> lhsList = new LinkedList<BaseDescr>();
+}	:	^(start=VT_OR_PREFIX (dt=lhs {	lhsList.add($dt.baseDescr);	})+)
+	{	$baseDescr = factory.createOr($start, lhsList);	}
+	|	^(start=VT_OR_INFIX dt1=lhs dt2=lhs)
+	{	lhsList.add($dt1.baseDescr);
+		lhsList.add($dt2.baseDescr);
+		$baseDescr = factory.createOr($start, lhsList);	}
+	|	^(start=VT_AND_PREFIX (dt=lhs {	lhsList.add($dt.baseDescr);	})+)
+	{	$baseDescr = factory.createAnd($start, lhsList);	}
+	|	^(start=VT_AND_INFIX dt1=lhs dt2=lhs)
+	{	lhsList.add($dt1.baseDescr);
+		lhsList.add($dt2.baseDescr);
+		$baseDescr = factory.createAnd($start, lhsList);	}
+	|	^(start=VK_EXISTS dt=lhs)
+	{	$baseDescr = factory.createExists($start, $dt.baseDescr);	}
+	|	^(start=VK_NOT dt=lhs)
+	{	$baseDescr = factory.createNot($start, $dt.baseDescr);	}
+	|	^(start=VK_EVAL pc=VT_PAREN_CHUNK)
+	{	$baseDescr = factory.createEval($start, $pc);	}
+	|	^(start=VK_FORALL (dt=lhs {	lhsList.add($dt.baseDescr);	})+)
+	{	$baseDescr = factory.createForAll($start, lhsList);	}
+	|	^(VK_FROM pn=lhs_pattern fe=from_elements)
+	{	$baseDescr = factory.setupFrom($pn.baseDescr, $fe.patternSourceDescr);	}
+	|	pn=lhs_pattern
+	{	$baseDescr = $pn.baseDescr;	}
+	;
+
+from_elements returns [PatternSourceDescr patternSourceDescr]
+	:	^(start=VK_ACCUMULATE dt=lhs
+	{	$patternSourceDescr = factory.createAccumulate($start, $dt.baseDescr);	} 
+		ret=accumulate_parts[$patternSourceDescr])
+	{	$patternSourceDescr = $ret.accumulateDescr;	}
+	|	^(start=VK_COLLECT dt=lhs)
+	{	$patternSourceDescr = factory.createCollect($start, $dt.baseDescr);	}
+	|	^(start=VK_ENTRY_POINT entryId=VT_ENTRYPOINT_ID)
+	{	$patternSourceDescr = factory.createEntryPoint($start, $entryId);	}
+	|	fs=from_source_clause
+	{	$patternSourceDescr = $fs.fromDescr;	}
+	;
+
+accumulate_parts[PatternSourceDescr patternSourceDescr] returns [AccumulateDescr accumulateDescr]
+	:	ac1=accumulate_init_clause[$patternSourceDescr]
+	{	$accumulateDescr = $ac1.accumulateDescr;	}
+	|	ac2=accumulate_id_clause[$patternSourceDescr]
+	{	$accumulateDescr = $ac2.accumulateDescr;	}
+	;
+
+accumulate_init_clause [PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr] 
+	:	^(VT_ACCUMULATE_INIT_CLAUSE 
+			^(start=VK_INIT pc1=VT_PAREN_CHUNK) 
+			^(VK_ACTION pc2=VT_PAREN_CHUNK) 
+			rev=accumulate_init_reverse_clause?
+			^(VK_RESULT pc3=VT_PAREN_CHUNK))
+	{	if (null == rev){
+			$accumulateDescr = factory.setupAccumulateInit($accumulateParam, $start, $pc1, $pc2, $pc3, null);
+		} else {
+			$accumulateDescr = factory.setupAccumulateInit($accumulateParam, $start, $pc1, $pc2, $pc3, $rev.vkReverseChunk);
+		}	}
+	;
+
+accumulate_init_reverse_clause returns [DroolsTree vkReverse, DroolsTree vkReverseChunk]
+	:	^(vk=VK_REVERSE pc=VT_PAREN_CHUNK)
+	{	$vkReverse = $vk;
+		$vkReverseChunk = $pc;	}
+	;
+
+accumulate_id_clause [PatternSourceDescr accumulateParam] returns [AccumulateDescr accumulateDescr]
+	:	^(VT_ACCUMULATE_ID_CLAUSE id=ID pc=VT_PAREN_CHUNK)
+	{	$accumulateDescr = factory.setupAccumulateId($accumulateParam, $id, $pc);	}
+	;
+
+from_source_clause returns [FromDescr fromDescr, AccessorDescr retAccessorDescr]
+scope{
+	AccessorDescr accessorDescr;
+}	:	^(VT_FROM_SOURCE id=ID pc=VT_PAREN_CHUNK? 
+	{	$from_source_clause::accessorDescr = factory.createAccessor($id, $pc);	
+		$retAccessorDescr = $from_source_clause::accessorDescr;	}
+		expression_chain?)
+	{	$fromDescr = factory.createFromSource(factory.setupAccessorOffset($from_source_clause::accessorDescr)); }
+	;
+
+expression_chain
+	:	^(start=VT_EXPRESSION_CHAIN id=ID sc=VT_SQUARE_CHUNK? pc=VT_PAREN_CHUNK?
+	{	DeclarativeInvokerDescr declarativeInvokerResult = factory.createExpressionChain($start, $id, $sc, $pc);	
+		$from_source_clause::accessorDescr.addInvoker(declarativeInvokerResult);	}
+		expression_chain?)
+	;
+
+lhs_pattern returns [BaseDescr baseDescr]
+	:	^(VT_PATTERN fe=fact_expression)
+	{	$baseDescr = $fe.descr;	}
+	;
+
+fact_expression returns [BaseDescr descr]
+ at init{
+	List<BaseDescr> exprList = new LinkedList<BaseDescr>();
+}	:	^(VT_FACT pt=pattern_type (fe=fact_expression {exprList.add($fe.descr);})*)
+	{	$descr = factory.createPattern($pt.dataType, exprList);	}
+	|	^(VT_FACT_BINDING label=VT_LABEL fact=fact_expression)
+	{	$descr = factory.setupPatternBiding($label, $fact.descr);	}
+	|	^(start=VT_FACT_OR left=fact_expression right=fact_expression)
+	{	$descr = factory.createFactOr($start, $left.descr, $right.descr);	}
+
+	|	^(VT_FIELD field=field_element fe=fact_expression?)
+	{	if (null != fe){
+			$descr = factory.setupFieldConstraint($field.element, $fe.descr);
+		} else {
+			$descr = factory.setupFieldConstraint($field.element, null);
+		}	}
+	|	^(VT_BIND_FIELD label=VT_LABEL fe=fact_expression)
+	{	$descr = factory.createFieldBinding($label, $fe.descr);	}
+
+	|	^(VK_EVAL pc=VT_PAREN_CHUNK)
+	{	$descr = factory.createPredicate($pc);	}
+
+	|	^(op=EQUAL fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=NOT_EQUAL fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=GREATER fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=GREATER_EQUAL fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=LESS fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=LESS_EQUAL fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, null, $fe.descr);	}
+	|	^(op=VK_CONTAINS not=VK_NOT? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr);	}
+	|	^(op=VK_EXCLUDES not=VK_NOT? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr);	}
+	|	^(op=VK_MATCHES not=VK_NOT? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr);	}
+	|	^(op=VK_SOUNDSLIKE not=VK_NOT? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr);	}
+	|	^(op=VK_MEMBEROF not=VK_NOT? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr);	}
+	|	^(op=ID not=VK_NOT? param=VT_SQUARE_CHUNK? fe=fact_expression)
+	{	$descr = factory.setupRestriction($op, $not, $fe.descr, $param);	}
+
+	|	^(VK_IN not=VK_NOT? (fe=fact_expression {exprList.add($fe.descr);})+)
+	{	$descr = factory.createRestrictionConnective($not, exprList);	}
+
+	|	^(DOUBLE_PIPE left=fact_expression right=fact_expression)
+	{	$descr = factory.createOrRestrictionConnective($left.descr, $right.descr);	}
+	|	^(DOUBLE_AMPER left=fact_expression right=fact_expression)
+	{	$descr = factory.createAndRestrictionConnective($left.descr, $right.descr);	}
+
+	|	^(VT_ACCESSOR_PATH (ae=accessor_element {exprList.add($ae.element);})+)
+	{	$descr = factory.createAccessorPath(exprList);	}
+	|	s=STRING
+	{	$descr = factory.createStringLiteralRestriction($s);	}
+	|	i=INT
+	{	$descr = factory.createIntLiteralRestriction($i);	}
+	|	f=FLOAT
+	{	$descr = factory.createFloatLiteralRestriction($f);	}
+	|	b=BOOL
+	{	$descr = factory.createBoolLiteralRestriction($b);	}
+	|	n=NULL
+	{	$descr = factory.createNullLiteralRestriction($n);	}
+	|	pc=VT_PAREN_CHUNK
+	{	$descr = factory.createReturnValue($pc);	}
+	;
+
+field_element returns [FieldConstraintDescr element]
+ at init{
+	List<BaseDescr> aeList = new LinkedList<BaseDescr>();
+}	:	^(VT_ACCESSOR_PATH (ae=accessor_element {aeList.add($ae.element);})+)
+	{	$element = factory.createFieldConstraint(aeList);	}
+	;
+
+accessor_element returns [BaseDescr element]
+	:	^(VT_ACCESSOR_ELEMENT id=ID sc+=VT_SQUARE_CHUNK*)
+	{	$element = factory.createAccessorElement($id, $sc);	}
+	;
+
+pattern_type returns [BaseDescr dataType]
+	:	^(VT_PATTERN_TYPE idList+=ID+ (LEFT_SQUARE rightList+=RIGHT_SQUARE)*)
+	{	$dataType = factory.createDataType($idList, $rightList);	}
+	;
+
+data_type returns [BaseDescr dataType]
+	:	^(VT_DATA_TYPE idList+=ID+ (LEFT_SQUARE rightList+=RIGHT_SQUARE)*)
+	{	$dataType = factory.createDataType($idList, $rightList);	}
+	;
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,205 @@
+tree grammar Tree2TestDRL;
+
+options{
+	tokenVocab=DRL;
+	ASTLabelType=DroolsTree;
+	TokenLabelType=DroolsToken;
+}
+
+ at header {
+	package org.drools.lang;
+}
+
+compilation_unit
+	:	^(VT_COMPILATION_UNIT package_statement? statement*) 
+	;
+
+package_statement
+	:	^(VK_PACKAGE package_id)
+	;
+
+package_id
+	:	^(VT_PACKAGE_ID ID+)
+	;
+
+statement
+	:	rule_attribute
+	|	function_import_statement 
+	|	import_statement 
+	|	global 
+	|	function
+	|	template
+	|	rule
+	|	query
+	;
+
+import_statement
+	:	^(VK_IMPORT import_name)
+	;
+
+function_import_statement
+	:	^(VT_FUNCTION_IMPORT VK_FUNCTION import_name)
+	;
+
+import_name
+	:	^(VT_IMPORT_ID ID+ DOT_STAR?)
+	;
+
+global
+	:	^(VK_GLOBAL data_type VT_GLOBAL_ID)
+	;
+
+function
+	:	^(VK_FUNCTION data_type? VT_FUNCTION_ID parameters curly_chunk)
+	;
+
+query
+	:	^(VK_QUERY VT_QUERY_ID parameters? lhs_block END)
+	;
+
+parameters
+	:	^(VT_PARAM_LIST param_definition*)
+	;
+
+param_definition
+	:	data_type? argument
+	;
+
+argument
+	:	ID dimension_definition*
+	;
+
+
+template
+	:	^(VK_TEMPLATE VT_TEMPLATE_ID template_slot+ END)
+	;
+
+template_slot
+	:	^(VT_SLOT data_type VT_SLOT_ID)
+	;
+
+rule
+	:	^(VK_RULE VT_RULE_ID rule_attributes? when_part? VT_RHS_CHUNK)
+	;
+
+when_part
+	:	VK_WHEN lhs_block
+	;
+
+rule_attributes
+	:	^(VT_RULE_ATTRIBUTES VK_ATTRIBUTES? rule_attribute+)
+	;
+
+rule_attribute
+	:	^(VK_SALIENCE (INT|VT_PAREN_CHUNK)) 
+	|	^(VK_NO_LOOP BOOL?)  
+	|	^(VK_AGENDA_GROUP STRING)  
+	|	^(VK_DURATION INT)   
+	|	^(VK_ACTIVATION_GROUP STRING) 
+	|	^(VK_AUTO_FOCUS BOOL?) 
+	|	^(VK_DATE_EFFECTIVE STRING) 
+	|	^(VK_DATE_EXPIRES STRING) 
+	|	^(VK_ENABLED BOOL) 
+	|	^(VK_RULEFLOW_GROUP STRING) 
+	|	^(VK_LOCK_ON_ACTIVE BOOL?)
+	|	^(VK_DIALECT STRING)
+	;
+	
+lhs_block
+	:	^(VT_AND_IMPLICIT lhs*)
+	;
+
+lhs	:	^(VT_OR_PREFIX lhs+)
+	|	^(VT_OR_INFIX lhs lhs)
+	|	^(VT_AND_PREFIX lhs+)
+	|	^(VT_AND_INFIX lhs lhs)
+	|	^(VK_EXISTS lhs)
+	|	^(VK_NOT lhs)
+	|	^(VK_EVAL VT_PAREN_CHUNK)
+	|	^(VK_FORALL lhs+)
+	|	^(VK_FROM lhs_pattern from_elements)
+	|	lhs_pattern
+	;
+
+from_elements
+	:	^(VK_ACCUMULATE lhs (accumulate_init_clause|accumulate_id_clause))
+	|	^(VK_COLLECT lhs)
+	|	^(VK_ENTRY_POINT VT_ENTRYPOINT_ID)
+	|	^(VT_FROM_SOURCE ID VT_PAREN_CHUNK? expression_chain?)
+	;
+
+accumulate_init_clause
+	:	^(VT_ACCUMULATE_INIT_CLAUSE 
+			^(VK_INIT VT_PAREN_CHUNK) 
+			^(VK_ACTION VT_PAREN_CHUNK) 
+			accumulate_init_reverse_clause?
+			^(VK_RESULT VT_PAREN_CHUNK))
+	;
+
+accumulate_init_reverse_clause
+	:	^(VK_REVERSE VT_PAREN_CHUNK)
+	;
+
+
+accumulate_id_clause
+	:	^(VT_ACCUMULATE_ID_CLAUSE ID VT_PAREN_CHUNK)
+	;
+
+lhs_pattern
+	:	^(VT_PATTERN fact_expression)
+	;
+
+fact_expression
+	:	^(DOUBLE_PIPE fact_expression fact_expression)
+	|	^(DOUBLE_AMPER fact_expression fact_expression)
+	|	^(VT_FACT_BINDING VT_LABEL fact_expression)
+	|	^(VT_FACT pattern_type fact_expression*)
+	|	^(VT_FACT_OR fact_expression fact_expression)
+	|	^(VK_EVAL VT_PAREN_CHUNK)
+	|	^(VK_IN VK_NOT? fact_expression+)
+	|	^(EQUAL fact_expression)
+	|	^(GREATER fact_expression)
+	|	^(GREATER_EQUAL fact_expression)
+	|	^(LESS fact_expression)
+	|	^(LESS_EQUAL fact_expression)
+	|	^(NOT_EQUAL fact_expression)
+	|	^(VK_CONTAINS VK_NOT? fact_expression)
+	|	^(VK_EXCLUDES VK_NOT? fact_expression)
+	|	^(VK_MATCHES VK_NOT? fact_expression)
+	|	^(VK_SOUNDSLIKE VK_NOT? fact_expression)
+	|	^(VK_MEMBEROF VK_NOT? fact_expression)
+	|	^(ID VK_NOT? VT_SQUARE_CHUNK? fact_expression)
+	|	^(VT_BIND_FIELD VT_LABEL fact_expression)
+	|	^(VT_FIELD fact_expression fact_expression?)
+	|	^(VT_ACCESSOR_PATH accessor_element+)
+	|	STRING
+	|	INT
+	|	FLOAT
+	|	BOOL
+	|	NULL
+	|	VT_PAREN_CHUNK
+	;
+
+pattern_type
+	:	^(VT_PATTERN_TYPE ID+ dimension_definition*)
+	;
+
+data_type
+	:	^(VT_DATA_TYPE ID+ dimension_definition*)
+	;
+
+dimension_definition
+	:	LEFT_SQUARE RIGHT_SQUARE
+	;
+
+accessor_element
+	:	^(VT_ACCESSOR_ELEMENT ID VT_SQUARE_CHUNK*)
+	;
+
+expression_chain
+	:	^(VT_EXPRESSION_CHAIN ID VT_SQUARE_CHUNK? VT_PAREN_CHUNK? expression_chain?)	
+	;
+
+curly_chunk
+	:	VT_CURLY_CHUNK
+	;
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -64,7 +64,8 @@
         return ruleBase;
     }
 
-    public void testEventAssertion() throws Exception {
+    //FIXME current parser does not support declare statement
+    public void FIXME_testEventAssertion() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleEventAssertion.drl" ) );
         RuleBase ruleBase = loadRuleBase( reader );
@@ -119,7 +120,8 @@
 
     }
 
-    public void testEventAssertionWithDuration() throws Exception {
+    //FIXME current parser does not support declare statement
+    public void FIXME_testEventAssertionWithDuration() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleEventAssertionWithDuration.drl" ) );
         final RuleBase ruleBase = loadRuleBase( reader );
@@ -190,7 +192,8 @@
 
     }
 
-    public void testTimeRelationalOperators() throws Exception {
+    //FIXME current parser does not support declare statement
+    public void FIXME_testTimeRelationalOperators() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_TimeRelationalOperators.drl" ) );
         final RuleBase ruleBase = loadRuleBase( reader );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DslTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DslTest.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DslTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -138,7 +138,7 @@
         Package pkg = builder.getPackage();
 
         pkg = SerializationHelper.serializeObject(pkg);
-        assertFalse( pkg.isValid() );
+        assertNull( pkg );
     }
 
     public void testDSLWithIndividualConstraintMappings() throws Exception {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -95,7 +95,8 @@
         return SerializationHelper.serializeObject(ruleBase);
     }
 
-    public void testEventAssertion() throws Exception {
+    //FIXME current parser does not support declare statement
+    public void FIXME_testEventAssertion() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_EntryPoint.drl" ) );
         final RuleBase ruleBase = loadRuleBase( reader );

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/ErrorsParserTest.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/ErrorsParserTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/ErrorsParserTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/ErrorsParserTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,257 @@
+package org.drools.lang;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.Tree;
+import org.drools.compiler.DroolsParserException;
+import org.drools.lang.dsl.DefaultExpander;
+
+public class ErrorsParserTest extends TestCase {
+
+	private DRLParser parser;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		this.parser = null;
+	}
+
+	protected void tearDown() throws Exception {
+		this.parser = null;
+		super.tearDown();
+	}
+
+	public void testPartialAST() throws Exception {
+		parseResource("pattern_partial.drl");
+
+		Tree object = (Tree) this.parser.compilation_unit().getTree();
+
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+
+		assertTrue(this.parser.hasErrors());
+
+		// FIXME check for generated Tree
+		// final PackageDescr pkg = this.parser.getPackageDescr();
+		// assertEquals( 1,
+		// pkg.getRules().size() );
+		// final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+		//
+		// assertEquals( 1,
+		// rule.getLhs().getDescrs().size() );
+		// final PatternDescr pattern = (PatternDescr)
+		// rule.getLhs().getDescrs().get( 0 );
+		//
+		// assertNotNull( pattern );
+		// assertEquals( "Bar",
+		// pattern.getObjectType() );
+		// assertEquals( "foo3",
+		// pattern.getIdentifier() );
+	}
+
+	public void testNotBindindShouldBarf() throws Exception {
+		final DRLParser parser = parseResource("not_with_binding_error.drl");
+		parser.compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+
+		assertTrue(parser.hasErrors());
+	}
+
+	public void testExpanderErrorsAfterExpansion() throws Exception {
+
+		final String name = "expander_post_errors.dslr";
+		final Expander expander = new DefaultExpander();
+		final String expanded = expander.expand(this.getReader(name));
+
+		final DRLParser parser = parse(name, expanded);
+		parser.compilation_unit();
+		assertTrue(parser.hasErrors());
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+
+		final DroolsParserException err = (DroolsParserException) parser
+				.getErrors().get(0);
+		assertEquals(1, parser.getErrors().size());
+
+		assertEquals(5, err.getLineNumber());
+	}
+
+	public void testInvalidSyntax_Catches() throws Exception {
+		parseResource("invalid_syntax.drl").compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue(this.parser.hasErrors());
+	}
+
+	public void testMultipleErrors() throws Exception {
+		parseResource("multiple_errors.drl").compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue(this.parser.hasErrors());
+		assertEquals(2, this.parser.getErrors().size());
+	}
+
+	public void testPackageGarbage() throws Exception {
+
+		parseResource("package_garbage.drl").compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue(this.parser.hasErrors());
+	}
+
+	public void testEvalWithSemicolon() throws Exception {
+		parseResource("eval_with_semicolon.drl").compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue(this.parser.hasErrors());
+		assertEquals(1, this.parser.getErrorMessages().size());
+		assertEquals("ERR 108", this.parser.getErrors().get(0).getErrorCode());
+	}
+
+	public void testRuleParseLhs2() throws Exception {
+		final String text = "Message( Message.HELLO )\n";
+		parse(text).lhs_pattern();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue(parser.hasErrors());
+	}
+
+	public void testErrorMessageForMisplacedParenthesis() throws Exception {
+		final DRLParser parser = parseResource("misplaced_parenthesis.drl");
+		parser.compilation_unit();
+
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue("Parser should have raised errors", parser.hasErrors());
+
+		assertEquals(2, parser.getErrors().size());
+
+		assertEquals("ERR 103", parser.getErrors().get(0).getErrorCode());
+		assertEquals("ERR 101", parser.getErrors().get(1).getErrorCode());
+	}
+
+	public void testNPEOnParser() throws Exception {
+		final DRLParser parser = parseResource("npe_on_parser.drl");
+		parser.compilation_unit();
+		System.out.println(this.getName());
+		for (String message : this.parser.getErrorMessages()) {
+			System.out.println(message);
+		}
+		assertTrue("Parser should have raised errors", parser.hasErrors());
+
+		assertEquals(1, parser.getErrors().size());
+
+		assertTrue(parser.getErrors().get(0).getErrorCode().equals("ERR 103"));
+	}
+
+	public void testCommaMisuse() throws Exception {
+		final DRLParser parser = parseResource("comma_misuse.drl");
+		try {
+			parser.compilation_unit();
+			System.out.println(this.getName());
+			for (String message : this.parser.getErrorMessages()) {
+				System.out.println(message);
+			}
+			assertTrue("Parser should have raised errors", parser.hasErrors());
+			assertEquals(3, parser.getErrors().size());
+
+		} catch (NullPointerException npe) {
+			fail("Should not raise NPE");
+		}
+	}
+
+	private DRLParser parse(final String text) throws Exception {
+		this.parser = newParser(newTokenStream(newLexer(newCharStream(text))));
+		return this.parser;
+	}
+
+	private DRLParser parse(final String source, final String text)
+			throws Exception {
+		this.parser = newParser(newTokenStream(newLexer(newCharStream(text))));
+		// this.parser.setSource( source );
+		return this.parser;
+	}
+
+	private Reader getReader(final String name) throws Exception {
+		final InputStream in = getClass().getResourceAsStream(name);
+
+		return new InputStreamReader(in);
+	}
+
+	private DRLParser parseResource(final String name) throws Exception {
+
+		final Reader reader = getReader(name);
+
+		final StringBuffer text = new StringBuffer();
+
+		final char[] buf = new char[1024];
+		int len = 0;
+
+		while ((len = reader.read(buf)) >= 0) {
+			text.append(buf, 0, len);
+		}
+
+		return parse(name, text.toString());
+	}
+
+	private CharStream newCharStream(final String text) {
+		return new ANTLRStringStream(text);
+	}
+
+	private DRLLexer newLexer(final CharStream charStream) {
+		return new DRLLexer(charStream);
+	}
+
+	private TokenStream newTokenStream(final Lexer lexer) {
+		return new CommonTokenStream(lexer);
+	}
+
+	private DRLParser newParser(final TokenStream tokenStream) {
+		final DRLParser p = new DRLParser(tokenStream);
+		p.setTreeAdaptor(new DroolsTreeAdaptor());
+		return p;
+	}
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,12 +1,15 @@
 package org.drools.lang;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
 import junit.framework.TestCase;
 
 import org.antlr.runtime.ANTLRStringStream;
 import org.antlr.runtime.CharStream;
 import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
 import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
 import org.drools.base.evaluators.SetEvaluatorsDefinition;
 import org.drools.lang.descr.FieldConstraintDescr;
@@ -33,8 +36,7 @@
     public void testDump() throws Exception {
         String input = "Cheese( price > 10 && < 20 || == $val || == 30 )";
         String expected = "( ( price > 10 && price < 20 ) || price == $val || price == 30 )" ;
-        DRLParser parser = parse( input );
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
         
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
         String result = dumper.dump( fieldDescr );
@@ -45,8 +47,7 @@
     public void testDumpMatches() throws Exception {
         String input = "Cheese( type.toString matches \"something\\swith\\tsingle escapes\" )";
         String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
-        DRLParser parser = parse( input );
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
         
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
         String result = dumper.dump( fieldDescr );
@@ -57,9 +58,8 @@
     public void testDumpMatches2() throws Exception {
         String input = "Cheese( type.toString matches 'something\\swith\\tsingle escapes' )";
         String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
-        DRLParser parser = parse( input );
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
+
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
         String result = dumper.dump( fieldDescr );
         
@@ -69,8 +69,7 @@
     public void testDumpMatches3() throws Exception {
         String input = "Map( this[\"content\"] matches \"hello ;=\" )";
         String expected = "this[\"content\"] ~= \"hello ;=\"" ;
-        DRLParser parser = parse( input );
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
         
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
         String result = dumper.dump( fieldDescr );
@@ -81,8 +80,7 @@
     public void testDumpWithDateAttr() throws Exception {
         String input = "Person( son.birthDate == \"01-jan-2000\" )";
         String expected = "son.birthDate == org.drools.util.DateUtils.parseDate( \"01-jan-2000\" )" ;
-        DRLParser parser = parse( input );
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
         
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
         String result = dumper.dump( fieldDescr, true );
@@ -90,26 +88,87 @@
         assertEquals( expected, result );
     }
 
-    private DRLParser parse(final String text) throws Exception {
-        return newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-    }
+	private Object parse(String parserRuleName, String treeRuleName,
+			final String text) throws Exception {
+		return newParser(parserRuleName, treeRuleName, newCharStream(text));
+	}
 
-    private CharStream newCharStream(final String text) {
-        return new ANTLRStringStream( text );
-    }
+	private CharStream newCharStream(final String text) {
+		return new ANTLRStringStream(text);
+	}
 
-    private DRLLexer newLexer(final CharStream charStream) {
-        return new DRLLexer( charStream );
-    }
+	private Object newParser(String parserRuleName, String treeRuleName,
+			final CharStream charStream) {
+		return execTreeParser(parserRuleName, treeRuleName, charStream);
+	}
 
-    private TokenStream newTokenStream(final Lexer lexer) {
-        return new CommonTokenStream( lexer );
-    }
+	public Object execTreeParser(String testRuleName, String testTreeRuleName,
+			CharStream charStream) {
+		Object treeRuleReturn = null;
+		try {
+			DRLLexer lexer = new DRLLexer(charStream);
+			CommonTokenStream tokens = new CommonTokenStream(lexer);
+			DRLParser parser = new DRLParser(tokens);
+			parser.setTreeAdaptor(new DroolsTreeAdaptor());
+			/** Use Reflection to get rule method from parser */
+			Method ruleName = Class.forName("org.drools.lang.DRLParser")
+					.getMethod(testRuleName);
 
-    private DRLParser newParser(final TokenStream tokenStream) {
-        final DRLParser p = new DRLParser( tokenStream );
-        //p.setParserDebug( true );
-        return p;
-    }
-    
+			/** Invoke grammar rule, and get the return value */
+			Object ruleReturn = ruleName.invoke(parser);
+			
+			if (!parser.hasErrors()){
+				Class _return = Class.forName("org.drools.lang.DRLParser" + "$"
+						+ testRuleName + "_return");
+				Method returnName = _return.getMethod("getTree");
+				DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn);
+
+				// Walk resulting tree; create tree nodes stream first
+				CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
+				// AST nodes have payload that point into token stream
+				nodes.setTokenStream(tokens);
+				// Create a tree walker attached to the nodes stream
+				DescrBuilderTree walker = new DescrBuilderTree(nodes);
+				/** Invoke the tree rule, and store the return value if there is */
+				Method treeRuleName = Class.forName(
+						"org.drools.lang.DescrBuilderTree").getMethod(
+						testTreeRuleName);
+				treeRuleReturn = treeRuleName.invoke(walker);				
+			}
+
+			if (treeRuleReturn != null) {
+				/** If return object is instanceof AST, get the toStringTree */
+				if (treeRuleReturn.toString().indexOf(
+						testTreeRuleName + "_return") > 0) {
+					try { // NullPointerException may happen here...
+						Class _treeReturn = Class
+								.forName("org.drools.lang.DescrBuilderTree"
+										+ "$" + testTreeRuleName + "_return");
+						Field[] fields = _treeReturn.getDeclaredFields();
+						for (Field field : fields) {
+							if (field.getType().getName().contains(
+									"org.drools.lang.descr.")) {
+								return field.get(treeRuleReturn);
+							}
+						}
+					} catch (Exception e) {
+						System.err.println(e);
+					}
+				}
+			}
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return treeRuleReturn;
+	}
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -1,3975 +1,3426 @@
-package org.drools.lang;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.CommonToken;
-import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.MismatchedTokenException;
-import org.antlr.runtime.NoViableAltException;
-import org.antlr.runtime.RecognitionException;
-import org.antlr.runtime.TokenStream;
-import org.drools.compiler.DrlParser;
-import org.drools.lang.DRLParser.paren_chunk_return;
-import org.drools.lang.descr.AccessorDescr;
-import org.drools.lang.descr.AccumulateDescr;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.CollectDescr;
-import org.drools.lang.descr.EntryPointDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FactTemplateDescr;
-import org.drools.lang.descr.FieldAccessDescr;
-import org.drools.lang.descr.FieldBindingDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.FieldTemplateDescr;
-import org.drools.lang.descr.ForallDescr;
-import org.drools.lang.descr.FromDescr;
-import org.drools.lang.descr.FunctionDescr;
-import org.drools.lang.descr.FunctionImportDescr;
-import org.drools.lang.descr.GlobalDescr;
-import org.drools.lang.descr.ImportDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.SlidingWindowDescr;
-import org.drools.lang.descr.TypeDeclarationDescr;
-import org.drools.lang.descr.TypeFieldDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.drools.lang.dsl.DefaultExpander;
-
-public class RuleParserTest extends TestCase {
-
-    private DRLParser parser;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        this.parser = null;
-    }
-
-    protected void tearDown() throws Exception {
-        this.parser = null;
-        super.tearDown();
-    }
-
-    public void testPackage_OneSegment() throws Exception {
-        final String packageName = parse( "package foo" ).package_statement();
-        assertEquals( "foo",
-                      packageName );
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testPackage_MultipleSegments() throws Exception {
-        final String packageName = parse( "package foo.bar.baz;" ).package_statement();
-        assertEquals( "foo.bar.baz",
-                      packageName );
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testEmptyPackage() throws Exception {
-        final String source = "package foo.bar.baz";
-        final DrlParser parser = new DrlParser();
-        final PackageDescr pkg = parser.parse( new StringReader( source ) );
-        assertFalse( parser.hasErrors() );
-        assertEquals( "foo.bar.baz",
-                      pkg.getName() );
-    }
-
-    public void testCompilationUnit() throws Exception {
-        final String source = "package foo; import com.foo.Bar; import com.foo.Baz;";
-        parse( source ).compilation_unit();
-        assertEquals( "foo",
-                      this.parser.getPackageDescr().getName() );
-        assertEquals( 2,
-                      this.parser.getPackageDescr().getImports().size() );
-        ImportDescr impdescr = (ImportDescr) this.parser.getPackageDescr().getImports().get( 0 );
-        assertEquals( "com.foo.Bar",
-                      impdescr.getTarget() );
-        assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
-                      impdescr.getStartCharacter() );
-        assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
-                      impdescr.getEndCharacter() );
-
-        impdescr = (ImportDescr) this.parser.getPackageDescr().getImports().get( 1 );
-        assertEquals( "com.foo.Baz",
-                      impdescr.getTarget() );
-        assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
-                      impdescr.getStartCharacter() );
-        assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
-                      impdescr.getEndCharacter() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testEmptyRule() throws Exception {
-        final RuleDescr rule = parseResource( "empty_rule.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "empty",
-                      rule.getName() );
-        assertNotNull( rule.getLhs() );
-        assertNotNull( rule.getConsequence() );
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-    }
-
-    public void testKeywordCollisions() throws Exception {
-        final DRLParser parser = parseResource( "eol_funny_business.drl" );
-
-        parser.compilation_unit();
-        final PackageDescr pkg = parser.getPackageDescr();
-
-        assertEquals( 1,
-                      pkg.getRules().size() );
-
-        assertFalse( parser.getErrors().toString(),
-                     parser.hasErrors() );
-
-    }
-
-    public void testPartialAST() throws Exception {
-        parseResource( "pattern_partial.drl" );
-
-        this.parser.compilation_unit();
-
-        assertTrue( this.parser.hasErrors() );
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-        assertEquals( 1,
-                      pkg.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
-        assertNotNull( pattern );
-        assertEquals( "Bar",
-                      pattern.getObjectType() );
-        assertEquals( "foo3",
-                      pattern.getIdentifier() );
-
-    }
-
-    public void testTemplates() throws Exception {
-
-        final DRLParser parser = parseResource( "test_Templates.drl" );
-
-        parser.compilation_unit();
-        final PackageDescr pkg = parser.getPackageDescr();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( "FACT TEMPLATES FAILED: " + parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-
-        assertEquals( 1,
-                      pkg.getRules().size() );
-        assertEquals( 2,
-                      pkg.getFactTemplates().size() );
-
-        FactTemplateDescr fact1 = (FactTemplateDescr) pkg.getFactTemplates().get( 0 );
-        assertEquals( "Cheese",
-                      fact1.getName() );
-        assertEquals( 2,
-                      fact1.getFields().size() );
-
-        assertEquals( "name",
-                      ((FieldTemplateDescr) fact1.getFields().get( 0 )).getName() );
-        assertEquals( "String",
-                      ((FieldTemplateDescr) fact1.getFields().get( 0 )).getClassType() );
-
-        assertEquals( "age",
-                      ((FieldTemplateDescr) fact1.getFields().get( 1 )).getName() );
-        assertEquals( "Integer",
-                      ((FieldTemplateDescr) fact1.getFields().get( 1 )).getClassType() );
-
-        fact1 = null;
-
-        final FactTemplateDescr fact2 = (FactTemplateDescr) pkg.getFactTemplates().get( 1 );
-        assertEquals( "Wine",
-                      fact2.getName() );
-        assertEquals( 3,
-                      fact2.getFields().size() );
-
-        assertEquals( "name",
-                      ((FieldTemplateDescr) fact2.getFields().get( 0 )).getName() );
-        assertEquals( "String",
-                      ((FieldTemplateDescr) fact2.getFields().get( 0 )).getClassType() );
-
-        assertEquals( "year",
-                      ((FieldTemplateDescr) fact2.getFields().get( 1 )).getName() );
-        assertEquals( "String",
-                      ((FieldTemplateDescr) fact2.getFields().get( 1 )).getClassType() );
-
-        assertEquals( "accolades",
-                      ((FieldTemplateDescr) fact2.getFields().get( 2 )).getName() );
-        assertEquals( "String[]",
-                      ((FieldTemplateDescr) fact2.getFields().get( 2 )).getClassType() );
-    }
-
-    public void testTernaryExpression() throws Exception {
-
-        final DRLParser parser = parseResource( "ternary_expression.drl" );
-
-        parser.compilation_unit();
-        final PackageDescr pkg = parser.getPackageDescr();
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 1,
-                      pkg.getRules().size() );
-
-        assertFalse( parser.hasErrors() );
-        assertEqualsIgnoreWhitespace( "if (speed > speedLimit ? true : false;) pullEmOver();",
-                                      (String) rule.getConsequence() );
-    }
-
-    public void FIXME_testLatinChars() throws Exception {
-        final DrlParser parser = new DrlParser();
-        final Reader drl = new InputStreamReader( this.getClass().getResourceAsStream( "latin-sample.dslr" ) );
-        final Reader dsl = new InputStreamReader( this.getClass().getResourceAsStream( "latin.dsl" ) );
-
-        final PackageDescr pkg = parser.parse( drl,
-                                               dsl );
-
-        //MN: will get some errors due to the char encoding on my FC5 install
-        //others who use the right encoding may not see this, feel free to uncomment
-        //the following assertion.
-        assertFalse( parser.hasErrors() );
-
-        assertEquals( "br.com.auster.drools.sample",
-                      pkg.getName() );
-        assertEquals( 1,
-                      pkg.getRules().size() );
-
-    }
-
-    public void testFunctionWithArrays() throws Exception {
-        final DRLParser parser = parseResource( "function_arrays.drl" );
-
-        parser.compilation_unit();
-        final PackageDescr pkg = parser.getPackageDescr();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-        assertEquals( "foo",
-                      pkg.getName() );
-        assertEquals( 1,
-                      pkg.getRules().size() );
-
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
-        assertEqualsIgnoreWhitespace( "yourFunction(new String[3] {\"a\",\"b\",\"c\"});",
-                                      (String) rule.getConsequence() );
-        final FunctionDescr func = (FunctionDescr) pkg.getFunctions().get( 0 );
-
-        assertEquals( "String[]",
-                      func.getReturnType() );
-        assertEquals( "args[]",
-                      func.getParameterNames().get( 0 ) );
-        assertEquals( "String",
-                      func.getParameterTypes().get( 0 ) );
-    }
-
-    public void testAlmostEmptyRule() throws Exception {
-        final RuleDescr rule = parseResource( "almost_empty_rule.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "almost_empty",
-                      rule.getName() );
-        assertNotNull( rule.getLhs() );
-        assertEquals( "",
-                      ((String) rule.getConsequence()).trim() );
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testQuotedStringNameRule() throws Exception {
-        final RuleDescr rule = parseResource( "quoted_string_name_rule.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "quoted string name",
-                      rule.getName() );
-        assertNotNull( rule.getLhs() );
-        assertEquals( "",
-                      ((String) rule.getConsequence()).trim() );
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testNoLoop() throws Exception {
-        final RuleDescr rule = parseResource( "no-loop.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "rule1",
-                      rule.getName() );
-        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
-        assertEquals( "false",
-                      att.getValue() );
-        assertEquals( "no-loop",
-                      att.getName() );
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-    }
-
-    public void testAutofocus() throws Exception {
-        final RuleDescr rule = parseResource( "autofocus.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "rule1",
-                      rule.getName() );
-        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
-        assertEquals( "true",
-                      att.getValue() );
-        assertEquals( "auto-focus",
-                      att.getName() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testRuleFlowGroup() throws Exception {
-        final RuleDescr rule = parseResource( "ruleflowgroup.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "rule1",
-                      rule.getName() );
-        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
-        assertEquals( "a group",
-                      att.getValue() );
-        assertEquals( "ruleflow-group",
-                      att.getName() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testConsequenceWithDeclaration() throws Exception {
-        final RuleDescr rule = parseResource( "declaration-in-consequence.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "myrule",
-                      rule.getName() );
-
-        final String expected = "int i = 0; i = 1; i / 1; i == 1; i(i); i = 'i'; i.i.i; i\\i; i<i; i>i; i=\"i\";  ++i;" + "i++; --i; i--; i += i; i -= i; i *= i; i /= i;" + "int i = 5;" + "for(int j; j<i; ++j) {" + "System.out.println(j);}"
-                                + "Object o = new String(\"Hello\");" + "String s = (String) o;";
-
-        assertEqualsIgnoreWhitespace( expected,
-                                      (String) rule.getConsequence() );
-        assertTrue( ((String) rule.getConsequence()).indexOf( "++" ) > 0 );
-        assertTrue( ((String) rule.getConsequence()).indexOf( "--" ) > 0 );
-        assertTrue( ((String) rule.getConsequence()).indexOf( "+=" ) > 0 );
-        assertTrue( ((String) rule.getConsequence()).indexOf( "==" ) > 0 );
-
-        //System.out.println(( String ) rule.getConsequence());
-        //note, need to assert that "i++" is preserved as is, no extra spaces.
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testRuleParseLhs() throws Exception {
-        final String text = "Person(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\") \n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testLiteralBoolAndNegativeNumbersRule() throws Exception {
-        final DRLParser parser = parseResource( "literal_bool_and_negative.drl" );
-        final RuleDescr rule = parser.rule();
-        assertFalse( parser.hasErrors() );
-
-        assertNotNull( rule );
-
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertNotNull( rule.getLhs() );
-        assertEqualsIgnoreWhitespace( "cons();",
-                                      (String) rule.getConsequence() );
-
-        final AndDescr lhs = rule.getLhs();
-        assertEquals( 3,
-                      lhs.getDescrs().size() );
-
-        PatternDescr pattern = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-        AndDescr fieldAnd = (AndDescr) pattern.getConstraint();
-        FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
-        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "false",
-                      lit.getText() );
-        assertEquals( "bar",
-                      fld.getFieldName() );
-
-        pattern = (PatternDescr) lhs.getDescrs().get( 1 );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        fieldAnd = (AndDescr) pattern.getConstraint();
-        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( ">",
-                      lit.getEvaluator() );
-        assertEquals( "-42",
-                      lit.getText() );
-        assertEquals( "boo",
-                      fld.getFieldName() );
-
-        pattern = (PatternDescr) lhs.getDescrs().get( 2 );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        //lit = (LiteralDescr) col.getDescrs().get( 0 );
-
-        fieldAnd = (AndDescr) pattern.getConstraint();
-        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( ">",
-                      lit.getEvaluator() );
-        assertEquals( "-42.42",
-                      lit.getText() );
-        assertEquals( "boo",
-                      fld.getFieldName() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testChunkWithoutParens() throws Exception {
-        String input = "( foo )";
-        paren_chunk_return ret = parse( input ).paren_chunk();
-        final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
-                                              ((CommonToken) ret.stop).getStopIndex() + 1 );
-
-        assertEquals( "( foo )",
-                      chunk );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testChunkWithParens() throws Exception {
-        String input = "(fnord())";
-        paren_chunk_return ret = parse( input ).paren_chunk();
-        final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
-                                              ((CommonToken) ret.stop).getStopIndex() + 1 );
-
-        assertEqualsIgnoreWhitespace( "(fnord())",
-                                      chunk );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testChunkWithParensAndQuotedString() throws Exception {
-        String input = "( fnord( \"cheese\" ) )";
-        paren_chunk_return ret = parse( input ).paren_chunk();
-        final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
-                                              ((CommonToken) ret.stop).getStopIndex() + 1 );
-
-        assertEqualsIgnoreWhitespace( "( fnord( \"cheese\" ) )",
-                                      chunk );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testChunkWithRandomCharac5ters() throws Exception {
-        String input = "( %*9dkj)";
-        paren_chunk_return ret = parse( input ).paren_chunk();
-        final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
-                                              ((CommonToken) ret.stop).getStopIndex() + 1 );
-
-        assertEqualsIgnoreWhitespace( "( %*9dkj)",
-                                      chunk );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testEmptyPattern() throws Exception {
-        parseResource( "test_EmptyPattern.drl" );
-        this.parser.compilation_unit();
-        final PackageDescr packageDescr = this.parser.getPackageDescr();
-        assertEquals( 1,
-                      packageDescr.getRules().size() );
-        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
-        assertEquals( "simple rule",
-                      ruleDescr.getName() );
-        assertNotNull( ruleDescr.getLhs() );
-        assertEquals( 1,
-                      ruleDescr.getLhs().getDescrs().size() );
-        final PatternDescr patternDescr = (PatternDescr) ruleDescr.getLhs().getDescrs().get( 0 );
-        assertEquals( 0,
-                      patternDescr.getConstraint().getDescrs().size() ); //this may be null, not sure as the test doesn't get this far...
-        assertEquals( "Cheese",
-                      patternDescr.getObjectType() );
-
-    }
-
-    public void testSimpleMethodCallWithFrom() throws Exception {
-
-        final RuleDescr rule = parseResource( "test_SimpleMethodCallWithFrom.drl" ).rule();
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FromDescr from = (FromDescr) pattern.getSource();
-        final AccessorDescr method = (AccessorDescr) from.getDataSource();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertEquals( "something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
-                      method.toString() );
-    }
-
-    public void testSimpleFunctionCallWithFrom() throws Exception {
-
-        final RuleDescr rule = parseResource( "test_SimpleFunctionCallWithFrom.drl" ).rule();
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FromDescr from = (FromDescr) pattern.getSource();
-        final AccessorDescr func = (AccessorDescr) from.getDataSource();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertEquals( "doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
-                      func.toString() );
-    }
-
-    public void testSimpleAccessorWithFrom() throws Exception {
-
-        final RuleDescr rule = parseResource( "test_SimpleAccessorWithFrom.drl" ).rule();
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FromDescr from = (FromDescr) pattern.getSource();
-        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
-
-        assertEquals( "something.doIt",
-                      accessor.toString() );
-    }
-
-    public void testSimpleAccessorAndArgWithFrom() throws Exception {
-
-        final RuleDescr rule = parseResource( "test_SimpleAccessorArgWithFrom.drl" ).rule();
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FromDescr from = (FromDescr) pattern.getSource();
-        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertNotNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
-
-        assertEquals( "something.doIt[\"key\"]",
-                      accessor.toString() );
-    }
-
-    public void testComplexChainedAcessor() throws Exception {
-        final RuleDescr rule = parseResource( "test_ComplexChainedCallWithFrom.drl" ).rule();
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FromDescr from = (FromDescr) pattern.getSource();
-        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertEquals( "doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]",
-                      accessor.toString() );
-    }
-
-    //        public void testFrom() throws Exception {
-    //            final RuleDescr rule = parseResource( "from.drl" ).rule();
-    //
-    //            if(parser.hasErrors()) {
-    //                System.err.println(parser.getErrorMessages());
-    //            }
-    //            assertFalse(parser.hasErrors());
-    //
-    //            assertNotNull( rule );
-    //
-    //            assertEquals( "using_from",
-    //                          rule.getName() );
-    //
-    //            assertEquals(9, rule.getLhs().getDescrs().size());
-    //
-    //            FromDescr from = (FromDescr) rule.getLhs().getDescrs().get(0);
-    //
-    //            assertEquals(3, from.getLine());
-    //
-    //            assertEquals("Foo", from.getReturnedPattern().getObjectType());
-    //            assertTrue(from.getDataSource() instanceof FieldAccessDescr);
-    //            assertEquals("baz", ((FieldAccessDescr) from.getDataSource()).getFieldName());
-    //            assertEquals("bar", ((FieldAccessDescr) from.getDataSource()).getVariableName());
-    //
-    //
-    //            ArgumentValueDescr arg = null;
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(1);
-    //            assertEquals("Foo", from.getReturnedPattern().getObjectType());
-    //            assertEquals(0, from.getReturnedPattern().getDescrs().size());
-    //            FieldAccessDescr fieldAccess = ( FieldAccessDescr ) from.getDataSource();
-    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
-    //            assertEquals(ArgumentValueDescr.STRING,  arg.getType() );
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(2);
-    //            fieldAccess = ( FieldAccessDescr ) from.getDataSource();
-    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
-    //            assertEquals(ArgumentValueDescr.VARIABLE,  arg.getType() );
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(3);
-    //            fieldAccess = ( FieldAccessDescr ) from.getDataSource();
-    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
-    //            assertEquals(ArgumentValueDescr.INTEGRAL,  arg.getType() );
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(4);
-    //            assertEquals("Whee", from.getReturnedColumn().getObjectType());
-    //            assertEquals(1, from.getReturnedColumn().getDescrs().size());
-    //            assertTrue(from.getDataSource() instanceof FunctionCallDescr);
-    //            assertEquals("whee", ((FunctionCallDescr) from.getDataSource()).getName());
-    //            assertEquals(1, ((FunctionCallDescr) from.getDataSource()).getArguments().size());
-    //            arg = ( (ArgumentValueDescr )((FunctionCallDescr) from.getDataSource()).getArguments().get(0));
-    //            assertEquals("y", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.STRING, arg.getType());
-    //
-    //            assertEquals(7, from.getLine());
-    //            assertEquals(7, from.getReturnedColumn().getLine());
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(5);
-    //            assertEquals("Foo", from.getReturnedColumn().getObjectType());
-    //            assertEquals(1, from.getReturnedColumn().getDescrs().size());
-    //            assertEquals("f", from.getReturnedColumn().getIdentifier());
-    //            assertTrue(from.getDataSource() instanceof MethodAccessDescr);
-    //            assertEquals("bar", ((MethodAccessDescr) from.getDataSource()).getVariableName());
-    //            assertEquals("la", ((MethodAccessDescr) from.getDataSource()).getMethodName());
-    //            assertEquals(1, ((MethodAccessDescr) from.getDataSource()).getArguments().size());
-    //            arg = (ArgumentValueDescr) ((MethodAccessDescr) from.getDataSource()).getArguments().get(0);
-    //
-    //
-    //            assertEquals("x", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.VARIABLE, arg.getType());
-    //
-    //            assertEqualsIgnoreWhitespace("whee();", ( String ) rule.getConsequence());
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(6);
-    //            assertEquals("wa", ((FunctionCallDescr)from.getDataSource()).getName());
-    //
-    //            from = (FromDescr) rule.getLhs().getDescrs().get(7);
-    //            MethodAccessDescr meth = (MethodAccessDescr)from.getDataSource();
-    //            assertEquals("wa", meth.getMethodName());
-    //            assertEquals("la", meth.getVariableName());
-    //
-    //            arg = (ArgumentValueDescr) meth.getArguments().get(0);
-    //            assertEquals("42", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType());
-    //
-    //            arg = (ArgumentValueDescr) meth.getArguments().get(1);
-    //            assertEquals("42.42", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.DECIMAL, arg.getType());
-    //
-    //            arg = (ArgumentValueDescr) meth.getArguments().get(2);
-    //            assertEquals("false", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.BOOLEAN, arg.getType());
-    //
-    //            arg = (ArgumentValueDescr) meth.getArguments().get(3);
-    //            assertEquals("null", arg.getValue());
-    //            assertEquals(ArgumentValueDescr.NULL, arg.getType());
-    //
-    //            assertEquals("Bam", ((PatternDescr)rule.getLhs().getDescrs().get(8)).getObjectType());
-    //        }
-
-    public void testSimpleRule() throws Exception {
-        final RuleDescr rule = parseResource( "simple_rule.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        assertEquals( 7,
-                      rule.getConsequenceLine() );
-        assertEquals( 2,
-                      rule.getConsequencePattern() );
-
-        final AndDescr lhs = rule.getLhs();
-
-        assertNotNull( lhs );
-
-        assertEquals( 3,
-                      lhs.getDescrs().size() );
-
-        //System.err.println( lhs.getDescrs() );
-
-        // Check first pattern
-        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "foo3",
-                      first.getIdentifier() );
-        assertEquals( "Bar",
-                      first.getObjectType() );
-
-        assertEquals( 1,
-                      first.getConstraint().getDescrs().size() );
-
-        AndDescr fieldAnd = (AndDescr) first.getConstraint();
-        FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
-        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "3",
-                      constraint.getText() );
-
-        // Check second pattern
-        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
-        assertEquals( "foo4",
-                      second.getIdentifier() );
-        assertEquals( "Bar",
-                      second.getObjectType() );
-
-        //System.err.println( second.getDescrs() );
-
-        fieldAnd = (AndDescr) second.getConstraint();
-        assertEquals( 2,
-                      fieldAnd.getDescrs().size() );
-
-        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) fieldAnd.getDescrs().get( 0 );
-        assertEquals( "a",
-                      fieldBindingDescr.getFieldName() );
-        assertEquals( "a4",
-                      fieldBindingDescr.getIdentifier() );
-
-        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 1 );
-        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "4",
-                      constraint.getText() );
-
-        // Check third pattern
-        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
-        assertNull( third.getIdentifier() );
-        assertEquals( "Baz",
-                      third.getObjectType() );
-
-        assertEqualsIgnoreWhitespace( "if ( a == b ) { " + "  assert( foo3 );" + "} else {" + "  retract( foo4 );" + "}" + "  System.out.println( a4 );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testRestrictionsMultiple() throws Exception {
-        final RuleDescr rule = parseResource( "restrictions_test.drl" ).rule();
-
-        assertFalse( this.parser.getErrors().toString(),
-                     this.parser.hasErrors() );
-        assertNotNull( rule );
-
-        assertEqualsIgnoreWhitespace( "consequence();",
-                                      (String) rule.getConsequence() );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        //The first pattern, with 2 restrictions on a single field (plus a connective)
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        AndDescr and = (AndDescr) pattern.getConstraint();
-        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        assertEquals( RestrictionConnectiveDescr.AND,
-                      ((RestrictionConnectiveDescr) fld.getRestriction()).getConnective() );
-        assertEquals( 2,
-                      fld.getRestrictions().size() );
-        assertEquals( "age",
-                      fld.getFieldName() );
-
-        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( ">",
-                      lit.getEvaluator() );
-        assertEquals( "30",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "40",
-                      lit.getText() );
-
-        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
-        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Vehicle",
-                      pattern.getObjectType() );
-        assertEquals( 2,
-                      pattern.getConstraint().getDescrs().size() );
-
-        and = (AndDescr) pattern.getConstraint();
-        fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( 1,
-                      fld.getRestrictions().size() );
-        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
-        assertEquals( RestrictionConnectiveDescr.OR,
-                      or.getConnective() );
-        assertEquals( 2,
-                      or.getRestrictions().size() );
-        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "sedan",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "wagon",
-                      lit.getText() );
-
-        //now the second field
-        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
-        assertEquals( 1,
-                      fld.getRestrictions().size() );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "3",
-                      lit.getText() );
-
-    }
-
-    public void testLineNumberInAST() throws Exception {
-        //also see testSimpleExpander to see how this works with an expander (should be the same).
-
-        final RuleDescr rule = parseResource( "simple_rule.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        assertEquals( 7,
-                      rule.getConsequenceLine() );
-        assertEquals( 2,
-                      rule.getConsequencePattern() );
-
-        final AndDescr lhs = rule.getLhs();
-
-        assertNotNull( lhs );
-
-        assertEquals( 3,
-                      lhs.getDescrs().size() );
-
-        // Check first pattern
-        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "foo3",
-                      first.getIdentifier() );
-        assertEquals( "Bar",
-                      first.getObjectType() );
-        assertEquals( 1,
-                      first.getConstraint().getDescrs().size() );
-
-        // Check second pattern
-        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
-        assertEquals( "foo4",
-                      second.getIdentifier() );
-        assertEquals( "Bar",
-                      second.getObjectType() );
-
-        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
-        assertEquals( "Baz",
-                      third.getObjectType() );
-
-        assertEquals( 4,
-                      first.getLine() );
-        assertEquals( 5,
-                      second.getLine() );
-        assertEquals( 6,
-                      third.getLine() );
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testLineNumberIncludingCommentsInRHS() throws Exception {
-        parseResource( "test_CommentLineNumbersInConsequence.drl" ).compilation_unit();
-
-        assertFalse( this.parser.hasErrors() );
-        final String rhs = (String) ((RuleDescr) this.parser.getPackageDescr().getRules().get( 0 )).getConsequence();
-        String expected = "  \t//woot\n  \tfirst\n  \t\n  \t//\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \n";
-        assertEquals( expected,
-                      rhs );
-    }
-
-    public void testLhsSemicolonDelim() throws Exception {
-        final RuleDescr rule = parseResource( "lhs_semicolon_delim.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        final AndDescr lhs = rule.getLhs();
-
-        assertNotNull( lhs );
-
-        assertEquals( 3,
-                      lhs.getDescrs().size() );
-
-        //System.err.println( lhs.getDescrs() );
-
-        // Check first pattern
-        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "foo3",
-                      first.getIdentifier() );
-        assertEquals( "Bar",
-                      first.getObjectType() );
-
-        assertEquals( 1,
-                      first.getConstraint().getDescrs().size() );
-
-        //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
-        AndDescr and = (AndDescr) first.getConstraint();
-        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "3",
-                      constraint.getText() );
-
-        // Check second pattern
-        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
-        assertEquals( "foo4",
-                      second.getIdentifier() );
-        assertEquals( "Bar",
-                      second.getObjectType() );
-
-        and = (AndDescr) second.getConstraint();
-        assertEquals( 2,
-                      and.getDescrs().size() );
-
-        //System.err.println( second.getDescrs() );
-
-        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
-        assertEquals( "a",
-                      fieldBindingDescr.getFieldName() );
-        assertEquals( "a4",
-                      fieldBindingDescr.getIdentifier() );
-
-        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
-
-        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "4",
-                      constraint.getText() );
-
-        // Check third pattern
-        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
-        assertNull( third.getIdentifier() );
-        assertEquals( "Baz",
-                      third.getObjectType() );
-
-        assertEqualsIgnoreWhitespace( "if ( a == b ) { " + "  assert( foo3 );" + "} else {" + "  retract( foo4 );" + "}" + "  System.out.println( a4 );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testNotNode() throws Exception {
-        final RuleDescr rule = parseResource( "rule_not.drl" ).rule();
-
-        assertNotNull( rule );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        final AndDescr lhs = rule.getLhs();
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
-        assertEquals( 1,
-                      not.getDescrs().size() );
-        final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
-
-        assertEquals( "Cheese",
-                      pattern.getObjectType() );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        final AndDescr and = (AndDescr) pattern.getConstraint();
-        final FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        final LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "stilton",
-                      lit.getText() );
-        assertEquals( "type",
-                      fld.getFieldName() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testFunctionImport() throws Exception {
-        final DRLParser parser = parseResource( "test_FunctionImport.drl" );
-        parser.compilation_unit();
-        assertFalse( parser.hasErrors() );
-
-        final PackageDescr pkg = parser.getPackageDescr();
-        assertEquals( 2,
-                      pkg.getFunctionImports().size() );
-
-        assertEquals( "abd.def.x",
-                      ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getTarget() );
-        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getStartCharacter() == -1 );
-        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getEndCharacter() == -1 );
-        assertEquals( "qed.wah.*",
-                      ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getTarget() );
-        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getStartCharacter() == -1 );
-        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getEndCharacter() == -1 );
-    }
-
-    public void testNotExistWithBrackets() throws Exception {
-
-        final DRLParser parser = parseResource( "not_exist_with_brackets.drl" );
-
-        parser.compilation_unit();
-        final PackageDescr pkg = parser.getPackageDescr();
-
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
-        assertNotNull( rule );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        final AndDescr lhs = rule.getLhs();
-        assertEquals( 2,
-                      lhs.getDescrs().size() );
-        final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
-        assertEquals( 1,
-                      not.getDescrs().size() );
-        final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
-
-        assertEquals( "Cheese",
-                      pattern.getObjectType() );
-
-        final ExistsDescr ex = (ExistsDescr) lhs.getDescrs().get( 1 );
-        assertEquals( 1,
-                      ex.getDescrs().size() );
-        final PatternDescr exPattern = (PatternDescr) ex.getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      exPattern.getObjectType() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testNotBindindShouldBarf() throws Exception {
-        final DRLParser parser = parseResource( "not_with_binding_error.drl" );
-        parser.compilation_unit();
-        assertTrue( parser.hasErrors() );
-    }
-
-    public void testSimpleQuery() throws Exception {
-        final QueryDescr query = parseResource( "simple_query.drl" ).query();
-
-        assertNotNull( query );
-
-        assertEquals( "simple_query",
-                      query.getName() );
-
-        final AndDescr lhs = query.getLhs();
-
-        assertNotNull( lhs );
-
-        assertEquals( 3,
-                      lhs.getDescrs().size() );
-
-        // Check first pattern
-        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "foo3",
-                      first.getIdentifier() );
-        assertEquals( "Bar",
-                      first.getObjectType() );
-
-        assertEquals( 1,
-                      first.getConstraint().getDescrs().size() );
-
-        AndDescr and = (AndDescr) first.getConstraint();
-        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "3",
-                      constraint.getText() );
-
-        // Check second pattern
-        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
-        assertEquals( "foo4",
-                      second.getIdentifier() );
-        assertEquals( "Bar",
-                      second.getObjectType() );
-
-        and = (AndDescr) second.getConstraint();
-        assertEquals( 2,
-                      and.getDescrs().size() );
-        //check it has field bindings.
-        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
-        assertEquals( "a",
-                      fieldBindingDescr.getFieldName() );
-        assertEquals( "a4",
-                      fieldBindingDescr.getIdentifier() );
-
-        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
-
-        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertNotNull( constraint );
-
-        assertEquals( "a",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      constraint.getEvaluator() );
-        assertEquals( "4",
-                      constraint.getText() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testQueryRuleMixed() throws Exception {
-        final DRLParser parser = parseResource( "query_and_rule.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 4,
-                      pack.getRules().size() ); //as queries are rules
-        RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( "bar",
-                      rule.getName() );
-
-        QueryDescr query = (QueryDescr) pack.getRules().get( 1 );
-        assertEquals( "simple_query",
-                      query.getName() );
-
-        rule = (RuleDescr) pack.getRules().get( 2 );
-        assertEquals( "bar2",
-                      rule.getName() );
-
-        query = (QueryDescr) pack.getRules().get( 3 );
-        assertEquals( "simple_query2",
-                      query.getName() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testMultipleRules() throws Exception {
-        final DRLParser parser = parseResource( "multiple_rules.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pkg = parser.getPackageDescr();
-        final List rules = pkg.getRules();
-
-        assertEquals( 2,
-                      rules.size() );
-
-        final RuleDescr rule0 = (RuleDescr) rules.get( 0 );
-        assertEquals( "Like Stilton",
-                      rule0.getName() );
-
-        final RuleDescr rule1 = (RuleDescr) rules.get( 1 );
-        assertEquals( "Like Cheddar",
-                      rule1.getName() );
-
-        //checkout the first rule
-        AndDescr lhs = rule1.getLhs();
-        assertNotNull( lhs );
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
-                                      (String) rule0.getConsequence() );
-
-        // Check first pattern
-        PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "Cheese",
-                      first.getObjectType() );
-
-        //checkout the second rule
-        lhs = rule1.getLhs();
-        assertNotNull( lhs );
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
-                                      (String) rule1.getConsequence() );
-
-        // Check first pattern
-        first = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "Cheese",
-                      first.getObjectType() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testExpanderErrorsAfterExpansion() throws Exception {
-
-        final String name = "expander_post_errors.dslr";
-        final Expander expander = new DefaultExpander();
-        final String expanded = expander.expand( this.getReader( name ) );
-
-        final DRLParser parser = parse( name,
-                                        expanded );
-        parser.compilation_unit();
-        assertTrue( parser.hasErrors() );
-
-        final RecognitionException err = (RecognitionException) parser.getErrors().get( 0 );
-        assertEquals( 1,
-                      parser.getErrors().size() );
-
-        assertEquals( 5,
-                      err.line );
-    }
-
-    public void testExpanderLineSpread() throws Exception {
-        final DrlParser parser = new DrlParser();
-        final PackageDescr pkg = parser.parse( this.getReader( "expander_spread_lines.dslr" ),
-                                               this.getReader( "complex.dsl" ) );
-
-        assertFalse( parser.getErrors().toString(),
-                     parser.hasErrors() );
-
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-        assertNotNull( (String) rule.getConsequence() );
-
-    }
-
-    public void testExpanderMultipleConstraints() throws Exception {
-        final DrlParser parser = new DrlParser();
-        final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints.dslr" ),
-                                               this.getReader( "multiple_constraints.dsl" ) );
-
-        assertFalse( parser.getErrors().toString(),
-                     parser.hasErrors() );
-
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-
-        assertEquals( 2,
-                      pattern.getConstraint().getDescrs().size() );
-        assertEquals( "age",
-                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
-        assertEquals( "location",
-                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
-
-        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Bar",
-                      pattern.getObjectType() );
-
-        assertNotNull( (String) rule.getConsequence() );
-
-    }
-
-    public void testExpanderMultipleConstraintsFlush() throws Exception {
-        final DrlParser parser = new DrlParser();
-        //this is similar to the other test, but it requires a flush to add the constraints
-        final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints_flush.dslr" ),
-                                               this.getReader( "multiple_constraints.dsl" ) );
-
-        assertFalse( parser.getErrors().toString(),
-                     parser.hasErrors() );
-
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-
-        assertEquals( 2,
-                      pattern.getConstraint().getDescrs().size() );
-        assertEquals( "age",
-                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
-        assertEquals( "location",
-                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
-
-        assertNotNull( (String) rule.getConsequence() );
-
-    }
-
-    //    public void testExpanderUnExpandableErrorLines() throws Exception {
-    //
-    //        //stubb expander
-    //        final ExpanderResolver res = new ExpanderResolver() {
-    //            public Expander get(String name,
-    //                                String config) {
-    //                return new Expander() {
-    //                    public String expand(String scope,
-    //                                         String pattern) {
-    //                        if ( pattern.startsWith( "Good" ) ) {
-    //                            return pattern;
-    //                        } else {
-    //                            throw new IllegalArgumentException( "whoops" );
-    //                        }
-    //
-    //                    }
-    //                };
-    //            }
-    //        };
-    //
-    //        final DRLParser parser = parseResource( "expander_line_errors.dslr" );
-    //        parser.setExpanderResolver( res );
-    //        parser.compilation_unit();
-    //        assertTrue( parser.hasErrors() );
-    //
-    //        final List messages = parser.getErrorMessages();
-    //        assertEquals( messages.size(),
-    //                      parser.getErrors().size() );
-    //
-    //        assertEquals( 4,
-    //                      parser.getErrors().size() );
-    //        assertEquals( ExpanderException.class,
-    //                      parser.getErrors().get( 0 ).getClass() );
-    //        assertEquals( 8,
-    //                      ((RecognitionException) parser.getErrors().get( 0 )).line );
-    //        assertEquals( 10,
-    //                      ((RecognitionException) parser.getErrors().get( 1 )).line );
-    //        assertEquals( 12,
-    //                      ((RecognitionException) parser.getErrors().get( 2 )).line );
-    //        assertEquals( 13,
-    //                      ((RecognitionException) parser.getErrors().get( 3 )).line );
-    //
-    //        final PackageDescr pack = parser.getPackageDescr();
-    //        assertNotNull( pack );
-    //
-    //        final ExpanderException ex = (ExpanderException) parser.getErrors().get( 0 );
-    //        assertTrue( ex.getMessage().indexOf( "whoops" ) > -1 );
-    //
-    //    }
-
-    public void testBasicBinding() throws Exception {
-        final DRLParser parser = parseResource( "basic_binding.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pkg = parser.getPackageDescr();
-        final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
-
-        final AndDescr lhs = ruleDescr.getLhs();
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( 1,
-                      cheese.getConstraint().getDescrs().size() );
-        assertEquals( "Cheese",
-                      cheese.getObjectType() );
-        assertEquals( 1,
-                      lhs.getDescrs().size() );
-        final FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
-        assertEquals( "type",
-                      fieldBinding.getFieldName() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testBoundVariables() throws Exception {
-        final DRLParser parser = parseResource( "bindings.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pkg = parser.getPackageDescr();
-        final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
-
-        final AndDescr lhs = ruleDescr.getLhs();
-        assertEquals( 2,
-                      lhs.getDescrs().size() );
-        final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
-        assertEquals( "Cheese",
-                      cheese.getObjectType() );
-        assertEquals( 2,
-                      lhs.getDescrs().size() );
-        FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
-        assertEquals( "type",
-                      fieldBinding.getFieldName() );
-
-        FieldConstraintDescr fld = (FieldConstraintDescr) cheese.getConstraint().getDescrs().get( 1 );
-        LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        //LiteralDescr literalDescr = (LiteralDescr) cheese.getDescrs().get( 1 );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      literalDescr.getEvaluator() );
-        assertEquals( "stilton",
-                      literalDescr.getText() );
-
-        final PatternDescr person = (PatternDescr) lhs.getDescrs().get( 1 );
-        fieldBinding = (FieldBindingDescr) person.getConstraint().getDescrs().get( 0 );
-        assertEquals( "name",
-                      fieldBinding.getFieldName() );
-
-        fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 1 );
-        literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "name",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      literalDescr.getEvaluator() );
-        assertEquals( "bob",
-                      literalDescr.getText() );
-
-        fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 2 );
-        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "likes",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      variableDescr.getEvaluator() );
-        assertEquals( "$type",
-                      variableDescr.getIdentifier() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testOrNesting() throws Exception {
-        final DRLParser parser = parseResource( "or_nesting.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertNotNull( pack );
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-
-        final PatternDescr first = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      first.getObjectType() );
-
-        final AndDescr and = (AndDescr) or.getDescrs().get( 1 );
-        assertEquals( 2,
-                      and.getDescrs().size() );
-
-        final PatternDescr left = (PatternDescr) and.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      left.getObjectType() );
-
-        final PatternDescr right = (PatternDescr) and.getDescrs().get( 1 );
-        assertEquals( "Cheese",
-                      right.getObjectType() );
-    }
-
-    /** Test that explicit "&&", "||" works as expected */
-    public void testAndOrRules() throws Exception {
-        final DRLParser parser = parseResource( "and_or_rule.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertNotNull( pack );
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-
-        //we will have 2 children under the main And node
-        final AndDescr and = rule.getLhs();
-        assertEquals( 2,
-                      and.getDescrs().size() );
-
-        //check the "&&" part
-        final AndDescr join = (AndDescr) and.getDescrs().get( 0 );
-        assertEquals( 2,
-                      join.getDescrs().size() );
-
-        PatternDescr left = (PatternDescr) join.getDescrs().get( 0 );
-        PatternDescr right = (PatternDescr) join.getDescrs().get( 1 );
-        assertEquals( "Person",
-                      left.getObjectType() );
-        assertEquals( "Cheese",
-                      right.getObjectType() );
-
-        assertEquals( 1,
-                      left.getConstraint().getDescrs().size() );
-
-        FieldConstraintDescr fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
-        LiteralRestrictionDescr literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      literal.getEvaluator() );
-        assertEquals( "name",
-                      fld.getFieldName() );
-        assertEquals( "mark",
-                      literal.getText() );
-
-        assertEquals( 1,
-                      right.getConstraint().getDescrs().size() );
-
-        fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
-        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      literal.getEvaluator() );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( "stilton",
-                      literal.getText() );
-
-        //now the "||" part
-        final OrDescr or = (OrDescr) and.getDescrs().get( 1 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-        left = (PatternDescr) or.getDescrs().get( 0 );
-        right = (PatternDescr) or.getDescrs().get( 1 );
-        assertEquals( "Person",
-                      left.getObjectType() );
-        assertEquals( "Cheese",
-                      right.getObjectType() );
-        assertEquals( 1,
-                      left.getConstraint().getDescrs().size() );
-
-        fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
-        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      literal.getEvaluator() );
-        assertEquals( "name",
-                      fld.getFieldName() );
-        assertEquals( "mark",
-                      literal.getText() );
-
-        assertEquals( 1,
-                      right.getConstraint().getDescrs().size() );
-
-        fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
-        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "==",
-                      literal.getEvaluator() );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( "stilton",
-                      literal.getText() );
-
-        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    /** test basic foo : Fact() || Fact() stuff */
-    public void testOrWithBinding() throws Exception {
-        final DRLParser parser = parseResource( "or_binding.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-
-        final PatternDescr leftPattern = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      leftPattern.getObjectType() );
-        assertEquals( "foo",
-                      leftPattern.getIdentifier() );
-
-        final PatternDescr rightPattern = (PatternDescr) or.getDescrs().get( 1 );
-        assertEquals( "Person",
-                      rightPattern.getObjectType() );
-        assertEquals( "foo",
-                      rightPattern.getIdentifier() );
-
-        final PatternDescr cheeseDescr = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Cheese",
-                      cheeseDescr.getObjectType() );
-        assertEquals( null,
-                      cheeseDescr.getIdentifier() );
-
-        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    /** test basic foo : Fact() || Fact() stuff binding to an "or"*/
-    public void testOrBindingComplex() throws Exception {
-        final DRLParser parser = parseResource( "or_binding_complex.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-
-        //first fact
-        final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      firstFact.getObjectType() );
-        assertEquals( "foo",
-                      firstFact.getIdentifier() );
-
-        //second "option"
-        final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 1 );
-        assertEquals( "Person",
-                      secondFact.getObjectType() );
-        assertEquals( 1,
-                      secondFact.getConstraint().getDescrs().size() );
-        assertEquals( "foo",
-                      secondFact.getIdentifier() );
-
-        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testOrBindingWithBrackets() throws Exception {
-        final DRLParser parser = parseResource( "or_binding_with_brackets.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-
-        //first fact
-        final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      firstFact.getObjectType() );
-        assertEquals( "foo",
-                      firstFact.getIdentifier() );
-
-        //second "option"
-        final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      secondFact.getObjectType() );
-        assertEquals( "foo",
-                      secondFact.getIdentifier() );
-
-        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    /** */
-    public void testBracketsPrecedence() throws Exception {
-        final DRLParser parser = parseResource( "brackets_precedence.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final AndDescr rootAnd = (AndDescr) rule.getLhs().getDescrs().get( 0 );
-
-        assertEquals( 2,
-                      rootAnd.getDescrs().size() );
-
-        final OrDescr leftOr = (OrDescr) rootAnd.getDescrs().get( 0 );
-
-        assertEquals( 2,
-                      leftOr.getDescrs().size() );
-        final NotDescr not = (NotDescr) leftOr.getDescrs().get( 0 );
-        final PatternDescr foo1 = (PatternDescr) not.getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      foo1.getObjectType() );
-        final PatternDescr foo2 = (PatternDescr) leftOr.getDescrs().get( 1 );
-        assertEquals( "Foo",
-                      foo2.getObjectType() );
-
-        final OrDescr rightOr = (OrDescr) rootAnd.getDescrs().get( 1 );
-
-        assertEquals( 2,
-                      rightOr.getDescrs().size() );
-        final PatternDescr shoes = (PatternDescr) rightOr.getDescrs().get( 0 );
-        assertEquals( "Shoes",
-                      shoes.getObjectType() );
-        final PatternDescr butt = (PatternDescr) rightOr.getDescrs().get( 1 );
-        assertEquals( "Butt",
-                      butt.getObjectType() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testEvalMultiple() throws Exception {
-        final DRLParser parser = parseResource( "eval_multiple.drl" );
-        parser.compilation_unit();
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 4,
-                      rule.getLhs().getDescrs().size() );
-
-        final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEqualsIgnoreWhitespace( "abc(\"foo\") + 5",
-                                      (String) eval.getContent() );
-
-        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Foo",
-                      pattern.getObjectType() );
-
-    }
-
-    public void testWithEval() throws Exception {
-        final DRLParser parser = parseResource( "with_eval.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 3,
-                      rule.getLhs().getDescrs().size() );
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      pattern.getObjectType() );
-        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Bar",
-                      pattern.getObjectType() );
-
-        final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 2 );
-        assertEqualsIgnoreWhitespace( "abc(\"foo\")",
-                                      (String) eval.getContent() );
-        assertEqualsIgnoreWhitespace( "Kapow",
-                                      (String) rule.getConsequence() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testWithRetval() throws Exception {
-        final DRLParser parser = parseResource( "with_retval.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 1,
-                      col.getConstraint().getDescrs().size() );
-        assertEquals( "Foo",
-                      col.getObjectType() );
-        final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
-        final ReturnValueRestrictionDescr retval = (ReturnValueRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "a + b",
-                      retval.getContent() );
-        assertEquals( "name",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      retval.getEvaluator() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testWithPredicate() throws Exception {
-        final DRLParser parser = parseResource( "with_predicate.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        AndDescr and = (AndDescr) col.getConstraint();
-        assertEquals( 2,
-                      and.getDescrs().size() );
-
-        final FieldBindingDescr field = (FieldBindingDescr) and.getDescrs().get( 0 );
-        final PredicateDescr pred = (PredicateDescr) and.getDescrs().get( 1 );
-        assertEquals( "age",
-                      field.getFieldName() );
-        assertEquals( "$age2",
-                      field.getIdentifier() );
-        assertEqualsIgnoreWhitespace( "$age2 == $age1+2",
-                                      (String) pred.getContent() );
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-    }
-
-    public void testNotWithConstraint() throws Exception {
-        final DRLParser parser = parseResource( "not_with_constraint.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final FieldBindingDescr fieldBinding = (FieldBindingDescr) pattern.getConstraint().getDescrs().get( 0 );
-        assertEquals( "$likes",
-                      fieldBinding.getIdentifier() );
-
-        final NotDescr not = (NotDescr) rule.getLhs().getDescrs().get( 1 );
-        pattern = (PatternDescr) not.getDescrs().get( 0 );
-
-        final FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
-        final VariableRestrictionDescr boundVariable = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      boundVariable.getEvaluator() );
-        assertEquals( "$likes",
-                      boundVariable.getIdentifier() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testGlobal() throws Exception {
-        final DRLParser parser = parseResource( "globals.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        assertEquals( 1,
-                      pack.getImports().size() );
-        assertEquals( 2,
-                      pack.getGlobals().size() );
-
-        final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get( 0 );
-        assertEquals( "java.lang.String",
-                      foo.getType() );
-        assertEquals( "foo",
-                      foo.getIdentifier() );
-        final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get( 1 );
-        assertEquals( "java.lang.Integer",
-                      bar.getType() );
-        assertEquals( "bar",
-                      bar.getIdentifier() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testFunctions() throws Exception {
-        final DRLParser parser = parseResource( "functions.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 2,
-                      pack.getRules().size() );
-
-        final List functions = pack.getFunctions();
-        assertEquals( 2,
-                      functions.size() );
-
-        FunctionDescr func = (FunctionDescr) functions.get( 0 );
-        assertEquals( "functionA",
-                      func.getName() );
-        assertEquals( "String",
-                      func.getReturnType() );
-        assertEquals( 2,
-                      func.getParameterNames().size() );
-        assertEquals( 2,
-                      func.getParameterTypes().size() );
-        assertEquals( 4,
-                      func.getLine() );
-        assertEquals( 0,
-                      func.getColumn() );
-
-        assertEquals( "String",
-                      func.getParameterTypes().get( 0 ) );
-        assertEquals( "s",
-                      func.getParameterNames().get( 0 ) );
-
-        assertEquals( "Integer",
-                      func.getParameterTypes().get( 1 ) );
-        assertEquals( "i",
-                      func.getParameterNames().get( 1 ) );
-
-        assertEqualsIgnoreWhitespace( "foo();",
-                                      func.getText() );
-
-        func = (FunctionDescr) functions.get( 1 );
-        assertEquals( "functionB",
-                      func.getName() );
-        assertEqualsIgnoreWhitespace( "bar();",
-                                      func.getText() );
-
-        assertFalse( parser.hasErrors() );
-    }
-
-    public void testComment() throws Exception {
-        final DRLParser parser = parseResource( "comment.drl" );
-        parser.compilation_unit();
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertNotNull( pack );
-
-        assertEquals( "foo.bar",
-                      pack.getName() );
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-    }
-
-    public void testAttributes() throws Exception {
-        final RuleDescr rule = parseResource( "rule_attributes.drl" ).rule();
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEqualsIgnoreWhitespace( "bar();",
-                                      (String) rule.getConsequence() );
-
-        final List attrs = rule.getAttributes();
-        assertEquals( 6,
-                      attrs.size() );
-
-        AttributeDescr at = (AttributeDescr) attrs.get( 0 );
-        assertEquals( "salience",
-                      at.getName() );
-        assertEquals( "42",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 1 );
-        assertEquals( "agenda-group",
-                      at.getName() );
-        assertEquals( "my_group",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 2 );
-        assertEquals( "no-loop",
-                      at.getName() );
-        assertEquals( "true",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 3 );
-        assertEquals( "duration",
-                      at.getName() );
-        assertEquals( "42",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 4 );
-        assertEquals( "activation-group",
-                      at.getName() );
-        assertEquals( "my_activation_group",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 5 );
-        assertEquals( "lock-on-active",
-                      at.getName() );
-        assertEquals( "true",
-                      at.getValue() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testAttributes_alternateSyntax() throws Exception {
-        final RuleDescr rule = parseResource( "rule_attributes_alt.drl" ).rule();
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEqualsIgnoreWhitespace( "bar();",
-                                      (String) rule.getConsequence() );
-
-        final List attrs = rule.getAttributes();
-        assertEquals( 6,
-                      attrs.size() );
-
-        AttributeDescr at = (AttributeDescr) attrs.get( 0 );
-        assertEquals( "salience",
-                      at.getName() );
-        assertEquals( "42",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 1 );
-        assertEquals( "agenda-group",
-                      at.getName() );
-        assertEquals( "my_group",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 2 );
-        assertEquals( "no-loop",
-                      at.getName() );
-        assertEquals( "true",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 3 );
-        assertEquals( "lock-on-active",
-                      at.getName() );
-        assertEquals( "true",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 4 );
-        assertEquals( "duration",
-                      at.getName() );
-        assertEquals( "42",
-                      at.getValue() );
-
-        at = (AttributeDescr) attrs.get( 5 );
-        assertEquals( "activation-group",
-                      at.getName() );
-        assertEquals( "my_activation_group",
-                      at.getValue() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testEnumeration() throws Exception {
-        final RuleDescr rule = parseResource( "enumeration.drl" ).rule();
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Foo",
-                      col.getObjectType() );
-        assertEquals( 1,
-                      col.getConstraint().getDescrs().size() );
-        final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
-        final QualifiedIdentifierRestrictionDescr lit = (QualifiedIdentifierRestrictionDescr) fld.getRestrictions().get( 0 );
-
-        assertEquals( "bar",
-                      fld.getFieldName() );
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "Foo.BAR",
-                      lit.getText() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testInvalidSyntax_Catches() throws Exception {
-        parseResource( "invalid_syntax.drl" ).compilation_unit();
-        assertTrue( this.parser.hasErrors() );
-    }
-
-    public void testMultipleErrors() throws Exception {
-        parseResource( "multiple_errors.drl" ).compilation_unit();
-        assertTrue( this.parser.hasErrors() );
-        assertEquals( 2,
-                      this.parser.getErrors().size() );
-    }
-
-    public void testExtraLhsNewline() throws Exception {
-        parseResource( "extra_lhs_newline.drl" ).compilation_unit();
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testPackageGarbage() throws Exception {
-
-        parseResource( "package_garbage.drl" ).compilation_unit();
-        assertTrue( this.parser.hasErrors() );
-    }
-
-    public void testSoundsLike() throws Exception {
-        parseResource( "soundslike_operator.drl" ).compilation_unit();
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        RuleDescr rule = (RuleDescr) this.parser.getPackageDescr().getRules().get( 0 );
-        PatternDescr pat = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
-        pat.getConstraint();
-    }
-
-    public void testPackageAttributes() throws Exception {
-        parseResource( "package_attributes.drl" ).compilation_unit();
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        PackageDescr pkg = this.parser.getPackageDescr();
-        AttributeDescr at = (AttributeDescr) pkg.getAttributes().get( 0 );
-        assertEquals( "agenda-group",
-                      at.getName() );
-        assertEquals( "x",
-                      at.getValue() );
-        at = (AttributeDescr) pkg.getAttributes().get( 1 );
-        assertEquals( "dialect",
-                      at.getName() );
-        assertEquals( "java",
-                      at.getValue() );
-
-        assertEquals( 2,
-                      pkg.getRules().size() );
-
-        assertEquals( 2,
-                      pkg.getImports().size() );
-
-        RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( "bar",
-                      rule.getName() );
-        at = (AttributeDescr) rule.getAttributes().get( 0 );
-        assertEquals( "agenda-group",
-                      at.getName() );
-        assertEquals( "x",
-                      at.getValue() );
-        at = (AttributeDescr) rule.getAttributes().get( 1 );
-        assertEquals( "dialect",
-                      at.getName() );
-        assertEquals( "java",
-                      at.getValue() );
-
-        rule = (RuleDescr) pkg.getRules().get( 1 );
-        assertEquals( "baz",
-                      rule.getName() );
-        at = (AttributeDescr) rule.getAttributes().get( 0 );
-        assertEquals( "dialect",
-                      at.getName() );
-        assertEquals( "mvel",
-                      at.getValue() );
-        at = (AttributeDescr) rule.getAttributes().get( 1 );
-        assertEquals( "agenda-group",
-                      at.getName() );
-        assertEquals( "x",
-                      at.getValue() );
-
-    }
-
-    public void testStatementOrdering1() throws Exception {
-        parseResource( "statement_ordering_1.drl" );
-        this.parser.compilation_unit();
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-
-        assertEquals( 2,
-                      pkg.getRules().size() );
-
-        assertEquals( "foo",
-                      ((RuleDescr) pkg.getRules().get( 0 )).getName() );
-        assertEquals( "bar",
-                      ((RuleDescr) pkg.getRules().get( 1 )).getName() );
-
-        assertEquals( 2,
-                      pkg.getFunctions().size() );
-
-        assertEquals( "cheeseIt",
-                      ((FunctionDescr) pkg.getFunctions().get( 0 )).getName() );
-        assertEquals( "uncheeseIt",
-                      ((FunctionDescr) pkg.getFunctions().get( 1 )).getName() );
-
-        assertEquals( 4,
-                      pkg.getImports().size() );
-        assertEquals( "im.one",
-                      ((ImportDescr) pkg.getImports().get( 0 )).getTarget() );
-        assertEquals( "im.two",
-                      ((ImportDescr) pkg.getImports().get( 1 )).getTarget() );
-        assertEquals( "im.three",
-                      ((ImportDescr) pkg.getImports().get( 2 )).getTarget() );
-        assertEquals( "im.four",
-                      ((ImportDescr) pkg.getImports().get( 3 )).getTarget() );
-
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testRuleNamesStartingWithNumbers() throws Exception {
-        parseResource( "rule_names_number_prefix.drl" ).compilation_unit();
-
-        assertFalse( this.parser.getErrors().toString(),
-                     this.parser.hasErrors() );
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-
-        assertEquals( 2,
-                      pkg.getRules().size() );
-
-        assertEquals( "1. Do Stuff!",
-                      ((RuleDescr) pkg.getRules().get( 0 )).getName() );
-        assertEquals( "2. Do More Stuff!",
-                      ((RuleDescr) pkg.getRules().get( 1 )).getName() );
-    }
-
-    public void testEvalWithNewline() throws Exception {
-        parseResource( "eval_with_newline.drl" ).compilation_unit();
-
-        if ( this.parser.hasErrors() ) {
-            System.err.println( this.parser.getErrorMessages() );
-        }
-        assertFalse( this.parser.hasErrors() );
-    }
-
-    public void testEvalWithSemicolon() throws Exception {
-        parseResource( "eval_with_semicolon.drl" ).compilation_unit();
-
-        assertTrue( this.parser.hasErrors() );
-        assertEquals( 1,
-                      this.parser.getErrorMessages().size() );
-        assertTrue( ((String) this.parser.getErrorMessages().get( 0 )).indexOf( "Trailing semi-colon not allowed" ) >= 0 );
-    }
-
-    public void testEndPosition() throws Exception {
-        parseResource( "test_EndPosition.drl" ).compilation_unit();
-        final RuleDescr rule = (RuleDescr) this.parser.getPackageDescr().getRules().get( 0 );
-        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( 6,
-                      col.getLine() );
-
-        assertEquals( 8,
-                      col.getEndLine() );
-
-    }
-
-    public void testQualifiedClassname() throws Exception {
-        parseResource( "qualified_classname.drl" ).compilation_unit();
-
-        assertFalse( this.parser.hasErrors() );
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
-        final PatternDescr p = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
-        assertEquals( "com.cheeseco.Cheese",
-                      p.getObjectType() );
-    }
-
-    public void testAccumulate() throws Exception {
-        final DRLParser parser = parseResource( "accumulate.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
-        assertEqualsIgnoreWhitespace( "int x = 0 ;",
-                                      accum.getInitCode() );
-        assertEqualsIgnoreWhitespace( "x++;",
-                                      accum.getActionCode() );
-        assertNull( accum.getReverseCode() );
-        assertEqualsIgnoreWhitespace( "new Integer(x)",
-                                      accum.getResultCode() );
-
-        assertFalse( accum.isExternalFunction() );
-
-        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-    }
-
-    public void testAccumulateWithBindings() throws Exception {
-        final DRLParser parser = parseResource( "accumulate_with_bindings.drl" );
-        parser.compilation_unit();
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
-        assertEqualsIgnoreWhitespace( "$counter",
-                                      outPattern.getIdentifier() );
-        assertEqualsIgnoreWhitespace( "int x = 0 ;",
-                                      accum.getInitCode() );
-        assertEqualsIgnoreWhitespace( "x++;",
-                                      accum.getActionCode() );
-        assertEqualsIgnoreWhitespace( "new Integer(x)",
-                                      accum.getResultCode() );
-
-        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-    }
-
-    public void testCollect() throws Exception {
-        final DRLParser parser = parseResource( "collect.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final CollectDescr collect = (CollectDescr) outPattern.getSource();
-
-        final PatternDescr pattern = (PatternDescr) collect.getInputPattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-    }
-
-    public void testPredicate() throws Exception {
-        final PatternDescr pattern = new PatternDescr();
-        parse( "$var : attr -> ( $var.equals(\"xyz\") )" ).constraints( pattern );
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        final List constraints = pattern.getConstraint().getDescrs();
-        assertEquals( 2,
-                      constraints.size() );
-
-        final FieldBindingDescr field = (FieldBindingDescr) constraints.get( 0 );
-        final PredicateDescr predicate = (PredicateDescr) constraints.get( 1 );
-        assertEquals( "$var",
-                      field.getIdentifier() );
-        assertEquals( "attr",
-                      field.getFieldName() );
-        assertEquals( " $var.equals(\"xyz\") ",
-                      predicate.getContent() );
-    }
-
-    public void testPredicate2() throws Exception {
-        final PatternDescr pattern = new PatternDescr();
-        // predicates are also prefixed by the eval keyword
-        parse( "eval( $var.equals(\"xyz\") )" ).constraints( pattern );
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        final List constraints = pattern.getConstraint().getDescrs();
-        assertEquals( 1,
-                      constraints.size() );
-
-        final PredicateDescr predicate = (PredicateDescr) constraints.get( 0 );
-        assertEquals( " $var.equals(\"xyz\") ",
-                      predicate.getContent() );
-    }
-
-    public void testEscapedStrings() throws Exception {
-        final RuleDescr rule = parseResource( "escaped-string.drl" ).rule();
-
-        assertNotNull( rule );
-
-        assertEquals( "test_Quotes",
-                      rule.getName() );
-
-        final String expected = "String s = \"\\\"\\n\\t\\\\\";";
-
-        assertEqualsIgnoreWhitespace( expected,
-                                      (String) rule.getConsequence() );
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-    }
-
-    public void testNestedCEs() throws Exception {
-        final RuleDescr rule = parseResource( "nested_conditional_elements.drl" ).rule();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        assertNotNull( rule );
-
-        final AndDescr root = rule.getLhs();
-        final NotDescr not1 = (NotDescr) root.getDescrs().get( 0 );
-        final AndDescr and1 = (AndDescr) not1.getDescrs().get( 0 );
-
-        final PatternDescr state = (PatternDescr) and1.getDescrs().get( 0 );
-        final NotDescr not2 = (NotDescr) and1.getDescrs().get( 1 );
-        final AndDescr and2 = (AndDescr) not2.getDescrs().get( 0 );
-        final PatternDescr person = (PatternDescr) and2.getDescrs().get( 0 );
-        final PatternDescr cheese = (PatternDescr) and2.getDescrs().get( 1 );
-
-        final PatternDescr person2 = (PatternDescr) root.getDescrs().get( 1 );
-        final OrDescr or = (OrDescr) root.getDescrs().get( 2 );
-        final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 0 );
-        final PatternDescr cheese3 = (PatternDescr) or.getDescrs().get( 1 );
-
-        assertEquals( state.getObjectType(),
-                      "State" );
-        assertEquals( person.getObjectType(),
-                      "Person" );
-        assertEquals( cheese.getObjectType(),
-                      "Cheese" );
-        assertEquals( person2.getObjectType(),
-                      "Person" );
-        assertEquals( cheese2.getObjectType(),
-                      "Cheese" );
-        assertEquals( cheese3.getObjectType(),
-                      "Cheese" );
-    }
-
-    public void testForall() throws Exception {
-        final DRLParser parser = parseResource( "forall.drl" );
-        parser.compilation_unit();
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final ForallDescr forall = (ForallDescr) rule.getLhs().getDescrs().get( 0 );
-
-        assertEquals( 2,
-                      forall.getDescrs().size() );
-        final PatternDescr pattern = forall.getBasePattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-        final List remaining = forall.getRemainingPatterns();
-        assertEquals( 1,
-                      remaining.size() );
-        final PatternDescr cheese = (PatternDescr) remaining.get( 0 );
-        assertEquals( "Cheese",
-                      cheese.getObjectType() );
-    }
-
-    public void testMemberof() throws Exception {
-        final String text = "Country( $cities : city )\nPerson( city memberOf $cities )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-
-        assertEquals( 2,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
-        assertEquals( "memberOf",
-                      restr.getEvaluator() );
-        assertFalse( restr.isNegated() );
-        assertEquals( "$cities",
-                      restr.getIdentifier() );
-    }
-
-    public void testNotMemberof() throws Exception {
-        final String text = "Country( $cities : city )\nPerson( city not memberOf $cities )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-
-        assertEquals( 2,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
-        assertEquals( "memberOf",
-                      restr.getEvaluator() );
-        assertTrue( restr.isNegated() );
-        assertEquals( "$cities",
-                      restr.getIdentifier() );
-    }
-
-    public void testInOperator() throws Exception {
-        final RuleDescr rule = parseResource( "in_operator_test.drl" ).rule();
-
-        assertFalse( this.parser.getErrors().toString(),
-                     this.parser.hasErrors() );
-        assertNotNull( rule );
-
-        assertEqualsIgnoreWhitespace( "consequence();",
-                                      (String) rule.getConsequence() );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        //The first pattern, with 2 restrictions on a single field (plus a connective)
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
-        assertEquals( RestrictionConnectiveDescr.AND,
-                      fld.getRestriction().getConnective() );
-        assertEquals( 2,
-                      fld.getRestrictions().size() );
-        assertEquals( "age",
-                      fld.getFieldName() );
-
-        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( ">",
-                      lit.getEvaluator() );
-        assertEquals( "30",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "40",
-                      lit.getText() );
-
-        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
-        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Vehicle",
-                      pattern.getObjectType() );
-        assertEquals( 2,
-                      pattern.getConstraint().getDescrs().size() );
-
-        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( 1,
-                      fld.getRestrictions().size() );
-
-        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
-        assertEquals( RestrictionConnectiveDescr.OR,
-                      or.getConnective() );
-        assertEquals( 2,
-                      or.getRestrictions().size() );
-
-        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "sedan",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
-        assertEquals( "==",
-                      lit.getEvaluator() );
-        assertEquals( "wagon",
-                      lit.getText() );
-
-        //now the second field
-        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
-        assertEquals( 1,
-                      fld.getRestrictions().size() );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "3",
-                      lit.getText() );
-
-    }
-
-    public void testNotInOperator() throws Exception {
-        final RuleDescr rule = parseResource( "notin_operator_test.drl" ).rule();
-
-        assertFalse( this.parser.getErrors().toString(),
-                     this.parser.hasErrors() );
-        assertNotNull( rule );
-
-        assertEqualsIgnoreWhitespace( "consequence();",
-                                      (String) rule.getConsequence() );
-        assertEquals( "simple_rule",
-                      rule.getName() );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        //The first pattern, with 2 restrictions on a single field (plus a connective)
-        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-        assertEquals( 1,
-                      pattern.getConstraint().getDescrs().size() );
-
-        FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
-        assertEquals( 2,
-                      fld.getRestrictions().size() );
-        assertEquals( "age",
-                      fld.getFieldName() );
-
-        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( ">",
-                      lit.getEvaluator() );
-        assertEquals( "30",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "40",
-                      lit.getText() );
-
-        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
-        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "Vehicle",
-                      pattern.getObjectType() );
-        assertEquals( 2,
-                      pattern.getConstraint().getDescrs().size() );
-
-        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
-        assertEquals( 2,
-                      fld.getRestrictions().size() );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( "type",
-                      fld.getFieldName() );
-        assertEquals( "!=",
-                      lit.getEvaluator() );
-        assertEquals( "sedan",
-                      lit.getText() );
-
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
-        assertEquals( "!=",
-                      lit.getEvaluator() );
-        assertEquals( "wagon",
-                      lit.getText() );
-
-        //now the second field
-        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
-        assertEquals( 1,
-                      fld.getRestrictions().size() );
-        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-        assertEquals( "<",
-                      lit.getEvaluator() );
-        assertEquals( "3",
-                      lit.getText() );
-
-    }
-
-    public void testConstraintAndConnective() throws Exception {
-        final String text = "Person( age < 42 && location==\"atlanta\")";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 2,
-                      pattern.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        fcd = (FieldConstraintDescr) pattern.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-    }
-
-    public void testConstraintOrConnective() throws Exception {
-        final String text = "Person( age < 42 || location==\"atlanta\")";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) or.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        fcd = (FieldConstraintDescr) or.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-    }
-
-    public void testConstraintConnectivesPrecedence() throws Exception {
-        final String text = "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
-        assertEquals( 3,
-                      or.getDescrs().size() );
-
-        AndDescr and = (AndDescr) or.getDescrs().get( 0 );
-        assertEquals( 2,
-                      and.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( "<",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "42",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "atlanta",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        and = (AndDescr) or.getDescrs().get( 1 );
-        assertEquals( 2,
-                      and.getDescrs().size() );
-        fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( ">",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "20",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "Seatle",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        fcd = (FieldConstraintDescr) or.getDescrs().get( 2 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "Chicago",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-    }
-
-    public void testConstraintConnectivesPrecedenceWithBracks() throws Exception {
-        final String text = "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
-        assertEquals( 2,
-                      or1.getDescrs().size() );
-
-        AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
-        assertEquals( 2,
-                      and1.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( "<",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "42",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        OrDescr or2 = (OrDescr) and1.getDescrs().get( 1 );
-        fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "atlanta",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        AndDescr and2 = (AndDescr) or2.getDescrs().get( 1 );
-        assertEquals( 2,
-                      and2.getDescrs().size() );
-        fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( ">",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "20",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "Seatle",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        fcd = (FieldConstraintDescr) or1.getDescrs().get( 1 );
-        assertEquals( "location",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "Chicago",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-    }
-
-    public void testConstraintConnectivesPrecedenceWithBracks2() throws Exception {
-        final String text = "Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) )";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
-        assertEquals( 3,
-                      or1.getDescrs().size() );
-
-        AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
-        AndDescr and2 = (AndDescr) or1.getDescrs().get( 1 );
-        AndDescr and3 = (AndDescr) or1.getDescrs().get( 2 );
-
-        assertEquals( 2,
-                      and1.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "70",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) and1.getDescrs().get( 1 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "black",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        assertEquals( 2,
-                      and2.getDescrs().size() );
-        fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "40",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "pink",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        assertEquals( 2,
-                      and3.getDescrs().size() );
-        fcd = (FieldConstraintDescr) and3.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "12",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        OrDescr or2 = (OrDescr) and3.getDescrs().get( 1 );
-        fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "yellow",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-        fcd = (FieldConstraintDescr) or2.getDescrs().get( 1 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "blue",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-    }
-
-    public void testRestrictionConnectives() throws Exception {
-
-        // the expression bellow must generate the following tree:
-        //
-        //                       AND
-        //                        |
-        //                       OR
-        //        /---------------+-------------------\
-        //       AND             AND                 AND
-        //    /---+---\       /---+---\           /---+---\
-        //   FC   FC  FC     FC       FC         FC       OR
-        //                                             /---+---\
-        //                                            FC       FC
-        //
-        final String text = "Person( teste == 3 && ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-
-        OrDescr orConstr = (OrDescr) pattern.getDescrs().get( 0 );
-
-        assertEquals( 3,
-                      orConstr.getDescrs().size() );
-
-        AndDescr andConstr1 = (AndDescr) orConstr.getDescrs().get( 0 );
-
-        assertEquals( 3,
-                      andConstr1.getDescrs().size() );
-
-        FieldConstraintDescr fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 0 );
-        assertEquals( "teste",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "3",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-
-        fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 1 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestriction().getRestrictions().get( 0 );
-        RestrictionConnectiveDescr and1 = (RestrictionConnectiveDescr) or.getRestrictions().get( 0 );
-        RestrictionConnectiveDescr and2 = (RestrictionConnectiveDescr) or.getRestrictions().get( 1 );
-
-        assertEquals( ">",
-                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "60",
-                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getText() );
-
-        assertEquals( "<",
-                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getEvaluator() );
-        assertEquals( "70",
-                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getText() );
-
-        assertEquals( ">",
-                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "50",
-                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getText() );
-
-        assertEquals( "<",
-                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getEvaluator() );
-        assertEquals( "55",
-                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getText() );
-
-        fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 2 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "black",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        AndDescr andConstr2 = (AndDescr) orConstr.getDescrs().get( 1 );
-        assertEquals( 2,
-                      andConstr2.getDescrs().size() );
-        fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "40",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 1 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "pink",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        AndDescr andConstr3 = (AndDescr) orConstr.getDescrs().get( 2 );
-        assertEquals( 2,
-                      andConstr3.getDescrs().size() );
-        fcd = (FieldConstraintDescr) andConstr3.getDescrs().get( 0 );
-        assertEquals( "age",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "12",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        OrDescr orConstr2 = (OrDescr) andConstr3.getDescrs().get( 1 );
-
-        fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 0 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "yellow",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-        fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 1 );
-        assertEquals( "hair",
-                      fcd.getFieldName() );
-
-        assertEquals( "==",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "blue",
-                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
-    }
-
-    public void testConstraintConnectivesMatches() throws Exception {
-        final String text = "Person( name matches \"mark\" || matches \"bob\" )";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.fact( null );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
-        assertEquals( "name",
-                      fcd.getFieldName() );
-
-        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestrictions().get( 0 );
-
-        assertEquals( 2,
-                      or.getRestrictions().size() );
-
-        assertEquals( "matches",
-                      ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getEvaluator() );
-        assertEquals( "mark",
-                      ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getText() );
-
-        assertEquals( "matches",
-                      ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getEvaluator() );
-        assertEquals( "bob",
-                      ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getText() );
-
-    }
-
-    public void testNotContains() throws Exception {
-        final String text = "City( $city : city )\nCountry( cities not contains $city )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 2,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
-        assertEquals( "contains",
-                      restr.getEvaluator() );
-        assertTrue( restr.isNegated() );
-        assertEquals( "$city",
-                      restr.getIdentifier() );
-    }
-
-    public void testNotMatches() throws Exception {
-        final String text = "Message( text not matches '[abc]*' )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        LiteralRestrictionDescr restr = (LiteralRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
-        assertEquals( "matches",
-                      restr.getEvaluator() );
-        assertTrue( restr.isNegated() );
-        assertEquals( "[abc]*",
-                      restr.getText() );
-    }
-
-    public void testRestrictions() throws Exception {
-        final String text = "Foo( bar > 1 || == 1 )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fieldConstr.getRestrictions().get( 0 );
-        LiteralRestrictionDescr gt1 = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
-        LiteralRestrictionDescr eq1 = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
-
-        assertEquals( ">",
-                      gt1.getEvaluator() );
-        assertEquals( false,
-                      gt1.isNegated() );
-        assertEquals( 1,
-                      ((Number) eq1.getValue()).intValue() );
-        assertEquals( "==",
-                      eq1.getEvaluator() );
-        assertEquals( false,
-                      eq1.isNegated() );
-        assertEquals( 1,
-                      ((Number) eq1.getValue()).intValue() );
-
-    }
-
-    public void testSemicolon() throws Exception {
-        parseResource( "semicolon.drl" );
-
-        this.parser.compilation_unit();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-        assertEquals( "org.drools",
-                      pkg.getName() );
-        assertEquals( 1,
-                      pkg.getGlobals().size() );
-        assertEquals( 3,
-                      pkg.getRules().size() );
-
-        final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 2,
-                      rule1.getLhs().getDescrs().size() );
-
-        final RuleDescr query1 = (RuleDescr) pkg.getRules().get( 1 );
-        assertEquals( 3,
-                      query1.getLhs().getDescrs().size() );
-
-        final RuleDescr rule2 = (RuleDescr) pkg.getRules().get( 2 );
-        assertEquals( 2,
-                      rule2.getLhs().getDescrs().size() );
-    }
-
-    public void testEval() throws Exception {
-        parseResource( "eval_parsing.drl" );
-
-        this.parser.compilation_unit();
-
-        assertFalse( this.parser.getErrorMessages().toString(),
-                     this.parser.hasErrors() );
-
-        final PackageDescr pkg = this.parser.getPackageDescr();
-        assertEquals( "org.drools",
-                      pkg.getName() );
-        assertEquals( 1,
-                      pkg.getRules().size() );
-
-        final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
-        assertEquals( 1,
-                      rule1.getLhs().getDescrs().size() );
-    }
-
-    public void testAccumulateReverse() throws Exception {
-        final DRLParser parser = parseResource( "accumulateReverse.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accum = (AccumulateDescr) out.getSource();
-        assertEqualsIgnoreWhitespace( "int x = 0 ;",
-                                      accum.getInitCode() );
-        assertEqualsIgnoreWhitespace( "x++;",
-                                      accum.getActionCode() );
-        assertEqualsIgnoreWhitespace( "x--;",
-                                      accum.getReverseCode() );
-        assertEqualsIgnoreWhitespace( "new Integer(x)",
-                                      accum.getResultCode() );
-        assertFalse( accum.isExternalFunction() );
-
-        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-    }
-
-    public void testAccumulateExternalFunction() throws Exception {
-        final DRLParser parser = parseResource( "accumulateExternalFunction.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accum = (AccumulateDescr) out.getSource();
-        assertEqualsIgnoreWhitespace( "$age",
-                                      accum.getExpression() );
-        assertEqualsIgnoreWhitespace( "average",
-                                      accum.getFunctionIdentifier() );
-        assertTrue( accum.isExternalFunction() );
-
-        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
-        assertEquals( "Person",
-                      pattern.getObjectType() );
-    }
-
-    public void testCollectWithNestedFrom() throws Exception {
-        final DRLParser parser = parseResource( "collect_with_nested_from.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final CollectDescr collect = (CollectDescr) out.getSource();
-
-        PatternDescr person = (PatternDescr) collect.getInputPattern();
-        assertEquals( "Person",
-                      person.getObjectType() );
-
-        final CollectDescr collect2 = (CollectDescr) person.getSource();
-
-        final PatternDescr people = collect2.getInputPattern();
-        assertEquals( "People",
-                      people.getObjectType() );
-    }
-
-    public void testAccumulateWithNestedFrom() throws Exception {
-        final DRLParser parser = parseResource( "accumulate_with_nested_from.drl" );
-        parser.compilation_unit();
-
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-
-        assertFalse( parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accumulate = (AccumulateDescr) out.getSource();
-
-        PatternDescr person = (PatternDescr) accumulate.getInputPattern();
-        assertEquals( "Person",
-                      person.getObjectType() );
-
-        final CollectDescr collect2 = (CollectDescr) person.getSource();
-
-        final PatternDescr people = collect2.getInputPattern();
-        assertEquals( "People",
-                      people.getObjectType() );
-    }
-
-    public void testAccessorPaths() throws Exception {
-        final String text = "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      descrs.getDescrs().size() );
-        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
-        assertEquals( "org.drools.Message",
-                      pat.getObjectType() );
-
-        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
-        QualifiedIdentifierRestrictionDescr restr = (QualifiedIdentifierRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
-        assertEquals( "matches",
-                      restr.getEvaluator() );
-        assertTrue( restr.isNegated() );
-        assertEquals( "$c.property",
-                      restr.getText() );
-    }
-
-    public void testOrCE() throws Exception {
-        final DRLParser parser = parseResource( "or_ce.drl" );
-        parser.compilation_unit();
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 2,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr person = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "Person",
-                      person.getObjectType() );
-        assertEquals( "$p",
-                      person.getIdentifier() );
-
-        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-
-        final PatternDescr cheese1 = (PatternDescr) or.getDescrs().get( 0 );
-        assertEquals( "Cheese",
-                      cheese1.getObjectType() );
-        assertEquals( "$c",
-                      cheese1.getIdentifier() );
-        final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 1 );
-        assertEquals( "Cheese",
-                      cheese2.getObjectType() );
-        assertNull( cheese2.getIdentifier() );
-    }
-
-    public void testRuleParseLhs2() throws Exception {
-        final String text = "Message( Message.HELLO )\n";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        assertTrue( parser.hasErrors() );
-    }
-
-    public void testRuleSingleLine() throws Exception {
-        final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( 10 );
-        RuleDescr rule = parser.rule();
-
-        assertFalse( parser.hasErrors() );
-        assertEquals( "another test",
-                      rule.getName() );
-        assertEquals( "System.out.println(1); ",
-                      rule.getConsequence() );
-    }
-
-    public void testRuleTwoLines() throws Exception {
-        final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\n end";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( 10 );
-        RuleDescr rule = parser.rule();
-
-        assertFalse( parser.hasErrors() );
-        assertEquals( "another test",
-                      rule.getName() );
-        assertEquals( "System.out.println(1);\n ",
-                      rule.getConsequence() );
-    }
-
-    public void testRuleParseLhs3() throws Exception {
-        final String text = "(or\nnot Person()\n(and Cheese()\nMeat()\nWine()))";
-        final AndDescr descrs = new AndDescr();
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-        parser.setLineOffset( descrs.getLine() );
-        parser.normal_lhs_block( descrs );
-        if ( parser.hasErrors() ) {
-            System.err.println( parser.getErrorMessages() );
-        }
-        assertFalse( parser.hasErrors() );
-        assertEquals( 1,
-                      descrs.getDescrs().size() );
-        OrDescr or = (OrDescr) descrs.getDescrs().get( 0 );
-        assertEquals( 2,
-                      or.getDescrs().size() );
-        NotDescr not = (NotDescr) or.getDescrs().get( 0 );
-        AndDescr and = (AndDescr) or.getDescrs().get( 1 );
-        assertEquals( 1,
-                      not.getDescrs().size() );
-        PatternDescr person = (PatternDescr) not.getDescrs().get( 0 );
-        assertEquals( "Person",
-                      person.getObjectType() );
-        assertEquals( 3,
-                      and.getDescrs().size() );
-        PatternDescr cheese = (PatternDescr) and.getDescrs().get( 0 );
-        assertEquals( "Cheese",
-                      cheese.getObjectType() );
-        PatternDescr meat = (PatternDescr) and.getDescrs().get( 1 );
-        assertEquals( "Meat",
-                      meat.getObjectType() );
-        PatternDescr wine = (PatternDescr) and.getDescrs().get( 2 );
-        assertEquals( "Wine",
-                      wine.getObjectType() );
-
-    }
-
-    public void testAccumulateMultiPattern() throws Exception {
-        final DRLParser parser = parseResource( "accumulate_multi_pattern.drl" );
-        parser.compilation_unit();
-
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 1,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
-        assertEqualsIgnoreWhitespace( "$counter",
-                                      outPattern.getIdentifier() );
-        assertEqualsIgnoreWhitespace( "int x = 0 ;",
-                                      accum.getInitCode() );
-        assertEqualsIgnoreWhitespace( "x++;",
-                                      accum.getActionCode() );
-        assertEqualsIgnoreWhitespace( "new Integer(x)",
-                                      accum.getResultCode() );
-
-        final AndDescr and = (AndDescr) accum.getInput();
-        assertEquals( 2,
-                      and.getDescrs().size() );
-        final PatternDescr person = (PatternDescr) and.getDescrs().get( 0 );
-        final PatternDescr cheese = (PatternDescr) and.getDescrs().get( 1 );
-        assertEquals( "Person",
-                      person.getObjectType() );
-        assertEquals( "Cheese",
-                      cheese.getObjectType() );
-    }
-
-    public void testErrorMessageForMisplacedParenthesis() throws Exception {
-        final DRLParser parser = parseResource( "misplaced_parenthesis.drl" );
-        parser.compilation_unit();
-
-        assertTrue( "Parser should have raised errors",
-                    parser.hasErrors() );
-
-        for ( Iterator it = parser.getErrors().iterator(); it.hasNext(); ) {
-            Object error = it.next();
-            if ( !(error instanceof MismatchedTokenException) ) {
-                fail( "Error should be an instance of MismatchedTokenException" );
-            }
-        }
-
-    }
-
-    public void testNPEOnParser() throws Exception {
-        final DRLParser parser = parseResource( "npe_on_parser.drl" );
-        parser.compilation_unit();
-
-        assertTrue( "Parser should have raised errors",
-                    parser.hasErrors() );
-
-        List errors = parser.getErrors();
-        assertEquals( 2,
-                      errors.size() );
-
-        assertTrue( errors.get( 0 ) instanceof MismatchedTokenException ); // "action" is a reserved word
-        assertTrue( errors.get( 1 ) instanceof NoViableAltException ); // no title in the rule
-
-    }
-
-    public void testCommaMisuse() throws Exception {
-        final DRLParser parser = parseResource( "comma_misuse.drl" );
-        try {
-            parser.compilation_unit();
-
-            assertTrue( "Parser should have raised errors",
-                        parser.hasErrors() );
-            assertEquals( 3,
-                          parser.getErrors().size() );
-
-        } catch ( NullPointerException npe ) {
-            fail( "Should not raise NPE" );
-        }
-    }
-
-    public void testPluggableOperators() throws Exception {
-        final DRLParser parser = parseResource( "pluggable_operators.drl" );
-        parser.compilation_unit();
-
-        assertFalse( "Parser should not have raised errors: " + parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-        assertEquals( 1,
-                      pack.getRules().size() );
-        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-        assertEquals( 5,
-                      rule.getLhs().getDescrs().size() );
-
-        final PatternDescr eventA = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-        assertEquals( "$a",
-                      eventA.getIdentifier() );
-        assertEquals( "EventA",
-                      eventA.getObjectType() );
-
-        final PatternDescr eventB = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
-        assertEquals( "$b",
-                      eventB.getIdentifier() );
-        assertEquals( "EventB",
-                      eventB.getObjectType() );
-        assertEquals( 1,
-                      eventB.getConstraint().getDescrs().size() );
-        final FieldConstraintDescr fcdB = (FieldConstraintDescr) eventB.getConstraint().getDescrs().get( 0 );
-        assertEquals( 1,
-                      fcdB.getRestrictions().size() );
-        assertTrue( fcdB.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
-        final VariableRestrictionDescr rb = (VariableRestrictionDescr) fcdB.getRestrictions().get( 0 );
-        assertEquals( "after",
-                      rb.getEvaluator() );
-        assertEquals( "$a",
-                      rb.getText() );
-        assertEquals( "1,10",
-                      rb.getParameterText() );
-        assertFalse( rb.isNegated() );
-
-        final PatternDescr eventC = (PatternDescr) rule.getLhs().getDescrs().get( 2 );
-        assertEquals( "$c",
-                      eventC.getIdentifier() );
-        assertEquals( "EventC",
-                      eventC.getObjectType() );
-        assertEquals( 1,
-                      eventC.getConstraint().getDescrs().size() );
-        final FieldConstraintDescr fcdC = (FieldConstraintDescr) eventC.getConstraint().getDescrs().get( 0 );
-        assertEquals( 1,
-                      fcdC.getRestrictions().size() );
-        assertTrue( fcdC.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
-        final VariableRestrictionDescr rc = (VariableRestrictionDescr) fcdC.getRestrictions().get( 0 );
-        assertEquals( "finishes",
-                      rc.getEvaluator() );
-        assertEquals( "$b",
-                      rc.getText() );
-        assertNull( rc.getParameterText() );
-        assertFalse( rc.isNegated() );
-
-        final PatternDescr eventD = (PatternDescr) rule.getLhs().getDescrs().get( 3 );
-        assertEquals( "$d",
-                      eventD.getIdentifier() );
-        assertEquals( "EventD",
-                      eventD.getObjectType() );
-        assertEquals( 1,
-                      eventD.getConstraint().getDescrs().size() );
-        final FieldConstraintDescr fcdD = (FieldConstraintDescr) eventD.getConstraint().getDescrs().get( 0 );
-        assertEquals( 1,
-                      fcdD.getRestrictions().size() );
-        assertTrue( fcdD.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
-        final VariableRestrictionDescr rd = (VariableRestrictionDescr) fcdD.getRestrictions().get( 0 );
-        assertEquals( "starts",
-                      rd.getEvaluator() );
-        assertEquals( "$a",
-                      rd.getText() );
-        assertNull( rd.getParameterText() );
-        assertTrue( rd.isNegated() );
-
-        final PatternDescr eventE = (PatternDescr) rule.getLhs().getDescrs().get( 4 );
-        assertEquals( "$e",
-                      eventE.getIdentifier() );
-        assertEquals( "EventE",
-                      eventE.getObjectType() );
-        assertEquals( 1,
-                      eventE.getConstraint().getDescrs().size() );
-        final FieldConstraintDescr fcdE = (FieldConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );
-        assertEquals( 1,
-                      fcdE.getRestrictions().size() );
-        assertTrue( fcdE.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
-        final VariableRestrictionDescr re = (VariableRestrictionDescr) fcdE.getRestrictions().get( 0 );
-        assertEquals( "before",
-                      re.getEvaluator() );
-        assertEquals( "$b",
-                      re.getText() );
-        assertEquals( "1, 10",
-                      re.getParameterText() );
-        assertTrue( re.isNegated() );
-    }
-
-    public void testTypeDeclaration() throws Exception {
-        final DRLParser parser = parseResource( "declare_type.drl" );
-        parser.compilation_unit();
-
-        assertFalse( "Parser should not raise errors: " + parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        final PackageDescr pack = parser.getPackageDescr();
-
-        final List<TypeDeclarationDescr> declarations = pack.getTypeDeclarations();
-
-        assertEquals( 1,
-                      declarations.size() );
-
-        final TypeDeclarationDescr descr = declarations.get( 0 );
-        assertEquals( "event",
-                      descr.getMetaAttribute( "role" ) );
-        assertEquals( "org.drools.events.Call",
-                      descr.getMetaAttribute( "class" ) );
-        assertEquals( "duration",
-                      descr.getMetaAttribute( "duration" ) );
-        assertEquals( "timestamp",
-                      descr.getMetaAttribute( "timestamp" ) );
-    }
-
-    public void testTypeDeclarationWithFields() throws Exception {
-        final DRLParser parser = parseResource( "declare_type_with_fields.drl" );
-        parser.compilation_unit();
-        assertFalse( "Parser should not raise errors: " + parser.getErrorMessages().toString(),
-                parser.hasErrors() );
-
-        PackageDescr pkg = parser.getPackageDescr();
-        List<TypeDeclarationDescr> td = pkg.getTypeDeclarations();
-        assertEquals(2, td.size());
-
-        TypeDeclarationDescr d = td.get(0);
-        assertEquals("SomeFact", d.getTypeName());
-        assertEquals(2, d.getFields().size());
-        assertTrue(d.getFields().containsKey("name"));
-        assertTrue(d.getFields().containsKey("age"));
-
-        TypeFieldDescr f = d.getFields().get("name");
-        assertEquals("String", f.getPattern().getObjectType());
-
-        f = d.getFields().get("age");
-        assertEquals("Integer", f.getPattern().getObjectType());
-
-
-        d = td.get(1);
-        assertEquals("AnotherFact", d.getTypeName());
-
-    }
-
-    public void testEntryPoint() throws Exception {
-        final String text = "StockTick( symbol==\"ACME\") from entry-point StreamA";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.pattern_source();
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
-        assertEquals( "symbol",
-                      fcd.getFieldName() );
-
-        assertNotNull( pattern.getSource() );
-        EntryPointDescr entry = (EntryPointDescr) pattern.getSource();
-        assertEquals( "StreamA",
-                      entry.getEntryId() );
-    }
-
-    public void testBehaviorDecl() throws Exception {
-        final String text = "StockTick( symbol==\"ACME\") over window:time(60000) from entry-point StreamA";
-        final CharStream charStream = new ANTLRStringStream( text );
-        final DRLLexer lexer = new DRLLexer( charStream );
-        final TokenStream tokenStream = new CommonTokenStream( lexer );
-        final DRLParser parser = new DRLParser( tokenStream );
-
-        PatternDescr pattern = (PatternDescr) parser.pattern_source();
-        assertFalse( parser.getErrorMessages().toString(),
-                     parser.hasErrors() );
-
-        assertEquals( 1,
-                      pattern.getDescrs().size() );
-        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
-        assertEquals( "symbol",
-                      fcd.getFieldName() );
-
-        assertNotNull( pattern.getSource() );
-        EntryPointDescr entry = (EntryPointDescr) pattern.getSource();
-        assertEquals( "StreamA",
-                      entry.getEntryId() );
-
-        assertEquals( 1,
-                      pattern.getBehaviors().size() );
-        SlidingWindowDescr window = (SlidingWindowDescr) pattern.getBehaviors().get( 0 );
-        assertEquals( "time",
-                      window.getType() );
-        assertEquals( "60000",
-                      window.getParameters() );
-    }
-
-    private DRLParser parse(final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        return this.parser;
-    }
-
-    private DRLParser parse(final String source,
-                            final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        this.parser.setSource( source );
-        return this.parser;
-    }
-
-    private Reader getReader(final String name) throws Exception {
-        final InputStream in = getClass().getResourceAsStream( name );
-
-        return new InputStreamReader( in );
-    }
-
-    private DRLParser parseResource(final String name) throws Exception {
-
-        //        System.err.println( getClass().getResource( name ) );
-        final Reader reader = getReader( name );
-
-        final StringBuffer text = new StringBuffer();
-
-        final char[] buf = new char[1024];
-        int len = 0;
-
-        while ( (len = reader.read( buf )) >= 0 ) {
-            text.append( buf,
-                         0,
-                         len );
-        }
-
-        return parse( name,
-                      text.toString() );
-    }
-
-    private CharStream newCharStream(final String text) {
-        return new ANTLRStringStream( text );
-    }
-
-    private DRLLexer newLexer(final CharStream charStream) {
-        return new DRLLexer( charStream );
-    }
-
-    private TokenStream newTokenStream(final Lexer lexer) {
-        return new CommonTokenStream( lexer );
-    }
-
-    private DRLParser newParser(final TokenStream tokenStream) {
-        final DRLParser p = new DRLParser( tokenStream );
-        //p.setParserDebug( true );
-        return p;
-    }
-
-    private void assertEqualsIgnoreWhitespace(final String expected,
-                                              final String actual) {
-        final String cleanExpected = expected.replaceAll( "\\s+",
-                                                          "" );
-        final String cleanActual = actual.replaceAll( "\\s+",
-                                                      "" );
-
-        assertEquals( cleanExpected,
-                      cleanActual );
-    }
-
-    private void prettyPrintErrors() {
-        final List msgs = this.parser.getErrorMessages();
-        for ( final Iterator iter = msgs.iterator(); iter.hasNext(); ) {
-            final String err = (String) iter.next();
-            System.out.println( err );
-
-        }
-    }
-
+package org.drools.lang;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.drools.compiler.DrlParser;
+import org.drools.lang.descr.AccessorDescr;
+import org.drools.lang.descr.AccumulateDescr;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.CollectDescr;
+import org.drools.lang.descr.EntryPointDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldAccessDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
+import org.drools.lang.descr.ForallDescr;
+import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+
+public class RuleParserTest extends TestCase {
+
+    private DescrBuilderTree walker;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.walker = null;
+    }
+
+    protected void tearDown() throws Exception {
+        this.walker = null;
+        super.tearDown();
+    }
+
+    public void testPackage_OneSegment() throws Exception {
+        final String packageName = (String) parse("package_statement","package_statement", "package foo" );
+        assertEquals( "foo",
+                      packageName );
+    }
+
+    public void testPackage_MultipleSegments() throws Exception {
+        final String packageName = (String) parse("package_statement","package_statement", "package foo.bar.baz;" );
+        assertEquals( "foo.bar.baz",
+                      packageName );
+    }
+
+    public void testEmptyPackage() throws Exception {
+        final String source = "package foo.bar.baz";
+        final DrlParser parser = new DrlParser();
+        final PackageDescr pkg = parser.parse( new StringReader( source ) );
+        assertFalse( parser.hasErrors() );
+        assertEquals( "foo.bar.baz",
+                      pkg.getName() );
+    }
+
+    public void testCompilationUnit() throws Exception {
+        final String source = "package foo; import com.foo.Bar; import com.foo.Baz;";
+        parse("compilation_unit","compilation_unit", source );
+        assertEquals( "foo",
+                      this.walker.getPackageDescr().getName() );
+        assertEquals( 2,
+                      this.walker.getPackageDescr().getImports().size() );
+        ImportDescr impdescr = (ImportDescr) this.walker.getPackageDescr().getImports().get( 0 );
+        assertEquals( "com.foo.Bar",
+                      impdescr.getTarget() );
+        assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
+                      impdescr.getStartCharacter() );
+        assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
+                      impdescr.getEndCharacter() );
+
+        impdescr = (ImportDescr) this.walker.getPackageDescr().getImports().get( 1 );
+        assertEquals( "com.foo.Baz",
+                      impdescr.getTarget() );
+        assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
+                      impdescr.getStartCharacter() );
+        assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
+                      impdescr.getEndCharacter() );
+    }
+    
+    public void testDialect() throws Exception {
+        final String source = "dialect 'mvel'";
+        parse("compilation_unit","compilation_unit", source );
+        AttributeDescr attr = (AttributeDescr) this.walker.getPackageDescr().getAttributes().get(0);
+        assertEquals( "dialect", attr.getName() );
+        assertEquals( "mvel", attr.getValue() );
+    }
+
+    public void testDialect2() throws Exception {
+        final String source = "dialect \"mvel\"";
+        parse("compilation_unit","compilation_unit", source );
+        AttributeDescr attr = (AttributeDescr) this.walker.getPackageDescr().getAttributes().get(0);
+        assertEquals( "dialect", attr.getName() );
+        assertEquals( "mvel", attr.getValue() );
+    }
+
+    public void testEmptyRule() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "empty_rule.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "empty",
+                      rule.getName() );
+        assertNotNull( rule.getLhs() );
+        assertNotNull( rule.getConsequence() );
+    }
+
+    //FIXME Keywords END and THEN should not be used as identifiers: try to enable it
+    public void FIXME_testKeywordCollisions() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "eol_funny_business.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+
+        assertEquals( 1,
+                      pkg.getRules().size() );
+    }
+
+    
+    public void testTemplates() throws Exception {
+
+        parseResource("compilation_unit","compilation_unit",  "test_Templates.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+
+        assertEquals( 1,
+                      pkg.getRules().size() );
+        assertEquals( 2,
+                      pkg.getFactTemplates().size() );
+
+        FactTemplateDescr fact1 = (FactTemplateDescr) pkg.getFactTemplates().get( 0 );
+        assertEquals( "Cheese",
+                      fact1.getName() );
+        assertEquals( 2,
+                      fact1.getFields().size() );
+
+        assertEquals( "name",
+                      ((FieldTemplateDescr) fact1.getFields().get( 0 )).getName() );
+        assertEquals( "String",
+                      ((FieldTemplateDescr) fact1.getFields().get( 0 )).getClassType() );
+
+        assertEquals( "age",
+                      ((FieldTemplateDescr) fact1.getFields().get( 1 )).getName() );
+        assertEquals( "Integer",
+                      ((FieldTemplateDescr) fact1.getFields().get( 1 )).getClassType() );
+
+        fact1 = null;
+
+        final FactTemplateDescr fact2 = (FactTemplateDescr) pkg.getFactTemplates().get( 1 );
+        assertEquals( "Wine",
+                      fact2.getName() );
+        assertEquals( 3,
+                      fact2.getFields().size() );
+
+        assertEquals( "name",
+                      ((FieldTemplateDescr) fact2.getFields().get( 0 )).getName() );
+        assertEquals( "String",
+                      ((FieldTemplateDescr) fact2.getFields().get( 0 )).getClassType() );
+
+        assertEquals( "year",
+                      ((FieldTemplateDescr) fact2.getFields().get( 1 )).getName() );
+        assertEquals( "String",
+                      ((FieldTemplateDescr) fact2.getFields().get( 1 )).getClassType() );
+
+        assertEquals( "accolades",
+                      ((FieldTemplateDescr) fact2.getFields().get( 2 )).getName() );
+        assertEquals( "String[]",
+                      ((FieldTemplateDescr) fact2.getFields().get( 2 )).getClassType() );
+    }
+
+    public void testTernaryExpression() throws Exception {
+
+        parseResource("compilation_unit","compilation_unit", "ternary_expression.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 1,
+                      pkg.getRules().size() );
+
+        assertEqualsIgnoreWhitespace( "if (speed > speedLimit ? true : false;) pullEmOver();",
+                                      (String) rule.getConsequence() );
+    }
+
+    public void FIXME_testLatinChars() throws Exception {
+        final DrlParser parser = new DrlParser();
+        final Reader drl = new InputStreamReader( this.getClass().getResourceAsStream( "latin-sample.dslr" ) );
+        final Reader dsl = new InputStreamReader( this.getClass().getResourceAsStream( "latin.dsl" ) );
+
+        final PackageDescr pkg = parser.parse( drl,
+                                               dsl );
+
+        //MN: will get some errors due to the char encoding on my FC5 install
+        //others who use the right encoding may not see this, feel free to uncomment
+        //the following assertion.
+        assertFalse( parser.hasErrors() );
+
+        assertEquals( "br.com.auster.drools.sample",
+                      pkg.getName() );
+        assertEquals( 1,
+                      pkg.getRules().size() );
+
+    }
+
+    public void testFunctionWithArrays() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "function_arrays.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+
+        assertEquals( "foo",
+                      pkg.getName() );
+        assertEquals( 1,
+                      pkg.getRules().size() );
+
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+        assertEqualsIgnoreWhitespace( "yourFunction(new String[3] {\"a\",\"b\",\"c\"});",
+                                      (String) rule.getConsequence() );
+        final FunctionDescr func = (FunctionDescr) pkg.getFunctions().get( 0 );
+
+        assertEquals( "String[]",
+                      func.getReturnType() );
+        assertEquals( "args[]",
+                      func.getParameterNames().get( 0 ) );
+        assertEquals( "String",
+                      func.getParameterTypes().get( 0 ) );
+    }
+
+    public void testAlmostEmptyRule() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "almost_empty_rule.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "almost_empty",
+                      rule.getName() );
+        assertNotNull( rule.getLhs() );
+        assertEquals( "",
+                      ((String) rule.getConsequence()).trim() );
+    }
+
+    public void testQuotedStringNameRule() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "quoted_string_name_rule.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "quoted string name",
+                      rule.getName() );
+        assertNotNull( rule.getLhs() );
+        assertEquals( "",
+                      ((String) rule.getConsequence()).trim() );
+    }
+
+    public void testNoLoop() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "no-loop.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "rule1",
+                      rule.getName() );
+        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+        assertEquals( "false",
+                      att.getValue() );
+        assertEquals( "no-loop",
+                      att.getName() );
+    }
+
+    public void testAutofocus() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "autofocus.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "rule1",
+                      rule.getName() );
+        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+        assertEquals( "true",
+                      att.getValue() );
+        assertEquals( "auto-focus",
+                      att.getName() );
+    }
+
+    public void testRuleFlowGroup() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "ruleflowgroup.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "rule1",
+                      rule.getName() );
+        final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+        assertEquals( "a group",
+                      att.getValue() );
+        assertEquals( "ruleflow-group",
+                      att.getName() );
+    }
+
+    public void testConsequenceWithDeclaration() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "declaration-in-consequence.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "myrule",
+                      rule.getName() );
+
+        final String expected = "int i = 0; i = 1; i / 1; i == 1; i(i); i = 'i'; i.i.i; i\\i; i<i; i>i; i=\"i\";  ++i;" + "i++; --i; i--; i += i; i -= i; i *= i; i /= i;" + "int i = 5;" + "for(int j; j<i; ++j) {" + "System.out.println(j);}"
+                                + "Object o = new String(\"Hello\");" + "String s = (String) o;";
+
+        assertEqualsIgnoreWhitespace( expected,
+                                      (String) rule.getConsequence() );
+        assertTrue( ((String) rule.getConsequence()).indexOf( "++" ) > 0 );
+        assertTrue( ((String) rule.getConsequence()).indexOf( "--" ) > 0 );
+        assertTrue( ((String) rule.getConsequence()).indexOf( "+=" ) > 0 );
+        assertTrue( ((String) rule.getConsequence()).indexOf( "==" ) > 0 );
+
+        //System.out.println(( String ) rule.getConsequence());
+        //note, need to assert that "i++" is preserved as is, no extra spaces.
+    }
+
+    public void testRuleParseLhs() throws Exception {
+        final String text = "Person(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\") \n";
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+    }
+
+    public void testLiteralBoolAndNegativeNumbersRule() throws Exception {
+    	final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "literal_bool_and_negative.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertNotNull( rule.getLhs() );
+        assertEqualsIgnoreWhitespace( "cons();",
+                                      (String) rule.getConsequence() );
+
+        final AndDescr lhs = rule.getLhs();
+        assertEquals( 3,
+                      lhs.getDescrs().size() );
+
+        PatternDescr pattern = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+        AndDescr fieldAnd = (AndDescr) pattern.getConstraint();
+        FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "false",
+                      lit.getText() );
+        assertEquals( "bar",
+                      fld.getFieldName() );
+
+        pattern = (PatternDescr) lhs.getDescrs().get( 1 );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        fieldAnd = (AndDescr) pattern.getConstraint();
+        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( ">",
+                      lit.getEvaluator() );
+        assertEquals( "-42",
+                      lit.getText() );
+        assertEquals( "boo",
+                      fld.getFieldName() );
+
+        pattern = (PatternDescr) lhs.getDescrs().get( 2 );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        //lit = (LiteralDescr) col.getDescrs().get( 0 );
+
+        fieldAnd = (AndDescr) pattern.getConstraint();
+        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( ">",
+                      lit.getEvaluator() );
+        assertEquals( "-42.42",
+                      lit.getText() );
+        assertEquals( "boo",
+                      fld.getFieldName() );
+    }
+
+    public void testChunkWithoutParens() throws Exception {
+        String input = "( foo )";
+        ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+        assertEquals( "( foo )",
+        		input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+    }
+
+    public void testChunkWithParens() throws Exception {
+        String input = "(fnord())";
+        ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+        assertEquals( "(fnord())",
+        		input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+    }
+
+    public void testChunkWithParensAndQuotedString() throws Exception {
+        String input = "( fnord( \"cheese\" ) )";
+        ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+        assertEquals( "( fnord( \"cheese\" ) )",
+        		input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+    }
+
+    public void testChunkWithRandomCharac5ters() throws Exception {
+        String input = "( %*9dkj)";
+        ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+        assertEquals( "( %*9dkj)",
+        		input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+    }
+
+    public void testEmptyPattern() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "test_EmptyPattern.drl" );
+
+        final PackageDescr packageDescr = this.walker.getPackageDescr();
+        assertEquals( 1,
+                      packageDescr.getRules().size() );
+        final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
+        assertEquals( "simple rule",
+                      ruleDescr.getName() );
+        assertNotNull( ruleDescr.getLhs() );
+        assertEquals( 1,
+                      ruleDescr.getLhs().getDescrs().size() );
+        final PatternDescr patternDescr = (PatternDescr) ruleDescr.getLhs().getDescrs().get( 0 );
+        assertEquals( 0,
+                      patternDescr.getConstraint().getDescrs().size() ); //this may be null, not sure as the test doesn't get this far...
+        assertEquals( "Cheese",
+                      patternDescr.getObjectType() );
+
+    }
+
+    public void testSimpleMethodCallWithFrom() throws Exception {
+
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "test_SimpleMethodCallWithFrom.drl" );
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FromDescr from = (FromDescr) pattern.getSource();
+        final AccessorDescr method = (AccessorDescr) from.getDataSource();
+
+        assertEquals( "something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
+                      method.toString() );
+    }
+
+    public void testSimpleFunctionCallWithFrom() throws Exception {
+
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "test_SimpleFunctionCallWithFrom.drl" );
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FromDescr from = (FromDescr) pattern.getSource();
+        final AccessorDescr func = (AccessorDescr) from.getDataSource();
+
+        assertEquals( "doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
+                      func.toString() );
+    }
+
+    public void testSimpleAccessorWithFrom() throws Exception {
+
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "test_SimpleAccessorWithFrom.drl" );
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FromDescr from = (FromDescr) pattern.getSource();
+        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+        assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
+
+        assertEquals( "something.doIt",
+                      accessor.toString() );
+    }
+
+    public void testSimpleAccessorAndArgWithFrom() throws Exception {
+
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "test_SimpleAccessorArgWithFrom.drl" );
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FromDescr from = (FromDescr) pattern.getSource();
+        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+        assertNotNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
+
+        assertEquals( "something.doIt[\"key\"]",
+                      accessor.toString() );
+    }
+
+    public void testComplexChainedAcessor() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "test_ComplexChainedCallWithFrom.drl" );
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FromDescr from = (FromDescr) pattern.getSource();
+        final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+        assertEquals( "doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]",
+                      accessor.toString() );
+    }
+
+    //        public void testFrom() throws Exception {
+    //            final RuleDescr rule = parseResource( "from.drl" ).rule();
+    //
+    //            if(parser.hasErrors()) {
+    //                System.err.println(parser.getErrorMessages());
+    //            }
+    //            assertFalse(parser.hasErrors());
+    //
+    //            assertNotNull( rule );
+    //
+    //            assertEquals( "using_from",
+    //                          rule.getName() );
+    //
+    //            assertEquals(9, rule.getLhs().getDescrs().size());
+    //
+    //            FromDescr from = (FromDescr) rule.getLhs().getDescrs().get(0);
+    //
+    //            assertEquals(3, from.getLine());
+    //
+    //            assertEquals("Foo", from.getReturnedPattern().getObjectType());
+    //            assertTrue(from.getDataSource() instanceof FieldAccessDescr);
+    //            assertEquals("baz", ((FieldAccessDescr) from.getDataSource()).getFieldName());
+    //            assertEquals("bar", ((FieldAccessDescr) from.getDataSource()).getVariableName());
+    //
+    //
+    //            ArgumentValueDescr arg = null;
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(1);
+    //            assertEquals("Foo", from.getReturnedPattern().getObjectType());
+    //            assertEquals(0, from.getReturnedPattern().getDescrs().size());
+    //            FieldAccessDescr fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+    //            assertEquals(ArgumentValueDescr.STRING,  arg.getType() );
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(2);
+    //            fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+    //            assertEquals(ArgumentValueDescr.VARIABLE,  arg.getType() );
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(3);
+    //            fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+    //            arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+    //            assertEquals(ArgumentValueDescr.INTEGRAL,  arg.getType() );
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(4);
+    //            assertEquals("Whee", from.getReturnedColumn().getObjectType());
+    //            assertEquals(1, from.getReturnedColumn().getDescrs().size());
+    //            assertTrue(from.getDataSource() instanceof FunctionCallDescr);
+    //            assertEquals("whee", ((FunctionCallDescr) from.getDataSource()).getName());
+    //            assertEquals(1, ((FunctionCallDescr) from.getDataSource()).getArguments().size());
+    //            arg = ( (ArgumentValueDescr )((FunctionCallDescr) from.getDataSource()).getArguments().get(0));
+    //            assertEquals("y", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.STRING, arg.getType());
+    //
+    //            assertEquals(7, from.getLine());
+    //            assertEquals(7, from.getReturnedColumn().getLine());
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(5);
+    //            assertEquals("Foo", from.getReturnedColumn().getObjectType());
+    //            assertEquals(1, from.getReturnedColumn().getDescrs().size());
+    //            assertEquals("f", from.getReturnedColumn().getIdentifier());
+    //            assertTrue(from.getDataSource() instanceof MethodAccessDescr);
+    //            assertEquals("bar", ((MethodAccessDescr) from.getDataSource()).getVariableName());
+    //            assertEquals("la", ((MethodAccessDescr) from.getDataSource()).getMethodName());
+    //            assertEquals(1, ((MethodAccessDescr) from.getDataSource()).getArguments().size());
+    //            arg = (ArgumentValueDescr) ((MethodAccessDescr) from.getDataSource()).getArguments().get(0);
+    //
+    //
+    //            assertEquals("x", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.VARIABLE, arg.getType());
+    //
+    //            assertEqualsIgnoreWhitespace("whee();", ( String ) rule.getConsequence());
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(6);
+    //            assertEquals("wa", ((FunctionCallDescr)from.getDataSource()).getName());
+    //
+    //            from = (FromDescr) rule.getLhs().getDescrs().get(7);
+    //            MethodAccessDescr meth = (MethodAccessDescr)from.getDataSource();
+    //            assertEquals("wa", meth.getMethodName());
+    //            assertEquals("la", meth.getVariableName());
+    //
+    //            arg = (ArgumentValueDescr) meth.getArguments().get(0);
+    //            assertEquals("42", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType());
+    //
+    //            arg = (ArgumentValueDescr) meth.getArguments().get(1);
+    //            assertEquals("42.42", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.DECIMAL, arg.getType());
+    //
+    //            arg = (ArgumentValueDescr) meth.getArguments().get(2);
+    //            assertEquals("false", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.BOOLEAN, arg.getType());
+    //
+    //            arg = (ArgumentValueDescr) meth.getArguments().get(3);
+    //            assertEquals("null", arg.getValue());
+    //            assertEquals(ArgumentValueDescr.NULL, arg.getType());
+    //
+    //            assertEquals("Bam", ((PatternDescr)rule.getLhs().getDescrs().get(8)).getObjectType());
+    //        }
+
+    public void testSimpleRule() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "simple_rule.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        assertEquals( 7,
+                      rule.getConsequenceLine() );
+        assertEquals( 2,
+                      rule.getConsequencePattern() );
+
+        final AndDescr lhs = rule.getLhs();
+
+        assertNotNull( lhs );
+
+        assertEquals( 3,
+                      lhs.getDescrs().size() );
+
+        //System.err.println( lhs.getDescrs() );
+
+        // Check first pattern
+        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "foo3",
+                      first.getIdentifier() );
+        assertEquals( "Bar",
+                      first.getObjectType() );
+
+        assertEquals( 1,
+                      first.getConstraint().getDescrs().size() );
+
+        AndDescr fieldAnd = (AndDescr) first.getConstraint();
+        FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "3",
+                      constraint.getText() );
+
+        // Check second pattern
+        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+        assertEquals( "foo4",
+                      second.getIdentifier() );
+        assertEquals( "Bar",
+                      second.getObjectType() );
+
+        //System.err.println( second.getDescrs() );
+
+        fieldAnd = (AndDescr) second.getConstraint();
+        assertEquals( 2,
+                      fieldAnd.getDescrs().size() );
+
+        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) fieldAnd.getDescrs().get( 0 );
+        assertEquals( "a",
+                      fieldBindingDescr.getFieldName() );
+        assertEquals( "a4",
+                      fieldBindingDescr.getIdentifier() );
+
+        fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 1 );
+        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "4",
+                      constraint.getText() );
+
+        // Check third pattern
+        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+        assertNull( third.getIdentifier() );
+        assertEquals( "Baz",
+                      third.getObjectType() );
+
+        assertEqualsIgnoreWhitespace( "if ( a == b ) { " + "  assert( foo3 );" + "} else {" + "  retract( foo4 );" + "}" + "  System.out.println( a4 );",
+                                      (String) rule.getConsequence() );
+    }
+
+    public void testRestrictionsMultiple() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "restrictions_test.drl" );
+
+        assertNotNull( rule );
+
+        assertEqualsIgnoreWhitespace( "consequence();",
+                                      (String) rule.getConsequence() );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        //The first pattern, with 2 restrictions on a single field (plus a connective)
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        AndDescr and = (AndDescr) pattern.getConstraint();
+        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        assertEquals( RestrictionConnectiveDescr.AND,
+                      ((RestrictionConnectiveDescr) fld.getRestriction()).getConnective() );
+        assertEquals( 2,
+                      fld.getRestrictions().size() );
+        assertEquals( "age",
+                      fld.getFieldName() );
+
+        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( ">",
+                      lit.getEvaluator() );
+        assertEquals( "30",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "40",
+                      lit.getText() );
+
+        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Vehicle",
+                      pattern.getObjectType() );
+        assertEquals( 2,
+                      pattern.getConstraint().getDescrs().size() );
+
+        and = (AndDescr) pattern.getConstraint();
+        fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( 1,
+                      fld.getRestrictions().size() );
+        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
+        assertEquals( RestrictionConnectiveDescr.OR,
+                      or.getConnective() );
+        assertEquals( 2,
+                      or.getRestrictions().size() );
+        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "sedan",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "wagon",
+                      lit.getText() );
+
+        //now the second field
+        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+        assertEquals( 1,
+                      fld.getRestrictions().size() );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "3",
+                      lit.getText() );
+
+    }
+
+    public void testLineNumberInAST() throws Exception {
+        //also see testSimpleExpander to see how this works with an expander (should be the same).
+
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "simple_rule.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        assertEquals( 7,
+                      rule.getConsequenceLine() );
+        assertEquals( 2,
+                      rule.getConsequencePattern() );
+
+        final AndDescr lhs = rule.getLhs();
+
+        assertNotNull( lhs );
+
+        assertEquals( 3,
+                      lhs.getDescrs().size() );
+
+        // Check first pattern
+        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "foo3",
+                      first.getIdentifier() );
+        assertEquals( "Bar",
+                      first.getObjectType() );
+        assertEquals( 1,
+                      first.getConstraint().getDescrs().size() );
+
+        // Check second pattern
+        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+        assertEquals( "foo4",
+                      second.getIdentifier() );
+        assertEquals( "Bar",
+                      second.getObjectType() );
+
+        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+        assertEquals( "Baz",
+                      third.getObjectType() );
+
+        assertEquals( 4,
+                      first.getLine() );
+        assertEquals( 5,
+                      second.getLine() );
+        assertEquals( 6,
+                      third.getLine() );
+    }
+
+    public void testLineNumberIncludingCommentsInRHS() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "test_CommentLineNumbersInConsequence.drl" );
+
+        final String rhs = (String) ((RuleDescr) this.walker.getPackageDescr().getRules().get( 0 )).getConsequence();
+        String expected = "  \t//woot\n  \tfirst\n  \t\n  \t//\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \n";
+        assertEquals( expected,
+                      rhs );
+    }
+
+    public void testLhsSemicolonDelim() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "lhs_semicolon_delim.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        final AndDescr lhs = rule.getLhs();
+
+        assertNotNull( lhs );
+
+        assertEquals( 3,
+                      lhs.getDescrs().size() );
+
+        //System.err.println( lhs.getDescrs() );
+
+        // Check first pattern
+        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "foo3",
+                      first.getIdentifier() );
+        assertEquals( "Bar",
+                      first.getObjectType() );
+
+        assertEquals( 1,
+                      first.getConstraint().getDescrs().size() );
+
+        //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
+        AndDescr and = (AndDescr) first.getConstraint();
+        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "3",
+                      constraint.getText() );
+
+        // Check second pattern
+        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+        assertEquals( "foo4",
+                      second.getIdentifier() );
+        assertEquals( "Bar",
+                      second.getObjectType() );
+
+        and = (AndDescr) second.getConstraint();
+        assertEquals( 2,
+                      and.getDescrs().size() );
+
+        //System.err.println( second.getDescrs() );
+
+        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
+        assertEquals( "a",
+                      fieldBindingDescr.getFieldName() );
+        assertEquals( "a4",
+                      fieldBindingDescr.getIdentifier() );
+
+        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+
+        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "4",
+                      constraint.getText() );
+
+        // Check third pattern
+        final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+        assertNull( third.getIdentifier() );
+        assertEquals( "Baz",
+                      third.getObjectType() );
+
+        assertEqualsIgnoreWhitespace( "if ( a == b ) { " + "  assert( foo3 );" + "} else {" + "  retract( foo4 );" + "}" + "  System.out.println( a4 );",
+                                      (String) rule.getConsequence() );
+    }
+
+    public void testNotNode() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "rule_not.drl" );
+
+        assertNotNull( rule );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        final AndDescr lhs = rule.getLhs();
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
+        assertEquals( 1,
+                      not.getDescrs().size() );
+        final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+        assertEquals( "Cheese",
+                      pattern.getObjectType() );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        final AndDescr and = (AndDescr) pattern.getConstraint();
+        final FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        final LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "stilton",
+                      lit.getText() );
+        assertEquals( "type",
+                      fld.getFieldName() );
+    }
+
+    public void testFunctionImport() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "test_FunctionImport.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+        assertEquals( 2,
+                      pkg.getFunctionImports().size() );
+
+        assertEquals( "abd.def.x",
+                      ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getTarget() );
+        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getStartCharacter() == -1 );
+        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getEndCharacter() == -1 );
+        assertEquals( "qed.wah.*",
+                      ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getTarget() );
+        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getStartCharacter() == -1 );
+        assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getEndCharacter() == -1 );
+    }
+
+    public void testNotExistWithBrackets() throws Exception {
+
+        parseResource("compilation_unit","compilation_unit", "not_exist_with_brackets.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+        assertNotNull( rule );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        final AndDescr lhs = rule.getLhs();
+        assertEquals( 2,
+                      lhs.getDescrs().size() );
+        final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
+        assertEquals( 1,
+                      not.getDescrs().size() );
+        final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+        assertEquals( "Cheese",
+                      pattern.getObjectType() );
+
+        final ExistsDescr ex = (ExistsDescr) lhs.getDescrs().get( 1 );
+        assertEquals( 1,
+                      ex.getDescrs().size() );
+        final PatternDescr exPattern = (PatternDescr) ex.getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      exPattern.getObjectType() );
+    }
+
+
+    public void testSimpleQuery() throws Exception {
+        final QueryDescr query = (QueryDescr) parseResource("query", "query", "simple_query.drl" );
+
+        assertNotNull( query );
+
+        assertEquals( "simple_query",
+                      query.getName() );
+
+        final AndDescr lhs = query.getLhs();
+
+        assertNotNull( lhs );
+
+        assertEquals( 3,
+                      lhs.getDescrs().size() );
+
+        // Check first pattern
+        final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "foo3",
+                      first.getIdentifier() );
+        assertEquals( "Bar",
+                      first.getObjectType() );
+
+        assertEquals( 1,
+                      first.getConstraint().getDescrs().size() );
+
+        AndDescr and = (AndDescr) first.getConstraint();
+        FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "3",
+                      constraint.getText() );
+
+        // Check second pattern
+        final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+        assertEquals( "foo4",
+                      second.getIdentifier() );
+        assertEquals( "Bar",
+                      second.getObjectType() );
+
+        and = (AndDescr) second.getConstraint();
+        assertEquals( 2,
+                      and.getDescrs().size() );
+        //check it has field bindings.
+        final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
+        assertEquals( "a",
+                      fieldBindingDescr.getFieldName() );
+        assertEquals( "a4",
+                      fieldBindingDescr.getIdentifier() );
+
+        fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+
+        constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertNotNull( constraint );
+
+        assertEquals( "a",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      constraint.getEvaluator() );
+        assertEquals( "4",
+                      constraint.getText() );
+    }
+
+    public void testQueryRuleMixed() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "query_and_rule.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 4,
+                      pack.getRules().size() ); //as queries are rules
+        RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( "bar",
+                      rule.getName() );
+
+        QueryDescr query = (QueryDescr) pack.getRules().get( 1 );
+        assertEquals( "simple_query",
+                      query.getName() );
+
+        rule = (RuleDescr) pack.getRules().get( 2 );
+        assertEquals( "bar2",
+                      rule.getName() );
+
+        query = (QueryDescr) pack.getRules().get( 3 );
+        assertEquals( "simple_query2",
+                      query.getName() );
+    }
+
+    public void testMultipleRules() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "multiple_rules.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+        final List rules = pkg.getRules();
+
+        assertEquals( 2,
+                      rules.size() );
+
+        final RuleDescr rule0 = (RuleDescr) rules.get( 0 );
+        assertEquals( "Like Stilton",
+                      rule0.getName() );
+
+        final RuleDescr rule1 = (RuleDescr) rules.get( 1 );
+        assertEquals( "Like Cheddar",
+                      rule1.getName() );
+
+        //checkout the first rule
+        AndDescr lhs = rule1.getLhs();
+        assertNotNull( lhs );
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
+                                      (String) rule0.getConsequence() );
+
+        // Check first pattern
+        PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "Cheese",
+                      first.getObjectType() );
+
+        //checkout the second rule
+        lhs = rule1.getLhs();
+        assertNotNull( lhs );
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
+                                      (String) rule1.getConsequence() );
+
+        // Check first pattern
+        first = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "Cheese",
+                      first.getObjectType() );
+    }
+
+    public void testExpanderLineSpread() throws Exception {
+        final DrlParser parser = new DrlParser();
+        final PackageDescr pkg = parser.parse( this.getReader( "expander_spread_lines.dslr" ),
+                                               this.getReader( "complex.dsl" ) );
+
+        assertFalse( parser.getErrors().toString(),
+                     parser.hasErrors() );
+
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+        assertNotNull( (String) rule.getConsequence() );
+
+    }
+
+    public void testExpanderMultipleConstraints() throws Exception {
+        final DrlParser parser = new DrlParser();
+        final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints.dslr" ),
+                                               this.getReader( "multiple_constraints.dsl" ) );
+
+        assertFalse( parser.getErrors().toString(),
+                     parser.hasErrors() );
+
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+
+        assertEquals( 2,
+                      pattern.getConstraint().getDescrs().size() );
+        assertEquals( "age",
+                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
+        assertEquals( "location",
+                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
+
+        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Bar",
+                      pattern.getObjectType() );
+
+        assertNotNull( (String) rule.getConsequence() );
+
+    }
+
+    public void testExpanderMultipleConstraintsFlush() throws Exception {
+        final DrlParser parser = new DrlParser();
+        //this is similar to the other test, but it requires a flush to add the constraints
+        final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints_flush.dslr" ),
+                                               this.getReader( "multiple_constraints.dsl" ) );
+
+        assertFalse( parser.getErrors().toString(),
+                     parser.hasErrors() );
+
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+
+        assertEquals( 2,
+                      pattern.getConstraint().getDescrs().size() );
+        assertEquals( "age",
+                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
+        assertEquals( "location",
+                      ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
+
+        assertNotNull( (String) rule.getConsequence() );
+
+    }
+
+    //    public void testExpanderUnExpandableErrorLines() throws Exception {
+    //
+    //        //stubb expander
+    //        final ExpanderResolver res = new ExpanderResolver() {
+    //            public Expander get(String name,
+    //                                String config) {
+    //                return new Expander() {
+    //                    public String expand(String scope,
+    //                                         String pattern) {
+    //                        if ( pattern.startsWith( "Good" ) ) {
+    //                            return pattern;
+    //                        } else {
+    //                            throw new IllegalArgumentException( "whoops" );
+    //                        }
+    //
+    //                    }
+    //                };
+    //            }
+    //        };
+    //
+    //        final DRLParser parser = parseResource( "expander_line_errors.dslr" );
+    //        parser.setExpanderResolver( res );
+    //        parser.compilation_unit();
+    //        assertTrue( parser.hasErrors() );
+    //
+    //        final List messages = parser.getErrorMessages();
+    //        assertEquals( messages.size(),
+    //                      parser.getErrors().size() );
+    //
+    //        assertEquals( 4,
+    //                      parser.getErrors().size() );
+    //        assertEquals( ExpanderException.class,
+    //                      parser.getErrors().get( 0 ).getClass() );
+    //        assertEquals( 8,
+    //                      ((RecognitionException) parser.getErrors().get( 0 )).line );
+    //        assertEquals( 10,
+    //                      ((RecognitionException) parser.getErrors().get( 1 )).line );
+    //        assertEquals( 12,
+    //                      ((RecognitionException) parser.getErrors().get( 2 )).line );
+    //        assertEquals( 13,
+    //                      ((RecognitionException) parser.getErrors().get( 3 )).line );
+    //
+    //        final PackageDescr pack = parser.getPackageDescr();
+    //        assertNotNull( pack );
+    //
+    //        final ExpanderException ex = (ExpanderException) parser.getErrors().get( 0 );
+    //        assertTrue( ex.getMessage().indexOf( "whoops" ) > -1 );
+    //
+    //    }
+
+    public void testBasicBinding() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "basic_binding.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+        final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
+
+        final AndDescr lhs = ruleDescr.getLhs();
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( 1,
+                      cheese.getConstraint().getDescrs().size() );
+        assertEquals( "Cheese",
+                      cheese.getObjectType() );
+        assertEquals( 1,
+                      lhs.getDescrs().size() );
+        final FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
+        assertEquals( "type",
+                      fieldBinding.getFieldName() );
+    }
+
+    public void testBoundVariables() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "bindings.drl" );
+
+        final PackageDescr pkg = walker.getPackageDescr();
+        final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
+
+        final AndDescr lhs = ruleDescr.getLhs();
+        assertEquals( 2,
+                      lhs.getDescrs().size() );
+        final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
+        assertEquals( "Cheese",
+                      cheese.getObjectType() );
+        assertEquals( 2,
+                      lhs.getDescrs().size() );
+        FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
+        assertEquals( "type",
+                      fieldBinding.getFieldName() );
+
+        FieldConstraintDescr fld = (FieldConstraintDescr) cheese.getConstraint().getDescrs().get( 1 );
+        LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        //LiteralDescr literalDescr = (LiteralDescr) cheese.getDescrs().get( 1 );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      literalDescr.getEvaluator() );
+        assertEquals( "stilton",
+                      literalDescr.getText() );
+
+        final PatternDescr person = (PatternDescr) lhs.getDescrs().get( 1 );
+        fieldBinding = (FieldBindingDescr) person.getConstraint().getDescrs().get( 0 );
+        assertEquals( "name",
+                      fieldBinding.getFieldName() );
+
+        fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 1 );
+        literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "name",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      literalDescr.getEvaluator() );
+        assertEquals( "bob",
+                      literalDescr.getText() );
+
+        fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 2 );
+        final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "likes",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      variableDescr.getEvaluator() );
+        assertEquals( "$type",
+                      variableDescr.getIdentifier() );
+    }
+
+    public void testOrNesting() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "or_nesting.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertNotNull( pack );
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+
+        final PatternDescr first = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      first.getObjectType() );
+
+        final AndDescr and = (AndDescr) or.getDescrs().get( 1 );
+        assertEquals( 2,
+                      and.getDescrs().size() );
+
+        final PatternDescr left = (PatternDescr) and.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      left.getObjectType() );
+
+        final PatternDescr right = (PatternDescr) and.getDescrs().get( 1 );
+        assertEquals( "Cheese",
+                      right.getObjectType() );
+    }
+
+    /** Test that explicit "&&", "||" works as expected */
+    public void testAndOrRules() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "and_or_rule.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertNotNull( pack );
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+
+        //we will have 2 children under the main And node
+        final AndDescr and = rule.getLhs();
+        assertEquals( 2,
+                      and.getDescrs().size() );
+
+        //check the "&&" part
+        final AndDescr join = (AndDescr) and.getDescrs().get( 0 );
+        assertEquals( 2,
+                      join.getDescrs().size() );
+
+        PatternDescr left = (PatternDescr) join.getDescrs().get( 0 );
+        PatternDescr right = (PatternDescr) join.getDescrs().get( 1 );
+        assertEquals( "Person",
+                      left.getObjectType() );
+        assertEquals( "Cheese",
+                      right.getObjectType() );
+
+        assertEquals( 1,
+                      left.getConstraint().getDescrs().size() );
+
+        FieldConstraintDescr fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
+        LiteralRestrictionDescr literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      literal.getEvaluator() );
+        assertEquals( "name",
+                      fld.getFieldName() );
+        assertEquals( "mark",
+                      literal.getText() );
+
+        assertEquals( 1,
+                      right.getConstraint().getDescrs().size() );
+
+        fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
+        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      literal.getEvaluator() );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( "stilton",
+                      literal.getText() );
+
+        //now the "||" part
+        final OrDescr or = (OrDescr) and.getDescrs().get( 1 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+        left = (PatternDescr) or.getDescrs().get( 0 );
+        right = (PatternDescr) or.getDescrs().get( 1 );
+        assertEquals( "Person",
+                      left.getObjectType() );
+        assertEquals( "Cheese",
+                      right.getObjectType() );
+        assertEquals( 1,
+                      left.getConstraint().getDescrs().size() );
+
+        fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
+        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      literal.getEvaluator() );
+        assertEquals( "name",
+                      fld.getFieldName() );
+        assertEquals( "mark",
+                      literal.getText() );
+
+        assertEquals( 1,
+                      right.getConstraint().getDescrs().size() );
+
+        fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
+        literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "==",
+                      literal.getEvaluator() );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( "stilton",
+                      literal.getText() );
+
+        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" );",
+                                      (String) rule.getConsequence() );
+    }
+
+    /** test basic foo : Fact() || Fact() stuff */
+    public void testOrWithBinding() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "or_binding.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+
+        final PatternDescr leftPattern = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      leftPattern.getObjectType() );
+        assertEquals( "foo",
+                      leftPattern.getIdentifier() );
+
+        final PatternDescr rightPattern = (PatternDescr) or.getDescrs().get( 1 );
+        assertEquals( "Person",
+                      rightPattern.getObjectType() );
+        assertEquals( "foo",
+                      rightPattern.getIdentifier() );
+
+        final PatternDescr cheeseDescr = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Cheese",
+                      cheeseDescr.getObjectType() );
+        assertEquals( null,
+                      cheeseDescr.getIdentifier() );
+
+        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+                                      (String) rule.getConsequence() );
+    }
+
+    /** test basic foo : Fact() || Fact() stuff binding to an "or"*/
+    public void testOrBindingComplex() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "or_binding_complex.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+
+        //first fact
+        final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      firstFact.getObjectType() );
+        assertEquals( "foo",
+                      firstFact.getIdentifier() );
+
+        //second "option"
+        final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 1 );
+        assertEquals( "Person",
+                      secondFact.getObjectType() );
+        assertEquals( 1,
+                      secondFact.getConstraint().getDescrs().size() );
+        assertEquals( "foo",
+                      secondFact.getIdentifier() );
+
+        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+                                      (String) rule.getConsequence() );
+    }
+
+    public void testOrBindingWithBrackets() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "or_binding_with_brackets.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+
+        //first fact
+        final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      firstFact.getObjectType() );
+        assertEquals( "foo",
+                      firstFact.getIdentifier() );
+
+        //second "option"
+        final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      secondFact.getObjectType() );
+        assertEquals( "foo",
+                      secondFact.getIdentifier() );
+
+        assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+                                      (String) rule.getConsequence() );
+    }
+
+    /** */
+    public void testBracketsPrecedence() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "brackets_precedence.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final AndDescr rootAnd = (AndDescr) rule.getLhs().getDescrs().get( 0 );
+
+        assertEquals( 2,
+                      rootAnd.getDescrs().size() );
+
+        final OrDescr leftOr = (OrDescr) rootAnd.getDescrs().get( 0 );
+
+        assertEquals( 2,
+                      leftOr.getDescrs().size() );
+        final NotDescr not = (NotDescr) leftOr.getDescrs().get( 0 );
+        final PatternDescr foo1 = (PatternDescr) not.getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      foo1.getObjectType() );
+        final PatternDescr foo2 = (PatternDescr) leftOr.getDescrs().get( 1 );
+        assertEquals( "Foo",
+                      foo2.getObjectType() );
+
+        final OrDescr rightOr = (OrDescr) rootAnd.getDescrs().get( 1 );
+
+        assertEquals( 2,
+                      rightOr.getDescrs().size() );
+        final PatternDescr shoes = (PatternDescr) rightOr.getDescrs().get( 0 );
+        assertEquals( "Shoes",
+                      shoes.getObjectType() );
+        final PatternDescr butt = (PatternDescr) rightOr.getDescrs().get( 1 );
+        assertEquals( "Butt",
+                      butt.getObjectType() );
+    }
+
+    public void testEvalMultiple() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "eval_multiple.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 4,
+                      rule.getLhs().getDescrs().size() );
+
+        final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEqualsIgnoreWhitespace( "abc(\"foo\") + 5",
+                                      (String) eval.getContent() );
+
+        final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Foo",
+                      pattern.getObjectType() );
+
+    }
+
+    public void testWithEval() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "with_eval.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 3,
+                      rule.getLhs().getDescrs().size() );
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      pattern.getObjectType() );
+        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Bar",
+                      pattern.getObjectType() );
+
+        final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 2 );
+        assertEqualsIgnoreWhitespace( "abc(\"foo\")",
+                                      (String) eval.getContent() );
+        assertEqualsIgnoreWhitespace( "Kapow",
+                                      (String) rule.getConsequence() );
+    }
+
+    public void testWithRetval() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "with_retval.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( 1,
+                      col.getConstraint().getDescrs().size() );
+        assertEquals( "Foo",
+                      col.getObjectType() );
+        final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
+        final ReturnValueRestrictionDescr retval = (ReturnValueRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "a + b",
+                      retval.getContent() );
+        assertEquals( "name",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      retval.getEvaluator() );
+    }
+
+    public void testWithPredicate() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "with_predicate.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        AndDescr and = (AndDescr) col.getConstraint();
+        assertEquals( 2,
+                      and.getDescrs().size() );
+
+        final FieldBindingDescr field = (FieldBindingDescr) and.getDescrs().get( 0 );
+        final PredicateDescr pred = (PredicateDescr) and.getDescrs().get( 1 );
+        assertEquals( "age",
+                      field.getFieldName() );
+        assertEquals( "$age2",
+                      field.getIdentifier() );
+        assertEqualsIgnoreWhitespace( "$age2 == $age1+2",
+                                      (String) pred.getContent() );
+    }
+
+    public void testNotWithConstraint() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "not_with_constraint.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final FieldBindingDescr fieldBinding = (FieldBindingDescr) pattern.getConstraint().getDescrs().get( 0 );
+        assertEquals( "$likes",
+                      fieldBinding.getIdentifier() );
+
+        final NotDescr not = (NotDescr) rule.getLhs().getDescrs().get( 1 );
+        pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+        final FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        final VariableRestrictionDescr boundVariable = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      boundVariable.getEvaluator() );
+        assertEquals( "$likes",
+                      boundVariable.getIdentifier() );
+    }
+
+    public void testGlobal() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "globals.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        assertEquals( 1,
+                      pack.getImports().size() );
+        assertEquals( 2,
+                      pack.getGlobals().size() );
+
+        final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get( 0 );
+        assertEquals( "java.lang.String",
+                      foo.getType() );
+        assertEquals( "foo",
+                      foo.getIdentifier() );
+        final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get( 1 );
+        assertEquals( "java.lang.Integer",
+                      bar.getType() );
+        assertEquals( "bar",
+                      bar.getIdentifier() );
+    }
+
+    public void testFunctions() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "functions.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 2,
+                      pack.getRules().size() );
+
+        final List functions = pack.getFunctions();
+        assertEquals( 2,
+                      functions.size() );
+
+        FunctionDescr func = (FunctionDescr) functions.get( 0 );
+        assertEquals( "functionA",
+                      func.getName() );
+        assertEquals( "String",
+                      func.getReturnType() );
+        assertEquals( 2,
+                      func.getParameterNames().size() );
+        assertEquals( 2,
+                      func.getParameterTypes().size() );
+        assertEquals( 4,
+                      func.getLine() );
+        assertEquals( 0,
+                      func.getColumn() );
+
+        assertEquals( "String",
+                      func.getParameterTypes().get( 0 ) );
+        assertEquals( "s",
+                      func.getParameterNames().get( 0 ) );
+
+        assertEquals( "Integer",
+                      func.getParameterTypes().get( 1 ) );
+        assertEquals( "i",
+                      func.getParameterNames().get( 1 ) );
+
+        assertEqualsIgnoreWhitespace( "foo();",
+                                      func.getText() );
+
+        func = (FunctionDescr) functions.get( 1 );
+        assertEquals( "functionB",
+                      func.getName() );
+        assertEqualsIgnoreWhitespace( "bar();",
+                                      func.getText() );
+    }
+
+    public void testComment() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "comment.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertNotNull( pack );
+
+        assertEquals( "foo.bar",
+                      pack.getName() );
+    }
+
+    public void testAttributes() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "rule_attributes.drl" );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEqualsIgnoreWhitespace( "bar();",
+                                      (String) rule.getConsequence() );
+
+        final List attrs = rule.getAttributes();
+        assertEquals( 6,
+                      attrs.size() );
+
+        AttributeDescr at = (AttributeDescr) attrs.get( 0 );
+        assertEquals( "salience",
+                      at.getName() );
+        assertEquals( "42",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 1 );
+        assertEquals( "agenda-group",
+                      at.getName() );
+        assertEquals( "my_group",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 2 );
+        assertEquals( "no-loop",
+                      at.getName() );
+        assertEquals( "true",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 3 );
+        assertEquals( "duration",
+                      at.getName() );
+        assertEquals( "42",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 4 );
+        assertEquals( "activation-group",
+                      at.getName() );
+        assertEquals( "my_activation_group",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 5 );
+        assertEquals( "lock-on-active",
+                      at.getName() );
+        assertEquals( "true",
+                      at.getValue() );
+    }
+
+    public void testAttributes_alternateSyntax() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "rule_attributes_alt.drl" );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEqualsIgnoreWhitespace( "bar();",
+                                      (String) rule.getConsequence() );
+
+        final List attrs = rule.getAttributes();
+        assertEquals( 6,
+                      attrs.size() );
+
+        AttributeDescr at = (AttributeDescr) attrs.get( 0 );
+        assertEquals( "salience",
+                      at.getName() );
+        assertEquals( "42",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 1 );
+        assertEquals( "agenda-group",
+                      at.getName() );
+        assertEquals( "my_group",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 2 );
+        assertEquals( "no-loop",
+                      at.getName() );
+        assertEquals( "true",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 3 );
+        assertEquals( "lock-on-active",
+                      at.getName() );
+        assertEquals( "true",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 4 );
+        assertEquals( "duration",
+                      at.getName() );
+        assertEquals( "42",
+                      at.getValue() );
+
+        at = (AttributeDescr) attrs.get( 5 );
+        assertEquals( "activation-group",
+                      at.getName() );
+        assertEquals( "my_activation_group",
+                      at.getValue() );
+    }
+
+    public void testEnumeration() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "enumeration.drl" );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Foo",
+                      col.getObjectType() );
+        assertEquals( 1,
+                      col.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
+        final QualifiedIdentifierRestrictionDescr lit = (QualifiedIdentifierRestrictionDescr) fld.getRestrictions().get( 0 );
+
+        assertEquals( "bar",
+                      fld.getFieldName() );
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "Foo.BAR",
+                      lit.getText() );
+    }
+    public void testExtraLhsNewline() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "extra_lhs_newline.drl" );
+    }
+
+    public void testSoundsLike() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "soundslike_operator.drl" );
+
+        RuleDescr rule = (RuleDescr) this.walker.getPackageDescr().getRules().get( 0 );
+        PatternDescr pat = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+
+        pat.getConstraint();
+    }
+
+    public void testPackageAttributes() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "package_attributes.drl" );
+
+        PackageDescr pkg = this.walker.getPackageDescr();
+        AttributeDescr at = (AttributeDescr) pkg.getAttributes().get( 0 );
+        assertEquals( "agenda-group",
+                      at.getName() );
+        assertEquals( "x",
+                      at.getValue() );
+        at = (AttributeDescr) pkg.getAttributes().get( 1 );
+        assertEquals( "dialect",
+                      at.getName() );
+        assertEquals( "java",
+                      at.getValue() );
+
+        assertEquals( 2,
+                      pkg.getRules().size() );
+
+        assertEquals( 2,
+                      pkg.getImports().size() );
+
+        RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( "bar",
+                      rule.getName() );
+        at = (AttributeDescr) rule.getAttributes().get( 0 );
+        assertEquals( "agenda-group",
+                      at.getName() );
+        assertEquals( "x",
+                      at.getValue() );
+        at = (AttributeDescr) rule.getAttributes().get( 1 );
+        assertEquals( "dialect",
+                      at.getName() );
+        assertEquals( "java",
+                      at.getValue() );
+
+        rule = (RuleDescr) pkg.getRules().get( 1 );
+        assertEquals( "baz",
+                      rule.getName() );
+        at = (AttributeDescr) rule.getAttributes().get( 0 );
+        assertEquals( "dialect",
+                      at.getName() );
+        assertEquals( "mvel",
+                      at.getValue() );
+        at = (AttributeDescr) rule.getAttributes().get( 1 );
+        assertEquals( "agenda-group",
+                      at.getName() );
+        assertEquals( "x",
+                      at.getValue() );
+
+    }
+
+    public void testStatementOrdering1() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "statement_ordering_1.drl" );
+
+        final PackageDescr pkg = this.walker.getPackageDescr();
+
+        assertEquals( 2,
+                      pkg.getRules().size() );
+
+        assertEquals( "foo",
+                      ((RuleDescr) pkg.getRules().get( 0 )).getName() );
+        assertEquals( "bar",
+                      ((RuleDescr) pkg.getRules().get( 1 )).getName() );
+
+        assertEquals( 2,
+                      pkg.getFunctions().size() );
+
+        assertEquals( "cheeseIt",
+                      ((FunctionDescr) pkg.getFunctions().get( 0 )).getName() );
+        assertEquals( "uncheeseIt",
+                      ((FunctionDescr) pkg.getFunctions().get( 1 )).getName() );
+
+        assertEquals( 4,
+                      pkg.getImports().size() );
+        assertEquals( "im.one",
+                      ((ImportDescr) pkg.getImports().get( 0 )).getTarget() );
+        assertEquals( "im.two",
+                      ((ImportDescr) pkg.getImports().get( 1 )).getTarget() );
+        assertEquals( "im.three",
+                      ((ImportDescr) pkg.getImports().get( 2 )).getTarget() );
+        assertEquals( "im.four",
+                      ((ImportDescr) pkg.getImports().get( 3 )).getTarget() );
+    }
+
+    public void testRuleNamesStartingWithNumbers() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "rule_names_number_prefix.drl" );
+
+        final PackageDescr pkg = this.walker.getPackageDescr();
+
+        assertEquals( 2,
+                      pkg.getRules().size() );
+
+        assertEquals( "1. Do Stuff!",
+                      ((RuleDescr) pkg.getRules().get( 0 )).getName() );
+        assertEquals( "2. Do More Stuff!",
+                      ((RuleDescr) pkg.getRules().get( 1 )).getName() );
+    }
+
+    public void testEvalWithNewline() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "eval_with_newline.drl" );
+    }
+
+    public void testEndPosition() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "test_EndPosition.drl" );
+        final RuleDescr rule = (RuleDescr) this.walker.getPackageDescr().getRules().get( 0 );
+        final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+//        assertEquals( 6,
+//                      col.getLine() );
+//
+//        assertEquals( 8,
+//                      col.getEndLine() );
+    }
+
+    public void testQualifiedClassname() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "qualified_classname.drl" );
+
+        final PackageDescr pkg = this.walker.getPackageDescr();
+        final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+        final PatternDescr p = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+
+        assertEquals( "com.cheeseco.Cheese",
+                      p.getObjectType() );
+    }
+
+    public void testAccumulate() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "accumulate.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+        assertEqualsIgnoreWhitespace( "int x = 0 ;",
+                                      accum.getInitCode() );
+        assertEqualsIgnoreWhitespace( "x++;",
+                                      accum.getActionCode() );
+        assertNull( accum.getReverseCode() );
+        assertEqualsIgnoreWhitespace( "new Integer(x)",
+                                      accum.getResultCode() );
+
+        assertFalse( accum.isExternalFunction() );
+
+        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+    }
+
+    public void testAccumulateWithBindings() throws Exception {
+        parseResource("compilation_unit","compilation_unit",  "accumulate_with_bindings.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+        assertEqualsIgnoreWhitespace( "$counter",
+                                      outPattern.getIdentifier() );
+        assertEqualsIgnoreWhitespace( "int x = 0 ;",
+                                      accum.getInitCode() );
+        assertEqualsIgnoreWhitespace( "x++;",
+                                      accum.getActionCode() );
+        assertEqualsIgnoreWhitespace( "new Integer(x)",
+                                      accum.getResultCode() );
+
+        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+    }
+
+    public void testCollect() throws Exception {
+        parseResource("compilation_unit","compilation_unit", "collect.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final CollectDescr collect = (CollectDescr) outPattern.getSource();
+
+        final PatternDescr pattern = (PatternDescr) collect.getInputPattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+    }
+
+    public void testPredicate() throws Exception {
+        final PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", "Foo ($var : attr -> ( $var.equals(\"xyz\") ))" );
+
+        final List constraints = pattern.getConstraint().getDescrs();
+        assertEquals( 2,
+                      constraints.size() );
+
+        final FieldBindingDescr field = (FieldBindingDescr) constraints.get( 0 );
+        final PredicateDescr predicate = (PredicateDescr) constraints.get( 1 );
+        assertEquals( "$var",
+                      field.getIdentifier() );
+        assertEquals( "attr",
+                      field.getFieldName() );
+        assertEquals( " $var.equals(\"xyz\") ",
+                      predicate.getContent() );
+    }
+
+    public void testPredicate2() throws Exception {
+        // predicates are also prefixed by the eval keyword
+        final PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern",  "Foo(eval( $var.equals(\"xyz\") ))" );
+
+        final List constraints = pattern.getConstraint().getDescrs();
+        assertEquals( 1,
+                      constraints.size() );
+
+        final PredicateDescr predicate = (PredicateDescr) constraints.get( 0 );
+        assertEquals( " $var.equals(\"xyz\") ",
+                      predicate.getContent() );
+    }
+
+    public void testEscapedStrings() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "escaped-string.drl" );
+
+        assertNotNull( rule );
+
+        assertEquals( "test_Quotes",
+                      rule.getName() );
+
+        final String expected = "String s = \"\\\"\\n\\t\\\\\";";
+
+        assertEqualsIgnoreWhitespace( expected,
+                                      (String) rule.getConsequence() );
+    }
+
+    public void testNestedCEs() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "nested_conditional_elements.drl" );
+
+        assertNotNull( rule );
+
+        final AndDescr root = rule.getLhs();
+        final NotDescr not1 = (NotDescr) root.getDescrs().get( 0 );
+        final AndDescr and1 = (AndDescr) not1.getDescrs().get( 0 );
+
+        final PatternDescr state = (PatternDescr) and1.getDescrs().get( 0 );
+        final NotDescr not2 = (NotDescr) and1.getDescrs().get( 1 );
+        final AndDescr and2 = (AndDescr) not2.getDescrs().get( 0 );
+        final PatternDescr person = (PatternDescr) and2.getDescrs().get( 0 );
+        final PatternDescr cheese = (PatternDescr) and2.getDescrs().get( 1 );
+
+        final PatternDescr person2 = (PatternDescr) root.getDescrs().get( 1 );
+        final OrDescr or = (OrDescr) root.getDescrs().get( 2 );
+        final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 0 );
+        final PatternDescr cheese3 = (PatternDescr) or.getDescrs().get( 1 );
+
+        assertEquals( state.getObjectType(),
+                      "State" );
+        assertEquals( person.getObjectType(),
+                      "Person" );
+        assertEquals( cheese.getObjectType(),
+                      "Cheese" );
+        assertEquals( person2.getObjectType(),
+                      "Person" );
+        assertEquals( cheese2.getObjectType(),
+                      "Cheese" );
+        assertEquals( cheese3.getObjectType(),
+                      "Cheese" );
+    }
+
+    public void testForall() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "forall.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final ForallDescr forall = (ForallDescr) rule.getLhs().getDescrs().get( 0 );
+
+        assertEquals( 2,
+                      forall.getDescrs().size() );
+        final PatternDescr pattern = forall.getBasePattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+        final List remaining = forall.getRemainingPatterns();
+        assertEquals( 1,
+                      remaining.size() );
+        final PatternDescr cheese = (PatternDescr) remaining.get( 0 );
+        assertEquals( "Cheese",
+                      cheese.getObjectType() );
+    }
+
+    public void testMemberof() throws Exception {
+        final String text = "Country( $cities : city )\nPerson( city memberOf $cities )\n";
+        AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 2,
+                      descrs.getDescrs().size() );
+        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+        assertEquals( "memberOf",
+                      restr.getEvaluator() );
+        assertFalse( restr.isNegated() );
+        assertEquals( "$cities",
+                      restr.getIdentifier() );
+    }
+
+    public void testNotMemberof() throws Exception {
+        final String text = "Country( $cities : city )\nPerson( city not memberOf $cities )\n";
+        AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 2,
+                      descrs.getDescrs().size() );
+        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+        assertEquals( "memberOf",
+                      restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
+        assertEquals( "$cities",
+                      restr.getIdentifier() );
+    }
+
+    public void testInOperator() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule", "rule",  "in_operator_test.drl" );
+
+        assertNotNull( rule );
+
+        assertEqualsIgnoreWhitespace( "consequence();",
+                                      (String) rule.getConsequence() );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        //The first pattern, with 2 restrictions on a single field (plus a connective)
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        assertEquals( RestrictionConnectiveDescr.AND,
+                      fld.getRestriction().getConnective() );
+        assertEquals( 2,
+                      fld.getRestrictions().size() );
+        assertEquals( "age",
+                      fld.getFieldName() );
+
+        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( ">",
+                      lit.getEvaluator() );
+        assertEquals( "30",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "40",
+                      lit.getText() );
+
+        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Vehicle",
+                      pattern.getObjectType() );
+        assertEquals( 2,
+                      pattern.getConstraint().getDescrs().size() );
+
+        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( 1,
+                      fld.getRestrictions().size() );
+
+        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
+        assertEquals( RestrictionConnectiveDescr.OR,
+                      or.getConnective() );
+        assertEquals( 2,
+                      or.getRestrictions().size() );
+
+        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "sedan",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+        assertEquals( "==",
+                      lit.getEvaluator() );
+        assertEquals( "wagon",
+                      lit.getText() );
+
+        //now the second field
+        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
+        assertEquals( 1,
+                      fld.getRestrictions().size() );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "3",
+                      lit.getText() );
+
+    }
+
+    public void testNotInOperator() throws Exception {
+        final RuleDescr rule = (RuleDescr) parseResource("rule","rule", "notin_operator_test.drl" );
+
+        assertNotNull( rule );
+
+        assertEqualsIgnoreWhitespace( "consequence();",
+                                      (String) rule.getConsequence() );
+        assertEquals( "simple_rule",
+                      rule.getName() );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        //The first pattern, with 2 restrictions on a single field (plus a connective)
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+        assertEquals( 1,
+                      pattern.getConstraint().getDescrs().size() );
+
+        FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        assertEquals( 2,
+                      fld.getRestrictions().size() );
+        assertEquals( "age",
+                      fld.getFieldName() );
+
+        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( ">",
+                      lit.getEvaluator() );
+        assertEquals( "30",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "40",
+                      lit.getText() );
+
+        //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+        pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "Vehicle",
+                      pattern.getObjectType() );
+        assertEquals( 2,
+                      pattern.getConstraint().getDescrs().size() );
+
+        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        assertEquals( 2,
+                      fld.getRestrictions().size() );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( "type",
+                      fld.getFieldName() );
+        assertEquals( "!=",
+                      lit.getEvaluator() );
+        assertEquals( "sedan",
+                      lit.getText() );
+
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+        assertEquals( "!=",
+                      lit.getEvaluator() );
+        assertEquals( "wagon",
+                      lit.getText() );
+
+        //now the second field
+        fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
+        assertEquals( 1,
+                      fld.getRestrictions().size() );
+        lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+        assertEquals( "<",
+                      lit.getEvaluator() );
+        assertEquals( "3",
+                      lit.getText() );
+
+    }
+
+    public void testCheckOrDescr() throws Exception {
+        final String text = "Person( eval( age == 25 ) || ( eval( name.equals( \"bob\" ) ) && eval( age == 30 ) ) )";
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        assertEquals(pattern.getConstraint().getClass(), org.drools.lang.descr.AndDescr.class);
+
+        assertEquals(pattern.getConstraint().getDescrs().get(0).getClass(), org.drools.lang.descr.OrDescr.class);
+
+        OrDescr orDescr = (OrDescr) pattern.getConstraint().getDescrs().get(0);
+        assertEquals(orDescr.getDescrs().get(0).getClass(), org.drools.lang.descr.PredicateDescr.class);
+    }
+
+    public void testConstraintAndConnective() throws Exception {
+        final String text = "Person( age < 42 && location==\"atlanta\")";
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 2,
+                      pattern.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        fcd = (FieldConstraintDescr) pattern.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+    }
+
+    public void testConstraintOrConnective() throws Exception {
+        final String text = "Person( age < 42 || location==\"atlanta\")";
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) or.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        fcd = (FieldConstraintDescr) or.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+    }
+
+    public void testConstraintConnectivesPrecedence() throws Exception {
+        final String text = "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")";
+
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+        assertEquals( 3,
+                      or.getDescrs().size() );
+
+        AndDescr and = (AndDescr) or.getDescrs().get( 0 );
+        assertEquals( 2,
+                      and.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( "<",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "42",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "atlanta",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        and = (AndDescr) or.getDescrs().get( 1 );
+        assertEquals( 2,
+                      and.getDescrs().size() );
+        fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( ">",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "20",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "Seatle",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        fcd = (FieldConstraintDescr) or.getDescrs().get( 2 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "Chicago",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+    }
+
+    public void testConstraintConnectivesPrecedenceWithBracks() throws Exception {
+        final String text = "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")";
+        
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
+        assertEquals( 2,
+                      or1.getDescrs().size() );
+
+        AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
+        assertEquals( 2,
+                      and1.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( "<",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "42",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        OrDescr or2 = (OrDescr) and1.getDescrs().get( 1 );
+        fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "atlanta",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        AndDescr and2 = (AndDescr) or2.getDescrs().get( 1 );
+        assertEquals( 2,
+                      and2.getDescrs().size() );
+        fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( ">",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "20",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "Seatle",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        fcd = (FieldConstraintDescr) or1.getDescrs().get( 1 );
+        assertEquals( "location",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "Chicago",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+    }
+
+    public void testConstraintConnectivesPrecedenceWithBracks2() throws Exception {
+        final String text = "Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) )";
+        
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
+        assertEquals( 3,
+                      or1.getDescrs().size() );
+
+        AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
+        AndDescr and2 = (AndDescr) or1.getDescrs().get( 1 );
+        AndDescr and3 = (AndDescr) or1.getDescrs().get( 2 );
+
+        assertEquals( 2,
+                      and1.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "70",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) and1.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "black",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        assertEquals( 2,
+                      and2.getDescrs().size() );
+        fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "40",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "pink",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        assertEquals( 2,
+                      and3.getDescrs().size() );
+        fcd = (FieldConstraintDescr) and3.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "12",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        OrDescr or2 = (OrDescr) and3.getDescrs().get( 1 );
+        fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "yellow",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+        fcd = (FieldConstraintDescr) or2.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "blue",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+    }
+
+    public void testRestrictionConnectives() throws Exception {
+
+        // the expression bellow must generate the following tree:
+        //
+        //                       AND
+        //                        |
+        //                       OR
+        //        /---------------+-------------------\
+        //       AND             AND                 AND
+        //    /---+---\       /---+---\           /---+---\
+        //   FC       FC     FC       FC         FC       OR
+        //                                             /---+---\
+        //                                            FC       FC
+        //
+        final String text = "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))";
+        
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+
+        OrDescr orConstr = (OrDescr) pattern.getDescrs().get( 0 );
+
+        assertEquals( 3,
+                      orConstr.getDescrs().size() );
+
+        AndDescr andConstr1 = (AndDescr) orConstr.getDescrs().get( 0 );
+
+        FieldConstraintDescr fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestriction().getRestrictions().get( 0 );
+        RestrictionConnectiveDescr and1 = (RestrictionConnectiveDescr) or.getRestrictions().get( 0 );
+        RestrictionConnectiveDescr and2 = (RestrictionConnectiveDescr) or.getRestrictions().get( 1 );
+
+        assertEquals( ">",
+                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "60",
+                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getText() );
+
+        assertEquals( "<",
+                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getEvaluator() );
+        assertEquals( "70",
+                      ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getText() );
+
+        assertEquals( ">",
+                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "50",
+                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getText() );
+
+        assertEquals( "<",
+                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getEvaluator() );
+        assertEquals( "55",
+                      ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getText() );
+
+        fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "black",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        AndDescr andConstr2 = (AndDescr) orConstr.getDescrs().get( 1 );
+        assertEquals( 2,
+                      andConstr2.getDescrs().size() );
+        fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "40",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "pink",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        AndDescr andConstr3 = (AndDescr) orConstr.getDescrs().get( 2 );
+        assertEquals( 2,
+                      andConstr3.getDescrs().size() );
+        fcd = (FieldConstraintDescr) andConstr3.getDescrs().get( 0 );
+        assertEquals( "age",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "12",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        OrDescr orConstr2 = (OrDescr) andConstr3.getDescrs().get( 1 );
+
+        fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 0 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "yellow",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+        fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 1 );
+        assertEquals( "hair",
+                      fcd.getFieldName() );
+
+        assertEquals( "==",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "blue",
+                      ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+    }
+
+    public void testConstraintConnectivesMatches() throws Exception {
+        final String text = "Person( name matches \"mark\" || matches \"bob\" )";
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+        assertEquals( "name",
+                      fcd.getFieldName() );
+
+        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestrictions().get( 0 );
+
+        assertEquals( 2,
+                      or.getRestrictions().size() );
+
+        assertEquals( "matches",
+                      ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getEvaluator() );
+        assertEquals( "mark",
+                      ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getText() );
+
+        assertEquals( "matches",
+                      ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getEvaluator() );
+        assertEquals( "bob",
+                      ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getText() );
+
+    }
+
+    public void testNotContains() throws Exception {
+        final String text = "City( $city : city )\nCountry( cities not contains $city )\n";
+        AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 2,
+                      descrs.getDescrs().size() );
+        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+        VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+        assertEquals( "contains",
+                      restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
+        assertEquals( "$city",
+                      restr.getIdentifier() );
+    }
+
+    public void testNotMatches() throws Exception {
+        final String text = "Message( text not matches '[abc]*' )\n";
+        AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 1,
+                      descrs.getDescrs().size() );
+        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+        LiteralRestrictionDescr restr = (LiteralRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+        assertEquals( "matches",
+                      restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
+        assertEquals( "[abc]*",
+                      restr.getText() );
+    }
+
+    public void testRestrictions() throws Exception {
+        final String text = "Foo( bar > 1 || == 1 )\n";
+
+        AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 1,
+                      descrs.getDescrs().size() );
+        PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+        RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fieldConstr.getRestrictions().get( 0 );
+        LiteralRestrictionDescr gt1 = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+        LiteralRestrictionDescr eq1 = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+
+        assertEquals( ">",
+                      gt1.getEvaluator() );
+        assertEquals( false,
+                      gt1.isNegated() );
+        assertEquals( 1,
+                      ((Number) eq1.getValue()).intValue() );
+        assertEquals( "==",
+                      eq1.getEvaluator() );
+        assertEquals( false,
+                      eq1.isNegated() );
+        assertEquals( 1,
+                      ((Number) eq1.getValue()).intValue() );
+
+    }
+
+    public void testSemicolon() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "semicolon.drl" );
+
+        final PackageDescr pkg = this.walker.getPackageDescr();
+        assertEquals( "org.drools",
+                      pkg.getName() );
+        assertEquals( 1,
+                      pkg.getGlobals().size() );
+        assertEquals( 3,
+                      pkg.getRules().size() );
+
+        final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 2,
+                      rule1.getLhs().getDescrs().size() );
+
+        final RuleDescr query1 = (RuleDescr) pkg.getRules().get( 1 );
+        assertEquals( 3,
+                      query1.getLhs().getDescrs().size() );
+
+        final RuleDescr rule2 = (RuleDescr) pkg.getRules().get( 2 );
+        assertEquals( 2,
+                      rule2.getLhs().getDescrs().size() );
+    }
+
+    public void testEval() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "eval_parsing.drl" );
+
+        final PackageDescr pkg = this.walker.getPackageDescr();
+        assertEquals( "org.drools",
+                      pkg.getName() );
+        assertEquals( 1,
+                      pkg.getRules().size() );
+
+        final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
+        assertEquals( 1,
+                      rule1.getLhs().getDescrs().size() );
+    }
+
+    public void testAccumulateReverse() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "accumulateReverse.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accum = (AccumulateDescr) out.getSource();
+        assertEqualsIgnoreWhitespace( "int x = 0 ;",
+                                      accum.getInitCode() );
+        assertEqualsIgnoreWhitespace( "x++;",
+                                      accum.getActionCode() );
+        assertEqualsIgnoreWhitespace( "x--;",
+                                      accum.getReverseCode() );
+        assertEqualsIgnoreWhitespace( "new Integer(x)",
+                                      accum.getResultCode() );
+        assertFalse( accum.isExternalFunction() );
+
+        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+    }
+
+    public void testAccumulateExternalFunction() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "accumulateExternalFunction.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accum = (AccumulateDescr) out.getSource();
+        assertEqualsIgnoreWhitespace( "$age",
+                                      accum.getExpression() );
+        assertEqualsIgnoreWhitespace( "average",
+                                      accum.getFunctionIdentifier() );
+        assertTrue( accum.isExternalFunction() );
+
+        final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+        assertEquals( "Person",
+                      pattern.getObjectType() );
+    }
+
+    public void testCollectWithNestedFrom() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "collect_with_nested_from.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final CollectDescr collect = (CollectDescr) out.getSource();
+
+        PatternDescr person = (PatternDescr) collect.getInputPattern();
+        assertEquals( "Person",
+                      person.getObjectType() );
+
+        final CollectDescr collect2 = (CollectDescr) person.getSource();
+
+        final PatternDescr people = collect2.getInputPattern();
+        assertEquals( "People",
+                      people.getObjectType() );
+    }
+
+    public void testAccumulateWithNestedFrom() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "accumulate_with_nested_from.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accumulate = (AccumulateDescr) out.getSource();
+
+        PatternDescr person = (PatternDescr) accumulate.getInputPattern();
+        assertEquals( "Person",
+                      person.getObjectType() );
+
+        final CollectDescr collect2 = (CollectDescr) person.getSource();
+
+        final PatternDescr people = collect2.getInputPattern();
+        assertEquals( "People",
+                      people.getObjectType() );
+    }
+
+    public void testAccessorPaths() throws Exception {
+        final String text = "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n";
+
+        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+        assertEquals( "org.drools.Message",
+        		pattern.getObjectType() );
+
+        FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        QualifiedIdentifierRestrictionDescr restr = (QualifiedIdentifierRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+        assertEquals( "matches",
+                      restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
+        assertEquals( "$c.property",
+                      restr.getText() );
+    }
+
+    public void testOrCE() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "or_ce.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 2,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr person = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "Person",
+                      person.getObjectType() );
+        assertEquals( "$p",
+                      person.getIdentifier() );
+
+        final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+
+        final PatternDescr cheese1 = (PatternDescr) or.getDescrs().get( 0 );
+        assertEquals( "Cheese",
+                      cheese1.getObjectType() );
+        assertEquals( "$c",
+                      cheese1.getIdentifier() );
+        final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 1 );
+        assertEquals( "Cheese",
+                      cheese2.getObjectType() );
+        assertNull( cheese2.getIdentifier() );
+    }
+
+    public void testRuleSingleLine() throws Exception {
+        final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end";
+        RuleDescr rule = (RuleDescr) parse("rule", "rule", text);
+        
+        assertEquals( "another test",
+                      rule.getName() );
+        assertEquals( "System.out.println(1); ",
+                      rule.getConsequence() );
+    }
+
+    public void testRuleTwoLines() throws Exception {
+        final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\n end";
+        RuleDescr rule = (RuleDescr) parse("rule", "rule", text);
+
+        assertEquals( "another test",
+                      rule.getName() );
+        assertEquals( "System.out.println(1);\n ",
+                      rule.getConsequence() );
+    }
+
+    public void testRuleParseLhs3() throws Exception {
+        final String text = "(or\nnot Person()\n(and Cheese()\nMeat()\nWine()))";
+        AndDescr pattern = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+        assertEquals( 1,
+        		pattern.getDescrs().size() );
+        OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+        assertEquals( 2,
+                      or.getDescrs().size() );
+        NotDescr not = (NotDescr) or.getDescrs().get( 0 );
+        AndDescr and = (AndDescr) or.getDescrs().get( 1 );
+        assertEquals( 1,
+                      not.getDescrs().size() );
+        PatternDescr person = (PatternDescr) not.getDescrs().get( 0 );
+        assertEquals( "Person",
+                      person.getObjectType() );
+        assertEquals( 3,
+                      and.getDescrs().size() );
+        PatternDescr cheese = (PatternDescr) and.getDescrs().get( 0 );
+        assertEquals( "Cheese",
+                      cheese.getObjectType() );
+        PatternDescr meat = (PatternDescr) and.getDescrs().get( 1 );
+        assertEquals( "Meat",
+                      meat.getObjectType() );
+        PatternDescr wine = (PatternDescr) and.getDescrs().get( 2 );
+        assertEquals( "Wine",
+                      wine.getObjectType() );
+
+    }
+
+    public void testAccumulateMultiPattern() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "accumulate_multi_pattern.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 1,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+        assertEqualsIgnoreWhitespace( "$counter",
+                                      outPattern.getIdentifier() );
+        assertEqualsIgnoreWhitespace( "int x = 0 ;",
+                                      accum.getInitCode() );
+        assertEqualsIgnoreWhitespace( "x++;",
+                                      accum.getActionCode() );
+        assertEqualsIgnoreWhitespace( "new Integer(x)",
+                                      accum.getResultCode() );
+
+        final AndDescr and = (AndDescr) accum.getInput();
+        assertEquals( 2,
+                      and.getDescrs().size() );
+        final PatternDescr person = (PatternDescr) and.getDescrs().get( 0 );
+        final PatternDescr cheese = (PatternDescr) and.getDescrs().get( 1 );
+        assertEquals( "Person",
+                      person.getObjectType() );
+        assertEquals( "Cheese",
+                      cheese.getObjectType() );
+    }
+
+
+    public void testPluggableOperators() throws Exception {
+        parseResource("compilation_unit", "compilation_unit", "pluggable_operators.drl" );
+
+        final PackageDescr pack = walker.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 5,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr eventA = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "$a",
+                      eventA.getIdentifier() );
+        assertEquals( "EventA",
+                      eventA.getObjectType() );
+
+        final PatternDescr eventB = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "$b",
+                      eventB.getIdentifier() );
+        assertEquals( "EventB",
+                      eventB.getObjectType() );
+        assertEquals( 1,
+                      eventB.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdB = (FieldConstraintDescr) eventB.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdB.getRestrictions().size() );
+        assertTrue( fcdB.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rb = (VariableRestrictionDescr) fcdB.getRestrictions().get( 0 );
+        assertEquals( "after",
+                      rb.getEvaluator() );
+        assertEquals( "$a",
+                      rb.getText() );
+        assertEquals( "1,10",
+                      rb.getParameterText() );
+        assertFalse( rb.isNegated() );
+
+        final PatternDescr eventC = (PatternDescr) rule.getLhs().getDescrs().get( 2 );
+        assertEquals( "$c",
+                      eventC.getIdentifier() );
+        assertEquals( "EventC",
+                      eventC.getObjectType() );
+        assertEquals( 1,
+                      eventC.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdC = (FieldConstraintDescr) eventC.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdC.getRestrictions().size() );
+        assertTrue( fcdC.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rc = (VariableRestrictionDescr) fcdC.getRestrictions().get( 0 );
+        assertEquals( "finishes",
+                      rc.getEvaluator() );
+        assertEquals( "$b",
+                      rc.getText() );
+        assertNull( rc.getParameterText() );
+        assertFalse( rc.isNegated() );
+
+        final PatternDescr eventD = (PatternDescr) rule.getLhs().getDescrs().get( 3 );
+        assertEquals( "$d",
+                      eventD.getIdentifier() );
+        assertEquals( "EventD",
+                      eventD.getObjectType() );
+        assertEquals( 1,
+                      eventD.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdD = (FieldConstraintDescr) eventD.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdD.getRestrictions().size() );
+        assertTrue( fcdD.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rd = (VariableRestrictionDescr) fcdD.getRestrictions().get( 0 );
+        assertEquals( "starts",
+                      rd.getEvaluator() );
+        assertEquals( "$a",
+                      rd.getText() );
+        assertNull( rd.getParameterText() );
+        assertTrue( rd.isNegated() );
+
+        final PatternDescr eventE = (PatternDescr) rule.getLhs().getDescrs().get( 4 );
+        assertEquals( "$e",
+                      eventE.getIdentifier() );
+        assertEquals( "EventE",
+                      eventE.getObjectType() );
+        assertEquals( 1,
+                      eventE.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdE = (FieldConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdE.getRestrictions().size() );
+        assertTrue( fcdE.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr re = (VariableRestrictionDescr) fcdE.getRestrictions().get( 0 );
+        assertEquals( "before",
+                      re.getEvaluator() );
+        assertEquals( "$b",
+                      re.getText() );
+        assertEquals( "1, 10",
+                      re.getParameterText() );
+        assertTrue( re.isNegated() );
+    }
+
+    public void testEntryPoint() throws Exception {
+        final String text = "StockTick( symbol==\"ACME\") from entry-point StreamA";
+
+        PatternDescr pattern = (PatternDescr) parse("pattern_source", "lhs", text);
+
+        assertEquals( 1,
+                      pattern.getDescrs().size() );
+        FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+        assertEquals( "symbol",
+                      fcd.getFieldName() );
+
+        assertNotNull( pattern.getSource() );
+        EntryPointDescr entry = (EntryPointDescr) pattern.getSource();
+        assertEquals( "StreamA",
+                      entry.getEntryId() );
+    }
+
+    public void testNesting() throws Exception {
+    	 parseResource("compilation_unit","compilation_unit", "not_pluggable_operator.drl" );
+
+         assertNotNull(walker);
+    }
+
+    
+	private Object parse(String parserRuleName, String treeRuleName,
+			final String text) throws Exception {
+		return newParser(parserRuleName, treeRuleName, newCharStream(text));
+	}
+
+	private Object parse(String parserRuleName, String treeRuleName,
+			final String source, final String text) throws Exception {
+		return newParser(parserRuleName, treeRuleName, newCharStream(text));
+		// this.parser.setSource( source );
+	}
+
+	private Reader getReader(final String name) throws Exception {
+		final InputStream in = getClass().getResourceAsStream(name);
+		return new InputStreamReader(in);
+	}
+
+	private Object parseResource(String parserRuleName, String treeRuleName,
+			final String name) throws Exception {
+
+		// System.err.println( getClass().getResource( name ) );
+		final Reader reader = getReader(name);
+
+		final StringBuffer text = new StringBuffer();
+
+		final char[] buf = new char[1024];
+		int len = 0;
+
+		while ((len = reader.read(buf)) >= 0) {
+			text.append(buf, 0, len);
+		}
+
+		return parse(parserRuleName, treeRuleName, name, text.toString());
+	}
+
+	private CharStream newCharStream(final String text) {
+		return new ANTLRStringStream(text);
+	}
+
+	private Object newParser(String parserRuleName, String treeRuleName,
+			final CharStream charStream) {
+		return execTreeParser(parserRuleName, treeRuleName, charStream);
+	}
+
+	public Object execTreeParser(String testRuleName, String testTreeRuleName,
+			CharStream charStream) {
+		Object treeRuleReturn = null;
+		try {
+			DRLLexer lexer = new DRLLexer(charStream);
+			CommonTokenStream tokens = new CommonTokenStream(lexer);
+			DRLParser parser = new DRLParser(tokens);
+			parser.setTreeAdaptor(new DroolsTreeAdaptor());
+			/** Use Reflection to get rule method from parser */
+			Method ruleName = Class.forName("org.drools.lang.DRLParser")
+					.getMethod(testRuleName);
+
+			/** Invoke grammar rule, and get the return value */
+			Object ruleReturn = ruleName.invoke(parser);
+			
+			if (!parser.hasErrors()){
+				Class _return = Class.forName("org.drools.lang.DRLParser" + "$"
+						+ testRuleName + "_return");
+				Method returnName = _return.getMethod("getTree");
+				DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn);
+
+				// Walk resulting tree; create tree nodes stream first
+				CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
+				// AST nodes have payload that point into token stream
+				nodes.setTokenStream(tokens);
+				// Create a tree walker attached to the nodes stream
+				this.walker = new DescrBuilderTree(nodes);
+				/** Invoke the tree rule, and store the return value if there is */
+				Method treeRuleName = Class.forName(
+						"org.drools.lang.DescrBuilderTree").getMethod(
+						testTreeRuleName);
+				treeRuleReturn = treeRuleName.invoke(walker);				
+			}
+
+			if (treeRuleReturn != null) {
+				/** If return object is instanceof AST, get the toStringTree */
+				if (treeRuleReturn.toString().indexOf(
+						testTreeRuleName + "_return") > 0) {
+					try { // NullPointerException may happen here...
+						Class _treeReturn = Class
+								.forName("org.drools.lang.DescrBuilderTree"
+										+ "$" + testTreeRuleName + "_return");
+						Field[] fields = _treeReturn.getDeclaredFields();
+						for (Field field : fields) {
+							if (field.getType().getName().contains(
+									"org.drools.lang.descr.")) {
+								return field.get(treeRuleReturn);
+							}
+						}
+					} catch (Exception e) {
+						System.err.println(e);
+					}
+				}
+			}
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return treeRuleReturn;
+	}
+
+    private void assertEqualsIgnoreWhitespace(final String expected,
+                                              final String actual) {
+        final String cleanExpected = expected.replaceAll( "\\s+",
+                                                          "" );
+        final String cleanActual = actual.replaceAll( "\\s+",
+                                                      "" );
+
+        assertEquals( cleanExpected,
+                      cleanActual );
+    }
 }
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestDRL.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/TestDRL.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestDRL.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestDRL.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,1581 @@
+package org.drools.lang;
+
+import junit.framework.TestCase;
+import java.io.*;
+import java.lang.reflect.*;
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;
+
+public class TestDRL extends TestCase {
+	String stdout;
+	String stderr;
+
+	public void testPackage_statement1() throws Exception {
+		// test input: "package foo"
+		Object retval = execParser("package_statement", "package foo", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(package (VT_PACKAGE_ID foo))";
+
+		assertEquals("testing rule "+"package_statement", expecting, actual);
+	}
+
+	public void testPackage_statement2() throws Exception {
+		// test input: "package foo.bar.baz;"
+		Object retval = execParser("package_statement", "package foo.bar.baz;", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(package (VT_PACKAGE_ID foo bar baz))";
+
+		assertEquals("testing rule "+"package_statement", expecting, actual);
+	}
+
+	public void testCompilation_unit3() throws Exception {
+		// test input: ""
+		Object retval = execParser("compilation_unit", "", false);
+		Object actual = examineParserExecResult(8, retval);
+		Object expecting = "VT_COMPILATION_UNIT";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit4() throws Exception {
+		// test input: "package foo; import com.foo.Bar; import com.foo.Baz;"
+		Object retval = execParser("compilation_unit", "package foo; import com.foo.Bar; import com.foo.Baz;", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (import (VT_IMPORT_ID com foo Bar)) (import (VT_IMPORT_ID com foo Baz)))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit5() throws Exception {
+		// test input: "rule empty \n\nthen\n  \nend"
+		Object retval = execParser("compilation_unit", "rule empty \n\nthen\n  \nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule empty then\n  \nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit6() throws Exception {
+		// test input: "#the purpose of this is to see what happens when we have some partially damaged syntax\n#as the IDE uses the parsers AST to work out completion suggestions.\npackage test\n\n\nrule simple_rule \n  when\n    foo3 : Bar(\n\n"
+		Object retval = execParser("compilation_unit", "#the purpose of this is to see what happens when we have some partially damaged syntax\n#as the IDE uses the parsers AST to work out completion suggestions.\npackage test\n\n\nrule simple_rule \n  when\n    foo3 : Bar(\n\n", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit7() throws Exception {
+		// test input: "package test.templates\n\ntemplate Cheese\n\tString \tname\n\tInteger age\nend\n\ntemplate \"Wine\"\n\tString \t\tname\n\tString \t\tyear\n\tString[] \taccolades\nend\n\n\nrule \"a rule\"\n  when\n\tCheese(name == \"Stilton\", age==2001)\n\tWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n  then\n  \tbaz();\nend"
+		Object retval = execParser("compilation_unit", "package test.templates\n\ntemplate Cheese\n\tString \tname\n\tInteger age\nend\n\ntemplate \"Wine\"\n\tString \t\tname\n\tString \t\tyear\n\tString[] \taccolades\nend\n\n\nrule \"a rule\"\n  when\n\tCheese(name == \"Stilton\", age==2001)\n\tWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n  then\n  \tbaz();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID test templates)) (template Cheese (VT_SLOT (VT_DATA_TYPE String) name) (VT_SLOT (VT_DATA_TYPE Integer) age) end) (template \"Wine\" (VT_SLOT (VT_DATA_TYPE String) name) (VT_SLOT (VT_DATA_TYPE String) year) (VT_SLOT (VT_DATA_TYPE String [ ]) accolades) end) (rule \"a rule\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Stilton\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 2001)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Grange\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== \"1978\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT accolades)) (contains \"world champion\"))))) then\n  \tbaz();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit8() throws Exception {
+		// test input: "package foo\n\nrule rule_one \n  when\n  \tFoo()\n  then\n  \t if (speed > speedLimit ? true : false;)\n     pullEmOver();\nend"
+		Object retval = execParser("compilation_unit", "package foo\n\nrule rule_one \n  when\n  \tFoo()\n  then\n  \t if (speed > speedLimit ? true : false;)\n     pullEmOver();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (rule rule_one when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then\n  \t if (speed > speedLimit ? true : false;)\n     pullEmOver();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit9() throws Exception {
+		// test input: "package foo\n\nfunction String[] yourFunction(String args[]) {\n     baz();\n}\n\nrule \"new rule\"\n\n\twhen\n\t\tSomething()\n\tthen\n\t\tyourFunction(new String[3] {\"a\",\"b\",\"c\"});\n\t\t\nend"
+		Object retval = execParser("compilation_unit", "package foo\n\nfunction String[] yourFunction(String args[]) {\n     baz();\n}\n\nrule \"new rule\"\n\n\twhen\n\t\tSomething()\n\tthen\n\t\tyourFunction(new String[3] {\"a\",\"b\",\"c\"});\n\t\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (function (VT_DATA_TYPE String [ ]) yourFunction (VT_PARAM_LIST (VT_DATA_TYPE String) args [ ]) {\n     baz();\n}) (rule \"new rule\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Something)))) then\n\t\tyourFunction(new String[3] {\"a\",\"b\",\"c\"});\n\t\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit10() throws Exception {
+		// test input: "\nrule almost_empty \n  when\n  then\nend"
+		Object retval = execParser("compilation_unit", "\nrule almost_empty \n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule almost_empty when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit11() throws Exception {
+		// test input: "rule \"quoted string name\"\n  when\n  then\nend"
+		Object retval = execParser("compilation_unit", "rule \"quoted string name\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"quoted string name\" when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit12() throws Exception {
+		// test input: "\nrule rule1 \n  no-loop false\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "\nrule rule1 \n  no-loop false\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (no-loop false)) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit13() throws Exception {
+		// test input: "\nrule rule1 \n  auto-focus true\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "\nrule rule1 \n  auto-focus true\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (auto-focus true)) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit14() throws Exception {
+		// test input: "\nrule rule1 \n  ruleflow-group \"a group\"\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "\nrule rule1 \n  ruleflow-group \"a group\"\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (ruleflow-group \"a group\")) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit15() throws Exception {
+		// test input: "\n\nrule myrule \n  when\n  then\n  \tint i = 0;\n\ti = 1;\n\ti / 1;\n\ti == 1;\n\ti(i);\n\ti = 'i';\n\ti.i.i;\n\ti\\i;\n\ti<i;\n\ti>i;\n\ti=\"i\";\t\n\t++i;\n\ti++;\n\t--i;\n\ti--;\n\ti += i;\n\ti -= i;\n\ti *= i;\n\ti /= i;\n\tint i = 5;\n\tfor(int j; j<i; ++j) {\n\t  System.out.println(j);\n\t}\t\n\tObject o = new String(\"Hello\");\n\tString s = (String) o;\t\n\t\nend"
+		Object retval = execParser("compilation_unit", "\n\nrule myrule \n  when\n  then\n  \tint i = 0;\n\ti = 1;\n\ti / 1;\n\ti == 1;\n\ti(i);\n\ti = 'i';\n\ti.i.i;\n\ti\\i;\n\ti<i;\n\ti>i;\n\ti=\"i\";\t\n\t++i;\n\ti++;\n\t--i;\n\ti--;\n\ti += i;\n\ti -= i;\n\ti *= i;\n\ti /= i;\n\tint i = 5;\n\tfor(int j; j<i; ++j) {\n\t  System.out.println(j);\n\t}\t\n\tObject o = new String(\"Hello\");\n\tString s = (String) o;\t\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule myrule when VT_AND_IMPLICIT then\n  \tint i = 0;\n\ti = 1;\n\ti / 1;\n\ti == 1;\n\ti(i);\n\ti = 'i';\n\ti.i.i;\n\ti\\i;\n\ti<i;\n\ti>i;\n\ti=\"i\";\t\n\t++i;\n\ti++;\n\t--i;\n\ti--;\n\ti += i;\n\ti -= i;\n\ti *= i;\n\ti /= i;\n\tint i = 5;\n\tfor(int j; j<i; ++j) {\n\t  System.out.println(j);\n\t}\t\n\tObject o = new String(\"Hello\");\n\tString s = (String) o;\t\n\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit16() throws Exception {
+		// test input: "#check that it can handle true/false literals, and \n#negative numbers\nrule simple_rule \n  when\n\tFoo(bar == false)\n\tFoo(boo > -42)\n\tFoo(boo > -42.42)\n  then\n\tcons();\nend"
+		Object retval = execParser("compilation_unit", "#check that it can handle true/false literals, and \n#negative numbers\nrule simple_rule \n  when\n\tFoo(bar == false)\n\tFoo(boo > -42)\n\tFoo(boo > -42.42)\n  then\n\tcons();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== false)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42.42))))) then\n\tcons();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit17() throws Exception {
+		// test input: "package org.drools.test;\n \nimport org.drools.Cheese;\n \nrule \"simple rule\"\n    when\n        Cheese( )\n    then\nend "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n \nimport org.drools.Cheese;\n \nrule \"simple rule\"\n    when\n        Cheese( )\n    then\nend ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (rule \"simple rule\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese)))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit18() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execParser("compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then\n\tpartay();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit19() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execParser("compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt ( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] ))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then\n\tpartay();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit20() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execParser("compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then\n\tpartay();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit21() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execParser("compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt [\"key\"]))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then\n\tpartay();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit22() throws Exception {
+		// test input: "rule blah\n when \n\tCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n\t            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execParser("compilation_unit", "rule blah\n when \n\tCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n\t            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt1 ( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ) (. doIt2 (bar, [a, \"b\", 42]) (. field [\"key\"])))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then\n\tpartay();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit23() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit24() throws Exception {
+		// test input: "#this is for showing off all the new multi restriction stuff\n\n\n\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execParser("compilation_unit", "#this is for showing off all the new multi restriction stuff\n\n\n\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (|| (== \"sedan\") (== \"wagon\"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then\n\tconsequence();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit25() throws Exception {
+		// test input: "package la\n\n\nrule simple_rule \n  when\n  \tBaz()\n  then\n  \t//woot\n  \tfirst\n  \t\n  \t#\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \nend"
+		Object retval = execParser("compilation_unit", "package la\n\n\nrule simple_rule \n  when\n  \tBaz()\n  then\n  \t//woot\n  \tfirst\n  \t\n  \t#\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID la)) (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then\n  \t//woot\n  \tfirst\n  \t\n  \t//\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit26() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit27() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit28() throws Exception {
+		// test input: "package HR1\n\nimport function abd.def.x\nimport function qed.wah.*\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "package HR1\n\nimport function abd.def.x\nimport function qed.wah.*\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID HR1)) (import function (VT_IMPORT_ID abd def x)) (import function (VT_IMPORT_ID qed wah .*)) (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit29() throws Exception {
+		// test input: "package HR1\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "package HR1\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID HR1)) (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))) then\n\tfunky();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit30() throws Exception {
+		// test input: "package HR2\n\nrule simple_rule \n  when  \t\t  \t\n  \ta : (not ( Cheese(type == \"stilton\") ))\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execParser("compilation_unit", "package HR2\n\nrule simple_rule \n  when  \t\t  \t\n  \ta : (not ( Cheese(type == \"stilton\") ))\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit31() throws Exception {
+		// test input: "\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend"
+		Object retval = execParser("compilation_unit", "\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (query \"simple_query\" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) end))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit32() throws Exception {
+		// test input: "\npackage foo\n\nrule bar\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\nrule bar2\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query2\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\t"
+		Object retval = execParser("compilation_unit", "\npackage foo\n\nrule bar\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\nrule bar2\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query2\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (rule bar when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then\n\t\tBoo()\nend) (query \"simple_query\" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) end) (rule bar2 when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then\n\t\tBoo()\nend) (query \"simple_query2\" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_P!
 ATTERN_TYPE Baz)))) end))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit33() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.integrationtests.Cheese;\n\nrule \"Like Stilton\"\n    when\n        Cheese( t:type == \"stilton\" )\n    then\n        System.out.println(\"I like \" + t);\nend    \n\nrule \"Like Cheddar\"\n    when\n        Cheese( t:type == \"cheddar\" )\n    then\n        System.out.println(\"I like \" + t );\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nimport org.drools.integrationtests.Cheese;\n\nrule \"Like Stilton\"\n    when\n        Cheese( t:type == \"stilton\" )\n    then\n        System.out.println(\"I like \" + t);\nend    \n\nrule \"Like Cheddar\"\n    when\n        Cheese( t:type == \"cheddar\" )\n    then\n        System.out.println(\"I like \" + t );\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools integrationtests Cheese)) (rule \"Like Stilton\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n        System.out.println(\"I like \" + t);\nend) (rule \"Like Cheddar\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"cheddar\")))))) then\n        System.out.println(\"I like \" + t );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit34() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nrule \"like cheddar\"\n    when\n        Cheese( $type:type )\n    then\n        System.out.println(\"I like \" + $type);\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nrule \"like cheddar\"\n    when\n        Cheese( $type:type )\n    then\n        System.out.println(\"I like \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (rule \"like cheddar\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type))))))) then\n        System.out.println(\"I like \" + $type);\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit35() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\nimport org.drools.Person;\n\nrule \"Who likes Stilton\"\n    when\n        Cheese($type : type == \"stilton\")\n        $person : Person($name : name == \"bob\", likes == $type)        \n    then\n        System.out.println( $name + \" likes \" + $type);\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\nimport org.drools.Person;\n\nrule \"Who likes Stilton\"\n    when\n        Cheese($type : type == \"stilton\")\n        $person : Person($name : name == \"bob\", likes == $type)        \n    then\n        System.out.println( $name + \" likes \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (import (VT_IMPORT_ID org drools Person)) (rule \"Who likes Stilton\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $name (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"bob\"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $type)))))))) then\n        System.out.println( $name + \" likes \" + $type);\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit36() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tPerson(name == \"mark\") or \n\t( Person(type == \"fan\") and Cheese(type == \"green\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execParser("compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tPerson(name == \"mark\") or \n\t( Person(type == \"fan\") and Cheese(type == \"green\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"green\"))))))) then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit37() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n    Person(name == \"mark\") && Cheese(type == \"stilton\")\n    Person(name == \"mark\") || Cheese(type == \"stilton\")\n  then\n\tSystem.out.println( \"Mark and Michael\" );\nend"
+		Object retval = execParser("compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n    Person(name == \"mark\") && Cheese(type == \"stilton\")\n    Person(name == \"mark\") || Cheese(type == \"stilton\")\n  then\n\tSystem.out.println( \"Mark and Michael\" );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (&& (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (|| (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n\tSystem.out.println( \"Mark and Michael\" );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit38() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \n\tCheese(type == \"green\")\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execParser("compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \n\tCheese(type == \"green\")\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"green\"))))) then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit39() throws Exception {
+		// test input: "\n\nrule simple_rule \n  when\n\tfoo : ( Person(name == \"mark\") \n\t\tor \n\t\tPerson(type == \"fan\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execParser("compilation_unit", "\n\nrule simple_rule \n  when\n\tfoo : ( Person(name == \"mark\") \n\t\tor \n\t\tPerson(type == \"fan\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\"))))))) then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit40() throws Exception {
+		// test input: "rule simple_rule \n  when\n\tfoo : ( \n\t\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t\t)\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execParser("compilation_unit", "rule simple_rule \n  when\n\tfoo : ( \n\t\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t\t)\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\"))))))) then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit41() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\t ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n  then\n\tgo wild\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\t ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n  then\n\tgo wild\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (and (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== \"a\"))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== \"y\"))))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Shoes))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Butt)))))) then\n\tgo wild\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit42() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\teval(abc(\"foo\") + 5)\n\tFoo()\n\teval(qed())\n\tBar()\n  then\n\tKapow\n\tPoof\n\t\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\teval(abc(\"foo\") + 5)\n\tFoo()\n\teval(qed())\n\tBar()\n  then\n\tKapow\n\tPoof\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (eval (abc(\"foo\") + 5)) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (eval (qed())) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar)))) then\n\tKapow\n\tPoof\n\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit43() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(abc(\"foo\"))\n  then\n\tKapow\n\t\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(abc(\"foo\"))\n  then\n\tKapow\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (abc(\"foo\")))) then\n\tKapow\n\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit44() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo(name== (a + b))\n  then\n\tKapow\n\t\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\tFoo(name== (a + b))\n  then\n\tKapow\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== (a + b)))))) then\n\tKapow\n\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit45() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tPerson( $age2:age -> ($age2 == $age1+2 ) ) \n  then\n\tfoo bar\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n  \tPerson( $age2:age -> ($age2 == $age1+2 ) ) \n  then\n\tfoo bar\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age2 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)))) (-> ($age2 == $age1+2 ))))) then\n\tfoo bar\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit46() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.util.List list;\nglobal java.lang.Integer five;\n\nrule \"not rule test\"\n    when\n        $person : Person( $likes:like )\n        not Cheese( type == $likes )\n    then\n\t\tlist.add( $person );\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.util.List list;\nglobal java.lang.Integer five;\n\nrule \"not rule test\"\n    when\n        $person : Person( $likes:like )\n        not Cheese( type == $likes )\n    then\n\t\tlist.add( $person );\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (global (VT_DATA_TYPE java util List) list) (global (VT_DATA_TYPE java lang Integer) five) (rule \"not rule test\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT like))))))) (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))) then\n\t\tlist.add( $person );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit47() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.lang.String foo\nglobal java.lang.Integer bar;\n\nrule baz\n    when\n        Cheese( )\n    then\n\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.lang.String foo\nglobal java.lang.Integer bar;\n\nrule baz\n    when\n        Cheese( )\n    then\n\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (global (VT_DATA_TYPE java lang String) foo) (global (VT_DATA_TYPE java lang Integer) bar) (rule baz when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese)))) then\n\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit48() throws Exception {
+		// test input: "\nimport java.lang.String\n\nfunction String functionA(String s, Integer i) {\n\t\n\tfoo();\n\n}\n\nfunction void functionB() {\n\tbar();\t\n}\n\n\nrule something \n\twhen\n\tthen\nend\n\nrule \"one more thing\"\n\twhen\n\tthen\nend\n\n\n\n\t"
+		Object retval = execParser("compilation_unit", "\nimport java.lang.String\n\nfunction String functionA(String s, Integer i) {\n\t\n\tfoo();\n\n}\n\nfunction void functionB() {\n\tbar();\t\n}\n\n\nrule something \n\twhen\n\tthen\nend\n\nrule \"one more thing\"\n\twhen\n\tthen\nend\n\n\n\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (import (VT_IMPORT_ID java lang String)) (function (VT_DATA_TYPE String) functionA (VT_PARAM_LIST (VT_DATA_TYPE String) s (VT_DATA_TYPE Integer) i) {\n\t\n\tfoo();\n\n}) (function (VT_DATA_TYPE void) functionB VT_PARAM_LIST {\n\tbar();\t\n}) (rule something when VT_AND_IMPLICIT then\nend) (rule \"one more thing\" when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit49() throws Exception {
+		// test input: "#this starts with a comment\npackage foo.bar\n\n//and another comment\n\n/*\nyet\n\t   another\n   \t\t\t\tstyle\n*/\n\nrule \"test\"\n  when\n  then\nend"
+		Object retval = execParser("compilation_unit", "#this starts with a comment\npackage foo.bar\n\n//and another comment\n\n/*\nyet\n\t   another\n   \t\t\t\tstyle\n*/\n\nrule \"test\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo bar)) (rule \"test\" when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit50() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n\t\t#attributes keywork (and colon) is totally optional\n\t\tsalience 42\n\t\tagenda-group \"my_group\"\n\t\tno-loop \n\t\tduration 42\n\t\tactivation-group \"my_activation_group\"\n\t\tlock-on-active true\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend"
+		Object retval = execParser("compilation_unit", "\n\n\nrule simple_rule \n\t\t#attributes keywork (and colon) is totally optional\n\t\tsalience 42\n\t\tagenda-group \"my_group\"\n\t\tno-loop \n\t\tduration 42\n\t\tactivation-group \"my_activation_group\"\n\t\tlock-on-active true\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule (VT_RULE_ATTRIBUTES (salience 42) (agenda-group \"my_group\") no-loop (duration 42) (activation-group \"my_activation_group\") (lock-on-active true)) when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then\n\t\tbar();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit51() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n\tattributes: \n\t\tsalience 42, agenda-group \"my_group\", no-loop,  lock-on-active, duration 42, activation-group \"my_activation_group\"\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend"
+		Object retval = execParser("compilation_unit", "\n\n\nrule simple_rule \n\tattributes: \n\t\tsalience 42, agenda-group \"my_group\", no-loop,  lock-on-active, duration 42, activation-group \"my_activation_group\"\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule (VT_RULE_ATTRIBUTES attributes (salience 42) (agenda-group \"my_group\") no-loop lock-on-active (duration 42) (activation-group \"my_activation_group\")) when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then\n\t\tbar();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit52() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tFoo(bar == Foo.BAR)\n  then\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n  \tFoo(bar == Foo.BAR)\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT Foo) (VT_ACCESSOR_ELEMENT BAR))))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit53() throws Exception {
+		// test input: "rule one\n  when\n    exists Foo()\n    exits Bar()\n  then\nend\n\nrule two \n  when\n    ford = ford = ford\n  then\nend"
+		Object retval = execParser("compilation_unit", "rule one\n  when\n    exists Foo()\n    exits Bar()\n  then\nend\n\nrule two \n  when\n    ford = ford = ford\n  then\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit54() throws Exception {
+		// test input: "\nrule \"another test\"\n    when\n        s : String()\n        eval(s.equals(\"foo\") && s.startsWith(\"f\"))\n        \n        \n    then\n        list.add( s );\nend "
+		Object retval = execParser("compilation_unit", "\nrule \"another test\"\n    when\n        s : String()\n        eval(s.equals(\"foo\") && s.startsWith(\"f\"))\n        \n        \n    then\n        list.add( s );\nend ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"another test\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING s (VT_FACT (VT_PATTERN_TYPE String)))) (eval (s.equals(\"foo\") && s.startsWith(\"f\")))) then\n        list.add( s );\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit55() throws Exception {
+		// test input: "package nesting;\n\n\n\n\nrule \"test something\"\n\n\twhen\n\t\tp: Person( name soundslike \"Michael\" )\n\tthen\n\t\tp.name = \"goober\"\n\t\tSystem.out.println(p.name)\nend"
+		Object retval = execParser("compilation_unit", "package nesting;\n\n\n\n\nrule \"test something\"\n\n\twhen\n\t\tp: Person( name soundslike \"Michael\" )\n\tthen\n\t\tp.name = \"goober\"\n\t\tSystem.out.println(p.name)\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID nesting)) (rule \"test something\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (soundslike \"Michael\")))))) then\n\t\tp.name = \"goober\"\n\t\tSystem.out.println(p.name)\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit56() throws Exception {
+		// test input: "package com.foo;\n\nagenda-group \"x\"\n\nimport goo.ber\nimport wee.waa\n\n\ndialect \"java\"\n\n\n\n\nrule bar\n  when\n  then\nend\n\nrule baz\n  dialect \"mvel\"\n  when\n  then\nend"
+		Object retval = execParser("compilation_unit", "package com.foo;\n\nagenda-group \"x\"\n\nimport goo.ber\nimport wee.waa\n\n\ndialect \"java\"\n\n\n\n\nrule bar\n  when\n  then\nend\n\nrule baz\n  dialect \"mvel\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID com foo)) (agenda-group \"x\") (import (VT_IMPORT_ID goo ber)) (import (VT_IMPORT_ID wee waa)) (dialect \"java\") (rule bar when VT_AND_IMPLICIT then\nend) (rule baz (VT_RULE_ATTRIBUTES (dialect \"mvel\")) when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit57() throws Exception {
+		// test input: "\npackage com.foo;\n\nimport im.one\n\nimport im.two\n\nrule foo\n  when\n  then\nend\n\nfunction cheeseIt() {\n\n}\n\nimport im.three;\n\nrule bar\n  when\n  then\nend\n\nfunction uncheeseIt() {\n\n}\n\nimport im.four;"
+		Object retval = execParser("compilation_unit", "\npackage com.foo;\n\nimport im.one\n\nimport im.two\n\nrule foo\n  when\n  then\nend\n\nfunction cheeseIt() {\n\n}\n\nimport im.three;\n\nrule bar\n  when\n  then\nend\n\nfunction uncheeseIt() {\n\n}\n\nimport im.four;", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID com foo)) (import (VT_IMPORT_ID im one)) (import (VT_IMPORT_ID im two)) (rule foo when VT_AND_IMPLICIT then\nend) (function cheeseIt VT_PARAM_LIST {\n\n}) (import (VT_IMPORT_ID im three)) (rule bar when VT_AND_IMPLICIT then\nend) (function uncheeseIt VT_PARAM_LIST {\n\n}) (import (VT_IMPORT_ID im four)))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit58() throws Exception {
+		// test input: "\nrule \"1. Do Stuff!\"\n  when\n  then\nend\n\nrule \"2. Do More Stuff!\"\n  when\n  then\nend"
+		Object retval = execParser("compilation_unit", "\nrule \"1. Do Stuff!\"\n  when\n  then\nend\n\nrule \"2. Do More Stuff!\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"1. Do Stuff!\" when VT_AND_IMPLICIT then\nend) (rule \"2. Do More Stuff!\" when VT_AND_IMPLICIT then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit59() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(\n\t\n\t\n\t\n\t       abc(\n\t       \n\t       \"foo\") + \n\t       5\n\t       \n\t       \n\t       \n\t        \n\t       )\n  then\n\tKapow\n\tPoof\n\t\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(\n\t\n\t\n\t\n\t       abc(\n\t       \n\t       \"foo\") + \n\t       5\n\t       \n\t       \n\t       \n\t        \n\t       )\n  then\n\tKapow\n\tPoof\n\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (\n\t\n\t\n\t\n\t       abc(\n\t       \n\t       \"foo\") + \n\t       5\n\t       \n\t       \n\t       \n\t        \n\t       ))) then\n\tKapow\n\tPoof\n\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit60() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\teval(abc();)\n  then\n\tKapow\n\tPoof\nend"
+		Object retval = execParser("compilation_unit", "\nrule simple_rule \n  when\n\teval(abc();)\n  then\n\tKapow\n\tPoof\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit61() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n  when\n\tFoo(\n\t  bar == baz, la==laz\n\t  )\n  then\n\tKapow\n\tPoof\nend\n\t"
+		Object retval = execParser("compilation_unit", "\n\n\nrule simple_rule \n  when\n\tFoo(\n\t  bar == baz, la==laz\n\t  )\n  then\n\tKapow\n\tPoof\nend\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT baz)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT la)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT laz))))))) then\n\tKapow\n\tPoof\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit62() throws Exception {
+		// test input: "package org.drools.test;\n\nrule \"Who likes Stilton\"\n    when\n        com.cheeseco.Cheese($type : type == \"stilton\")\n    then\n        System.out.println( $name + \" likes \" + $type);\nend    "
+		Object retval = execParser("compilation_unit", "package org.drools.test;\n\nrule \"Who likes Stilton\"\n    when\n        com.cheeseco.Cheese($type : type == \"stilton\")\n    then\n        System.out.println( $name + \" likes \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (rule \"Who likes Stilton\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE com cheeseco Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\")))))) then\n        System.out.println( $name + \" likes \" + $type);\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit63() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                result( new Integer(x) ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit64() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit65() throws Exception {
+		// test input: "rule \"CollectParserTest\"\nwhen\n     $personList : ArrayList() from collect( Person( age > 21 ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"CollectParserTest\"\nwhen\n     $personList : ArrayList() from collect( Person( age > 21 ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"CollectParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit66() throws Exception {
+		// test input: "rule \"test_Quotes\"\n   when\n      InitialFact()\n   then\n      String s = \"\\\"\\n\\t\\\\\";\nend "
+		Object retval = execParser("compilation_unit", "rule \"test_Quotes\"\n   when\n      InitialFact()\n   then\n      String s = \"\\\"\\n\\t\\\\\";\nend ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"test_Quotes\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE InitialFact)))) then\n      String s = \"\\\"\\n\\t\\\\\";\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit67() throws Exception {
+		// test input: "rule \"test nested CEs\"\t\n\twhen\n\t    not ( State( $state : state ) and\n\t          not( Person( status == $state, $likes : likes ) and\n\t               Cheese( type == $likes ) ) )\n\t    Person( name == \"Bob\" )\n\t    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n\tthen \n\t\tresults.add(\"OK\");\t\t\nend"
+		Object retval = execParser("compilation_unit", "rule \"test nested CEs\"\t\n\twhen\n\t    not ( State( $state : state ) and\n\t          not( Person( status == $state, $likes : likes ) and\n\t               Cheese( type == $likes ) ) )\n\t    Person( name == \"Bob\" )\n\t    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n\tthen \n\t\tresults.add(\"OK\");\t\t\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"test nested CEs\" when (VT_AND_IMPLICIT (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE State) (VT_BIND_FIELD $state (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT state)))))) (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT status)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $state)))) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Bob\")))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"br!
 ie\")))))) then \n\t\tresults.add(\"OK\");\t\t\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit68() throws Exception {
+		// test input: "rule \"ForallParserTest\"\nwhen\n     forall( Person( age > 21, $likes : likes )\n             Cheese( type == $likes ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"ForallParserTest\"\nwhen\n     forall( Person( age > 21, $likes : likes )\n             Cheese( type == $likes ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"ForallParserTest\" when (VT_AND_IMPLICIT (forall (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit69() throws Exception {
+		// test input: "#testing 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execParser("compilation_unit", "#testing 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in \"sedan\" \"wagon\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then\n\tconsequence();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit70() throws Exception {
+		// test input: "#testing not 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execParser("compilation_unit", "#testing not 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in not \"sedan\" \"wagon\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then\n\tconsequence();\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit71() throws Exception {
+		// test input: "package org.drools;\n\nglobal java.util.List list;\n\nrule \"rule1\"\nwhen\n    Pattern1();\n    Pattern2() from x.y.z;\nthen\n    System.out.println(\"Test\");\nend;\n\nquery \"query1\"\n\tPattern5();\n\tPattern6();\n\tPattern7();\nend;\n\nrule \"rule2\"\nwhen\n    Pattern3();\n    Pattern4() from collect( Pattern5() );\nthen\n    System.out.println(\"Test\");\nend;\n\n\t"
+		Object retval = execParser("compilation_unit", "package org.drools;\n\nglobal java.util.List list;\n\nrule \"rule1\"\nwhen\n    Pattern1();\n    Pattern2() from x.y.z;\nthen\n    System.out.println(\"Test\");\nend;\n\nquery \"query1\"\n\tPattern5();\n\tPattern6();\n\tPattern7();\nend;\n\nrule \"rule2\"\nwhen\n    Pattern3();\n    Pattern4() from collect( Pattern5() );\nthen\n    System.out.println(\"Test\");\nend;\n\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (global (VT_DATA_TYPE java util List) list) (rule \"rule1\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern1))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern2))) (VT_FROM_SOURCE x (. y (. z))))) then\n    System.out.println(\"Test\");\nend;) (query \"query1\" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern6))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern7)))) end) (rule \"rule2\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern3))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern4))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5)))))) then\n    System.out.println(\"Test\");\nend;))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit72() throws Exception {
+		// test input: "package org.drools\n\nrule \"Test Parse\"\n\nwhen\n    eval( 3==3 )\nthen\n    System.out.println(\"OK\");\nend "
+		Object retval = execParser("compilation_unit", "package org.drools\n\nrule \"Test Parse\"\n\nwhen\n    eval( 3==3 )\nthen\n    System.out.println(\"OK\");\nend ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule \"Test Parse\" when (VT_AND_IMPLICIT (eval ( 3==3 ))) then\n    System.out.println(\"OK\");\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit73() throws Exception {
+		// test input: "rule \"AccumulateReverseParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                reverse( x--; ),\n                                result( new Integer(x) ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateReverseParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                reverse( x--; ),\n                                result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateReverseParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (reverse ( x--; )) (result ( new Integer(x) )))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit74() throws Exception {
+		// test input: "rule \"AccumulateReverseParserTest\"\nwhen\n     Number() from accumulate( Person( $age : age > 21 ),\n                               average( $age ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateReverseParserTest\"\nwhen\n     Number() from accumulate( Person( $age : age > 21 ),\n                               average( $age ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateReverseParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Number))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_ID_CLAUSE average ( $age ))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit75() throws Exception {
+		// test input: "rule \"CollectParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\nthen\nend\n\n\t"
+		Object retval = execParser("compilation_unit", "rule \"CollectParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\nthen\nend\n\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"CollectParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (from (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ())))))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit76() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n                                                max( $age ) );\nthen\nend\n\n\t"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n                                                max( $age ) );\nthen\nend\n\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (accumulate (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (> 21) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))) (VT_ACCUMULATE_ID_CLAUSE max ( $age ))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit77() throws Exception {
+		// test input: "package org.drools;\n\nrule \"testing OR CE\"\nwhen\n    $p : Person( name == \"bob\" )\n    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\nthen\n    // do something\nend "
+		Object retval = execParser("compilation_unit", "package org.drools;\n\nrule \"testing OR CE\"\nwhen\n    $p : Person( name == \"bob\" )\n    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\nthen\n    // do something\nend ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule \"testing OR CE\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"bob\"))))) (|| (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $p) (VT_ACCESSOR_ELEMENT likes))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))))) then\n    // do something\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit78() throws Exception {
+		// test input: "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end"
+		Object retval = execParser("compilation_unit", "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"another test\" (VT_RULE_ATTRIBUTES (salience 10)) when (VT_AND_IMPLICIT (eval ( true ))) then System.out.println(1); end))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit79() throws Exception {
+		// test input: "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\nend"
+		Object retval = execParser("compilation_unit", "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"another test\" (VT_RULE_ATTRIBUTES (salience 10)) when (VT_AND_IMPLICIT (eval ( true ))) then System.out.println(1);\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit80() throws Exception {
+		// test input: "rule \"AccumulateMultiPatternParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend"
+		Object retval = execParser("compilation_unit", "rule \"AccumulateMultiPatternParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (rule \"AccumulateMultiPatternParserTest\" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (and (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $person) (VT_ACCESSOR_ELEMENT likes))))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit81() throws Exception {
+		// test input: "package org.drools;\n\nrule \"test rule\"\n\tsalience 10\n\twhen\n\t\t$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))\n\tthen\n\t\tretract($p);\nend\n\t"
+		Object retval = execParser("compilation_unit", "package org.drools;\n\nrule \"test rule\"\n\tsalience 10\n\twhen\n\t\t$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))\n\tthen\n\t\tretract($p);\nend\n\t", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit82() throws Exception {
+		// test input: "package org.drools;\n\nrule \"Avoid NPE on wrong syntax\"\nwhen\n    not( Cheese( ( type == \"stilton\", price == 10 ) || ( type == \"brie\", price == 15 ) ) from $cheeseList )\nthen\n    System.out.println(\"OK\");\nend"
+		Object retval = execParser("compilation_unit", "package org.drools;\n\nrule \"Avoid NPE on wrong syntax\"\nwhen\n    not( Cheese( ( type == \"stilton\", price == 10 ) || ( type == \"brie\", price == 15 ) ) from $cheeseList )\nthen\n    System.out.println(\"OK\");\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit83() throws Exception {
+		// test input: "package org.drools;\n\nrule \"test pluggable operators\"\nwhen\n    $a : EventA()\n    $b : EventB( this `after[1,10] $a )\n    $c : EventC( this finishes $b )\n    $d : EventD( this not starts $a )\n    $e : EventE( this not `before [1, 10] $b )\nthen\nend"
+		Object retval = execParser("compilation_unit", "package org.drools;\n\nrule \"test pluggable operators\"\nwhen\n    $a : EventA()\n    $b : EventB( this `after[1,10] $a )\n    $c : EventC( this finishes $b )\n    $d : EventD( this not starts $a )\n    $e : EventE( this not `before [1, 10] $b )\nthen\nend", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule \"test pluggable operators\" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $a (VT_FACT (VT_PATTERN_TYPE EventA)))) (VT_PATTERN (VT_FACT_BINDING $b (VT_FACT (VT_PATTERN_TYPE EventB) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (after [1,10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE EventC) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (finishes (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))) (VT_PATTERN (VT_FACT_BINDING $d (VT_FACT (VT_PATTERN_TYPE EventD) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (starts not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $e (VT_FACT (VT_PATTERN_TYPE EventE) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (before not [1, 10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b)))))))) then\nend))";
+
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testPattern_source84() throws Exception {
+		// test input: "StockTick( symbol==\"ACME\") from entry-point StreamA"
+		Object retval = execParser("pattern_source", "StockTick( symbol==\"ACME\") from entry-point StreamA", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE StockTick) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT symbol)) (== \"ACME\")))) (entry-point StreamA))";
+
+		assertEquals("testing rule "+"pattern_source", expecting, actual);
+	}
+
+	public void testParen_chunk85() throws Exception {
+		// test input: "( foo )"
+		Object retval = execParser("paren_chunk", "( foo )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "( foo )";
+
+		assertEquals("testing rule "+"paren_chunk", expecting, actual);
+	}
+
+	public void testParen_chunk86() throws Exception {
+		// test input: "(fnord())"
+		Object retval = execParser("paren_chunk", "(fnord())", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(fnord())";
+
+		assertEquals("testing rule "+"paren_chunk", expecting, actual);
+	}
+
+	public void testParen_chunk87() throws Exception {
+		// test input: "( fnord( \"cheese\" ) )"
+		Object retval = execParser("paren_chunk", "( fnord( \"cheese\" ) )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "( fnord( \"cheese\" ) )";
+
+		assertEquals("testing rule "+"paren_chunk", expecting, actual);
+	}
+
+	public void testParen_chunk88() throws Exception {
+		// test input: "( %*9dkj)"
+		Object retval = execParser("paren_chunk", "( %*9dkj)", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "( %*9dkj)";
+
+		assertEquals("testing rule "+"paren_chunk", expecting, actual);
+	}
+
+	public void testNormal_lhs_block89() throws Exception {
+		// test input: ""
+		Object retval = execParser("normal_lhs_block", "", false);
+		Object actual = examineParserExecResult(8, retval);
+		Object expecting = "VT_AND_IMPLICIT";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block90() throws Exception {
+		// test input: "\n     Country( $cities : city )\n     Person( city memberOf $cities )\n    "
+		Object retval = execParser("normal_lhs_block", "\n     Country( $cities : city )\n     Person( city memberOf $cities )\n    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_BIND_FIELD $cities (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)) (memberOf (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $cities)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block91() throws Exception {
+		// test input: "\n     Country( $cities : city )\n     Person( city not memberOf $cities )\n    "
+		Object retval = execParser("normal_lhs_block", "\n     Country( $cities : city )\n     Person( city not memberOf $cities )\n    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_BIND_FIELD $cities (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)) (memberOf not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $cities)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block92() throws Exception {
+		// test input: " Person( age < 42 && location==\"atlanta\") "
+		Object retval = execParser("normal_lhs_block", " Person( age < 42 && location==\"atlanta\") ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"atlanta\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block93() throws Exception {
+		// test input: " Person( age < 42 || location==\"atlanta\") "
+		Object retval = execParser("normal_lhs_block", " Person( age < 42 || location==\"atlanta\") ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"atlanta\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block94() throws Exception {
+		// test input: "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")"
+		Object retval = execParser("normal_lhs_block", "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"atlanta\"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 20)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"Seatle\")))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"Chicago\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block95() throws Exception {
+		// test input: "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")"
+		Object retval = execParser("normal_lhs_block", "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"atlanta\")) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 20)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"Seatle\"))))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"Chicago\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block96() throws Exception {
+		// test input: " Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) ) "
+		Object retval = execParser("normal_lhs_block", " Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) ) ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 70)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"black\"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 40)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"pink\")))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 12)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"yellow\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"blue\"))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block97() throws Exception {
+		// test input: " Person( name matches \"mark\" || matches \"bob\" ) "
+		Object retval = execParser("normal_lhs_block", " Person( name matches \"mark\" || matches \"bob\" ) ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (|| (matches \"mark\") (matches \"bob\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block98() throws Exception {
+		// test input: "\n\tCity( $city : city )\n\tCountry( cities not contains $city )\n\t"
+		Object retval = execParser("normal_lhs_block", "\n\tCity( $city : city )\n\tCountry( cities not contains $city )\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE City) (VT_BIND_FIELD $city (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT cities)) (contains not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $city)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block99() throws Exception {
+		// test input: " Message( text not matches '[abc]*' ) "
+		Object retval = execParser("normal_lhs_block", " Message( text not matches '[abc]*' ) ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Message) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT text)) (matches not '[abc]*')))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block100() throws Exception {
+		// test input: "Foo( bar > 1 || == 1 )"
+		Object retval = execParser("normal_lhs_block", "Foo( bar > 1 || == 1 )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (|| (> 1) (== 1))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block101() throws Exception {
+		// test input: "\n\t(or\n\tnot Person()\n\t\t(and Cheese()\n\t\t\tMeat()\n\t\t\tWine()))\n\t"
+		Object retval = execParser("normal_lhs_block", "\n\t(or\n\tnot Person()\n\t\t(and Cheese()\n\t\t\tMeat()\n\t\t\tWine()))\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person)))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Meat))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block102() throws Exception {
+		// test input: "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))"
+		Object retval = execParser("normal_lhs_block", "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (&& (> 60) (< 70)) (&& (> 50) (< 55)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"black\"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 40)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"pink\")))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 12)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"yellow\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== \"blue\"))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block103() throws Exception {
+		// test input: "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n"
+		Object retval = execParser("normal_lhs_block", "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE org drools Message) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT text)) (matches not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $c) (VT_ACCESSOR_ELEMENT property)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block104() throws Exception {
+		// test input: " $id : Something( duration == \"foo\") "
+		Object retval = execParser("normal_lhs_block", " $id : Something( duration == \"foo\") ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $id (VT_FACT (VT_PATTERN_TYPE Something) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT duration)) (== \"foo\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block105() throws Exception {
+		// test input: "foo3 : Bar("
+		Object retval = execParser("normal_lhs_block", "foo3 : Bar(", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block106() throws Exception {
+		// test input: "\nCheese(name == \"Stilton\", age==2001)\nWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n"
+		Object retval = execParser("normal_lhs_block", "\nCheese(name == \"Stilton\", age==2001)\nWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Stilton\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 2001)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Grange\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== \"1978\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT accolades)) (contains \"world champion\")))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block107() throws Exception {
+		// test input: "Foo()"
+		Object retval = execParser("normal_lhs_block", "Foo()", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block108() throws Exception {
+		// test input: "not Cheese(type == \"stilton\")"
+		Object retval = execParser("normal_lhs_block", "not Cheese(type == \"stilton\")", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block109() throws Exception {
+		// test input: "\nPerson(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\")\n"
+		Object retval = execParser("normal_lhs_block", "\nPerson(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\")\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== \"atlanta\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"bob\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block110() throws Exception {
+		// test input: "\nFoo(bar == false)\nFoo(boo > -42)\nFoo(boo > -42.42)\n"
+		Object retval = execParser("normal_lhs_block", "\nFoo(bar == false)\nFoo(boo > -42)\nFoo(boo > -42.42)\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== false)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42.42)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block111() throws Exception {
+		// test input: "Cheese( )"
+		Object retval = execParser("normal_lhs_block", "Cheese( )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block112() throws Exception {
+		// test input: "\nCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n"
+		Object retval = execParser("normal_lhs_block", "\nCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block113() throws Exception {
+		// test input: "\nCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n"
+		Object retval = execParser("normal_lhs_block", "\nCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt ( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] ))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block114() throws Exception {
+		// test input: "\nCol1() from something.doIt\nCol2()\n"
+		Object retval = execParser("normal_lhs_block", "\nCol1() from something.doIt\nCol2()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block115() throws Exception {
+		// test input: "\nCol1() from something.doIt[\"key\"]\nCol2()\n"
+		Object retval = execParser("normal_lhs_block", "\nCol1() from something.doIt[\"key\"]\nCol2()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt [\"key\"]))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block116() throws Exception {
+		// test input: "\nCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\nCol2()\n"
+		Object retval = execParser("normal_lhs_block", "\nCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\nCol2()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt1 ( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ) (. doIt2 (bar, [a, \"b\", 42]) (. field [\"key\"])))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block117() throws Exception {
+		// test input: "\nfoo3 : Bar(a==3)\nfoo4 : Bar(a4:a==4)\nBaz()\n"
+		Object retval = execParser("normal_lhs_block", "\nfoo3 : Bar(a==3)\nfoo4 : Bar(a4:a==4)\nBaz()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block118() throws Exception {
+		// test input: "\nPerson(age > 30 && < 40)\nVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n"
+		Object retval = execParser("normal_lhs_block", "\nPerson(age > 30 && < 40)\nVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (|| (== \"sedan\") (== \"wagon\"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block119() throws Exception {
+		// test input: "    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()"
+		Object retval = execParser("normal_lhs_block", "    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block120() throws Exception {
+		// test input: "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n"
+		Object retval = execParser("normal_lhs_block", "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block121() throws Exception {
+		// test input: "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n"
+		Object retval = execParser("normal_lhs_block", "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block122() throws Exception {
+		// test input: "\na : (not ( Cheese(type == \"stilton\") ))\nexists ( Foo() )\n"
+		Object retval = execParser("normal_lhs_block", "\na : (not ( Cheese(type == \"stilton\") ))\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block123() throws Exception {
+		// test input: " Cheese( t:type == \"cheddar\" ) "
+		Object retval = execParser("normal_lhs_block", " Cheese( t:type == \"cheddar\" ) ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"cheddar\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block124() throws Exception {
+		// test input: "Cheese( $type:type )"
+		Object retval = execParser("normal_lhs_block", "Cheese( $type:type )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block125() throws Exception {
+		// test input: "\n    Cheese($type : type == \"stilton\")\n    $person : Person($name : name == \"bob\", likes == $type)        \n"
+		Object retval = execParser("normal_lhs_block", "\n    Cheese($type : type == \"stilton\")\n    $person : Person($name : name == \"bob\", likes == $type)        \n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $name (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"bob\"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $type))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block126() throws Exception {
+		// test input: "\nPerson(name == \"mark\") or \n( Person(type == \"fan\") and Cheese(type == \"green\") )\n"
+		Object retval = execParser("normal_lhs_block", "\nPerson(name == \"mark\") or \n( Person(type == \"fan\") and Cheese(type == \"green\") )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"green\")))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block127() throws Exception {
+		// test input: "\nPerson(name == \"mark\") && Cheese(type == \"stilton\")\nPerson(name == \"mark\") || Cheese(type == \"stilton\")\n"
+		Object retval = execParser("normal_lhs_block", "\nPerson(name == \"mark\") && Cheese(type == \"stilton\")\nPerson(name == \"mark\") || Cheese(type == \"stilton\")\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (&& (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))) (|| (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block128() throws Exception {
+		// test input: "\nfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \nCheese(type == \"green\")\n"
+		Object retval = execParser("normal_lhs_block", "\nfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \nCheese(type == \"green\")\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"green\")))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block129() throws Exception {
+		// test input: "\nfoo : ( Person(name == \"mark\") \n\tor \n\tPerson(type == \"fan\") )\n"
+		Object retval = execParser("normal_lhs_block", "\nfoo : ( Person(name == \"mark\") \n\tor \n\tPerson(type == \"fan\") )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block130() throws Exception {
+		// test input: "\nfoo : ( \n\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t)\n"
+		Object retval = execParser("normal_lhs_block", "\nfoo : ( \n\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t)\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"mark\"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"fan\")))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block131() throws Exception {
+		// test input: "\n ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n"
+		Object retval = execParser("normal_lhs_block", "\n ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (and (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== \"a\"))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== \"y\"))))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Shoes))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Butt))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block132() throws Exception {
+		// test input: "\neval(abc(\"foo\") + 5)\nFoo()\neval(qed())\nBar()\n"
+		Object retval = execParser("normal_lhs_block", "\neval(abc(\"foo\") + 5)\nFoo()\neval(qed())\nBar()\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (eval (abc(\"foo\") + 5)) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (eval (qed())) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block133() throws Exception {
+		// test input: "\nFoo()\nBar()\neval(abc(\"foo\"))\n"
+		Object retval = execParser("normal_lhs_block", "\nFoo()\nBar()\neval(abc(\"foo\"))\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (abc(\"foo\"))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block134() throws Exception {
+		// test input: "Foo(name== (a + b))"
+		Object retval = execParser("normal_lhs_block", "Foo(name== (a + b))", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== (a + b))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block135() throws Exception {
+		// test input: "Person( $age2:age -> ($age2 == $age1+2 ) )"
+		Object retval = execParser("normal_lhs_block", "Person( $age2:age -> ($age2 == $age1+2 ) )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age2 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)))) (-> ($age2 == $age1+2 )))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block136() throws Exception {
+		// test input: "Foo(bar == Foo.BAR)"
+		Object retval = execParser("normal_lhs_block", "Foo(bar == Foo.BAR)", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT Foo) (VT_ACCESSOR_ELEMENT BAR)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block137() throws Exception {
+		// test input: "\np: Person( name soundslike \"Michael\" )\n"
+		Object retval = execParser("normal_lhs_block", "\np: Person( name soundslike \"Michael\" )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (soundslike \"Michael\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block138() throws Exception {
+		// test input: "\nFoo()\nBar()\neval(\n\n\n\n       abc(\n       \n       \"foo\") + \n       5\n       \n       \n       \n        \n       )\n"
+		Object retval = execParser("normal_lhs_block", "\nFoo()\nBar()\neval(\n\n\n\n       abc(\n       \n       \"foo\") + \n       5\n       \n       \n       \n        \n       )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (\n\n\n\n       abc(\n       \n       \"foo\") + \n       5\n       \n       \n       \n        \n       )))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block139() throws Exception {
+		// test input: "eval(abc();)"
+		Object retval = execParser("normal_lhs_block", "eval(abc();)", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block140() throws Exception {
+		// test input: "\nFoo(\n  bar == baz, la==laz\n  )\n "
+		Object retval = execParser("normal_lhs_block", "\nFoo(\n  bar == baz, la==laz\n  )\n ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT baz)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT la)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT laz)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block141() throws Exception {
+		// test input: "com.cheeseco.Cheese($type : type == \"stilton\")"
+		Object retval = execParser("normal_lhs_block", "com.cheeseco.Cheese($type : type == \"stilton\")", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE com cheeseco Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"stilton\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block142() throws Exception {
+		// test input: "\n     Integer() from accumulate( Person( age > 21 ),\n                            init( int x = 0; ),\n                            action( x++; ),\n                            result( new Integer(x) ) );\n"
+		Object retval = execParser("normal_lhs_block", "\n     Integer() from accumulate( Person( age > 21 ),\n                            init( int x = 0; ),\n                            action( x++; ),\n                            result( new Integer(x) ) );\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block143() throws Exception {
+		// test input: "\n $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                     init( int x = 0; ),\n                                     action( x++; ),\n                                     result( new Integer(x) ) );\n"
+		Object retval = execParser("normal_lhs_block", "\n $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                     init( int x = 0; ),\n                                     action( x++; ),\n                                     result( new Integer(x) ) );\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block144() throws Exception {
+		// test input: "$personList : ArrayList() from collect( Person( age > 21 ) );"
+		Object retval = execParser("normal_lhs_block", "$personList : ArrayList() from collect( Person( age > 21 ) );", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block145() throws Exception {
+		// test input: "\n\tnot ( State( $state : state ) and\n          not( Person( status == $state, $likes : likes ) and\n               Cheese( type == $likes ) ) )\n    Person( name == \"Bob\" )\n    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n"
+		Object retval = execParser("normal_lhs_block", "\n\tnot ( State( $state : state ) and\n          not( Person( status == $state, $likes : likes ) and\n               Cheese( type == $likes ) ) )\n    Person( name == \"Bob\" )\n    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE State) (VT_BIND_FIELD $state (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT state)))))) (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT status)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $state)))) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"Bob\")))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== \"brie\"))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block146() throws Exception {
+		// test input: "\n forall( Person( age > 21, $likes : likes )\n         Cheese( type == $likes ) );\n"
+		Object retval = execParser("normal_lhs_block", "\n forall( Person( age > 21, $likes : likes )\n         Cheese( type == $likes ) );\n", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (forall (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block147() throws Exception {
+		// test input: "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n\t"
+		Object retval = execParser("normal_lhs_block", "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in \"sedan\" \"wagon\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block148() throws Exception {
+		// test input: "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n\t"
+		Object retval = execParser("normal_lhs_block", "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in not \"sedan\" \"wagon\")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block149() throws Exception {
+		// test input: "\n\t\tPattern1();\n\t\tPattern2() from x.y.z;\n\t\tPattern5();\n\t\tPattern6();\n\t\tPattern7();\n\t\tPattern3();\n\t\tPattern4() from collect( Pattern5() );\n\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t\tPattern1();\n\t\tPattern2() from x.y.z;\n\t\tPattern5();\n\t\tPattern6();\n\t\tPattern7();\n\t\tPattern3();\n\t\tPattern4() from collect( Pattern5() );\n\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern1))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern2))) (VT_FROM_SOURCE x (. y (. z)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern6))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern7))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern3))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern4))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block150() throws Exception {
+		// test input: " eval( 3==3 ) "
+		Object retval = execParser("normal_lhs_block", " eval( 3==3 ) ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (eval ( 3==3 )))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block151() throws Exception {
+		// test input: "\n\t\tInteger() from accumulate( Person( age > 21 ),\n\t\t                           init( int x = 0; ),\n\t\t                           action( x++; ),\n\t\t                           reverse( x--; ),\n\t\t                           result( new Integer(x) ) );\n\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t\tInteger() from accumulate( Person( age > 21 ),\n\t\t                           init( int x = 0; ),\n\t\t                           action( x++; ),\n\t\t                           reverse( x--; ),\n\t\t                           result( new Integer(x) ) );\n\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (reverse ( x--; )) (result ( new Integer(x) ))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block152() throws Exception {
+		// test input: "\n\t     Number() from accumulate( Person( $age : age > 21 ),\n\t                               average( $age ) );\n\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t     Number() from accumulate( Person( $age : age > 21 ),\n\t                               average( $age ) );\n\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Number))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_ID_CLAUSE average ( $age )))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block153() throws Exception {
+		// test input: "\n\t     #bellow statement makes no sense, but is useful to test parsing recursiveness\n\t     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\n\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t     #bellow statement makes no sense, but is useful to test parsing recursiveness\n\t     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\n\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (from (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block154() throws Exception {
+		// test input: "\n\t     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n\t                                                max( $age ) );\n\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n\t                                                max( $age ) );\n\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (accumulate (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (> 21) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))) (VT_ACCUMULATE_ID_CLAUSE max ( $age )))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block155() throws Exception {
+		// test input: "\n\t    $p : Person( name == \"bob\" )\n\t    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\n\t    "
+		Object retval = execParser("normal_lhs_block", "\n\t    $p : Person( name == \"bob\" )\n\t    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\n\t    ", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== \"bob\"))))) (|| (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $p) (VT_ACCESSOR_ELEMENT likes))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block156() throws Exception {
+		// test input: "\n\t\t     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n\t\t                                         init( int x = 0; ),\n\t\t                                         action( x++; ),\n\t\t                                         result( new Integer(x) ) );\n\t\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t\t     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n\t\t                                         init( int x = 0; ),\n\t\t                                         action( x++; ),\n\t\t                                         result( new Integer(x) ) );\n\t\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (and (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $person) (VT_ACCESSOR_ELEMENT likes))))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block157() throws Exception {
+		// test input: "\n\t\t    $a : EventA()\n\t\t    $b : EventB( this `after[1,10] $a )\n\t\t    $c : EventC( this finishes $b )\n\t\t    $d : EventD( this not starts $a )\n\t\t    $e : EventE( this not `before [1, 10] $b )\n\t\t\t"
+		Object retval = execParser("normal_lhs_block", "\n\t\t    $a : EventA()\n\t\t    $b : EventB( this `after[1,10] $a )\n\t\t    $c : EventC( this finishes $b )\n\t\t    $d : EventD( this not starts $a )\n\t\t    $e : EventE( this not `before [1, 10] $b )\n\t\t\t", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $a (VT_FACT (VT_PATTERN_TYPE EventA)))) (VT_PATTERN (VT_FACT_BINDING $b (VT_FACT (VT_PATTERN_TYPE EventB) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (after [1,10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE EventC) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (finishes (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))) (VT_PATTERN (VT_FACT_BINDING $d (VT_FACT (VT_PATTERN_TYPE EventD) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (starts not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $e (VT_FACT (VT_PATTERN_TYPE EventE) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (before not [1, 10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testNormal_lhs_block158() throws Exception {
+		// test input: "StockTick( symbol==\"ACME\") from entry-point StreamA"
+		Object retval = execParser("normal_lhs_block", "StockTick( symbol==\"ACME\") from entry-point StreamA", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE StockTick) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT symbol)) (== \"ACME\")))) (entry-point StreamA)))";
+
+		assertEquals("testing rule "+"normal_lhs_block", expecting, actual);
+	}
+
+	public void testConstraints159() throws Exception {
+		// test input: "eval( $var.equals(\"xyz\") )"
+		Object retval = execParser("constraints", "eval( $var.equals(\"xyz\") )", false);
+		Object actual = examineParserExecResult(10, retval);
+		Object expecting = "(eval ( $var.equals(\"xyz\") ))";
+
+		assertEquals("testing rule "+"constraints", expecting, actual);
+	}
+
+	// Invoke target parser.rule
+	public Object execParser(String testRuleName, String testInput, boolean isFile) throws Exception {
+		CharStream input;
+		/** Set up ANTLR input stream based on input source, file or String */
+		if ( isFile==true ) {
+			input = new ANTLRFileStream(testInput);
+		}
+		else {
+			input = new ANTLRStringStream(testInput);
+		}
+		try {
+			DRLLexer lexer = new DRLLexer(input);
+			CommonTokenStream tokens = new CommonTokenStream(lexer);
+			DRLParser parser = new DRLParser(tokens);
+			parser.setTreeAdaptor(new DroolsTreeAdaptor());
+			/** Use Reflection to get rule method from parser */
+			Method ruleName = Class.forName("org.drools.lang.DRLParser").getMethod(testRuleName);
+
+			/** Start of I/O Redirecting */
+			PipedInputStream pipedIn = new PipedInputStream();
+			PipedOutputStream pipedOut = new PipedOutputStream();
+			PipedInputStream pipedErrIn = new PipedInputStream();
+			PipedOutputStream pipedErrOut = new PipedOutputStream();
+			try {
+				pipedOut.connect(pipedIn);
+				pipedErrOut.connect(pipedErrIn);
+			}
+			catch(IOException e) {
+				System.err.println("connection failed...");
+				System.exit(1);
+			}
+			PrintStream console = System.out;
+			PrintStream consoleErr = System.err;
+			PrintStream ps = new PrintStream(pipedOut);
+			PrintStream ps2 = new PrintStream(pipedErrOut);
+			System.setOut(ps);
+			System.setErr(ps2);
+			/** End of redirecting */
+
+			/** Invoke grammar rule, and store if there is a return value */
+			Object ruleReturn = ruleName.invoke(parser);
+			String astString = null;
+			/** If rule has return value, determine if it's an AST */
+			if ( ruleReturn!=null ) {
+				/** If return object is instanceof AST, get the toStringTree */
+				if ( ruleReturn.toString().indexOf(testRuleName+"_return")>0 ) {
+					try {	// NullPointerException may happen here...
+						Class _return = Class.forName("org.drools.lang.DRLParser"+"$"+testRuleName+"_return");            	
+						Method[] methods = _return.getDeclaredMethods();
+                		for(Method method : methods) {
+			                if ( method.getName().equals("getTree") ) {
+			                	Method returnName = _return.getMethod("getTree");
+		                    	CommonTree tree = (CommonTree) returnName.invoke(ruleReturn);
+		                    	astString = tree.toStringTree();
+			                }
+			            }
+					}
+					catch(Exception e) {
+                		System.err.println(e);
+                	}
+				}
+			}
+
+			org.antlr.gunit.gUnitExecuter.StreamVacuum stdoutVacuum = new org.antlr.gunit.gUnitExecuter.StreamVacuum(pipedIn);
+			org.antlr.gunit.gUnitExecuter.StreamVacuum stderrVacuum = new org.antlr.gunit.gUnitExecuter.StreamVacuum(pipedErrIn);
+			ps.close();
+			ps2.close();
+			System.setOut(console);			// Reset standard output
+			System.setErr(consoleErr);		// Reset standard err out
+			this.stdout = null;
+			this.stderr = null;
+			stdoutVacuum.start();
+			stderrVacuum.start();			
+			stdoutVacuum.join();
+			stderrVacuum.join();
+			// retVal could be actual return object from rule, stderr or stdout
+			if ( stderrVacuum.toString().length()>0 ) {
+				this.stderr = stderrVacuum.toString();
+				return this.stderr;
+			}
+			if ( parser.hasErrors() ) {
+				this.stderr = parser.getErrors().toString();
+				return this.stderr;
+			}			
+			if ( stdoutVacuum.toString().length()>0 ) {
+				this.stdout = stdoutVacuum.toString();
+			}
+			if ( astString!=null ) {	// Return toStringTree of AST
+				return astString;
+			}
+			if ( ruleReturn!=null ) {
+				return ruleReturn;
+			}
+			if ( stderrVacuum.toString().length()==0 && stdoutVacuum.toString().length()==0 ) {
+				return null;
+			}
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (SecurityException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (IllegalAccessException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (InvocationTargetException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (InterruptedException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (Exception e) {
+			e.printStackTrace(); System.exit(1);
+		}
+		return stdout;
+	}
+
+	// Modify the return value if the expected token type is OK or FAIL
+	public Object examineParserExecResult(int tokenType, Object retVal) {	
+		if ( tokenType==27 ) {	// expected Token: OK
+			if ( this.stderr==null ) {
+				return "OK";
+			}
+			else {
+				return "FAIL";
+			}
+		}
+		else if ( tokenType==28 ) {	// expected Token: FAIL
+			if ( this.stderr!=null ) {
+				return "FAIL";
+			}
+			else {
+				return "OK";
+			}
+		}
+		else {	// return the same object for the other token types
+			return retVal;
+		}		
+	}
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestTree2TestDRL.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/TestTree2TestDRL.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestTree2TestDRL.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/TestTree2TestDRL.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,1559 @@
+package org.drools.lang;
+
+import junit.framework.TestCase;
+import java.io.*;
+import java.lang.reflect.*;
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;
+
+public class TestTree2TestDRL extends TestCase {
+	String stdout;
+	String stderr;
+
+	public void testPackage_statement_walks_Package_statement1() throws Exception {
+		// test input: "package foo"
+		Object retval = execTreeParser("package_statement", "package_statement", "package foo", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"package_statement", expecting, actual);
+	}
+
+	public void testPackage_statement_walks_Package_statement2() throws Exception {
+		// test input: "package foo.bar.baz;"
+		Object retval = execTreeParser("package_statement", "package_statement", "package foo.bar.baz;", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"package_statement", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit3() throws Exception {
+		// test input: ""
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit4() throws Exception {
+		// test input: "package foo; import com.foo.Bar; import com.foo.Baz;"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package foo; import com.foo.Bar; import com.foo.Baz;", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit5() throws Exception {
+		// test input: "rule empty \n\nthen\n  \nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule empty \n\nthen\n  \nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit6() throws Exception {
+		// test input: "#the purpose of this is to see what happens when we have some partially damaged syntax\n#as the IDE uses the parsers AST to work out completion suggestions.\npackage test\n\n\nrule simple_rule \n  when\n    foo3 : Bar(\n\n"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#the purpose of this is to see what happens when we have some partially damaged syntax\n#as the IDE uses the parsers AST to work out completion suggestions.\npackage test\n\n\nrule simple_rule \n  when\n    foo3 : Bar(\n\n", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit7() throws Exception {
+		// test input: "package test.templates\n\ntemplate Cheese\n\tString \tname\n\tInteger age\nend\n\ntemplate \"Wine\"\n\tString \t\tname\n\tString \t\tyear\n\tString[] \taccolades\nend\n\n\nrule \"a rule\"\n  when\n\tCheese(name == \"Stilton\", age==2001)\n\tWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n  then\n  \tbaz();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package test.templates\n\ntemplate Cheese\n\tString \tname\n\tInteger age\nend\n\ntemplate \"Wine\"\n\tString \t\tname\n\tString \t\tyear\n\tString[] \taccolades\nend\n\n\nrule \"a rule\"\n  when\n\tCheese(name == \"Stilton\", age==2001)\n\tWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n  then\n  \tbaz();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit8() throws Exception {
+		// test input: "package foo\n\nrule rule_one \n  when\n  \tFoo()\n  then\n  \t if (speed > speedLimit ? true : false;)\n     pullEmOver();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package foo\n\nrule rule_one \n  when\n  \tFoo()\n  then\n  \t if (speed > speedLimit ? true : false;)\n     pullEmOver();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit9() throws Exception {
+		// test input: "package foo\n\nfunction String[] yourFunction(String args[]) {\n     baz();\n}\n\nrule \"new rule\"\n\n\twhen\n\t\tSomething()\n\tthen\n\t\tyourFunction(new String[3] {\"a\",\"b\",\"c\"});\n\t\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package foo\n\nfunction String[] yourFunction(String args[]) {\n     baz();\n}\n\nrule \"new rule\"\n\n\twhen\n\t\tSomething()\n\tthen\n\t\tyourFunction(new String[3] {\"a\",\"b\",\"c\"});\n\t\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit10() throws Exception {
+		// test input: "\nrule almost_empty \n  when\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule almost_empty \n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit11() throws Exception {
+		// test input: "rule \"quoted string name\"\n  when\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"quoted string name\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit12() throws Exception {
+		// test input: "\nrule rule1 \n  no-loop false\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule rule1 \n  no-loop false\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit13() throws Exception {
+		// test input: "\nrule rule1 \n  auto-focus true\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule rule1 \n  auto-focus true\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit14() throws Exception {
+		// test input: "\nrule rule1 \n  ruleflow-group \"a group\"\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule rule1 \n  ruleflow-group \"a group\"\n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit15() throws Exception {
+		// test input: "\n\nrule myrule \n  when\n  then\n  \tint i = 0;\n\ti = 1;\n\ti / 1;\n\ti == 1;\n\ti(i);\n\ti = 'i';\n\ti.i.i;\n\ti\\i;\n\ti<i;\n\ti>i;\n\ti=\"i\";\t\n\t++i;\n\ti++;\n\t--i;\n\ti--;\n\ti += i;\n\ti -= i;\n\ti *= i;\n\ti /= i;\n\tint i = 5;\n\tfor(int j; j<i; ++j) {\n\t  System.out.println(j);\n\t}\t\n\tObject o = new String(\"Hello\");\n\tString s = (String) o;\t\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\nrule myrule \n  when\n  then\n  \tint i = 0;\n\ti = 1;\n\ti / 1;\n\ti == 1;\n\ti(i);\n\ti = 'i';\n\ti.i.i;\n\ti\\i;\n\ti<i;\n\ti>i;\n\ti=\"i\";\t\n\t++i;\n\ti++;\n\t--i;\n\ti--;\n\ti += i;\n\ti -= i;\n\ti *= i;\n\ti /= i;\n\tint i = 5;\n\tfor(int j; j<i; ++j) {\n\t  System.out.println(j);\n\t}\t\n\tObject o = new String(\"Hello\");\n\tString s = (String) o;\t\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit16() throws Exception {
+		// test input: "#check that it can handle true/false literals, and \n#negative numbers\nrule simple_rule \n  when\n\tFoo(bar == false)\n\tFoo(boo > -42)\n\tFoo(boo > -42.42)\n  then\n\tcons();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#check that it can handle true/false literals, and \n#negative numbers\nrule simple_rule \n  when\n\tFoo(bar == false)\n\tFoo(boo > -42)\n\tFoo(boo > -42.42)\n  then\n\tcons();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit17() throws Exception {
+		// test input: "package org.drools.test;\n \nimport org.drools.Cheese;\n \nrule \"simple rule\"\n    when\n        Cheese( )\n    then\nend "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n \nimport org.drools.Cheese;\n \nrule \"simple rule\"\n    when\n        Cheese( )\n    then\nend ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit18() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit19() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit20() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit21() throws Exception {
+		// test input: "\nrule blah\n\n when \n\n\tCol1() from something.doIt[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule blah\n\n when \n\n\tCol1() from something.doIt[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit22() throws Exception {
+		// test input: "rule blah\n when \n\tCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n\t            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule blah\n when \n\tCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n\t            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\n\tCol2()\n then\n\tpartay();\nend\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit23() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit24() throws Exception {
+		// test input: "#this is for showing off all the new multi restriction stuff\n\n\n\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#this is for showing off all the new multi restriction stuff\n\n\n\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit25() throws Exception {
+		// test input: "package la\n\n\nrule simple_rule \n  when\n  \tBaz()\n  then\n  \t//woot\n  \tfirst\n  \t\n  \t#\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package la\n\n\nrule simple_rule \n  when\n  \tBaz()\n  then\n  \t//woot\n  \tfirst\n  \t\n  \t#\n  \t\n  \t/* lala\n  \t\n  \t*/\n  \tsecond  \nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit26() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()\n  then\n  if ( a == b ) {\n    assert( foo3 );\n  } else {\n    retract( foo4 );\n  } \n  System.out.println( a4 );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit27() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n  \tnot Cheese(type == \"stilton\")\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit28() throws Exception {
+		// test input: "package HR1\n\nimport function abd.def.x\nimport function qed.wah.*\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package HR1\n\nimport function abd.def.x\nimport function qed.wah.*\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit29() throws Exception {
+		// test input: "package HR1\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package HR1\n\nrule simple_rule \n  when  \t\t  \t\n  \tnot ( Cheese(type == \"stilton\") )\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit30() throws Exception {
+		// test input: "package HR2\n\nrule simple_rule \n  when  \t\t  \t\n  \ta : (not ( Cheese(type == \"stilton\") ))\n  \texists ( Foo() )\n  then\n\tfunky();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package HR2\n\nrule simple_rule \n  when  \t\t  \t\n  \ta : (not ( Cheese(type == \"stilton\") ))\n  \texists ( Foo() )\n  then\n\tfunky();\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit31() throws Exception {
+		// test input: "\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit32() throws Exception {
+		// test input: "\npackage foo\n\nrule bar\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\nrule bar2\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query2\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\npackage foo\n\nrule bar\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\nrule bar2\n\twhen\n\t\tBaz()\n\tthen\n\t\tBoo()\nend\n\nquery \"simple_query2\" \n    foo3 : Bar(a==3)\n    foo4 : Bar(a4:a==4)\n    Baz()\n\t\nend\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit33() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.integrationtests.Cheese;\n\nrule \"Like Stilton\"\n    when\n        Cheese( t:type == \"stilton\" )\n    then\n        System.out.println(\"I like \" + t);\nend    \n\nrule \"Like Cheddar\"\n    when\n        Cheese( t:type == \"cheddar\" )\n    then\n        System.out.println(\"I like \" + t );\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nimport org.drools.integrationtests.Cheese;\n\nrule \"Like Stilton\"\n    when\n        Cheese( t:type == \"stilton\" )\n    then\n        System.out.println(\"I like \" + t);\nend    \n\nrule \"Like Cheddar\"\n    when\n        Cheese( t:type == \"cheddar\" )\n    then\n        System.out.println(\"I like \" + t );\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit34() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nrule \"like cheddar\"\n    when\n        Cheese( $type:type )\n    then\n        System.out.println(\"I like \" + $type);\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nrule \"like cheddar\"\n    when\n        Cheese( $type:type )\n    then\n        System.out.println(\"I like \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit35() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\nimport org.drools.Person;\n\nrule \"Who likes Stilton\"\n    when\n        Cheese($type : type == \"stilton\")\n        $person : Person($name : name == \"bob\", likes == $type)        \n    then\n        System.out.println( $name + \" likes \" + $type);\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\nimport org.drools.Person;\n\nrule \"Who likes Stilton\"\n    when\n        Cheese($type : type == \"stilton\")\n        $person : Person($name : name == \"bob\", likes == $type)        \n    then\n        System.out.println( $name + \" likes \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit36() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tPerson(name == \"mark\") or \n\t( Person(type == \"fan\") and Cheese(type == \"green\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tPerson(name == \"mark\") or \n\t( Person(type == \"fan\") and Cheese(type == \"green\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit37() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n    Person(name == \"mark\") && Cheese(type == \"stilton\")\n    Person(name == \"mark\") || Cheese(type == \"stilton\")\n  then\n\tSystem.out.println( \"Mark and Michael\" );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n    Person(name == \"mark\") && Cheese(type == \"stilton\")\n    Person(name == \"mark\") || Cheese(type == \"stilton\")\n  then\n\tSystem.out.println( \"Mark and Michael\" );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit38() throws Exception {
+		// test input: "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \n\tCheese(type == \"green\")\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nimport org.drools.Person\n\nrule simple_rule \n  when\n\tfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \n\tCheese(type == \"green\")\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit39() throws Exception {
+		// test input: "\n\nrule simple_rule \n  when\n\tfoo : ( Person(name == \"mark\") \n\t\tor \n\t\tPerson(type == \"fan\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\nrule simple_rule \n  when\n\tfoo : ( Person(name == \"mark\") \n\t\tor \n\t\tPerson(type == \"fan\") )\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit40() throws Exception {
+		// test input: "rule simple_rule \n  when\n\tfoo : ( \n\t\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t\t)\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule simple_rule \n  when\n\tfoo : ( \n\t\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t\t)\n  then\n\tSystem.out.println( \"Mark and Michael\" + bar );\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit41() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\t ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n  then\n\tgo wild\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\t ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n  then\n\tgo wild\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit42() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\teval(abc(\"foo\") + 5)\n\tFoo()\n\teval(qed())\n\tBar()\n  then\n\tKapow\n\tPoof\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\teval(abc(\"foo\") + 5)\n\tFoo()\n\teval(qed())\n\tBar()\n  then\n\tKapow\n\tPoof\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit43() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(abc(\"foo\"))\n  then\n\tKapow\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(abc(\"foo\"))\n  then\n\tKapow\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit44() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo(name== (a + b))\n  then\n\tKapow\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\tFoo(name== (a + b))\n  then\n\tKapow\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit45() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tPerson( $age2:age -> ($age2 == $age1+2 ) ) \n  then\n\tfoo bar\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n  \tPerson( $age2:age -> ($age2 == $age1+2 ) ) \n  then\n\tfoo bar\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit46() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.util.List list;\nglobal java.lang.Integer five;\n\nrule \"not rule test\"\n    when\n        $person : Person( $likes:like )\n        not Cheese( type == $likes )\n    then\n\t\tlist.add( $person );\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.util.List list;\nglobal java.lang.Integer five;\n\nrule \"not rule test\"\n    when\n        $person : Person( $likes:like )\n        not Cheese( type == $likes )\n    then\n\t\tlist.add( $person );\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit47() throws Exception {
+		// test input: "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.lang.String foo\nglobal java.lang.Integer bar;\n\nrule baz\n    when\n        Cheese( )\n    then\n\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nimport org.drools.Cheese;\n\nglobal java.lang.String foo\nglobal java.lang.Integer bar;\n\nrule baz\n    when\n        Cheese( )\n    then\n\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit48() throws Exception {
+		// test input: "\nimport java.lang.String\n\nfunction String functionA(String s, Integer i) {\n\t\n\tfoo();\n\n}\n\nfunction void functionB() {\n\tbar();\t\n}\n\n\nrule something \n\twhen\n\tthen\nend\n\nrule \"one more thing\"\n\twhen\n\tthen\nend\n\n\n\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nimport java.lang.String\n\nfunction String functionA(String s, Integer i) {\n\t\n\tfoo();\n\n}\n\nfunction void functionB() {\n\tbar();\t\n}\n\n\nrule something \n\twhen\n\tthen\nend\n\nrule \"one more thing\"\n\twhen\n\tthen\nend\n\n\n\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit49() throws Exception {
+		// test input: "#this starts with a comment\npackage foo.bar\n\n//and another comment\n\n/*\nyet\n\t   another\n   \t\t\t\tstyle\n*/\n\nrule \"test\"\n  when\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#this starts with a comment\npackage foo.bar\n\n//and another comment\n\n/*\nyet\n\t   another\n   \t\t\t\tstyle\n*/\n\nrule \"test\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit50() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n\t\t#attributes keywork (and colon) is totally optional\n\t\tsalience 42\n\t\tagenda-group \"my_group\"\n\t\tno-loop \n\t\tduration 42\n\t\tactivation-group \"my_activation_group\"\n\t\tlock-on-active true\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\n\nrule simple_rule \n\t\t#attributes keywork (and colon) is totally optional\n\t\tsalience 42\n\t\tagenda-group \"my_group\"\n\t\tno-loop \n\t\tduration 42\n\t\tactivation-group \"my_activation_group\"\n\t\tlock-on-active true\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit51() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n\tattributes: \n\t\tsalience 42, agenda-group \"my_group\", no-loop,  lock-on-active, duration 42, activation-group \"my_activation_group\"\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\n\nrule simple_rule \n\tattributes: \n\t\tsalience 42, agenda-group \"my_group\", no-loop,  lock-on-active, duration 42, activation-group \"my_activation_group\"\n\twhen\n\t\tFoo()\n\tthen\n\t\tbar();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit52() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n  \tFoo(bar == Foo.BAR)\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n  \tFoo(bar == Foo.BAR)\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit53() throws Exception {
+		// test input: "rule one\n  when\n    exists Foo()\n    exits Bar()\n  then\nend\n\nrule two \n  when\n    ford = ford = ford\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule one\n  when\n    exists Foo()\n    exits Bar()\n  then\nend\n\nrule two \n  when\n    ford = ford = ford\n  then\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit54() throws Exception {
+		// test input: "\nrule \"another test\"\n    when\n        s : String()\n        eval(s.equals(\"foo\") && s.startsWith(\"f\"))\n        \n        \n    then\n        list.add( s );\nend "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule \"another test\"\n    when\n        s : String()\n        eval(s.equals(\"foo\") && s.startsWith(\"f\"))\n        \n        \n    then\n        list.add( s );\nend ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit55() throws Exception {
+		// test input: "package nesting;\n\n\n\n\nrule \"test something\"\n\n\twhen\n\t\tp: Person( name soundslike \"Michael\" )\n\tthen\n\t\tp.name = \"goober\"\n\t\tSystem.out.println(p.name)\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package nesting;\n\n\n\n\nrule \"test something\"\n\n\twhen\n\t\tp: Person( name soundslike \"Michael\" )\n\tthen\n\t\tp.name = \"goober\"\n\t\tSystem.out.println(p.name)\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit56() throws Exception {
+		// test input: "package com.foo;\n\nagenda-group \"x\"\n\nimport goo.ber\nimport wee.waa\n\n\ndialect \"java\"\n\n\n\n\nrule bar\n  when\n  then\nend\n\nrule baz\n  dialect \"mvel\"\n  when\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package com.foo;\n\nagenda-group \"x\"\n\nimport goo.ber\nimport wee.waa\n\n\ndialect \"java\"\n\n\n\n\nrule bar\n  when\n  then\nend\n\nrule baz\n  dialect \"mvel\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit57() throws Exception {
+		// test input: "\npackage com.foo;\n\nimport im.one\n\nimport im.two\n\nrule foo\n  when\n  then\nend\n\nfunction cheeseIt() {\n\n}\n\nimport im.three;\n\nrule bar\n  when\n  then\nend\n\nfunction uncheeseIt() {\n\n}\n\nimport im.four;"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\npackage com.foo;\n\nimport im.one\n\nimport im.two\n\nrule foo\n  when\n  then\nend\n\nfunction cheeseIt() {\n\n}\n\nimport im.three;\n\nrule bar\n  when\n  then\nend\n\nfunction uncheeseIt() {\n\n}\n\nimport im.four;", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit58() throws Exception {
+		// test input: "\nrule \"1. Do Stuff!\"\n  when\n  then\nend\n\nrule \"2. Do More Stuff!\"\n  when\n  then\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule \"1. Do Stuff!\"\n  when\n  then\nend\n\nrule \"2. Do More Stuff!\"\n  when\n  then\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit59() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(\n\t\n\t\n\t\n\t       abc(\n\t       \n\t       \"foo\") + \n\t       5\n\t       \n\t       \n\t       \n\t        \n\t       )\n  then\n\tKapow\n\tPoof\n\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\tFoo()\n\tBar()\n\teval(\n\t\n\t\n\t\n\t       abc(\n\t       \n\t       \"foo\") + \n\t       5\n\t       \n\t       \n\t       \n\t        \n\t       )\n  then\n\tKapow\n\tPoof\n\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit60() throws Exception {
+		// test input: "\nrule simple_rule \n  when\n\teval(abc();)\n  then\n\tKapow\n\tPoof\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\nrule simple_rule \n  when\n\teval(abc();)\n  then\n\tKapow\n\tPoof\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit61() throws Exception {
+		// test input: "\n\n\nrule simple_rule \n  when\n\tFoo(\n\t  bar == baz, la==laz\n\t  )\n  then\n\tKapow\n\tPoof\nend\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "\n\n\nrule simple_rule \n  when\n\tFoo(\n\t  bar == baz, la==laz\n\t  )\n  then\n\tKapow\n\tPoof\nend\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit62() throws Exception {
+		// test input: "package org.drools.test;\n\nrule \"Who likes Stilton\"\n    when\n        com.cheeseco.Cheese($type : type == \"stilton\")\n    then\n        System.out.println( $name + \" likes \" + $type);\nend    "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools.test;\n\nrule \"Who likes Stilton\"\n    when\n        com.cheeseco.Cheese($type : type == \"stilton\")\n    then\n        System.out.println( $name + \" likes \" + $type);\nend    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit63() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                result( new Integer(x) ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit64() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit65() throws Exception {
+		// test input: "rule \"CollectParserTest\"\nwhen\n     $personList : ArrayList() from collect( Person( age > 21 ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"CollectParserTest\"\nwhen\n     $personList : ArrayList() from collect( Person( age > 21 ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit66() throws Exception {
+		// test input: "rule \"test_Quotes\"\n   when\n      InitialFact()\n   then\n      String s = \"\\\"\\n\\t\\\\\";\nend "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"test_Quotes\"\n   when\n      InitialFact()\n   then\n      String s = \"\\\"\\n\\t\\\\\";\nend ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit67() throws Exception {
+		// test input: "rule \"test nested CEs\"\t\n\twhen\n\t    not ( State( $state : state ) and\n\t          not( Person( status == $state, $likes : likes ) and\n\t               Cheese( type == $likes ) ) )\n\t    Person( name == \"Bob\" )\n\t    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n\tthen \n\t\tresults.add(\"OK\");\t\t\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"test nested CEs\"\t\n\twhen\n\t    not ( State( $state : state ) and\n\t          not( Person( status == $state, $likes : likes ) and\n\t               Cheese( type == $likes ) ) )\n\t    Person( name == \"Bob\" )\n\t    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n\tthen \n\t\tresults.add(\"OK\");\t\t\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit68() throws Exception {
+		// test input: "rule \"ForallParserTest\"\nwhen\n     forall( Person( age > 21, $likes : likes )\n             Cheese( type == $likes ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"ForallParserTest\"\nwhen\n     forall( Person( age > 21, $likes : likes )\n             Cheese( type == $likes ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit69() throws Exception {
+		// test input: "#testing 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#testing 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit70() throws Exception {
+		// test input: "#testing not 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "#testing not 'in' operator\n\nrule simple_rule \n  when\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n  then\n\tconsequence();\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit71() throws Exception {
+		// test input: "package org.drools;\n\nglobal java.util.List list;\n\nrule \"rule1\"\nwhen\n    Pattern1();\n    Pattern2() from x.y.z;\nthen\n    System.out.println(\"Test\");\nend;\n\nquery \"query1\"\n\tPattern5();\n\tPattern6();\n\tPattern7();\nend;\n\nrule \"rule2\"\nwhen\n    Pattern3();\n    Pattern4() from collect( Pattern5() );\nthen\n    System.out.println(\"Test\");\nend;\n\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools;\n\nglobal java.util.List list;\n\nrule \"rule1\"\nwhen\n    Pattern1();\n    Pattern2() from x.y.z;\nthen\n    System.out.println(\"Test\");\nend;\n\nquery \"query1\"\n\tPattern5();\n\tPattern6();\n\tPattern7();\nend;\n\nrule \"rule2\"\nwhen\n    Pattern3();\n    Pattern4() from collect( Pattern5() );\nthen\n    System.out.println(\"Test\");\nend;\n\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit72() throws Exception {
+		// test input: "package org.drools\n\nrule \"Test Parse\"\n\nwhen\n    eval( 3==3 )\nthen\n    System.out.println(\"OK\");\nend "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools\n\nrule \"Test Parse\"\n\nwhen\n    eval( 3==3 )\nthen\n    System.out.println(\"OK\");\nend ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit73() throws Exception {
+		// test input: "rule \"AccumulateReverseParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                reverse( x--; ),\n                                result( new Integer(x) ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateReverseParserTest\"\nwhen\n     Integer() from accumulate( Person( age > 21 ),\n                                init( int x = 0; ),\n                                action( x++; ),\n                                reverse( x--; ),\n                                result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit74() throws Exception {
+		// test input: "rule \"AccumulateReverseParserTest\"\nwhen\n     Number() from accumulate( Person( $age : age > 21 ),\n                               average( $age ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateReverseParserTest\"\nwhen\n     Number() from accumulate( Person( $age : age > 21 ),\n                               average( $age ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit75() throws Exception {
+		// test input: "rule \"CollectParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\nthen\nend\n\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"CollectParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\nthen\nend\n\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit76() throws Exception {
+		// test input: "rule \"AccumulateParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n                                                max( $age ) );\nthen\nend\n\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateParserTest\"\nwhen\n     #bellow statement makes no sense, but is useful to test parsing recursiveness\n     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n                                                max( $age ) );\nthen\nend\n\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit77() throws Exception {
+		// test input: "package org.drools;\n\nrule \"testing OR CE\"\nwhen\n    $p : Person( name == \"bob\" )\n    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\nthen\n    // do something\nend "
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools;\n\nrule \"testing OR CE\"\nwhen\n    $p : Person( name == \"bob\" )\n    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\nthen\n    // do something\nend ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit78() throws Exception {
+		// test input: "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit79() throws Exception {
+		// test input: "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit80() throws Exception {
+		// test input: "rule \"AccumulateMultiPatternParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "rule \"AccumulateMultiPatternParserTest\"\nwhen\n     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n                                         init( int x = 0; ),\n                                         action( x++; ),\n                                         result( new Integer(x) ) );\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit81() throws Exception {
+		// test input: "package org.drools;\n\nrule \"test rule\"\n\tsalience 10\n\twhen\n\t\t$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))\n\tthen\n\t\tretract($p);\nend\n\t"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools;\n\nrule \"test rule\"\n\tsalience 10\n\twhen\n\t\t$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))\n\tthen\n\t\tretract($p);\nend\n\t", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit82() throws Exception {
+		// test input: "package org.drools;\n\nrule \"Avoid NPE on wrong syntax\"\nwhen\n    not( Cheese( ( type == \"stilton\", price == 10 ) || ( type == \"brie\", price == 15 ) ) from $cheeseList )\nthen\n    System.out.println(\"OK\");\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools;\n\nrule \"Avoid NPE on wrong syntax\"\nwhen\n    not( Cheese( ( type == \"stilton\", price == 10 ) || ( type == \"brie\", price == 15 ) ) from $cheeseList )\nthen\n    System.out.println(\"OK\");\nend", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testCompilation_unit_walks_Compilation_unit83() throws Exception {
+		// test input: "package org.drools;\n\nrule \"test pluggable operators\"\nwhen\n    $a : EventA()\n    $b : EventB( this `after[1,10] $a )\n    $c : EventC( this finishes $b )\n    $d : EventD( this not starts $a )\n    $e : EventE( this not `before [1, 10] $b )\nthen\nend"
+		Object retval = execTreeParser("compilation_unit", "compilation_unit", "package org.drools;\n\nrule \"test pluggable operators\"\nwhen\n    $a : EventA()\n    $b : EventB( this `after[1,10] $a )\n    $c : EventC( this finishes $b )\n    $d : EventD( this not starts $a )\n    $e : EventE( this not `before [1, 10] $b )\nthen\nend", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"compilation_unit", expecting, actual);
+	}
+
+	public void testLhs_walks_Pattern_source84() throws Exception {
+		// test input: "StockTick( symbol==\"ACME\") from entry-point StreamA"
+		Object retval = execTreeParser("lhs", "pattern_source", "StockTick( symbol==\"ACME\") from entry-point StreamA", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block85() throws Exception {
+		// test input: ""
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block86() throws Exception {
+		// test input: "\n     Country( $cities : city )\n     Person( city memberOf $cities )\n    "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n     Country( $cities : city )\n     Person( city memberOf $cities )\n    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block87() throws Exception {
+		// test input: "\n     Country( $cities : city )\n     Person( city not memberOf $cities )\n    "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n     Country( $cities : city )\n     Person( city not memberOf $cities )\n    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block88() throws Exception {
+		// test input: " Person( age < 42 && location==\"atlanta\") "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Person( age < 42 && location==\"atlanta\") ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block89() throws Exception {
+		// test input: " Person( age < 42 || location==\"atlanta\") "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Person( age < 42 || location==\"atlanta\") ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block90() throws Exception {
+		// test input: "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block91() throws Exception {
+		// test input: "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block92() throws Exception {
+		// test input: " Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) ) "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) ) ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block93() throws Exception {
+		// test input: " Person( name matches \"mark\" || matches \"bob\" ) "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Person( name matches \"mark\" || matches \"bob\" ) ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block94() throws Exception {
+		// test input: "\n\tCity( $city : city )\n\tCountry( cities not contains $city )\n\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\tCity( $city : city )\n\tCountry( cities not contains $city )\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block95() throws Exception {
+		// test input: " Message( text not matches '[abc]*' ) "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Message( text not matches '[abc]*' ) ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block96() throws Exception {
+		// test input: "Foo( bar > 1 || == 1 )"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Foo( bar > 1 || == 1 )", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block97() throws Exception {
+		// test input: "\n\t(or\n\tnot Person()\n\t\t(and Cheese()\n\t\t\tMeat()\n\t\t\tWine()))\n\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t(or\n\tnot Person()\n\t\t(and Cheese()\n\t\t\tMeat()\n\t\t\tWine()))\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block98() throws Exception {
+		// test input: "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block99() throws Exception {
+		// test input: "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "org   .   drools/*comment*/\t  .Message( text not matches $c#comment\n. property )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block100() throws Exception {
+		// test input: " $id : Something( duration == \"foo\") "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " $id : Something( duration == \"foo\") ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block101() throws Exception {
+		// test input: "foo3 : Bar("
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "foo3 : Bar(", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block102() throws Exception {
+		// test input: "\nCheese(name == \"Stilton\", age==2001)\nWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCheese(name == \"Stilton\", age==2001)\nWine(name == \"Grange\", age == \"1978\", accolades contains \"world champion\")\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block103() throws Exception {
+		// test input: "Foo()"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Foo()", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block104() throws Exception {
+		// test input: "not Cheese(type == \"stilton\")"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "not Cheese(type == \"stilton\")", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block105() throws Exception {
+		// test input: "\nPerson(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\")\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nPerson(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\")\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block106() throws Exception {
+		// test input: "\nFoo(bar == false)\nFoo(boo > -42)\nFoo(boo > -42.42)\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nFoo(bar == false)\nFoo(boo > -42)\nFoo(boo > -42.42)\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block107() throws Exception {
+		// test input: "Cheese( )"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Cheese( )", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block108() throws Exception {
+		// test input: "\nCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCol1() from something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block109() throws Exception {
+		// test input: "\nCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCol1() from doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )\nCol2()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block110() throws Exception {
+		// test input: "\nCol1() from something.doIt\nCol2()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCol1() from something.doIt\nCol2()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block111() throws Exception {
+		// test input: "\nCol1() from something.doIt[\"key\"]\nCol2()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCol1() from something.doIt[\"key\"]\nCol2()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block112() throws Exception {
+		// test input: "\nCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\nCol2()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nCol1() from doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] )\n            .doIt2(bar, [a, \"b\", 42]).field[\"key\"]\nCol2()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block113() throws Exception {
+		// test input: "\nfoo3 : Bar(a==3)\nfoo4 : Bar(a4:a==4)\nBaz()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nfoo3 : Bar(a==3)\nfoo4 : Bar(a4:a==4)\nBaz()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block114() throws Exception {
+		// test input: "\nPerson(age > 30 && < 40)\nVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nPerson(age > 30 && < 40)\nVehicle(type == \"sedan\" || == \"wagon\", age < 3)\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block115() throws Exception {
+		// test input: "    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block116() throws Exception {
+		// test input: "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block117() throws Exception {
+		// test input: "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nnot ( Cheese(type == \"stilton\") )\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block118() throws Exception {
+		// test input: "\na : (not ( Cheese(type == \"stilton\") ))\nexists ( Foo() )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\na : (not ( Cheese(type == \"stilton\") ))\nexists ( Foo() )\n", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block119() throws Exception {
+		// test input: " Cheese( t:type == \"cheddar\" ) "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " Cheese( t:type == \"cheddar\" ) ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block120() throws Exception {
+		// test input: "Cheese( $type:type )"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Cheese( $type:type )", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block121() throws Exception {
+		// test input: "\n    Cheese($type : type == \"stilton\")\n    $person : Person($name : name == \"bob\", likes == $type)        \n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n    Cheese($type : type == \"stilton\")\n    $person : Person($name : name == \"bob\", likes == $type)        \n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block122() throws Exception {
+		// test input: "\nPerson(name == \"mark\") or \n( Person(type == \"fan\") and Cheese(type == \"green\") )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nPerson(name == \"mark\") or \n( Person(type == \"fan\") and Cheese(type == \"green\") )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block123() throws Exception {
+		// test input: "\nPerson(name == \"mark\") && Cheese(type == \"stilton\")\nPerson(name == \"mark\") || Cheese(type == \"stilton\")\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nPerson(name == \"mark\") && Cheese(type == \"stilton\")\nPerson(name == \"mark\") || Cheese(type == \"stilton\")\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block124() throws Exception {
+		// test input: "\nfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \nCheese(type == \"green\")\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nfoo :  ( Person(name == \"mark\") or Person(type == \"fan\") ) \nCheese(type == \"green\")\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block125() throws Exception {
+		// test input: "\nfoo : ( Person(name == \"mark\") \n\tor \n\tPerson(type == \"fan\") )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nfoo : ( Person(name == \"mark\") \n\tor \n\tPerson(type == \"fan\") )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block126() throws Exception {
+		// test input: "\nfoo : ( \n\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t)\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nfoo : ( \n\tPerson(name == \"mark\") or Person(type == \"fan\") \n\t)\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block127() throws Exception {
+		// test input: "\n ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n ( (not Foo(x==\"a\") or Foo(x==\"y\") ) and ( Shoes() or Butt() ) )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block128() throws Exception {
+		// test input: "\neval(abc(\"foo\") + 5)\nFoo()\neval(qed())\nBar()\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\neval(abc(\"foo\") + 5)\nFoo()\neval(qed())\nBar()\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block129() throws Exception {
+		// test input: "\nFoo()\nBar()\neval(abc(\"foo\"))\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nFoo()\nBar()\neval(abc(\"foo\"))\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block130() throws Exception {
+		// test input: "Foo(name== (a + b))"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Foo(name== (a + b))", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block131() throws Exception {
+		// test input: "Person( $age2:age -> ($age2 == $age1+2 ) )"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Person( $age2:age -> ($age2 == $age1+2 ) )", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block132() throws Exception {
+		// test input: "Foo(bar == Foo.BAR)"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "Foo(bar == Foo.BAR)", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block133() throws Exception {
+		// test input: "\np: Person( name soundslike \"Michael\" )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\np: Person( name soundslike \"Michael\" )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block134() throws Exception {
+		// test input: "\nFoo()\nBar()\neval(\n\n\n\n       abc(\n       \n       \"foo\") + \n       5\n       \n       \n       \n        \n       )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nFoo()\nBar()\neval(\n\n\n\n       abc(\n       \n       \"foo\") + \n       5\n       \n       \n       \n        \n       )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block135() throws Exception {
+		// test input: "eval(abc();)"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "eval(abc();)", false);
+		Object actual = examineParserExecResult(28, retval);
+		Object expecting = "FAIL";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block136() throws Exception {
+		// test input: "\nFoo(\n  bar == baz, la==laz\n  )\n "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\nFoo(\n  bar == baz, la==laz\n  )\n ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block137() throws Exception {
+		// test input: "com.cheeseco.Cheese($type : type == \"stilton\")"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "com.cheeseco.Cheese($type : type == \"stilton\")", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block138() throws Exception {
+		// test input: "\n     Integer() from accumulate( Person( age > 21 ),\n                            init( int x = 0; ),\n                            action( x++; ),\n                            result( new Integer(x) ) );\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n     Integer() from accumulate( Person( age > 21 ),\n                            init( int x = 0; ),\n                            action( x++; ),\n                            result( new Integer(x) ) );\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block139() throws Exception {
+		// test input: "\n $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                     init( int x = 0; ),\n                                     action( x++; ),\n                                     result( new Integer(x) ) );\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n $counter:Integer() from accumulate( $person : Person( age > 21 ),\n                                     init( int x = 0; ),\n                                     action( x++; ),\n                                     result( new Integer(x) ) );\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block140() throws Exception {
+		// test input: "$personList : ArrayList() from collect( Person( age > 21 ) );"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "$personList : ArrayList() from collect( Person( age > 21 ) );", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block141() throws Exception {
+		// test input: "\n\tnot ( State( $state : state ) and\n          not( Person( status == $state, $likes : likes ) and\n               Cheese( type == $likes ) ) )\n    Person( name == \"Bob\" )\n    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\tnot ( State( $state : state ) and\n          not( Person( status == $state, $likes : likes ) and\n               Cheese( type == $likes ) ) )\n    Person( name == \"Bob\" )\n    ( Cheese( price == 10 ) or Cheese( type == \"brie\" ) )\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block142() throws Exception {
+		// test input: "\n forall( Person( age > 21, $likes : likes )\n         Cheese( type == $likes ) );\n"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n forall( Person( age > 21, $likes : likes )\n         Cheese( type == $likes ) );\n", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block143() throws Exception {
+		// test input: "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type in ( \"sedan\", \"wagon\" ), age < 3)\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block144() throws Exception {
+		// test input: "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n  \tPerson(age > 30 && < 40)\n  \tVehicle(type not in ( \"sedan\", \"wagon\" ), age < 3)\n\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block145() throws Exception {
+		// test input: "\n\t\tPattern1();\n\t\tPattern2() from x.y.z;\n\t\tPattern5();\n\t\tPattern6();\n\t\tPattern7();\n\t\tPattern3();\n\t\tPattern4() from collect( Pattern5() );\n\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t\tPattern1();\n\t\tPattern2() from x.y.z;\n\t\tPattern5();\n\t\tPattern6();\n\t\tPattern7();\n\t\tPattern3();\n\t\tPattern4() from collect( Pattern5() );\n\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block146() throws Exception {
+		// test input: " eval( 3==3 ) "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", " eval( 3==3 ) ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block147() throws Exception {
+		// test input: "\n\t\tInteger() from accumulate( Person( age > 21 ),\n\t\t                           init( int x = 0; ),\n\t\t                           action( x++; ),\n\t\t                           reverse( x--; ),\n\t\t                           result( new Integer(x) ) );\n\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t\tInteger() from accumulate( Person( age > 21 ),\n\t\t                           init( int x = 0; ),\n\t\t                           action( x++; ),\n\t\t                           reverse( x--; ),\n\t\t                           result( new Integer(x) ) );\n\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block148() throws Exception {
+		// test input: "\n\t     Number() from accumulate( Person( $age : age > 21 ),\n\t                               average( $age ) );\n\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t     Number() from accumulate( Person( $age : age > 21 ),\n\t                               average( $age ) );\n\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block149() throws Exception {
+		// test input: "\n\t     #bellow statement makes no sense, but is useful to test parsing recursiveness\n\t     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\n\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t     #bellow statement makes no sense, but is useful to test parsing recursiveness\n\t     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );\n\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block150() throws Exception {
+		// test input: "\n\t     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n\t                                                max( $age ) );\n\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),\n\t                                                max( $age ) );\n\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block151() throws Exception {
+		// test input: "\n\t    $p : Person( name == \"bob\" )\n\t    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\n\t    "
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t    $p : Person( name == \"bob\" )\n\t    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )\n\t    ", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block152() throws Exception {
+		// test input: "\n\t\t     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n\t\t                                         init( int x = 0; ),\n\t\t                                         action( x++; ),\n\t\t                                         result( new Integer(x) ) );\n\t\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t\t     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),\n\t\t                                         init( int x = 0; ),\n\t\t                                         action( x++; ),\n\t\t                                         result( new Integer(x) ) );\n\t\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block153() throws Exception {
+		// test input: "\n\t\t    $a : EventA()\n\t\t    $b : EventB( this `after[1,10] $a )\n\t\t    $c : EventC( this finishes $b )\n\t\t    $d : EventD( this not starts $a )\n\t\t    $e : EventE( this not `before [1, 10] $b )\n\t\t\t"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "\n\t\t    $a : EventA()\n\t\t    $b : EventB( this `after[1,10] $a )\n\t\t    $c : EventC( this finishes $b )\n\t\t    $d : EventD( this not starts $a )\n\t\t    $e : EventE( this not `before [1, 10] $b )\n\t\t\t", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testLhs_block_walks_Normal_lhs_block154() throws Exception {
+		// test input: "StockTick( symbol==\"ACME\") from entry-point StreamA"
+		Object retval = execTreeParser("lhs_block", "normal_lhs_block", "StockTick( symbol==\"ACME\") from entry-point StreamA", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"lhs_block", expecting, actual);
+	}
+
+	public void testFact_expression_walks_Constraints155() throws Exception {
+		// test input: "eval( $var.equals(\"xyz\") )"
+		Object retval = execTreeParser("fact_expression", "constraints", "eval( $var.equals(\"xyz\") )", false);
+		Object actual = examineParserExecResult(27, retval);
+		Object expecting = "OK";
+		
+		assertEquals("testing rule "+"fact_expression", expecting, actual);
+	}
+
+	// Invoke target parser.rule
+	public Object execTreeParser(String testTreeRuleName, String testRuleName, String testInput, boolean isFile) throws Exception {
+		CharStream input;
+		if ( isFile==true ) {
+			input = new ANTLRFileStream(testInput);
+		}
+		else {
+			input = new ANTLRStringStream(testInput);
+		}
+		try {
+			DRLLexer lexer = new DRLLexer(input);
+			CommonTokenStream tokens = new CommonTokenStream(lexer);
+			DRLParser parser = new DRLParser(tokens);
+			parser.setTreeAdaptor(new DroolsTreeAdaptor());
+			/** Use Reflection to get rule method from parser */
+			Method ruleName = Class.forName("org.drools.lang.DRLParser").getMethod(testRuleName);
+
+			/** Start of I/O Redirecting */
+			PipedInputStream pipedIn = new PipedInputStream();
+			PipedOutputStream pipedOut = new PipedOutputStream();
+			PipedInputStream pipedErrIn = new PipedInputStream();
+			PipedOutputStream pipedErrOut = new PipedOutputStream();
+			try {
+				pipedOut.connect(pipedIn);
+				pipedErrOut.connect(pipedErrIn);
+			}
+			catch(IOException e) {
+				System.err.println("connection failed...");
+				System.exit(1);
+			}
+			PrintStream console = System.out;
+			PrintStream consoleErr = System.err;
+			PrintStream ps = new PrintStream(pipedOut);
+			PrintStream ps2 = new PrintStream(pipedErrOut);
+			System.setOut(ps);
+			System.setErr(ps2);
+			/** End of redirecting */
+
+			/** Invoke grammar rule, and get the return value */
+			Object ruleReturn = ruleName.invoke(parser);
+			
+			Class _return = Class.forName("org.drools.lang.DRLParser"+"$"+testRuleName+"_return");            	
+        	Method returnName = _return.getMethod("getTree");
+        	CommonTree tree = (CommonTree) returnName.invoke(ruleReturn);
+			
+			// Walk resulting tree; create tree nodes stream first
+        	CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
+        	// AST nodes have payload that point into token stream
+        	nodes.setTokenStream(tokens);
+        	// Create a tree walker attached to the nodes stream
+        	Tree2TestDRL treeParser = new Tree2TestDRL(nodes);
+        	/** Invoke the tree rule, and store the return value if there is */
+            Method treeRuleName = Class.forName("org.drools.lang.Tree2TestDRL").getMethod(testTreeRuleName);
+            Object treeRuleReturn = treeRuleName.invoke(treeParser);
+            
+            String astString = null;
+            /** If tree rule has return value, determine if it's an AST */
+            if ( treeRuleReturn!=null ) {
+            	/** If return object is instanceof AST, get the toStringTree */
+                if ( treeRuleReturn.toString().indexOf(testTreeRuleName+"_return")>0 ) {
+                	try {	// NullPointerException may happen here...
+                		Class _treeReturn = Class.forName("org.drools.lang.Tree2TestDRL"+"$"+testTreeRuleName+"_return");
+                		Method[] methods = _treeReturn.getDeclaredMethods();
+			            for(Method method : methods) {
+			                if ( method.getName().equals("getTree") ) {
+			                	Method treeReturnName = _treeReturn.getMethod("getTree");
+		                    	CommonTree returnTree = (CommonTree) treeReturnName.invoke(treeRuleReturn);
+		                        astString = returnTree.toStringTree();
+			                }
+			            }
+                	}
+                	catch(Exception e) {
+                		System.err.println(e);
+                	}
+                }
+            }
+
+			org.antlr.gunit.gUnitExecuter.StreamVacuum stdoutVacuum = new org.antlr.gunit.gUnitExecuter.StreamVacuum(pipedIn);
+			org.antlr.gunit.gUnitExecuter.StreamVacuum stderrVacuum = new org.antlr.gunit.gUnitExecuter.StreamVacuum(pipedErrIn);
+			ps.close();
+			ps2.close();
+			System.setOut(console);			// Reset standard output
+			System.setErr(consoleErr);		// Reset standard err out
+			this.stdout = null;
+			this.stderr = null;
+			stdoutVacuum.start();
+			stderrVacuum.start();			
+			stdoutVacuum.join();
+			stderrVacuum.join();
+			// retVal could be actual return object from rule, stderr or stdout
+			if ( stderrVacuum.toString().length()>0 ) {
+				this.stderr = stderrVacuum.toString();
+				return this.stderr;
+			}
+			if ( parser.hasErrors() ) {
+				this.stderr = parser.getErrors().toString();
+				return this.stderr;
+			}			
+			if ( stdoutVacuum.toString().length()>0 ) {
+				this.stdout = stdoutVacuum.toString();
+			}
+			if ( astString!=null ) {	// Return toStringTree of AST
+				return astString;
+			}
+			if ( treeRuleReturn!=null ) {
+				return treeRuleReturn;
+			}
+			if ( stderrVacuum.toString().length()==0 && stdoutVacuum.toString().length()==0 ) {
+				return null;
+			}
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (SecurityException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (IllegalAccessException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (InvocationTargetException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (InterruptedException e) {
+			e.printStackTrace(); System.exit(1);
+		} catch (Exception e) {
+			e.printStackTrace(); System.exit(1);
+		}
+		return stdout;
+	}
+
+	// Modify the return value if the expected token type is OK or FAIL
+	public Object examineParserExecResult(int tokenType, Object retVal) {	
+		if ( tokenType==27 ) {	// expected Token: OK
+			if ( this.stderr==null ) {
+				return "OK";
+			}
+			else {
+				return "FAIL";
+			}
+		}
+		else if ( tokenType==28 ) {	// expected Token: FAIL
+			if ( this.stderr!=null ) {
+				return "FAIL";
+			}
+			else {
+				return "OK";
+			}
+		}
+		else {	// return the same object for the other token types
+			return retVal;
+		}		
+	}
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/Tree2TestDRL.java (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/Tree2TestDRL.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/Tree2TestDRL.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/Tree2TestDRL.java	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,3568 @@
+// $ANTLR 3.0.1 /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g 2008-06-05 13:52:46
+
+	package org.drools.lang;
+
+
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+public class Tree2TestDRL extends TreeParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VT_COMPILATION_UNIT", "VT_FUNCTION_IMPORT", "VT_FACT", "VT_CONSTRAINTS", "VT_LABEL", "VT_QUERY_ID", "VT_TEMPLATE_ID", "VT_RULE_ID", "VT_ENTRYPOINT_ID", "VT_SLOT_ID", "VT_SLOT", "VT_RULE_ATTRIBUTES", "VT_RHS_CHUNK", "VT_CURLY_CHUNK", "VT_SQUARE_CHUNK", "VT_PAREN_CHUNK", "VT_AND_IMPLICIT", "VT_AND_PREFIX", "VT_OR_PREFIX", "VT_AND_INFIX", "VT_OR_INFIX", "VT_ACCUMULATE_INIT_CLAUSE", "VT_ACCUMULATE_ID_CLAUSE", "VT_FROM_SOURCE", "VT_EXPRESSION_CHAIN", "VT_PATTERN", "VT_FACT_BINDING", "VT_FACT_OR", "VT_BIND_FIELD", "VT_FIELD", "VT_ACCESSOR_PATH", "VT_ACCESSOR_ELEMENT", "VT_DATA_TYPE", "VT_PATTERN_TYPE", "VT_PACKAGE_ID", "VT_IMPORT_ID", "VT_GLOBAL_ID", "VT_FUNCTION_ID", "VT_PARAM_LIST", "VK_DATE_EFFECTIVE", "VK_DATE_EXPIRES", "VK_LOCK_ON_ACTIVE", "VK_NO_LOOP", "VK_AUTO_FOCUS", "VK_ACTIVATION_GROUP", "VK_AGENDA_GROUP", "VK_RULEFLOW_GROUP", "VK_DURATION", "VK_DIALECT", "VK_SALIENCE", "VK_ENABLED", "VK_ATTRIBUTES", "VK_WHEN", "VK_RULE",!
  "VK_IMPORT", "VK_PACKAGE", "VK_TEMPLATE", "VK_QUERY", "VK_DECLARE", "VK_FUNCTION", "VK_GLOBAL", "VK_EVAL", "VK_CONTAINS", "VK_MATCHES", "VK_EXCLUDES", "VK_SOUNDSLIKE", "VK_MEMBEROF", "VK_ENTRY_POINT", "VK_NOT", "VK_IN", "VK_OR", "VK_AND", "VK_EXISTS", "VK_FORALL", "VK_FROM", "VK_ACCUMULATE", "VK_INIT", "VK_ACTION", "VK_REVERSE", "VK_RESULT", "VK_COLLECT", "SEMICOLON", "ID", "DOT", "DOT_STAR", "END", "STRING", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "COLON", "BOOL", "INT", "DOUBLE_PIPE", "DOUBLE_AMPER", "ARROW", "EQUAL", "GREATER", "GREATER_EQUAL", "LESS", "LESS_EQUAL", "NOT_EQUAL", "GRAVE_ACCENT", "FLOAT", "NULL", "LEFT_SQUARE", "RIGHT_SQUARE", "THEN", "LEFT_CURLY", "RIGHT_CURLY", "MISC", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT"
+    };
+    public static final int COMMA=92;
+    public static final int VT_PATTERN_TYPE=37;
+    public static final int VT_ACCUMULATE_ID_CLAUSE=26;
+    public static final int VK_DIALECT=52;
+    public static final int VK_FUNCTION=63;
+    public static final int END=89;
+    public static final int HexDigit=118;
+    public static final int VK_ATTRIBUTES=55;
+    public static final int VT_EXPRESSION_CHAIN=28;
+    public static final int VK_ACCUMULATE=79;
+    public static final int MISC=114;
+    public static final int VT_AND_PREFIX=21;
+    public static final int VK_QUERY=61;
+    public static final int THEN=111;
+    public static final int VK_AUTO_FOCUS=47;
+    public static final int DOT=87;
+    public static final int VK_IMPORT=58;
+    public static final int VT_SLOT=14;
+    public static final int VT_PACKAGE_ID=38;
+    public static final int LEFT_SQUARE=109;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=121;
+    public static final int VT_DATA_TYPE=36;
+    public static final int VK_MATCHES=67;
+    public static final int VT_FACT=6;
+    public static final int LEFT_CURLY=112;
+    public static final int LEFT_PAREN=91;
+    public static final int DOUBLE_AMPER=98;
+    public static final int VT_QUERY_ID=9;
+    public static final int VT_ACCESSOR_PATH=34;
+    public static final int VT_LABEL=8;
+    public static final int VT_ENTRYPOINT_ID=12;
+    public static final int VK_SOUNDSLIKE=69;
+    public static final int VK_SALIENCE=53;
+    public static final int VT_FIELD=33;
+    public static final int WS=116;
+    public static final int STRING=90;
+    public static final int VK_AND=75;
+    public static final int VT_ACCESSOR_ELEMENT=35;
+    public static final int VK_GLOBAL=64;
+    public static final int VT_ACCUMULATE_INIT_CLAUSE=25;
+    public static final int VK_REVERSE=82;
+    public static final int GRAVE_ACCENT=106;
+    public static final int VK_DURATION=51;
+    public static final int VT_SQUARE_CHUNK=18;
+    public static final int VK_FORALL=77;
+    public static final int VT_COMPILATION_UNIT=4;
+    public static final int VT_PAREN_CHUNK=19;
+    public static final int VK_ENABLED=54;
+    public static final int VK_RESULT=83;
+    public static final int UnicodeEscape=119;
+    public static final int VK_PACKAGE=59;
+    public static final int VT_RULE_ID=11;
+    public static final int EQUAL=100;
+    public static final int VK_NO_LOOP=46;
+    public static final int SEMICOLON=85;
+    public static final int VK_TEMPLATE=60;
+    public static final int VT_AND_IMPLICIT=20;
+    public static final int NULL=108;
+    public static final int COLON=94;
+    public static final int MULTI_LINE_COMMENT=123;
+    public static final int VT_RULE_ATTRIBUTES=15;
+    public static final int RIGHT_SQUARE=110;
+    public static final int VK_AGENDA_GROUP=49;
+    public static final int VT_FACT_OR=31;
+    public static final int VK_NOT=72;
+    public static final int VK_DATE_EXPIRES=44;
+    public static final int ARROW=99;
+    public static final int FLOAT=107;
+    public static final int VT_SLOT_ID=13;
+    public static final int VT_CURLY_CHUNK=17;
+    public static final int VT_OR_PREFIX=22;
+    public static final int DOUBLE_PIPE=97;
+    public static final int LESS=103;
+    public static final int VT_PATTERN=29;
+    public static final int VK_DATE_EFFECTIVE=43;
+    public static final int EscapeSequence=117;
+    public static final int VK_EXISTS=76;
+    public static final int INT=96;
+    public static final int VT_BIND_FIELD=32;
+    public static final int VK_RULE=57;
+    public static final int VK_EVAL=65;
+    public static final int VK_COLLECT=84;
+    public static final int GREATER=101;
+    public static final int VT_FACT_BINDING=30;
+    public static final int ID=86;
+    public static final int NOT_EQUAL=105;
+    public static final int RIGHT_CURLY=113;
+    public static final int VK_ENTRY_POINT=71;
+    public static final int VT_AND_INFIX=23;
+    public static final int VT_PARAM_LIST=42;
+    public static final int BOOL=95;
+    public static final int VT_FROM_SOURCE=27;
+    public static final int VK_CONTAINS=66;
+    public static final int VK_LOCK_ON_ACTIVE=45;
+    public static final int VT_FUNCTION_IMPORT=5;
+    public static final int VK_IN=73;
+    public static final int VT_RHS_CHUNK=16;
+    public static final int VK_MEMBEROF=70;
+    public static final int GREATER_EQUAL=102;
+    public static final int VT_OR_INFIX=24;
+    public static final int DOT_STAR=88;
+    public static final int VK_OR=74;
+    public static final int VT_GLOBAL_ID=40;
+    public static final int LESS_EQUAL=104;
+    public static final int VK_WHEN=56;
+    public static final int VK_RULEFLOW_GROUP=50;
+    public static final int VT_FUNCTION_ID=41;
+    public static final int EOF=-1;
+    public static final int VT_CONSTRAINTS=7;
+    public static final int VT_IMPORT_ID=39;
+    public static final int EOL=115;
+    public static final int VK_INIT=80;
+    public static final int VK_ACTIVATION_GROUP=48;
+    public static final int OctalEscape=120;
+    public static final int VK_ACTION=81;
+    public static final int VK_FROM=78;
+    public static final int VK_EXCLUDES=68;
+    public static final int RIGHT_PAREN=93;
+    public static final int VT_TEMPLATE_ID=10;
+    public static final int VK_DECLARE=62;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=122;
+
+        public Tree2TestDRL(TreeNodeStream input) {
+            super(input);
+        }
+        
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "/Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g"; }
+
+
+
+    // $ANTLR start compilation_unit
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:13:1: compilation_unit : ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* ) ;
+    public final void compilation_unit() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:2: ( ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:4: ^( VT_COMPILATION_UNIT ( package_statement )? ( statement )* )
+            {
+            match(input,VT_COMPILATION_UNIT,FOLLOW_VT_COMPILATION_UNIT_in_compilation_unit43); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:26: ( package_statement )?
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==VK_PACKAGE) ) {
+                    alt1=1;
+                }
+                switch (alt1) {
+                    case 1 :
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:26: package_statement
+                        {
+                        pushFollow(FOLLOW_package_statement_in_compilation_unit45);
+                        package_statement();
+                        _fsp--;
+
+
+                        }
+                        break;
+
+                }
+
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:45: ( statement )*
+                loop2:
+                do {
+                    int alt2=2;
+                    int LA2_0 = input.LA(1);
+
+                    if ( (LA2_0==VT_FUNCTION_IMPORT||(LA2_0>=VK_DATE_EFFECTIVE && LA2_0<=VK_ENABLED)||(LA2_0>=VK_RULE && LA2_0<=VK_IMPORT)||(LA2_0>=VK_TEMPLATE && LA2_0<=VK_QUERY)||(LA2_0>=VK_FUNCTION && LA2_0<=VK_GLOBAL)) ) {
+                        alt2=1;
+                    }
+
+
+                    switch (alt2) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:14:45: statement
+                	    {
+                	    pushFollow(FOLLOW_statement_in_compilation_unit48);
+                	    statement();
+                	    _fsp--;
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop2;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end compilation_unit
+
+
+    // $ANTLR start package_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:17:1: package_statement : ^( VK_PACKAGE package_id ) ;
+    public final void package_statement() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:18:2: ( ^( VK_PACKAGE package_id ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:18:4: ^( VK_PACKAGE package_id )
+            {
+            match(input,VK_PACKAGE,FOLLOW_VK_PACKAGE_in_package_statement63); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_package_id_in_package_statement65);
+            package_id();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end package_statement
+
+
+    // $ANTLR start package_id
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:21:1: package_id : ^( VT_PACKAGE_ID ( ID )+ ) ;
+    public final void package_id() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:22:2: ( ^( VT_PACKAGE_ID ( ID )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:22:4: ^( VT_PACKAGE_ID ( ID )+ )
+            {
+            match(input,VT_PACKAGE_ID,FOLLOW_VT_PACKAGE_ID_in_package_id78); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:22:20: ( ID )+
+            int cnt3=0;
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( (LA3_0==ID) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:22:20: ID
+            	    {
+            	    match(input,ID,FOLLOW_ID_in_package_id80); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
+                }
+                cnt3++;
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end package_id
+
+
+    // $ANTLR start statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:25:1: statement : ( rule_attribute | function_import_statement | import_statement | global | function | template | rule | query );
+    public final void statement() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:26:2: ( rule_attribute | function_import_statement | import_statement | global | function | template | rule | query )
+            int alt4=8;
+            switch ( input.LA(1) ) {
+            case VK_DATE_EFFECTIVE:
+            case VK_DATE_EXPIRES:
+            case VK_LOCK_ON_ACTIVE:
+            case VK_NO_LOOP:
+            case VK_AUTO_FOCUS:
+            case VK_ACTIVATION_GROUP:
+            case VK_AGENDA_GROUP:
+            case VK_RULEFLOW_GROUP:
+            case VK_DURATION:
+            case VK_DIALECT:
+            case VK_SALIENCE:
+            case VK_ENABLED:
+                {
+                alt4=1;
+                }
+                break;
+            case VT_FUNCTION_IMPORT:
+                {
+                alt4=2;
+                }
+                break;
+            case VK_IMPORT:
+                {
+                alt4=3;
+                }
+                break;
+            case VK_GLOBAL:
+                {
+                alt4=4;
+                }
+                break;
+            case VK_FUNCTION:
+                {
+                alt4=5;
+                }
+                break;
+            case VK_TEMPLATE:
+                {
+                alt4=6;
+                }
+                break;
+            case VK_RULE:
+                {
+                alt4=7;
+                }
+                break;
+            case VK_QUERY:
+                {
+                alt4=8;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("25:1: statement : ( rule_attribute | function_import_statement | import_statement | global | function | template | rule | query );", 4, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt4) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:26:4: rule_attribute
+                    {
+                    pushFollow(FOLLOW_rule_attribute_in_statement93);
+                    rule_attribute();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:27:4: function_import_statement
+                    {
+                    pushFollow(FOLLOW_function_import_statement_in_statement98);
+                    function_import_statement();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:28:4: import_statement
+                    {
+                    pushFollow(FOLLOW_import_statement_in_statement104);
+                    import_statement();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:29:4: global
+                    {
+                    pushFollow(FOLLOW_global_in_statement110);
+                    global();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:30:4: function
+                    {
+                    pushFollow(FOLLOW_function_in_statement116);
+                    function();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:31:4: template
+                    {
+                    pushFollow(FOLLOW_template_in_statement121);
+                    template();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:32:4: rule
+                    {
+                    pushFollow(FOLLOW_rule_in_statement126);
+                    rule();
+                    _fsp--;
+
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:33:4: query
+                    {
+                    pushFollow(FOLLOW_query_in_statement131);
+                    query();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end statement
+
+
+    // $ANTLR start import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:36:1: import_statement : ^( VK_IMPORT import_name ) ;
+    public final void import_statement() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:37:2: ( ^( VK_IMPORT import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:37:4: ^( VK_IMPORT import_name )
+            {
+            match(input,VK_IMPORT,FOLLOW_VK_IMPORT_in_import_statement143); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_import_name_in_import_statement145);
+            import_name();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end import_statement
+
+
+    // $ANTLR start function_import_statement
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:40:1: function_import_statement : ^( VT_FUNCTION_IMPORT VK_FUNCTION import_name ) ;
+    public final void function_import_statement() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:41:2: ( ^( VT_FUNCTION_IMPORT VK_FUNCTION import_name ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:41:4: ^( VT_FUNCTION_IMPORT VK_FUNCTION import_name )
+            {
+            match(input,VT_FUNCTION_IMPORT,FOLLOW_VT_FUNCTION_IMPORT_in_function_import_statement158); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VK_FUNCTION,FOLLOW_VK_FUNCTION_in_function_import_statement160); 
+            pushFollow(FOLLOW_import_name_in_function_import_statement162);
+            import_name();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end function_import_statement
+
+
+    // $ANTLR start import_name
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:44:1: import_name : ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? ) ;
+    public final void import_name() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:2: ( ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:4: ^( VT_IMPORT_ID ( ID )+ ( DOT_STAR )? )
+            {
+            match(input,VT_IMPORT_ID,FOLLOW_VT_IMPORT_ID_in_import_name175); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:19: ( ID )+
+            int cnt5=0;
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( (LA5_0==ID) ) {
+                    alt5=1;
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:19: ID
+            	    {
+            	    match(input,ID,FOLLOW_ID_in_import_name177); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt5 >= 1 ) break loop5;
+                        EarlyExitException eee =
+                            new EarlyExitException(5, input);
+                        throw eee;
+                }
+                cnt5++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:23: ( DOT_STAR )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==DOT_STAR) ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:45:23: DOT_STAR
+                    {
+                    match(input,DOT_STAR,FOLLOW_DOT_STAR_in_import_name180); 
+
+                    }
+                    break;
+
+            }
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end import_name
+
+
+    // $ANTLR start global
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:48:1: global : ^( VK_GLOBAL data_type VT_GLOBAL_ID ) ;
+    public final void global() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:49:2: ( ^( VK_GLOBAL data_type VT_GLOBAL_ID ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:49:4: ^( VK_GLOBAL data_type VT_GLOBAL_ID )
+            {
+            match(input,VK_GLOBAL,FOLLOW_VK_GLOBAL_in_global194); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_data_type_in_global196);
+            data_type();
+            _fsp--;
+
+            match(input,VT_GLOBAL_ID,FOLLOW_VT_GLOBAL_ID_in_global198); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end global
+
+
+    // $ANTLR start function
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:52:1: function : ^( VK_FUNCTION ( data_type )? VT_FUNCTION_ID parameters curly_chunk ) ;
+    public final void function() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:53:2: ( ^( VK_FUNCTION ( data_type )? VT_FUNCTION_ID parameters curly_chunk ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:53:4: ^( VK_FUNCTION ( data_type )? VT_FUNCTION_ID parameters curly_chunk )
+            {
+            match(input,VK_FUNCTION,FOLLOW_VK_FUNCTION_in_function211); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:53:18: ( data_type )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==VT_DATA_TYPE) ) {
+                alt7=1;
+            }
+            switch (alt7) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:53:18: data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_function213);
+                    data_type();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            match(input,VT_FUNCTION_ID,FOLLOW_VT_FUNCTION_ID_in_function216); 
+            pushFollow(FOLLOW_parameters_in_function218);
+            parameters();
+            _fsp--;
+
+            pushFollow(FOLLOW_curly_chunk_in_function220);
+            curly_chunk();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end function
+
+
+    // $ANTLR start query
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:56:1: query : ^( VK_QUERY VT_QUERY_ID ( parameters )? lhs_block END ) ;
+    public final void query() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:57:2: ( ^( VK_QUERY VT_QUERY_ID ( parameters )? lhs_block END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:57:4: ^( VK_QUERY VT_QUERY_ID ( parameters )? lhs_block END )
+            {
+            match(input,VK_QUERY,FOLLOW_VK_QUERY_in_query233); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_QUERY_ID,FOLLOW_VT_QUERY_ID_in_query235); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:57:27: ( parameters )?
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==VT_PARAM_LIST) ) {
+                alt8=1;
+            }
+            switch (alt8) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:57:27: parameters
+                    {
+                    pushFollow(FOLLOW_parameters_in_query237);
+                    parameters();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_lhs_block_in_query240);
+            lhs_block();
+            _fsp--;
+
+            match(input,END,FOLLOW_END_in_query242); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end query
+
+
+    // $ANTLR start parameters
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:60:1: parameters : ^( VT_PARAM_LIST ( param_definition )* ) ;
+    public final void parameters() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:61:2: ( ^( VT_PARAM_LIST ( param_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:61:4: ^( VT_PARAM_LIST ( param_definition )* )
+            {
+            match(input,VT_PARAM_LIST,FOLLOW_VT_PARAM_LIST_in_parameters255); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:61:20: ( param_definition )*
+                loop9:
+                do {
+                    int alt9=2;
+                    int LA9_0 = input.LA(1);
+
+                    if ( (LA9_0==VT_DATA_TYPE||LA9_0==ID) ) {
+                        alt9=1;
+                    }
+
+
+                    switch (alt9) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:61:20: param_definition
+                	    {
+                	    pushFollow(FOLLOW_param_definition_in_parameters257);
+                	    param_definition();
+                	    _fsp--;
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop9;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end parameters
+
+
+    // $ANTLR start param_definition
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:64:1: param_definition : ( data_type )? argument ;
+    public final void param_definition() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:65:2: ( ( data_type )? argument )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:65:4: ( data_type )? argument
+            {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:65:4: ( data_type )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==VT_DATA_TYPE) ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:65:4: data_type
+                    {
+                    pushFollow(FOLLOW_data_type_in_param_definition270);
+                    data_type();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            pushFollow(FOLLOW_argument_in_param_definition273);
+            argument();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end param_definition
+
+
+    // $ANTLR start argument
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:68:1: argument : ID ( dimension_definition )* ;
+    public final void argument() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:69:2: ( ID ( dimension_definition )* )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:69:4: ID ( dimension_definition )*
+            {
+            match(input,ID,FOLLOW_ID_in_argument284); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:69:7: ( dimension_definition )*
+            loop11:
+            do {
+                int alt11=2;
+                int LA11_0 = input.LA(1);
+
+                if ( (LA11_0==LEFT_SQUARE) ) {
+                    alt11=1;
+                }
+
+
+                switch (alt11) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:69:7: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_argument286);
+            	    dimension_definition();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop11;
+                }
+            } while (true);
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end argument
+
+
+    // $ANTLR start template
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:73:1: template : ^( VK_TEMPLATE VT_TEMPLATE_ID ( template_slot )+ END ) ;
+    public final void template() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:74:2: ( ^( VK_TEMPLATE VT_TEMPLATE_ID ( template_slot )+ END ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:74:4: ^( VK_TEMPLATE VT_TEMPLATE_ID ( template_slot )+ END )
+            {
+            match(input,VK_TEMPLATE,FOLLOW_VK_TEMPLATE_in_template300); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_TEMPLATE_ID,FOLLOW_VT_TEMPLATE_ID_in_template302); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:74:33: ( template_slot )+
+            int cnt12=0;
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( (LA12_0==VT_SLOT) ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:74:33: template_slot
+            	    {
+            	    pushFollow(FOLLOW_template_slot_in_template304);
+            	    template_slot();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt12 >= 1 ) break loop12;
+                        EarlyExitException eee =
+                            new EarlyExitException(12, input);
+                        throw eee;
+                }
+                cnt12++;
+            } while (true);
+
+            match(input,END,FOLLOW_END_in_template307); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end template
+
+
+    // $ANTLR start template_slot
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:77:1: template_slot : ^( VT_SLOT data_type VT_SLOT_ID ) ;
+    public final void template_slot() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:78:2: ( ^( VT_SLOT data_type VT_SLOT_ID ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:78:4: ^( VT_SLOT data_type VT_SLOT_ID )
+            {
+            match(input,VT_SLOT,FOLLOW_VT_SLOT_in_template_slot320); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_data_type_in_template_slot322);
+            data_type();
+            _fsp--;
+
+            match(input,VT_SLOT_ID,FOLLOW_VT_SLOT_ID_in_template_slot324); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end template_slot
+
+
+    // $ANTLR start rule
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:81:1: rule : ^( VK_RULE VT_RULE_ID ( rule_attributes )? ( when_part )? VT_RHS_CHUNK ) ;
+    public final void rule() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:2: ( ^( VK_RULE VT_RULE_ID ( rule_attributes )? ( when_part )? VT_RHS_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:4: ^( VK_RULE VT_RULE_ID ( rule_attributes )? ( when_part )? VT_RHS_CHUNK )
+            {
+            match(input,VK_RULE,FOLLOW_VK_RULE_in_rule337); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_RULE_ID,FOLLOW_VT_RULE_ID_in_rule339); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:25: ( rule_attributes )?
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0==VT_RULE_ATTRIBUTES) ) {
+                alt13=1;
+            }
+            switch (alt13) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:25: rule_attributes
+                    {
+                    pushFollow(FOLLOW_rule_attributes_in_rule341);
+                    rule_attributes();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:42: ( when_part )?
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==VK_WHEN) ) {
+                alt14=1;
+            }
+            switch (alt14) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:82:42: when_part
+                    {
+                    pushFollow(FOLLOW_when_part_in_rule344);
+                    when_part();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            match(input,VT_RHS_CHUNK,FOLLOW_VT_RHS_CHUNK_in_rule347); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end rule
+
+
+    // $ANTLR start when_part
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:85:1: when_part : VK_WHEN lhs_block ;
+    public final void when_part() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:86:2: ( VK_WHEN lhs_block )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:86:4: VK_WHEN lhs_block
+            {
+            match(input,VK_WHEN,FOLLOW_VK_WHEN_in_when_part359); 
+            pushFollow(FOLLOW_lhs_block_in_when_part361);
+            lhs_block();
+            _fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end when_part
+
+
+    // $ANTLR start rule_attributes
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:89:1: rule_attributes : ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? ( rule_attribute )+ ) ;
+    public final void rule_attributes() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:2: ( ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? ( rule_attribute )+ ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:4: ^( VT_RULE_ATTRIBUTES ( VK_ATTRIBUTES )? ( rule_attribute )+ )
+            {
+            match(input,VT_RULE_ATTRIBUTES,FOLLOW_VT_RULE_ATTRIBUTES_in_rule_attributes373); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:25: ( VK_ATTRIBUTES )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==VK_ATTRIBUTES) ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:25: VK_ATTRIBUTES
+                    {
+                    match(input,VK_ATTRIBUTES,FOLLOW_VK_ATTRIBUTES_in_rule_attributes375); 
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:40: ( rule_attribute )+
+            int cnt16=0;
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( ((LA16_0>=VK_DATE_EFFECTIVE && LA16_0<=VK_ENABLED)) ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:90:40: rule_attribute
+            	    {
+            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes378);
+            	    rule_attribute();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt16 >= 1 ) break loop16;
+                        EarlyExitException eee =
+                            new EarlyExitException(16, input);
+                        throw eee;
+                }
+                cnt16++;
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end rule_attributes
+
+
+    // $ANTLR start rule_attribute
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:93:1: rule_attribute : ( ^( VK_SALIENCE ( INT | VT_PAREN_CHUNK ) ) | ^( VK_NO_LOOP ( BOOL )? ) | ^( VK_AGENDA_GROUP STRING ) | ^( VK_DURATION INT ) | ^( VK_ACTIVATION_GROUP STRING ) | ^( VK_AUTO_FOCUS ( BOOL )? ) | ^( VK_DATE_EFFECTIVE STRING ) | ^( VK_DATE_EXPIRES STRING ) | ^( VK_ENABLED BOOL ) | ^( VK_RULEFLOW_GROUP STRING ) | ^( VK_LOCK_ON_ACTIVE ( BOOL )? ) | ^( VK_DIALECT STRING ) );
+    public final void rule_attribute() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:94:2: ( ^( VK_SALIENCE ( INT | VT_PAREN_CHUNK ) ) | ^( VK_NO_LOOP ( BOOL )? ) | ^( VK_AGENDA_GROUP STRING ) | ^( VK_DURATION INT ) | ^( VK_ACTIVATION_GROUP STRING ) | ^( VK_AUTO_FOCUS ( BOOL )? ) | ^( VK_DATE_EFFECTIVE STRING ) | ^( VK_DATE_EXPIRES STRING ) | ^( VK_ENABLED BOOL ) | ^( VK_RULEFLOW_GROUP STRING ) | ^( VK_LOCK_ON_ACTIVE ( BOOL )? ) | ^( VK_DIALECT STRING ) )
+            int alt20=12;
+            switch ( input.LA(1) ) {
+            case VK_SALIENCE:
+                {
+                alt20=1;
+                }
+                break;
+            case VK_NO_LOOP:
+                {
+                alt20=2;
+                }
+                break;
+            case VK_AGENDA_GROUP:
+                {
+                alt20=3;
+                }
+                break;
+            case VK_DURATION:
+                {
+                alt20=4;
+                }
+                break;
+            case VK_ACTIVATION_GROUP:
+                {
+                alt20=5;
+                }
+                break;
+            case VK_AUTO_FOCUS:
+                {
+                alt20=6;
+                }
+                break;
+            case VK_DATE_EFFECTIVE:
+                {
+                alt20=7;
+                }
+                break;
+            case VK_DATE_EXPIRES:
+                {
+                alt20=8;
+                }
+                break;
+            case VK_ENABLED:
+                {
+                alt20=9;
+                }
+                break;
+            case VK_RULEFLOW_GROUP:
+                {
+                alt20=10;
+                }
+                break;
+            case VK_LOCK_ON_ACTIVE:
+                {
+                alt20=11;
+                }
+                break;
+            case VK_DIALECT:
+                {
+                alt20=12;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("93:1: rule_attribute : ( ^( VK_SALIENCE ( INT | VT_PAREN_CHUNK ) ) | ^( VK_NO_LOOP ( BOOL )? ) | ^( VK_AGENDA_GROUP STRING ) | ^( VK_DURATION INT ) | ^( VK_ACTIVATION_GROUP STRING ) | ^( VK_AUTO_FOCUS ( BOOL )? ) | ^( VK_DATE_EFFECTIVE STRING ) | ^( VK_DATE_EXPIRES STRING ) | ^( VK_ENABLED BOOL ) | ^( VK_RULEFLOW_GROUP STRING ) | ^( VK_LOCK_ON_ACTIVE ( BOOL )? ) | ^( VK_DIALECT STRING ) );", 20, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt20) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:94:4: ^( VK_SALIENCE ( INT | VT_PAREN_CHUNK ) )
+                    {
+                    match(input,VK_SALIENCE,FOLLOW_VK_SALIENCE_in_rule_attribute392); 
+
+                    match(input, Token.DOWN, null); 
+                    if ( input.LA(1)==VT_PAREN_CHUNK||input.LA(1)==INT ) {
+                        input.consume();
+                        errorRecovery=false;
+                    }
+                    else {
+                        MismatchedSetException mse =
+                            new MismatchedSetException(null,input);
+                        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_rule_attribute394);    throw mse;
+                    }
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:95:4: ^( VK_NO_LOOP ( BOOL )? )
+                    {
+                    match(input,VK_NO_LOOP,FOLLOW_VK_NO_LOOP_in_rule_attribute406); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:95:17: ( BOOL )?
+                        int alt17=2;
+                        int LA17_0 = input.LA(1);
+
+                        if ( (LA17_0==BOOL) ) {
+                            alt17=1;
+                        }
+                        switch (alt17) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:95:17: BOOL
+                                {
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute408); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:96:4: ^( VK_AGENDA_GROUP STRING )
+                    {
+                    match(input,VK_AGENDA_GROUP,FOLLOW_VK_AGENDA_GROUP_in_rule_attribute418); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute420); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:97:4: ^( VK_DURATION INT )
+                    {
+                    match(input,VK_DURATION,FOLLOW_VK_DURATION_in_rule_attribute429); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,INT,FOLLOW_INT_in_rule_attribute431); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:98:4: ^( VK_ACTIVATION_GROUP STRING )
+                    {
+                    match(input,VK_ACTIVATION_GROUP,FOLLOW_VK_ACTIVATION_GROUP_in_rule_attribute441); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute443); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:99:4: ^( VK_AUTO_FOCUS ( BOOL )? )
+                    {
+                    match(input,VK_AUTO_FOCUS,FOLLOW_VK_AUTO_FOCUS_in_rule_attribute451); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:99:20: ( BOOL )?
+                        int alt18=2;
+                        int LA18_0 = input.LA(1);
+
+                        if ( (LA18_0==BOOL) ) {
+                            alt18=1;
+                        }
+                        switch (alt18) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:99:20: BOOL
+                                {
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute453); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:100:4: ^( VK_DATE_EFFECTIVE STRING )
+                    {
+                    match(input,VK_DATE_EFFECTIVE,FOLLOW_VK_DATE_EFFECTIVE_in_rule_attribute462); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute464); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:101:4: ^( VK_DATE_EXPIRES STRING )
+                    {
+                    match(input,VK_DATE_EXPIRES,FOLLOW_VK_DATE_EXPIRES_in_rule_attribute472); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute474); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:102:4: ^( VK_ENABLED BOOL )
+                    {
+                    match(input,VK_ENABLED,FOLLOW_VK_ENABLED_in_rule_attribute482); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,BOOL,FOLLOW_BOOL_in_rule_attribute484); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:103:4: ^( VK_RULEFLOW_GROUP STRING )
+                    {
+                    match(input,VK_RULEFLOW_GROUP,FOLLOW_VK_RULEFLOW_GROUP_in_rule_attribute492); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute494); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:104:4: ^( VK_LOCK_ON_ACTIVE ( BOOL )? )
+                    {
+                    match(input,VK_LOCK_ON_ACTIVE,FOLLOW_VK_LOCK_ON_ACTIVE_in_rule_attribute502); 
+
+                    if ( input.LA(1)==Token.DOWN ) {
+                        match(input, Token.DOWN, null); 
+                        // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:104:24: ( BOOL )?
+                        int alt19=2;
+                        int LA19_0 = input.LA(1);
+
+                        if ( (LA19_0==BOOL) ) {
+                            alt19=1;
+                        }
+                        switch (alt19) {
+                            case 1 :
+                                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:104:24: BOOL
+                                {
+                                match(input,BOOL,FOLLOW_BOOL_in_rule_attribute504); 
+
+                                }
+                                break;
+
+                        }
+
+
+                        match(input, Token.UP, null); 
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:105:4: ^( VK_DIALECT STRING )
+                    {
+                    match(input,VK_DIALECT,FOLLOW_VK_DIALECT_in_rule_attribute512); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,STRING,FOLLOW_STRING_in_rule_attribute514); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end rule_attribute
+
+
+    // $ANTLR start lhs_block
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:108:1: lhs_block : ^( VT_AND_IMPLICIT ( lhs )* ) ;
+    public final void lhs_block() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:109:2: ( ^( VT_AND_IMPLICIT ( lhs )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:109:4: ^( VT_AND_IMPLICIT ( lhs )* )
+            {
+            match(input,VT_AND_IMPLICIT,FOLLOW_VT_AND_IMPLICIT_in_lhs_block528); 
+
+            if ( input.LA(1)==Token.DOWN ) {
+                match(input, Token.DOWN, null); 
+                // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:109:22: ( lhs )*
+                loop21:
+                do {
+                    int alt21=2;
+                    int LA21_0 = input.LA(1);
+
+                    if ( ((LA21_0>=VT_AND_PREFIX && LA21_0<=VT_OR_INFIX)||LA21_0==VT_PATTERN||LA21_0==VK_EVAL||LA21_0==VK_NOT||(LA21_0>=VK_EXISTS && LA21_0<=VK_FROM)) ) {
+                        alt21=1;
+                    }
+
+
+                    switch (alt21) {
+                	case 1 :
+                	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:109:22: lhs
+                	    {
+                	    pushFollow(FOLLOW_lhs_in_lhs_block530);
+                	    lhs();
+                	    _fsp--;
+
+
+                	    }
+                	    break;
+
+                	default :
+                	    break loop21;
+                    }
+                } while (true);
+
+
+                match(input, Token.UP, null); 
+            }
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end lhs_block
+
+
+    // $ANTLR start lhs
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:112:1: lhs : ( ^( VT_OR_PREFIX ( lhs )+ ) | ^( VT_OR_INFIX lhs lhs ) | ^( VT_AND_PREFIX ( lhs )+ ) | ^( VT_AND_INFIX lhs lhs ) | ^( VK_EXISTS lhs ) | ^( VK_NOT lhs ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_FORALL ( lhs )+ ) | ^( VK_FROM lhs_pattern from_elements ) | lhs_pattern );
+    public final void lhs() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:112:5: ( ^( VT_OR_PREFIX ( lhs )+ ) | ^( VT_OR_INFIX lhs lhs ) | ^( VT_AND_PREFIX ( lhs )+ ) | ^( VT_AND_INFIX lhs lhs ) | ^( VK_EXISTS lhs ) | ^( VK_NOT lhs ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_FORALL ( lhs )+ ) | ^( VK_FROM lhs_pattern from_elements ) | lhs_pattern )
+            int alt25=10;
+            switch ( input.LA(1) ) {
+            case VT_OR_PREFIX:
+                {
+                alt25=1;
+                }
+                break;
+            case VT_OR_INFIX:
+                {
+                alt25=2;
+                }
+                break;
+            case VT_AND_PREFIX:
+                {
+                alt25=3;
+                }
+                break;
+            case VT_AND_INFIX:
+                {
+                alt25=4;
+                }
+                break;
+            case VK_EXISTS:
+                {
+                alt25=5;
+                }
+                break;
+            case VK_NOT:
+                {
+                alt25=6;
+                }
+                break;
+            case VK_EVAL:
+                {
+                alt25=7;
+                }
+                break;
+            case VK_FORALL:
+                {
+                alt25=8;
+                }
+                break;
+            case VK_FROM:
+                {
+                alt25=9;
+                }
+                break;
+            case VT_PATTERN:
+                {
+                alt25=10;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("112:1: lhs : ( ^( VT_OR_PREFIX ( lhs )+ ) | ^( VT_OR_INFIX lhs lhs ) | ^( VT_AND_PREFIX ( lhs )+ ) | ^( VT_AND_INFIX lhs lhs ) | ^( VK_EXISTS lhs ) | ^( VK_NOT lhs ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_FORALL ( lhs )+ ) | ^( VK_FROM lhs_pattern from_elements ) | lhs_pattern );", 25, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt25) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:112:7: ^( VT_OR_PREFIX ( lhs )+ )
+                    {
+                    match(input,VT_OR_PREFIX,FOLLOW_VT_OR_PREFIX_in_lhs543); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:112:22: ( lhs )+
+                    int cnt22=0;
+                    loop22:
+                    do {
+                        int alt22=2;
+                        int LA22_0 = input.LA(1);
+
+                        if ( ((LA22_0>=VT_AND_PREFIX && LA22_0<=VT_OR_INFIX)||LA22_0==VT_PATTERN||LA22_0==VK_EVAL||LA22_0==VK_NOT||(LA22_0>=VK_EXISTS && LA22_0<=VK_FROM)) ) {
+                            alt22=1;
+                        }
+
+
+                        switch (alt22) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:112:22: lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs545);
+                    	    lhs();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt22 >= 1 ) break loop22;
+                                EarlyExitException eee =
+                                    new EarlyExitException(22, input);
+                                throw eee;
+                        }
+                        cnt22++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:113:4: ^( VT_OR_INFIX lhs lhs )
+                    {
+                    match(input,VT_OR_INFIX,FOLLOW_VT_OR_INFIX_in_lhs553); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs555);
+                    lhs();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_lhs_in_lhs557);
+                    lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:114:4: ^( VT_AND_PREFIX ( lhs )+ )
+                    {
+                    match(input,VT_AND_PREFIX,FOLLOW_VT_AND_PREFIX_in_lhs564); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:114:20: ( lhs )+
+                    int cnt23=0;
+                    loop23:
+                    do {
+                        int alt23=2;
+                        int LA23_0 = input.LA(1);
+
+                        if ( ((LA23_0>=VT_AND_PREFIX && LA23_0<=VT_OR_INFIX)||LA23_0==VT_PATTERN||LA23_0==VK_EVAL||LA23_0==VK_NOT||(LA23_0>=VK_EXISTS && LA23_0<=VK_FROM)) ) {
+                            alt23=1;
+                        }
+
+
+                        switch (alt23) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:114:20: lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs566);
+                    	    lhs();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt23 >= 1 ) break loop23;
+                                EarlyExitException eee =
+                                    new EarlyExitException(23, input);
+                                throw eee;
+                        }
+                        cnt23++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:115:4: ^( VT_AND_INFIX lhs lhs )
+                    {
+                    match(input,VT_AND_INFIX,FOLLOW_VT_AND_INFIX_in_lhs574); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs576);
+                    lhs();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_lhs_in_lhs578);
+                    lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:116:4: ^( VK_EXISTS lhs )
+                    {
+                    match(input,VK_EXISTS,FOLLOW_VK_EXISTS_in_lhs585); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs587);
+                    lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:117:4: ^( VK_NOT lhs )
+                    {
+                    match(input,VK_NOT,FOLLOW_VK_NOT_in_lhs594); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_lhs596);
+                    lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:118:4: ^( VK_EVAL VT_PAREN_CHUNK )
+                    {
+                    match(input,VK_EVAL,FOLLOW_VK_EVAL_in_lhs603); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_lhs605); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:119:4: ^( VK_FORALL ( lhs )+ )
+                    {
+                    match(input,VK_FORALL,FOLLOW_VK_FORALL_in_lhs612); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:119:16: ( lhs )+
+                    int cnt24=0;
+                    loop24:
+                    do {
+                        int alt24=2;
+                        int LA24_0 = input.LA(1);
+
+                        if ( ((LA24_0>=VT_AND_PREFIX && LA24_0<=VT_OR_INFIX)||LA24_0==VT_PATTERN||LA24_0==VK_EVAL||LA24_0==VK_NOT||(LA24_0>=VK_EXISTS && LA24_0<=VK_FROM)) ) {
+                            alt24=1;
+                        }
+
+
+                        switch (alt24) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:119:16: lhs
+                    	    {
+                    	    pushFollow(FOLLOW_lhs_in_lhs614);
+                    	    lhs();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt24 >= 1 ) break loop24;
+                                EarlyExitException eee =
+                                    new EarlyExitException(24, input);
+                                throw eee;
+                        }
+                        cnt24++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:120:4: ^( VK_FROM lhs_pattern from_elements )
+                    {
+                    match(input,VK_FROM,FOLLOW_VK_FROM_in_lhs622); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs624);
+                    lhs_pattern();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_from_elements_in_lhs626);
+                    from_elements();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:121:4: lhs_pattern
+                    {
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs632);
+                    lhs_pattern();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end lhs
+
+
+    // $ANTLR start from_elements
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:124:1: from_elements : ( ^( VK_ACCUMULATE lhs ( accumulate_init_clause | accumulate_id_clause ) ) | ^( VK_COLLECT lhs ) | ^( VK_ENTRY_POINT VT_ENTRYPOINT_ID ) | ^( VT_FROM_SOURCE ID ( VT_PAREN_CHUNK )? ( expression_chain )? ) );
+    public final void from_elements() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:125:2: ( ^( VK_ACCUMULATE lhs ( accumulate_init_clause | accumulate_id_clause ) ) | ^( VK_COLLECT lhs ) | ^( VK_ENTRY_POINT VT_ENTRYPOINT_ID ) | ^( VT_FROM_SOURCE ID ( VT_PAREN_CHUNK )? ( expression_chain )? ) )
+            int alt29=4;
+            switch ( input.LA(1) ) {
+            case VK_ACCUMULATE:
+                {
+                alt29=1;
+                }
+                break;
+            case VK_COLLECT:
+                {
+                alt29=2;
+                }
+                break;
+            case VK_ENTRY_POINT:
+                {
+                alt29=3;
+                }
+                break;
+            case VT_FROM_SOURCE:
+                {
+                alt29=4;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("124:1: from_elements : ( ^( VK_ACCUMULATE lhs ( accumulate_init_clause | accumulate_id_clause ) ) | ^( VK_COLLECT lhs ) | ^( VK_ENTRY_POINT VT_ENTRYPOINT_ID ) | ^( VT_FROM_SOURCE ID ( VT_PAREN_CHUNK )? ( expression_chain )? ) );", 29, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt29) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:125:4: ^( VK_ACCUMULATE lhs ( accumulate_init_clause | accumulate_id_clause ) )
+                    {
+                    match(input,VK_ACCUMULATE,FOLLOW_VK_ACCUMULATE_in_from_elements644); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_from_elements646);
+                    lhs();
+                    _fsp--;
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:125:24: ( accumulate_init_clause | accumulate_id_clause )
+                    int alt26=2;
+                    int LA26_0 = input.LA(1);
+
+                    if ( (LA26_0==VT_ACCUMULATE_INIT_CLAUSE) ) {
+                        alt26=1;
+                    }
+                    else if ( (LA26_0==VT_ACCUMULATE_ID_CLAUSE) ) {
+                        alt26=2;
+                    }
+                    else {
+                        NoViableAltException nvae =
+                            new NoViableAltException("125:24: ( accumulate_init_clause | accumulate_id_clause )", 26, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt26) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:125:25: accumulate_init_clause
+                            {
+                            pushFollow(FOLLOW_accumulate_init_clause_in_from_elements649);
+                            accumulate_init_clause();
+                            _fsp--;
+
+
+                            }
+                            break;
+                        case 2 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:125:48: accumulate_id_clause
+                            {
+                            pushFollow(FOLLOW_accumulate_id_clause_in_from_elements651);
+                            accumulate_id_clause();
+                            _fsp--;
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:126:4: ^( VK_COLLECT lhs )
+                    {
+                    match(input,VK_COLLECT,FOLLOW_VK_COLLECT_in_from_elements659); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_lhs_in_from_elements661);
+                    lhs();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:127:4: ^( VK_ENTRY_POINT VT_ENTRYPOINT_ID )
+                    {
+                    match(input,VK_ENTRY_POINT,FOLLOW_VK_ENTRY_POINT_in_from_elements668); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,VT_ENTRYPOINT_ID,FOLLOW_VT_ENTRYPOINT_ID_in_from_elements670); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:128:4: ^( VT_FROM_SOURCE ID ( VT_PAREN_CHUNK )? ( expression_chain )? )
+                    {
+                    match(input,VT_FROM_SOURCE,FOLLOW_VT_FROM_SOURCE_in_from_elements677); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,ID,FOLLOW_ID_in_from_elements679); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:128:24: ( VT_PAREN_CHUNK )?
+                    int alt27=2;
+                    int LA27_0 = input.LA(1);
+
+                    if ( (LA27_0==VT_PAREN_CHUNK) ) {
+                        alt27=1;
+                    }
+                    switch (alt27) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:128:24: VT_PAREN_CHUNK
+                            {
+                            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_from_elements681); 
+
+                            }
+                            break;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:128:40: ( expression_chain )?
+                    int alt28=2;
+                    int LA28_0 = input.LA(1);
+
+                    if ( (LA28_0==VT_EXPRESSION_CHAIN) ) {
+                        alt28=1;
+                    }
+                    switch (alt28) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:128:40: expression_chain
+                            {
+                            pushFollow(FOLLOW_expression_chain_in_from_elements684);
+                            expression_chain();
+                            _fsp--;
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end from_elements
+
+
+    // $ANTLR start accumulate_init_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:131:1: accumulate_init_clause : ^( VT_ACCUMULATE_INIT_CLAUSE ^( VK_INIT VT_PAREN_CHUNK ) ^( VK_ACTION VT_PAREN_CHUNK ) ( accumulate_init_reverse_clause )? ^( VK_RESULT VT_PAREN_CHUNK ) ) ;
+    public final void accumulate_init_clause() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:132:2: ( ^( VT_ACCUMULATE_INIT_CLAUSE ^( VK_INIT VT_PAREN_CHUNK ) ^( VK_ACTION VT_PAREN_CHUNK ) ( accumulate_init_reverse_clause )? ^( VK_RESULT VT_PAREN_CHUNK ) ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:132:4: ^( VT_ACCUMULATE_INIT_CLAUSE ^( VK_INIT VT_PAREN_CHUNK ) ^( VK_ACTION VT_PAREN_CHUNK ) ( accumulate_init_reverse_clause )? ^( VK_RESULT VT_PAREN_CHUNK ) )
+            {
+            match(input,VT_ACCUMULATE_INIT_CLAUSE,FOLLOW_VT_ACCUMULATE_INIT_CLAUSE_in_accumulate_init_clause698); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VK_INIT,FOLLOW_VK_INIT_in_accumulate_init_clause705); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause707); 
+
+            match(input, Token.UP, null); 
+            match(input,VK_ACTION,FOLLOW_VK_ACTION_in_accumulate_init_clause715); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause717); 
+
+            match(input, Token.UP, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:135:4: ( accumulate_init_reverse_clause )?
+            int alt30=2;
+            int LA30_0 = input.LA(1);
+
+            if ( (LA30_0==VK_REVERSE) ) {
+                alt30=1;
+            }
+            switch (alt30) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:135:4: accumulate_init_reverse_clause
+                    {
+                    pushFollow(FOLLOW_accumulate_init_reverse_clause_in_accumulate_init_clause724);
+                    accumulate_init_reverse_clause();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+            match(input,VK_RESULT,FOLLOW_VK_RESULT_in_accumulate_init_clause731); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause733); 
+
+            match(input, Token.UP, null); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end accumulate_init_clause
+
+
+    // $ANTLR start accumulate_init_reverse_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:139:1: accumulate_init_reverse_clause : ^( VK_REVERSE VT_PAREN_CHUNK ) ;
+    public final void accumulate_init_reverse_clause() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:140:2: ( ^( VK_REVERSE VT_PAREN_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:140:4: ^( VK_REVERSE VT_PAREN_CHUNK )
+            {
+            match(input,VK_REVERSE,FOLLOW_VK_REVERSE_in_accumulate_init_reverse_clause747); 
+
+            match(input, Token.DOWN, null); 
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_reverse_clause749); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end accumulate_init_reverse_clause
+
+
+    // $ANTLR start accumulate_id_clause
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:144:1: accumulate_id_clause : ^( VT_ACCUMULATE_ID_CLAUSE ID VT_PAREN_CHUNK ) ;
+    public final void accumulate_id_clause() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:145:2: ( ^( VT_ACCUMULATE_ID_CLAUSE ID VT_PAREN_CHUNK ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:145:4: ^( VT_ACCUMULATE_ID_CLAUSE ID VT_PAREN_CHUNK )
+            {
+            match(input,VT_ACCUMULATE_ID_CLAUSE,FOLLOW_VT_ACCUMULATE_ID_CLAUSE_in_accumulate_id_clause763); 
+
+            match(input, Token.DOWN, null); 
+            match(input,ID,FOLLOW_ID_in_accumulate_id_clause765); 
+            match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_accumulate_id_clause767); 
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end accumulate_id_clause
+
+
+    // $ANTLR start lhs_pattern
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:148:1: lhs_pattern : ^( VT_PATTERN fact_expression ) ;
+    public final void lhs_pattern() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:149:2: ( ^( VT_PATTERN fact_expression ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:149:4: ^( VT_PATTERN fact_expression )
+            {
+            match(input,VT_PATTERN,FOLLOW_VT_PATTERN_in_lhs_pattern780); 
+
+            match(input, Token.DOWN, null); 
+            pushFollow(FOLLOW_fact_expression_in_lhs_pattern782);
+            fact_expression();
+            _fsp--;
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end lhs_pattern
+
+
+    // $ANTLR start fact_expression
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:152:1: fact_expression : ( ^( DOUBLE_PIPE fact_expression fact_expression ) | ^( DOUBLE_AMPER fact_expression fact_expression ) | ^( VT_FACT_BINDING VT_LABEL fact_expression ) | ^( VT_FACT pattern_type ( fact_expression )* ) | ^( VT_FACT_OR fact_expression fact_expression ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_IN ( VK_NOT )? ( fact_expression )+ ) | ^( EQUAL fact_expression ) | ^( GREATER fact_expression ) | ^( GREATER_EQUAL fact_expression ) | ^( LESS fact_expression ) | ^( LESS_EQUAL fact_expression ) | ^( NOT_EQUAL fact_expression ) | ^( VK_CONTAINS ( VK_NOT )? fact_expression ) | ^( VK_EXCLUDES ( VK_NOT )? fact_expression ) | ^( VK_MATCHES ( VK_NOT )? fact_expression ) | ^( VK_SOUNDSLIKE ( VK_NOT )? fact_expression ) | ^( VK_MEMBEROF ( VK_NOT )? fact_expression ) | ^( ID ( VK_NOT )? ( VT_SQUARE_CHUNK )? fact_expression ) | ^( VT_BIND_FIELD VT_LABEL fact_express!
 ion ) | ^( VT_FIELD fact_expression ( fact_expression )? ) | ^( VT_ACCESSOR_PATH ( accessor_element )+ ) | STRING | INT | FLOAT | BOOL | NULL | VT_PAREN_CHUNK );
+    public final void fact_expression() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:153:2: ( ^( DOUBLE_PIPE fact_expression fact_expression ) | ^( DOUBLE_AMPER fact_expression fact_expression ) | ^( VT_FACT_BINDING VT_LABEL fact_expression ) | ^( VT_FACT pattern_type ( fact_expression )* ) | ^( VT_FACT_OR fact_expression fact_expression ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_IN ( VK_NOT )? ( fact_expression )+ ) | ^( EQUAL fact_expression ) | ^( GREATER fact_expression ) | ^( GREATER_EQUAL fact_expression ) | ^( LESS fact_expression ) | ^( LESS_EQUAL fact_expression ) | ^( NOT_EQUAL fact_expression ) | ^( VK_CONTAINS ( VK_NOT )? fact_expression ) | ^( VK_EXCLUDES ( VK_NOT )? fact_expression ) | ^( VK_MATCHES ( VK_NOT )? fact_expression ) | ^( VK_SOUNDSLIKE ( VK_NOT )? fact_expression ) | ^( VK_MEMBEROF ( VK_NOT )? fact_expression ) | ^( ID ( VK_NOT )? ( VT_SQUARE_CHUNK )? fact_expression ) | ^( VT_BIND_FIELD VT_LABEL fact_expression ) | ^(!
  VT_FIELD fact_expression ( fact_expression )? ) | ^( VT_ACCESSOR_PATH ( accessor_element )+ ) | STRING | INT | FLOAT | BOOL | NULL | VT_PAREN_CHUNK )
+            int alt43=28;
+            switch ( input.LA(1) ) {
+            case DOUBLE_PIPE:
+                {
+                alt43=1;
+                }
+                break;
+            case DOUBLE_AMPER:
+                {
+                alt43=2;
+                }
+                break;
+            case VT_FACT_BINDING:
+                {
+                alt43=3;
+                }
+                break;
+            case VT_FACT:
+                {
+                alt43=4;
+                }
+                break;
+            case VT_FACT_OR:
+                {
+                alt43=5;
+                }
+                break;
+            case VK_EVAL:
+                {
+                alt43=6;
+                }
+                break;
+            case VK_IN:
+                {
+                alt43=7;
+                }
+                break;
+            case EQUAL:
+                {
+                alt43=8;
+                }
+                break;
+            case GREATER:
+                {
+                alt43=9;
+                }
+                break;
+            case GREATER_EQUAL:
+                {
+                alt43=10;
+                }
+                break;
+            case LESS:
+                {
+                alt43=11;
+                }
+                break;
+            case LESS_EQUAL:
+                {
+                alt43=12;
+                }
+                break;
+            case NOT_EQUAL:
+                {
+                alt43=13;
+                }
+                break;
+            case VK_CONTAINS:
+                {
+                alt43=14;
+                }
+                break;
+            case VK_EXCLUDES:
+                {
+                alt43=15;
+                }
+                break;
+            case VK_MATCHES:
+                {
+                alt43=16;
+                }
+                break;
+            case VK_SOUNDSLIKE:
+                {
+                alt43=17;
+                }
+                break;
+            case VK_MEMBEROF:
+                {
+                alt43=18;
+                }
+                break;
+            case ID:
+                {
+                alt43=19;
+                }
+                break;
+            case VT_BIND_FIELD:
+                {
+                alt43=20;
+                }
+                break;
+            case VT_FIELD:
+                {
+                alt43=21;
+                }
+                break;
+            case VT_ACCESSOR_PATH:
+                {
+                alt43=22;
+                }
+                break;
+            case STRING:
+                {
+                alt43=23;
+                }
+                break;
+            case INT:
+                {
+                alt43=24;
+                }
+                break;
+            case FLOAT:
+                {
+                alt43=25;
+                }
+                break;
+            case BOOL:
+                {
+                alt43=26;
+                }
+                break;
+            case NULL:
+                {
+                alt43=27;
+                }
+                break;
+            case VT_PAREN_CHUNK:
+                {
+                alt43=28;
+                }
+                break;
+            default:
+                NoViableAltException nvae =
+                    new NoViableAltException("152:1: fact_expression : ( ^( DOUBLE_PIPE fact_expression fact_expression ) | ^( DOUBLE_AMPER fact_expression fact_expression ) | ^( VT_FACT_BINDING VT_LABEL fact_expression ) | ^( VT_FACT pattern_type ( fact_expression )* ) | ^( VT_FACT_OR fact_expression fact_expression ) | ^( VK_EVAL VT_PAREN_CHUNK ) | ^( VK_IN ( VK_NOT )? ( fact_expression )+ ) | ^( EQUAL fact_expression ) | ^( GREATER fact_expression ) | ^( GREATER_EQUAL fact_expression ) | ^( LESS fact_expression ) | ^( LESS_EQUAL fact_expression ) | ^( NOT_EQUAL fact_expression ) | ^( VK_CONTAINS ( VK_NOT )? fact_expression ) | ^( VK_EXCLUDES ( VK_NOT )? fact_expression ) | ^( VK_MATCHES ( VK_NOT )? fact_expression ) | ^( VK_SOUNDSLIKE ( VK_NOT )? fact_expression ) | ^( VK_MEMBEROF ( VK_NOT )? fact_expression ) | ^( ID ( VK_NOT )? ( VT_SQUARE_CHUNK )? fact_expression ) | ^( VT_BIND_FIELD VT_LABEL fact_expression ) | ^( VT_FIELD fact_expression ( fact_expression )? ) | ^( !
 VT_ACCESSOR_PATH ( accessor_element )+ ) | STRING | INT | FLOAT | BOOL | NULL | VT_PAREN_CHUNK );", 43, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt43) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:153:4: ^( DOUBLE_PIPE fact_expression fact_expression )
+                    {
+                    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_fact_expression795); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression797);
+                    fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression799);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:154:4: ^( DOUBLE_AMPER fact_expression fact_expression )
+                    {
+                    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_fact_expression806); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression808);
+                    fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression810);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 3 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:155:4: ^( VT_FACT_BINDING VT_LABEL fact_expression )
+                    {
+                    match(input,VT_FACT_BINDING,FOLLOW_VT_FACT_BINDING_in_fact_expression817); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,VT_LABEL,FOLLOW_VT_LABEL_in_fact_expression819); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression821);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 4 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:156:4: ^( VT_FACT pattern_type ( fact_expression )* )
+                    {
+                    match(input,VT_FACT,FOLLOW_VT_FACT_in_fact_expression828); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_pattern_type_in_fact_expression830);
+                    pattern_type();
+                    _fsp--;
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:156:27: ( fact_expression )*
+                    loop31:
+                    do {
+                        int alt31=2;
+                        int LA31_0 = input.LA(1);
+
+                        if ( (LA31_0==VT_FACT||LA31_0==VT_PAREN_CHUNK||(LA31_0>=VT_FACT_BINDING && LA31_0<=VT_ACCESSOR_PATH)||(LA31_0>=VK_EVAL && LA31_0<=VK_MEMBEROF)||LA31_0==VK_IN||LA31_0==ID||LA31_0==STRING||(LA31_0>=BOOL && LA31_0<=DOUBLE_AMPER)||(LA31_0>=EQUAL && LA31_0<=NOT_EQUAL)||(LA31_0>=FLOAT && LA31_0<=NULL)) ) {
+                            alt31=1;
+                        }
+
+
+                        switch (alt31) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:156:27: fact_expression
+                    	    {
+                    	    pushFollow(FOLLOW_fact_expression_in_fact_expression832);
+                    	    fact_expression();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop31;
+                        }
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 5 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:157:4: ^( VT_FACT_OR fact_expression fact_expression )
+                    {
+                    match(input,VT_FACT_OR,FOLLOW_VT_FACT_OR_in_fact_expression840); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression842);
+                    fact_expression();
+                    _fsp--;
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression844);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 6 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:158:4: ^( VK_EVAL VT_PAREN_CHUNK )
+                    {
+                    match(input,VK_EVAL,FOLLOW_VK_EVAL_in_fact_expression851); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_fact_expression853); 
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 7 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:159:4: ^( VK_IN ( VK_NOT )? ( fact_expression )+ )
+                    {
+                    match(input,VK_IN,FOLLOW_VK_IN_in_fact_expression860); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:159:12: ( VK_NOT )?
+                    int alt32=2;
+                    int LA32_0 = input.LA(1);
+
+                    if ( (LA32_0==VK_NOT) ) {
+                        alt32=1;
+                    }
+                    switch (alt32) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:159:12: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression862); 
+
+                            }
+                            break;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:159:20: ( fact_expression )+
+                    int cnt33=0;
+                    loop33:
+                    do {
+                        int alt33=2;
+                        int LA33_0 = input.LA(1);
+
+                        if ( (LA33_0==VT_FACT||LA33_0==VT_PAREN_CHUNK||(LA33_0>=VT_FACT_BINDING && LA33_0<=VT_ACCESSOR_PATH)||(LA33_0>=VK_EVAL && LA33_0<=VK_MEMBEROF)||LA33_0==VK_IN||LA33_0==ID||LA33_0==STRING||(LA33_0>=BOOL && LA33_0<=DOUBLE_AMPER)||(LA33_0>=EQUAL && LA33_0<=NOT_EQUAL)||(LA33_0>=FLOAT && LA33_0<=NULL)) ) {
+                            alt33=1;
+                        }
+
+
+                        switch (alt33) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:159:20: fact_expression
+                    	    {
+                    	    pushFollow(FOLLOW_fact_expression_in_fact_expression865);
+                    	    fact_expression();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt33 >= 1 ) break loop33;
+                                EarlyExitException eee =
+                                    new EarlyExitException(33, input);
+                                throw eee;
+                        }
+                        cnt33++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 8 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:160:4: ^( EQUAL fact_expression )
+                    {
+                    match(input,EQUAL,FOLLOW_EQUAL_in_fact_expression873); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression875);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 9 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:161:4: ^( GREATER fact_expression )
+                    {
+                    match(input,GREATER,FOLLOW_GREATER_in_fact_expression882); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression884);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 10 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:162:4: ^( GREATER_EQUAL fact_expression )
+                    {
+                    match(input,GREATER_EQUAL,FOLLOW_GREATER_EQUAL_in_fact_expression891); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression893);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 11 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:163:4: ^( LESS fact_expression )
+                    {
+                    match(input,LESS,FOLLOW_LESS_in_fact_expression900); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression902);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 12 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:164:4: ^( LESS_EQUAL fact_expression )
+                    {
+                    match(input,LESS_EQUAL,FOLLOW_LESS_EQUAL_in_fact_expression909); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression911);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 13 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:165:4: ^( NOT_EQUAL fact_expression )
+                    {
+                    match(input,NOT_EQUAL,FOLLOW_NOT_EQUAL_in_fact_expression918); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression920);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 14 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:166:4: ^( VK_CONTAINS ( VK_NOT )? fact_expression )
+                    {
+                    match(input,VK_CONTAINS,FOLLOW_VK_CONTAINS_in_fact_expression927); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:166:18: ( VK_NOT )?
+                    int alt34=2;
+                    int LA34_0 = input.LA(1);
+
+                    if ( (LA34_0==VK_NOT) ) {
+                        alt34=1;
+                    }
+                    switch (alt34) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:166:18: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression929); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression932);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 15 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:167:4: ^( VK_EXCLUDES ( VK_NOT )? fact_expression )
+                    {
+                    match(input,VK_EXCLUDES,FOLLOW_VK_EXCLUDES_in_fact_expression939); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:167:18: ( VK_NOT )?
+                    int alt35=2;
+                    int LA35_0 = input.LA(1);
+
+                    if ( (LA35_0==VK_NOT) ) {
+                        alt35=1;
+                    }
+                    switch (alt35) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:167:18: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression941); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression944);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 16 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:168:4: ^( VK_MATCHES ( VK_NOT )? fact_expression )
+                    {
+                    match(input,VK_MATCHES,FOLLOW_VK_MATCHES_in_fact_expression951); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:168:17: ( VK_NOT )?
+                    int alt36=2;
+                    int LA36_0 = input.LA(1);
+
+                    if ( (LA36_0==VK_NOT) ) {
+                        alt36=1;
+                    }
+                    switch (alt36) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:168:17: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression953); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression956);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 17 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:169:4: ^( VK_SOUNDSLIKE ( VK_NOT )? fact_expression )
+                    {
+                    match(input,VK_SOUNDSLIKE,FOLLOW_VK_SOUNDSLIKE_in_fact_expression963); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:169:20: ( VK_NOT )?
+                    int alt37=2;
+                    int LA37_0 = input.LA(1);
+
+                    if ( (LA37_0==VK_NOT) ) {
+                        alt37=1;
+                    }
+                    switch (alt37) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:169:20: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression965); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression968);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 18 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:170:4: ^( VK_MEMBEROF ( VK_NOT )? fact_expression )
+                    {
+                    match(input,VK_MEMBEROF,FOLLOW_VK_MEMBEROF_in_fact_expression975); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:170:18: ( VK_NOT )?
+                    int alt38=2;
+                    int LA38_0 = input.LA(1);
+
+                    if ( (LA38_0==VK_NOT) ) {
+                        alt38=1;
+                    }
+                    switch (alt38) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:170:18: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression977); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression980);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 19 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:171:4: ^( ID ( VK_NOT )? ( VT_SQUARE_CHUNK )? fact_expression )
+                    {
+                    match(input,ID,FOLLOW_ID_in_fact_expression987); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:171:9: ( VK_NOT )?
+                    int alt39=2;
+                    int LA39_0 = input.LA(1);
+
+                    if ( (LA39_0==VK_NOT) ) {
+                        alt39=1;
+                    }
+                    switch (alt39) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:171:9: VK_NOT
+                            {
+                            match(input,VK_NOT,FOLLOW_VK_NOT_in_fact_expression989); 
+
+                            }
+                            break;
+
+                    }
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:171:17: ( VT_SQUARE_CHUNK )?
+                    int alt40=2;
+                    int LA40_0 = input.LA(1);
+
+                    if ( (LA40_0==VT_SQUARE_CHUNK) ) {
+                        alt40=1;
+                    }
+                    switch (alt40) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:171:17: VT_SQUARE_CHUNK
+                            {
+                            match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_fact_expression992); 
+
+                            }
+                            break;
+
+                    }
+
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression995);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 20 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:172:4: ^( VT_BIND_FIELD VT_LABEL fact_expression )
+                    {
+                    match(input,VT_BIND_FIELD,FOLLOW_VT_BIND_FIELD_in_fact_expression1002); 
+
+                    match(input, Token.DOWN, null); 
+                    match(input,VT_LABEL,FOLLOW_VT_LABEL_in_fact_expression1004); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1006);
+                    fact_expression();
+                    _fsp--;
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 21 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:173:4: ^( VT_FIELD fact_expression ( fact_expression )? )
+                    {
+                    match(input,VT_FIELD,FOLLOW_VT_FIELD_in_fact_expression1013); 
+
+                    match(input, Token.DOWN, null); 
+                    pushFollow(FOLLOW_fact_expression_in_fact_expression1015);
+                    fact_expression();
+                    _fsp--;
+
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:173:31: ( fact_expression )?
+                    int alt41=2;
+                    int LA41_0 = input.LA(1);
+
+                    if ( (LA41_0==VT_FACT||LA41_0==VT_PAREN_CHUNK||(LA41_0>=VT_FACT_BINDING && LA41_0<=VT_ACCESSOR_PATH)||(LA41_0>=VK_EVAL && LA41_0<=VK_MEMBEROF)||LA41_0==VK_IN||LA41_0==ID||LA41_0==STRING||(LA41_0>=BOOL && LA41_0<=DOUBLE_AMPER)||(LA41_0>=EQUAL && LA41_0<=NOT_EQUAL)||(LA41_0>=FLOAT && LA41_0<=NULL)) ) {
+                        alt41=1;
+                    }
+                    switch (alt41) {
+                        case 1 :
+                            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:173:31: fact_expression
+                            {
+                            pushFollow(FOLLOW_fact_expression_in_fact_expression1017);
+                            fact_expression();
+                            _fsp--;
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 22 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:174:4: ^( VT_ACCESSOR_PATH ( accessor_element )+ )
+                    {
+                    match(input,VT_ACCESSOR_PATH,FOLLOW_VT_ACCESSOR_PATH_in_fact_expression1025); 
+
+                    match(input, Token.DOWN, null); 
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:174:23: ( accessor_element )+
+                    int cnt42=0;
+                    loop42:
+                    do {
+                        int alt42=2;
+                        int LA42_0 = input.LA(1);
+
+                        if ( (LA42_0==VT_ACCESSOR_ELEMENT) ) {
+                            alt42=1;
+                        }
+
+
+                        switch (alt42) {
+                    	case 1 :
+                    	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:174:23: accessor_element
+                    	    {
+                    	    pushFollow(FOLLOW_accessor_element_in_fact_expression1027);
+                    	    accessor_element();
+                    	    _fsp--;
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt42 >= 1 ) break loop42;
+                                EarlyExitException eee =
+                                    new EarlyExitException(42, input);
+                                throw eee;
+                        }
+                        cnt42++;
+                    } while (true);
+
+
+                    match(input, Token.UP, null); 
+
+                    }
+                    break;
+                case 23 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:175:4: STRING
+                    {
+                    match(input,STRING,FOLLOW_STRING_in_fact_expression1034); 
+
+                    }
+                    break;
+                case 24 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:176:4: INT
+                    {
+                    match(input,INT,FOLLOW_INT_in_fact_expression1039); 
+
+                    }
+                    break;
+                case 25 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:177:4: FLOAT
+                    {
+                    match(input,FLOAT,FOLLOW_FLOAT_in_fact_expression1044); 
+
+                    }
+                    break;
+                case 26 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:178:4: BOOL
+                    {
+                    match(input,BOOL,FOLLOW_BOOL_in_fact_expression1049); 
+
+                    }
+                    break;
+                case 27 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:179:4: NULL
+                    {
+                    match(input,NULL,FOLLOW_NULL_in_fact_expression1054); 
+
+                    }
+                    break;
+                case 28 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:180:4: VT_PAREN_CHUNK
+                    {
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_fact_expression1059); 
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end fact_expression
+
+
+    // $ANTLR start pattern_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:183:1: pattern_type : ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* ) ;
+    public final void pattern_type() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:2: ( ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:4: ^( VT_PATTERN_TYPE ( ID )+ ( dimension_definition )* )
+            {
+            match(input,VT_PATTERN_TYPE,FOLLOW_VT_PATTERN_TYPE_in_pattern_type1071); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:22: ( ID )+
+            int cnt44=0;
+            loop44:
+            do {
+                int alt44=2;
+                int LA44_0 = input.LA(1);
+
+                if ( (LA44_0==ID) ) {
+                    alt44=1;
+                }
+
+
+                switch (alt44) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:22: ID
+            	    {
+            	    match(input,ID,FOLLOW_ID_in_pattern_type1073); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt44 >= 1 ) break loop44;
+                        EarlyExitException eee =
+                            new EarlyExitException(44, input);
+                        throw eee;
+                }
+                cnt44++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:26: ( dimension_definition )*
+            loop45:
+            do {
+                int alt45=2;
+                int LA45_0 = input.LA(1);
+
+                if ( (LA45_0==LEFT_SQUARE) ) {
+                    alt45=1;
+                }
+
+
+                switch (alt45) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:184:26: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_pattern_type1076);
+            	    dimension_definition();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop45;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end pattern_type
+
+
+    // $ANTLR start data_type
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:187:1: data_type : ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* ) ;
+    public final void data_type() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:2: ( ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:4: ^( VT_DATA_TYPE ( ID )+ ( dimension_definition )* )
+            {
+            match(input,VT_DATA_TYPE,FOLLOW_VT_DATA_TYPE_in_data_type1090); 
+
+            match(input, Token.DOWN, null); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:19: ( ID )+
+            int cnt46=0;
+            loop46:
+            do {
+                int alt46=2;
+                int LA46_0 = input.LA(1);
+
+                if ( (LA46_0==ID) ) {
+                    alt46=1;
+                }
+
+
+                switch (alt46) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:19: ID
+            	    {
+            	    match(input,ID,FOLLOW_ID_in_data_type1092); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt46 >= 1 ) break loop46;
+                        EarlyExitException eee =
+                            new EarlyExitException(46, input);
+                        throw eee;
+                }
+                cnt46++;
+            } while (true);
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:23: ( dimension_definition )*
+            loop47:
+            do {
+                int alt47=2;
+                int LA47_0 = input.LA(1);
+
+                if ( (LA47_0==LEFT_SQUARE) ) {
+                    alt47=1;
+                }
+
+
+                switch (alt47) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:188:23: dimension_definition
+            	    {
+            	    pushFollow(FOLLOW_dimension_definition_in_data_type1095);
+            	    dimension_definition();
+            	    _fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop47;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end data_type
+
+
+    // $ANTLR start dimension_definition
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:191:1: dimension_definition : LEFT_SQUARE RIGHT_SQUARE ;
+    public final void dimension_definition() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:192:2: ( LEFT_SQUARE RIGHT_SQUARE )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:192:4: LEFT_SQUARE RIGHT_SQUARE
+            {
+            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_dimension_definition1108); 
+            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_dimension_definition1110); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end dimension_definition
+
+
+    // $ANTLR start accessor_element
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:195:1: accessor_element : ^( VT_ACCESSOR_ELEMENT ID ( VT_SQUARE_CHUNK )* ) ;
+    public final void accessor_element() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:196:2: ( ^( VT_ACCESSOR_ELEMENT ID ( VT_SQUARE_CHUNK )* ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:196:4: ^( VT_ACCESSOR_ELEMENT ID ( VT_SQUARE_CHUNK )* )
+            {
+            match(input,VT_ACCESSOR_ELEMENT,FOLLOW_VT_ACCESSOR_ELEMENT_in_accessor_element1122); 
+
+            match(input, Token.DOWN, null); 
+            match(input,ID,FOLLOW_ID_in_accessor_element1124); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:196:29: ( VT_SQUARE_CHUNK )*
+            loop48:
+            do {
+                int alt48=2;
+                int LA48_0 = input.LA(1);
+
+                if ( (LA48_0==VT_SQUARE_CHUNK) ) {
+                    alt48=1;
+                }
+
+
+                switch (alt48) {
+            	case 1 :
+            	    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:196:29: VT_SQUARE_CHUNK
+            	    {
+            	    match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_accessor_element1126); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop48;
+                }
+            } while (true);
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end accessor_element
+
+
+    // $ANTLR start expression_chain
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:199:1: expression_chain : ^( VT_EXPRESSION_CHAIN ID ( VT_SQUARE_CHUNK )? ( VT_PAREN_CHUNK )? ( expression_chain )? ) ;
+    public final void expression_chain() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:2: ( ^( VT_EXPRESSION_CHAIN ID ( VT_SQUARE_CHUNK )? ( VT_PAREN_CHUNK )? ( expression_chain )? ) )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:4: ^( VT_EXPRESSION_CHAIN ID ( VT_SQUARE_CHUNK )? ( VT_PAREN_CHUNK )? ( expression_chain )? )
+            {
+            match(input,VT_EXPRESSION_CHAIN,FOLLOW_VT_EXPRESSION_CHAIN_in_expression_chain1140); 
+
+            match(input, Token.DOWN, null); 
+            match(input,ID,FOLLOW_ID_in_expression_chain1142); 
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:29: ( VT_SQUARE_CHUNK )?
+            int alt49=2;
+            int LA49_0 = input.LA(1);
+
+            if ( (LA49_0==VT_SQUARE_CHUNK) ) {
+                alt49=1;
+            }
+            switch (alt49) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:29: VT_SQUARE_CHUNK
+                    {
+                    match(input,VT_SQUARE_CHUNK,FOLLOW_VT_SQUARE_CHUNK_in_expression_chain1144); 
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:46: ( VT_PAREN_CHUNK )?
+            int alt50=2;
+            int LA50_0 = input.LA(1);
+
+            if ( (LA50_0==VT_PAREN_CHUNK) ) {
+                alt50=1;
+            }
+            switch (alt50) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:46: VT_PAREN_CHUNK
+                    {
+                    match(input,VT_PAREN_CHUNK,FOLLOW_VT_PAREN_CHUNK_in_expression_chain1147); 
+
+                    }
+                    break;
+
+            }
+
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:62: ( expression_chain )?
+            int alt51=2;
+            int LA51_0 = input.LA(1);
+
+            if ( (LA51_0==VT_EXPRESSION_CHAIN) ) {
+                alt51=1;
+            }
+            switch (alt51) {
+                case 1 :
+                    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:200:62: expression_chain
+                    {
+                    pushFollow(FOLLOW_expression_chain_in_expression_chain1150);
+                    expression_chain();
+                    _fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+
+            match(input, Token.UP, null); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end expression_chain
+
+
+    // $ANTLR start curly_chunk
+    // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:203:1: curly_chunk : VT_CURLY_CHUNK ;
+    public final void curly_chunk() throws RecognitionException {
+        try {
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:204:2: ( VT_CURLY_CHUNK )
+            // /Users/porcelli/Documents/dev/drools/drools-compiler/src/main/resources/org/drools/lang/Tree2TestDRL.g:204:4: VT_CURLY_CHUNK
+            {
+            match(input,VT_CURLY_CHUNK,FOLLOW_VT_CURLY_CHUNK_in_curly_chunk1164); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end curly_chunk
+
+
+ 
+
+    public static final BitSet FOLLOW_VT_COMPILATION_UNIT_in_compilation_unit43 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_package_statement_in_compilation_unit45 = new BitSet(new long[]{0xB67FF80000000028L,0x0000000000000001L});
+    public static final BitSet FOLLOW_statement_in_compilation_unit48 = new BitSet(new long[]{0xB67FF80000000028L,0x0000000000000001L});
+    public static final BitSet FOLLOW_VK_PACKAGE_in_package_statement63 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_package_id_in_package_statement65 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PACKAGE_ID_in_package_id78 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_package_id80 = new BitSet(new long[]{0x0000000000000008L,0x0000000000400000L});
+    public static final BitSet FOLLOW_rule_attribute_in_statement93 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_import_statement_in_statement98 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_statement_in_statement104 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_global_in_statement110 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_in_statement116 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_template_in_statement121 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule_in_statement126 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_in_statement131 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VK_IMPORT_in_import_statement143 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_import_name_in_import_statement145 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FUNCTION_IMPORT_in_function_import_statement158 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_FUNCTION_in_function_import_statement160 = new BitSet(new long[]{0x0000008000000000L});
+    public static final BitSet FOLLOW_import_name_in_function_import_statement162 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_IMPORT_ID_in_import_name175 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_import_name177 = new BitSet(new long[]{0x0000000000000008L,0x0000000001400000L});
+    public static final BitSet FOLLOW_DOT_STAR_in_import_name180 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_GLOBAL_in_global194 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_global196 = new BitSet(new long[]{0x0000010000000000L});
+    public static final BitSet FOLLOW_VT_GLOBAL_ID_in_global198 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_FUNCTION_in_function211 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_function213 = new BitSet(new long[]{0x0000020000000000L});
+    public static final BitSet FOLLOW_VT_FUNCTION_ID_in_function216 = new BitSet(new long[]{0x0000040000000000L});
+    public static final BitSet FOLLOW_parameters_in_function218 = new BitSet(new long[]{0x0000000000020000L});
+    public static final BitSet FOLLOW_curly_chunk_in_function220 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_QUERY_in_query233 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_QUERY_ID_in_query235 = new BitSet(new long[]{0x0000040000100000L});
+    public static final BitSet FOLLOW_parameters_in_query237 = new BitSet(new long[]{0x0000000000100000L});
+    public static final BitSet FOLLOW_lhs_block_in_query240 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_END_in_query242 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PARAM_LIST_in_parameters255 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_param_definition_in_parameters257 = new BitSet(new long[]{0x0000001000000008L,0x0000000000400000L});
+    public static final BitSet FOLLOW_data_type_in_param_definition270 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_argument_in_param_definition273 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_argument284 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_dimension_definition_in_argument286 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_VK_TEMPLATE_in_template300 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_TEMPLATE_ID_in_template302 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_template_slot_in_template304 = new BitSet(new long[]{0x0000000000004000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_END_in_template307 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_SLOT_in_template_slot320 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_data_type_in_template_slot322 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_VT_SLOT_ID_in_template_slot324 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_RULE_in_rule337 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_RULE_ID_in_rule339 = new BitSet(new long[]{0x0100000000018000L});
+    public static final BitSet FOLLOW_rule_attributes_in_rule341 = new BitSet(new long[]{0x0100000000010000L});
+    public static final BitSet FOLLOW_when_part_in_rule344 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_VT_RHS_CHUNK_in_rule347 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_WHEN_in_when_part359 = new BitSet(new long[]{0x0000000000100000L});
+    public static final BitSet FOLLOW_lhs_block_in_when_part361 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_RULE_ATTRIBUTES_in_rule_attributes373 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_ATTRIBUTES_in_rule_attributes375 = new BitSet(new long[]{0x007FF80000000000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes378 = new BitSet(new long[]{0x007FF80000000008L});
+    public static final BitSet FOLLOW_VK_SALIENCE_in_rule_attribute392 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_set_in_rule_attribute394 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_NO_LOOP_in_rule_attribute406 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute408 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_AGENDA_GROUP_in_rule_attribute418 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute420 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DURATION_in_rule_attribute429 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_INT_in_rule_attribute431 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ACTIVATION_GROUP_in_rule_attribute441 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute443 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_AUTO_FOCUS_in_rule_attribute451 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute453 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DATE_EFFECTIVE_in_rule_attribute462 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute464 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DATE_EXPIRES_in_rule_attribute472 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute474 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ENABLED_in_rule_attribute482 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute484 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_RULEFLOW_GROUP_in_rule_attribute492 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute494 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_LOCK_ON_ACTIVE_in_rule_attribute502 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_BOOL_in_rule_attribute504 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_DIALECT_in_rule_attribute512 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_STRING_in_rule_attribute514 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_AND_IMPLICIT_in_lhs_block528 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs_block530 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_OR_PREFIX_in_lhs543 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs545 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_OR_INFIX_in_lhs553 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs555 = new BitSet(new long[]{0x0000000021E00000L,0x0000000000007102L});
+    public static final BitSet FOLLOW_lhs_in_lhs557 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_AND_PREFIX_in_lhs564 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs566 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VT_AND_INFIX_in_lhs574 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs576 = new BitSet(new long[]{0x0000000021E00000L,0x0000000000007102L});
+    public static final BitSet FOLLOW_lhs_in_lhs578 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EXISTS_in_lhs585 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs587 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_NOT_in_lhs594 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs596 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EVAL_in_lhs603 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_lhs605 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_FORALL_in_lhs612 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_lhs614 = new BitSet(new long[]{0x0000000021E00008L,0x0000000000007102L});
+    public static final BitSet FOLLOW_VK_FROM_in_lhs622 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs624 = new BitSet(new long[]{0x0000000008000000L,0x0000000000108080L});
+    public static final BitSet FOLLOW_from_elements_in_lhs626 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs632 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VK_ACCUMULATE_in_from_elements644 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_from_elements646 = new BitSet(new long[]{0x0000000006000000L});
+    public static final BitSet FOLLOW_accumulate_init_clause_in_from_elements649 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_accumulate_id_clause_in_from_elements651 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_COLLECT_in_from_elements659 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_lhs_in_from_elements661 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ENTRY_POINT_in_from_elements668 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_ENTRYPOINT_ID_in_from_elements670 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FROM_SOURCE_in_from_elements677 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_from_elements679 = new BitSet(new long[]{0x0000000010080008L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_from_elements681 = new BitSet(new long[]{0x0000000010000008L});
+    public static final BitSet FOLLOW_expression_chain_in_from_elements684 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_ACCUMULATE_INIT_CLAUSE_in_accumulate_init_clause698 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_INIT_in_accumulate_init_clause705 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause707 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_ACTION_in_accumulate_init_clause715 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause717 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_accumulate_init_reverse_clause_in_accumulate_init_clause724 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080000L});
+    public static final BitSet FOLLOW_VK_RESULT_in_accumulate_init_clause731 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_clause733 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_REVERSE_in_accumulate_init_reverse_clause747 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_init_reverse_clause749 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_ACCUMULATE_ID_CLAUSE_in_accumulate_id_clause763 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_accumulate_id_clause765 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_accumulate_id_clause767 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_PATTERN_in_lhs_pattern780 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_lhs_pattern782 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_fact_expression795 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression797 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression799 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_fact_expression806 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression808 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression810 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FACT_BINDING_in_fact_expression817 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_LABEL_in_fact_expression819 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression821 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FACT_in_fact_expression828 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_pattern_type_in_fact_expression830 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression832 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_VT_FACT_OR_in_fact_expression840 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression842 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression844 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EVAL_in_fact_expression851 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_fact_expression853 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_IN_in_fact_expression860 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression862 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression865 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_EQUAL_in_fact_expression873 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression875 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_GREATER_in_fact_expression882 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression884 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_GREATER_EQUAL_in_fact_expression891 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression893 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_LESS_in_fact_expression900 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression902 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_LESS_EQUAL_in_fact_expression909 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression911 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_NOT_EQUAL_in_fact_expression918 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression920 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_CONTAINS_in_fact_expression927 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression929 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression932 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_EXCLUDES_in_fact_expression939 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression941 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression944 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_MATCHES_in_fact_expression951 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression953 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression956 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_SOUNDSLIKE_in_fact_expression963 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression965 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression968 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VK_MEMBEROF_in_fact_expression975 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression977 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression980 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_ID_in_fact_expression987 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VK_NOT_in_fact_expression989 = new BitSet(new long[]{0x00000007C00C0040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_fact_expression992 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression995 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_BIND_FIELD_in_fact_expression1002 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_VT_LABEL_in_fact_expression1004 = new BitSet(new long[]{0x00000007C0080040L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1006 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_FIELD_in_fact_expression1013 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1015 = new BitSet(new long[]{0x00000007C0080048L,0x00001BF78440027EL});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression1017 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_ACCESSOR_PATH_in_fact_expression1025 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_accessor_element_in_fact_expression1027 = new BitSet(new long[]{0x0000000800000008L});
+    public static final BitSet FOLLOW_STRING_in_fact_expression1034 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_INT_in_fact_expression1039 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FLOAT_in_fact_expression1044 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_BOOL_in_fact_expression1049 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NULL_in_fact_expression1054 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_fact_expression1059 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_PATTERN_TYPE_in_pattern_type1071 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_pattern_type1073 = new BitSet(new long[]{0x0000000000000008L,0x0000200000400000L});
+    public static final BitSet FOLLOW_dimension_definition_in_pattern_type1076 = new BitSet(new long[]{0x0000000000000008L,0x0000200000000000L});
+    public static final BitSet FOLLOW_VT_DATA_TYPE_in_data_type1090 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_data_type1092 = new BitSet(new long[]{0x0000000000000008L,0x0000200000400000L});
+    public static final BitSet FOLLOW_dimension_definition_in_data_type1095 = new BitSet(new long[]{0x0000000000000008L,0x0000200000000000L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_dimension_definition1108 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_dimension_definition1110 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_VT_ACCESSOR_ELEMENT_in_accessor_element1122 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_accessor_element1124 = new BitSet(new long[]{0x0000000000040008L});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_accessor_element1126 = new BitSet(new long[]{0x0000000000040008L});
+    public static final BitSet FOLLOW_VT_EXPRESSION_CHAIN_in_expression_chain1140 = new BitSet(new long[]{0x0000000000000004L});
+    public static final BitSet FOLLOW_ID_in_expression_chain1142 = new BitSet(new long[]{0x00000000100C0008L});
+    public static final BitSet FOLLOW_VT_SQUARE_CHUNK_in_expression_chain1144 = new BitSet(new long[]{0x0000000010080008L});
+    public static final BitSet FOLLOW_VT_PAREN_CHUNK_in_expression_chain1147 = new BitSet(new long[]{0x0000000010000008L});
+    public static final BitSet FOLLOW_expression_chain_in_expression_chain1150 = new BitSet(new long[]{0x0000000000000008L});
+    public static final BitSet FOLLOW_VT_CURLY_CHUNK_in_curly_chunk1164 = new BitSet(new long[]{0x0000000000000002L});
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTest.testsuite (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/gUnitTest.testsuite)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTest.testsuite	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTest.testsuite	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,1883 @@
+gunit DRL;
+
+ at header{
+package org.drools.lang;
+}
+
+package_statement:
+
+/**
+ * test Package One Segment
+ */
+	"package foo" 
+		-> (package (VT_PACKAGE_ID foo))
+
+/**
+ * test Package Multiple Segments
+ */
+	"package foo.bar.baz;"
+		-> (package (VT_PACKAGE_ID foo bar baz))
+
+compilation_unit:
+/**
+ * test Empty Compilation Unit
+ */
+	""
+		-> "VT_COMPILATION_UNIT"
+/**
+ * test Compilation Unit
+ */
+	"package foo; import com.foo.Bar; import com.foo.Baz;"
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (import (VT_IMPORT_ID com foo Bar)) (import (VT_IMPORT_ID com foo Baz)))
+/**
+ * test Empty Rule
+ */
+	<<rule empty 
+
+then
+  
+end>>
+		-> (VT_COMPILATION_UNIT (rule empty then
+  
+end))
+/**
+ * test Damaged syntax
+ */
+	<<#the purpose of this is to see what happens when we have some partially damaged syntax
+#as the IDE uses the parsers AST to work out completion suggestions.
+package test
+
+
+rule simple_rule 
+  when
+    foo3 : Bar(
+
+>>
+		FAIL
+/**
+ * test Templates
+ */
+	<<package test.templates
+
+template Cheese
+	String 	name
+	Integer age
+end
+
+template "Wine"
+	String 		name
+	String 		year
+	String[] 	accolades
+end
+
+
+rule "a rule"
+  when
+	Cheese(name == "Stilton", age==2001)
+	Wine(name == "Grange", age == "1978", accolades contains "world champion")
+  then
+  	baz();
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID test templates)) (template Cheese (VT_SLOT (VT_DATA_TYPE String) name) (VT_SLOT (VT_DATA_TYPE Integer) age) end) (template "Wine" (VT_SLOT (VT_DATA_TYPE String) name) (VT_SLOT (VT_DATA_TYPE String) year) (VT_SLOT (VT_DATA_TYPE String [ ]) accolades) end) (rule "a rule" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Stilton")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 2001)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Grange")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== "1978")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT accolades)) (contains "world champion"))))) then
+  	baz();
+end))
+/**
+ * test Ternary Expression
+ */
+	<<package foo
+
+rule rule_one 
+  when
+  	Foo()
+  then
+  	 if (speed > speedLimit ? true : false;)
+     pullEmOver();
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (rule rule_one when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then
+  	 if (speed > speedLimit ? true : false;)
+     pullEmOver();
+end))
+/**
+ * test Function With Arrays
+ */
+	<<package foo
+
+function String[] yourFunction(String args[]) {
+     baz();
+}
+
+rule "new rule"
+
+	when
+		Something()
+	then
+		yourFunction(new String[3] {"a","b","c"});
+		
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (function (VT_DATA_TYPE String [ ]) yourFunction (VT_PARAM_LIST (VT_DATA_TYPE String) args [ ]) {
+     baz();
+}) (rule "new rule" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Something)))) then
+		yourFunction(new String[3] {"a","b","c"});
+		
+end))
+/**
+ * test Almost Empty Rule
+ */
+	<<
+rule almost_empty 
+  when
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (rule almost_empty when VT_AND_IMPLICIT then
+end))
+/**
+ * test Quoted String Name Rule
+ */
+	<<rule "quoted string name"
+  when
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "quoted string name" when VT_AND_IMPLICIT then
+end))
+/**
+ * test No Loop
+ */
+	<<
+rule rule1 
+  no-loop false
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (no-loop false)) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+	funky();
+end))
+/**
+ * test Auto focus
+ */
+	<<
+rule rule1 
+  auto-focus true
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (auto-focus true)) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+	funky();
+end))
+/**
+ * test Rule Flow Group
+ */
+	<<
+rule rule1 
+  ruleflow-group "a group"
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (rule rule1 (VT_RULE_ATTRIBUTES (ruleflow-group "a group")) when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+	funky();
+end))
+/**
+ * test Consequence With Declaration
+ */
+	<<
+
+rule myrule 
+  when
+  then
+  	int i = 0;
+	i = 1;
+	i / 1;
+	i == 1;
+	i(i);
+	i = 'i';
+	i.i.i;
+	i\i;
+	i<i;
+	i>i;
+	i="i";	
+	++i;
+	i++;
+	--i;
+	i--;
+	i += i;
+	i -= i;
+	i *= i;
+	i /= i;
+	int i = 5;
+	for(int j; j<i; ++j) {
+	  System.out.println(j);
+	}	
+	Object o = new String("Hello");
+	String s = (String) o;	
+	
+end>>
+		-> (VT_COMPILATION_UNIT (rule myrule when VT_AND_IMPLICIT then
+  	int i = 0;
+	i = 1;
+	i / 1;
+	i == 1;
+	i(i);
+	i = 'i';
+	i.i.i;
+	i\i;
+	i<i;
+	i>i;
+	i="i";	
+	++i;
+	i++;
+	--i;
+	i--;
+	i += i;
+	i -= i;
+	i *= i;
+	i /= i;
+	int i = 5;
+	for(int j; j<i; ++j) {
+	  System.out.println(j);
+	}	
+	Object o = new String("Hello");
+	String s = (String) o;	
+	
+end))
+/**
+ * test Literal Bool And Negative Numbers Rule
+ */
+	<<#check that it can handle true/false literals, and 
+#negative numbers
+rule simple_rule 
+  when
+	Foo(bar == false)
+	Foo(boo > -42)
+	Foo(boo > -42.42)
+  then
+	cons();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== false)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42.42))))) then
+	cons();
+end))
+
+	<<package org.drools.test;
+ 
+import org.drools.Cheese;
+ 
+rule "simple rule"
+    when
+        Cheese( )
+    then
+end >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (rule "simple rule" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese)))) then
+end))
+/**
+ * test Simple Method Call With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+	Col2()
+ then
+	partay();
+end	>>
+		-> (VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then
+	partay();
+end))
+/**
+ * test Simple Function Call With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+	Col2()
+ then
+	partay();
+end	>>
+		-> (VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt ( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] ))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then
+	partay();
+end))
+/**
+ * test Simple Accessor With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt
+	Col2()
+ then
+	partay();
+end	>>
+		-> (VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then
+	partay();
+end))
+/**
+ * test Simple Accessor And Arg With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt["key"]
+	Col2()
+ then
+	partay();
+end	>>
+		-> (VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ["key"]))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then
+	partay();
+end))
+/**
+ * test Complex Chained Acessor
+ */
+	<<rule blah
+ when 
+	Col1() from doIt1( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] )
+	            .doIt2(bar, [a, "b", 42]).field["key"]
+	Col2()
+ then
+	partay();
+end	>>
+		-> (VT_COMPILATION_UNIT (rule blah when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt1 ( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] ) (. doIt2 (bar, [a, "b", 42]) (. field ["key"])))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2)))) then
+	partay();
+end))
+/**
+ * test Simple Rule
+ */
+	<<
+rule simple_rule 
+  when
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+  then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end))
+/**
+ * test Restrictions Multiple
+ */
+	<<#this is for showing off all the new multi restriction stuff
+
+
+
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type == "sedan" || == "wagon", age < 3)
+  then
+	consequence();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (|| (== "sedan") (== "wagon"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then
+	consequence();
+end))
+/**
+ * test Line Number Including Comments In RHS
+ */
+	<<package la
+
+
+rule simple_rule 
+  when
+  	Baz()
+  then
+  	//woot
+  	first
+  	
+  	#
+  	
+  	/* lala
+  	
+  	*/
+  	second  
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID la)) (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then
+  	//woot
+  	first
+  	
+  	//
+  	
+  	/* lala
+  	
+  	*/
+  	second  
+end))
+/**
+ * test Lhs Semicolon Delim
+ */
+	<<
+rule simple_rule 
+  when
+    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()
+  then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end))
+/**
+ * test Not Node
+ */
+	<<
+rule simple_rule 
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+	funky();
+end))
+/**
+ * test Function Import
+ */
+	<<package HR1
+
+import function abd.def.x
+import function qed.wah.*
+
+rule simple_rule 
+  when  		  	
+  	not ( Cheese(type == "stilton") )
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID HR1)) (import function (VT_IMPORT_ID abd def x)) (import function (VT_IMPORT_ID qed wah .*)) (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))) then
+	funky();
+end))
+/**
+ * test Not Exist With Brackets
+ */
+	<<package HR1
+
+rule simple_rule 
+  when  		  	
+  	not ( Cheese(type == "stilton") )
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID HR1)) (rule simple_rule when (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))) then
+	funky();
+end))
+/**
+ * test Damaged syntax
+ */
+	<<package HR2
+
+rule simple_rule 
+  when  		  	
+  	a : (not ( Cheese(type == "stilton") ))
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		FAIL
+/**
+ * test Simple Query
+ */
+	<<
+
+query "simple_query" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end>>
+		-> (VT_COMPILATION_UNIT (query "simple_query" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) end))
+/**
+ * test Query Rule Mixed
+ */
+	<<
+package foo
+
+rule bar
+	when
+		Baz()
+	then
+		Boo()
+end
+
+query "simple_query" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end
+
+rule bar2
+	when
+		Baz()
+	then
+		Boo()
+end
+
+query "simple_query2" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end
+	>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo)) (rule bar when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then
+		Boo()
+end) (query "simple_query" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) end) (rule bar2 when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) then
+		Boo()
+end) (query "simple_query2" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz)))) end))
+
+/**
+ * test Multiple Rules
+ */
+	<<package org.drools.test;
+
+import org.drools.integrationtests.Cheese;
+
+rule "Like Stilton"
+    when
+        Cheese( t:type == "stilton" )
+    then
+        System.out.println("I like " + t);
+end    
+
+rule "Like Cheddar"
+    when
+        Cheese( t:type == "cheddar" )
+    then
+        System.out.println("I like " + t );
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools integrationtests Cheese)) (rule "Like Stilton" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+        System.out.println("I like " + t);
+end) (rule "Like Cheddar" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "cheddar")))))) then
+        System.out.println("I like " + t );
+end))
+/**
+ * test Basic Binding
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+rule "like cheddar"
+    when
+        Cheese( $type:type )
+    then
+        System.out.println("I like " + $type);
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (rule "like cheddar" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type))))))) then
+        System.out.println("I like " + $type);
+end))
+/**
+ * test Bound Variables
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+import org.drools.Person;
+
+rule "Who likes Stilton"
+    when
+        Cheese($type : type == "stilton")
+        $person : Person($name : name == "bob", likes == $type)        
+    then
+        System.out.println( $name + " likes " + $type);
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (import (VT_IMPORT_ID org drools Person)) (rule "Who likes Stilton" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $name (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "bob"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $type)))))))) then
+        System.out.println( $name + " likes " + $type);
+end))
+/**
+ * test Or Nesting
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+	Person(name == "mark") or 
+	( Person(type == "fan") and Cheese(type == "green") )
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		-> (VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "green"))))))) then
+	System.out.println( "Mark and Michael" + bar );
+end))
+/**
+ * test And Or Rules
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+    Person(name == "mark") && Cheese(type == "stilton")
+    Person(name == "mark") || Cheese(type == "stilton")
+  then
+	System.out.println( "Mark and Michael" );
+end>>
+		-> (VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (&& (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (|| (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+	System.out.println( "Mark and Michael" );
+end))
+/**
+ * test Or With Binding
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+	foo :  ( Person(name == "mark") or Person(type == "fan") ) 
+	Cheese(type == "green")
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		-> (VT_COMPILATION_UNIT (import (VT_IMPORT_ID org drools Person)) (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "green"))))) then
+	System.out.println( "Mark and Michael" + bar );
+end))
+/**
+ * test Or Binding Complex
+ */
+	<<
+
+rule simple_rule 
+  when
+	foo : ( Person(name == "mark") 
+		or 
+		Person(type == "fan") )
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan"))))))) then
+	System.out.println( "Mark and Michael" + bar );
+end))
+/**
+ * test Or Binding With Brackets
+ */
+	<<rule simple_rule 
+  when
+	foo : ( 
+		Person(name == "mark") or Person(type == "fan") 
+		)
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan"))))))) then
+	System.out.println( "Mark and Michael" + bar );
+end))
+/**
+ * test Brackets Precedence
+ */
+	<<
+rule simple_rule 
+  when
+	 ( (not Foo(x=="a") or Foo(x=="y") ) and ( Shoes() or Butt() ) )
+  then
+	go wild
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (and (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== "a"))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== "y"))))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Shoes))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Butt)))))) then
+	go wild
+end))
+/**
+ * test Eval Multiple
+ */
+	<<
+rule simple_rule 
+  when
+	eval(abc("foo") + 5)
+	Foo()
+	eval(qed())
+	Bar()
+  then
+	Kapow
+	Poof
+	
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (eval (abc("foo") + 5)) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (eval (qed())) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar)))) then
+	Kapow
+	Poof
+	
+end))
+/**
+ * test With Eval
+ */
+	<<
+rule simple_rule 
+  when
+	Foo()
+	Bar()
+	eval(abc("foo"))
+  then
+	Kapow
+	
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (abc("foo")))) then
+	Kapow
+	
+end))
+/**
+ * test With Retval
+ */
+	<<
+rule simple_rule 
+  when
+	Foo(name== (a + b))
+  then
+	Kapow
+	
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== (a + b)))))) then
+	Kapow
+	
+end))
+/**
+ * test With Predicate
+ */
+	<<
+rule simple_rule 
+  when
+  	Person( $age2:age -> ($age2 == $age1+2 ) ) 
+  then
+	foo bar
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age2 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)))) (-> ($age2 == $age1+2 ))))) then
+	foo bar
+end))
+/**
+ * test Not With Constraint
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+global java.util.List list;
+global java.lang.Integer five;
+
+rule "not rule test"
+    when
+        $person : Person( $likes:like )
+        not Cheese( type == $likes )
+    then
+		list.add( $person );
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (global (VT_DATA_TYPE java util List) list) (global (VT_DATA_TYPE java lang Integer) five) (rule "not rule test" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT like))))))) (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))) then
+		list.add( $person );
+end))
+/**
+ * test Global
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+global java.lang.String foo
+global java.lang.Integer bar;
+
+rule baz
+    when
+        Cheese( )
+    then
+
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (import (VT_IMPORT_ID org drools Cheese)) (global (VT_DATA_TYPE java lang String) foo) (global (VT_DATA_TYPE java lang Integer) bar) (rule baz when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese)))) then
+
+end))
+/**
+ * test Functions
+ */
+	<<
+import java.lang.String
+
+function String functionA(String s, Integer i) {
+	
+	foo();
+
+}
+
+function void functionB() {
+	bar();	
+}
+
+
+rule something 
+	when
+	then
+end
+
+rule "one more thing"
+	when
+	then
+end
+
+
+
+	>>
+		-> (VT_COMPILATION_UNIT (import (VT_IMPORT_ID java lang String)) (function (VT_DATA_TYPE String) functionA (VT_PARAM_LIST (VT_DATA_TYPE String) s (VT_DATA_TYPE Integer) i) {
+	
+	foo();
+
+}) (function (VT_DATA_TYPE void) functionB VT_PARAM_LIST {
+	bar();	
+}) (rule something when VT_AND_IMPLICIT then
+end) (rule "one more thing" when VT_AND_IMPLICIT then
+end))
+
+/**
+ * test Comment
+ */
+	<<#this starts with a comment
+package foo.bar
+
+//and another comment
+
+/*
+yet
+	   another
+   				style
+*/
+
+rule "test"
+  when
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID foo bar)) (rule "test" when VT_AND_IMPLICIT then
+end))
+/**
+ * test Attributes
+ */
+	<<
+
+
+rule simple_rule 
+		#attributes keywork (and colon) is totally optional
+		salience 42
+		agenda-group "my_group"
+		no-loop 
+		duration 42
+		activation-group "my_activation_group"
+		lock-on-active true
+	when
+		Foo()
+	then
+		bar();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule (VT_RULE_ATTRIBUTES (salience 42) (agenda-group "my_group") no-loop (duration 42) (activation-group "my_activation_group") (lock-on-active true)) when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then
+		bar();
+end))
+/**
+ * test Attributes alternate Syntax
+ */
+	<<
+
+
+rule simple_rule 
+	attributes: 
+		salience 42, agenda-group "my_group", no-loop,  lock-on-active, duration 42, activation-group "my_activation_group"
+	when
+		Foo()
+	then
+		bar();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule (VT_RULE_ATTRIBUTES attributes (salience 42) (agenda-group "my_group") no-loop lock-on-active (duration 42) (activation-group "my_activation_group")) when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))) then
+		bar();
+end))
+/**
+ * test Enumeration
+ */
+	<<
+rule simple_rule 
+  when
+  	Foo(bar == Foo.BAR)
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT Foo) (VT_ACCESSOR_ELEMENT BAR))))))) then
+end))
+/**
+ * test Syntax Damage
+ */
+	<<rule one
+  when
+    exists Foo()
+    exits Bar()
+  then
+end
+
+rule two 
+  when
+    ford = ford = ford
+  then
+end>>
+		FAIL
+/**
+ * test Extra Lhs Newline
+ */
+	<<
+rule "another test"
+    when
+        s : String()
+        eval(s.equals("foo") && s.startsWith("f"))
+        
+        
+    then
+        list.add( s );
+end >>
+		-> (VT_COMPILATION_UNIT (rule "another test" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING s (VT_FACT (VT_PATTERN_TYPE String)))) (eval (s.equals("foo") && s.startsWith("f")))) then
+        list.add( s );
+end))
+/**
+ * test Sounds Like
+ */
+	<<package nesting;
+
+
+
+
+rule "test something"
+
+	when
+		p: Person( name soundslike "Michael" )
+	then
+		p.name = "goober"
+		System.out.println(p.name)
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID nesting)) (rule "test something" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (soundslike "Michael")))))) then
+		p.name = "goober"
+		System.out.println(p.name)
+end))
+/**
+ * test Package Attributes
+ */
+	<<package com.foo;
+
+agenda-group "x"
+
+import goo.ber
+import wee.waa
+
+
+dialect "java"
+
+
+
+
+rule bar
+  when
+  then
+end
+
+rule baz
+  dialect "mvel"
+  when
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID com foo)) (agenda-group "x") (import (VT_IMPORT_ID goo ber)) (import (VT_IMPORT_ID wee waa)) (dialect "java") (rule bar when VT_AND_IMPLICIT then
+end) (rule baz (VT_RULE_ATTRIBUTES (dialect "mvel")) when VT_AND_IMPLICIT then
+end))
+/**
+ * test Statement Ordering 1
+ */
+	<<
+package com.foo;
+
+import im.one
+
+import im.two
+
+rule foo
+  when
+  then
+end
+
+function cheeseIt() {
+
+}
+
+import im.three;
+
+rule bar
+  when
+  then
+end
+
+function uncheeseIt() {
+
+}
+
+import im.four;>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID com foo)) (import (VT_IMPORT_ID im one)) (import (VT_IMPORT_ID im two)) (rule foo when VT_AND_IMPLICIT then
+end) (function cheeseIt VT_PARAM_LIST {
+
+}) (import (VT_IMPORT_ID im three)) (rule bar when VT_AND_IMPLICIT then
+end) (function uncheeseIt VT_PARAM_LIST {
+
+}) (import (VT_IMPORT_ID im four)))
+/**
+ * test Rule Names Starting With Numbers
+ */
+	<<
+rule "1. Do Stuff!"
+  when
+  then
+end
+
+rule "2. Do More Stuff!"
+  when
+  then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "1. Do Stuff!" when VT_AND_IMPLICIT then
+end) (rule "2. Do More Stuff!" when VT_AND_IMPLICIT then
+end))
+/**
+ * test Eval With Newline
+ */
+	<<
+rule simple_rule 
+  when
+	Foo()
+	Bar()
+	eval(
+	
+	
+	
+	       abc(
+	       
+	       "foo") + 
+	       5
+	       
+	       
+	       
+	        
+	       )
+  then
+	Kapow
+	Poof
+	
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (
+	
+	
+	
+	       abc(
+	       
+	       "foo") + 
+	       5
+	       
+	       
+	       
+	        
+	       ))) then
+	Kapow
+	Poof
+	
+end))
+/**
+ * test Syntax Damage
+ */
+	<<
+rule simple_rule 
+  when
+	eval(abc();)
+  then
+	Kapow
+	Poof
+end>>
+		FAIL
+/**
+ * test End Position
+ */
+	<<
+
+
+rule simple_rule 
+  when
+	Foo(
+	  bar == baz, la==laz
+	  )
+  then
+	Kapow
+	Poof
+end
+	>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT baz)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT la)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT laz))))))) then
+	Kapow
+	Poof
+end))
+/**
+ * test Qualified Classname
+ */
+	<<package org.drools.test;
+
+rule "Who likes Stilton"
+    when
+        com.cheeseco.Cheese($type : type == "stilton")
+    then
+        System.out.println( $name + " likes " + $type);
+end    >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools test)) (rule "Who likes Stilton" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE com cheeseco Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton")))))) then
+        System.out.println( $name + " likes " + $type);
+end))
+/**
+ * test Accumulate
+ */
+	<<rule "AccumulateParserTest"
+when
+     Integer() from accumulate( Person( age > 21 ),
+                                init( int x = 0; ),
+                                action( x++; ),
+                                result( new Integer(x) ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then
+end))
+/**
+ * test Accumulate With Bindings
+ */
+	<<rule "AccumulateParserTest"
+when
+     $counter:Integer() from accumulate( $person : Person( age > 21 ),
+                                         init( int x = 0; ),
+                                         action( x++; ),
+                                         result( new Integer(x) ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then
+end))
+/**
+ * test Collect
+ */
+	<<rule "CollectParserTest"
+when
+     $personList : ArrayList() from collect( Person( age > 21 ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "CollectParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))))) then
+end))
+	<<rule "test_Quotes"
+   when
+      InitialFact()
+   then
+      String s = "\"\n\t\\";
+end >>
+		-> (VT_COMPILATION_UNIT (rule "test_Quotes" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE InitialFact)))) then
+      String s = "\"\n\t\\";
+end))
+/**
+ * test Nested CEs
+ */
+	<<rule "test nested CEs"	
+	when
+	    not ( State( $state : state ) and
+	          not( Person( status == $state, $likes : likes ) and
+	               Cheese( type == $likes ) ) )
+	    Person( name == "Bob" )
+	    ( Cheese( price == 10 ) or Cheese( type == "brie" ) )
+	then 
+		results.add("OK");		
+end>>
+		-> (VT_COMPILATION_UNIT (rule "test nested CEs" when (VT_AND_IMPLICIT (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE State) (VT_BIND_FIELD $state (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT state)))))) (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT status)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $state)))) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Bob")))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "brie")))))) then 
+		results.add("OK");		
+end))
+/**
+ * test For All
+ */
+	<<rule "ForallParserTest"
+when
+     forall( Person( age > 21, $likes : likes )
+             Cheese( type == $likes ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "ForallParserTest" when (VT_AND_IMPLICIT (forall (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))) then
+end))
+/**
+ * test In Operator
+ */
+	<<#testing 'in' operator
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type in ( "sedan", "wagon" ), age < 3)
+  then
+	consequence();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in "sedan" "wagon")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then
+	consequence();
+end))
+/**
+ * test Not In Operator
+ */
+	<<#testing not 'in' operator
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type not in ( "sedan", "wagon" ), age < 3)
+  then
+	consequence();
+end>>
+		-> (VT_COMPILATION_UNIT (rule simple_rule when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in not "sedan" "wagon")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3))))) then
+	consequence();
+end))
+/**
+ * test Semicolon
+ */
+	<<package org.drools;
+
+global java.util.List list;
+
+rule "rule1"
+when
+    Pattern1();
+    Pattern2() from x.y.z;
+then
+    System.out.println("Test");
+end;
+
+query "query1"
+	Pattern5();
+	Pattern6();
+	Pattern7();
+end;
+
+rule "rule2"
+when
+    Pattern3();
+    Pattern4() from collect( Pattern5() );
+then
+    System.out.println("Test");
+end;
+
+	>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (global (VT_DATA_TYPE java util List) list) (rule "rule1" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern1))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern2))) (VT_FROM_SOURCE x (. y (. z))))) then
+    System.out.println("Test");
+end;) (query "query1" (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern6))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern7)))) end) (rule "rule2" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern3))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern4))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5)))))) then
+    System.out.println("Test");
+end;))
+/**
+ * test Eval
+ */
+	<<package org.drools
+
+rule "Test Parse"
+
+when
+    eval( 3==3 )
+then
+    System.out.println("OK");
+end >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule "Test Parse" when (VT_AND_IMPLICIT (eval ( 3==3 ))) then
+    System.out.println("OK");
+end))
+/**
+ * test Accumulate Reverse
+ */
+	<<rule "AccumulateReverseParserTest"
+when
+     Integer() from accumulate( Person( age > 21 ),
+                                init( int x = 0; ),
+                                action( x++; ),
+                                reverse( x--; ),
+                                result( new Integer(x) ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateReverseParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (reverse ( x--; )) (result ( new Integer(x) )))))) then
+end))
+/**
+ * test Accumulate External Function
+ */
+	<<rule "AccumulateReverseParserTest"
+when
+     Number() from accumulate( Person( $age : age > 21 ),
+                               average( $age ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateReverseParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Number))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_ID_CLAUSE average ( $age ))))) then
+end))
+/**
+ * test Collect With Nested From
+ */
+	<<rule "CollectParserTest"
+when
+     #bellow statement makes no sense, but is useful to test parsing recursiveness
+     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );
+then
+end
+
+	>>
+		-> (VT_COMPILATION_UNIT (rule "CollectParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (from (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ())))))))) then
+end))
+/**
+ * test Accumulate With Nested From
+ */
+	<<rule "AccumulateParserTest"
+when
+     #bellow statement makes no sense, but is useful to test parsing recursiveness
+     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),
+                                                max( $age ) );
+then
+end
+
+	>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (accumulate (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (> 21) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))) (VT_ACCUMULATE_ID_CLAUSE max ( $age ))))) then
+end))
+/**
+ * test Or CE
+ */
+	<<package org.drools;
+
+rule "testing OR CE"
+when
+    $p : Person( name == "bob" )
+    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )
+then
+    // do something
+end >>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule "testing OR CE" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "bob"))))) (|| (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $p) (VT_ACCESSOR_ELEMENT likes))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))))) then
+    // do something
+end))
+/**
+ * test Rule Single Line
+ */
+	<<rule "another test" salience 10 when eval( true ) then System.out.println(1); end>>
+		-> (VT_COMPILATION_UNIT (rule "another test" (VT_RULE_ATTRIBUTES (salience 10)) when (VT_AND_IMPLICIT (eval ( true ))) then System.out.println(1); end))
+/**
+ * test Rule Two Lines
+ */
+	<<rule "another test" salience 10 when eval( true ) then System.out.println(1);
+end>>
+		-> (VT_COMPILATION_UNIT (rule "another test" (VT_RULE_ATTRIBUTES (salience 10)) when (VT_AND_IMPLICIT (eval ( true ))) then System.out.println(1);
+end))
+/**
+ * test Accumulate Multi Pattern
+ */
+	<<rule "AccumulateMultiPatternParserTest"
+when
+     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),
+                                         init( int x = 0; ),
+                                         action( x++; ),
+                                         result( new Integer(x) ) );
+then
+end>>
+		-> (VT_COMPILATION_UNIT (rule "AccumulateMultiPatternParserTest" when (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (and (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $person) (VT_ACCESSOR_ELEMENT likes))))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) )))))) then
+end))
+/**
+ * test Syntax Damage
+ */
+	<<package org.drools;
+
+rule "test rule"
+	salience 10
+	when
+		$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))
+	then
+		retract($p);
+end
+	>>
+		FAIL
+/**
+ * test Syntax Damage
+ */
+	<<package org.drools;
+
+rule "Avoid NPE on wrong syntax"
+when
+    not( Cheese( ( type == "stilton", price == 10 ) || ( type == "brie", price == 15 ) ) from $cheeseList )
+then
+    System.out.println("OK");
+end>>
+		FAIL
+
+/**
+ * test Pluggable Operators
+ */
+	<<package org.drools;
+
+rule "test pluggable operators"
+when
+    $a : EventA()
+    $b : EventB( this `after[1,10] $a )
+    $c : EventC( this finishes $b )
+    $d : EventD( this not starts $a )
+    $e : EventE( this not `before [1, 10] $b )
+then
+end>>
+		-> (VT_COMPILATION_UNIT (package (VT_PACKAGE_ID org drools)) (rule "test pluggable operators" when (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $a (VT_FACT (VT_PATTERN_TYPE EventA)))) (VT_PATTERN (VT_FACT_BINDING $b (VT_FACT (VT_PATTERN_TYPE EventB) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (after [1,10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE EventC) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (finishes (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))) (VT_PATTERN (VT_FACT_BINDING $d (VT_FACT (VT_PATTERN_TYPE EventD) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (starts not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $e (VT_FACT (VT_PATTERN_TYPE EventE) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (before not [1, 10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b)))))))) then
+end))
+
+pattern_source:
+/**
+ * test Entry Point
+ */
+	<<StockTick( symbol=="ACME") from entry-point StreamA>>
+		-> (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE StockTick) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT symbol)) (== "ACME")))) (entry-point StreamA))
+
+paren_chunk:
+/**
+ * test Chunk Without Parens
+ */
+	<<( foo )>>
+		-> ( foo )
+/**
+ * test Chunk With Parens
+ */
+	<<(fnord())>>
+		-> (fnord())
+/**
+ * test Chunk With Parens And Quoted String
+ */
+	<<( fnord( "cheese" ) )>>
+		-> ( fnord( "cheese" ) )
+/**
+ * test Chunk With Random Charac5ters
+ */
+	<<( %*9dkj)>>
+		-> ( %*9dkj)
+
+normal_lhs_block:
+/**
+ * test Empty lhs
+ */
+	"" -> "VT_AND_IMPLICIT"
+/**
+ * test Member Of
+ */
+	<<
+     Country( $cities : city )
+     Person( city memberOf $cities )
+    >>
+    	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_BIND_FIELD $cities (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)) (memberOf (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $cities)))))))
+/**
+ * test Not Member Of
+ */
+	<<
+     Country( $cities : city )
+     Person( city not memberOf $cities )
+    >>
+    	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_BIND_FIELD $cities (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)) (memberOf not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $cities)))))))
+/**
+ * test Constraint And Connective
+ */
+	<< Person( age < 42 && location=="atlanta") >>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "atlanta"))))))
+
+/**
+ * test Constraint Or Connective
+ */
+	<< Person( age < 42 || location=="atlanta") >>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "atlanta"))))))
+
+/**
+ * test Constraint Connectives Precedence
+ */
+	<<Person( age < 42 && location=="atlanta" || age > 20 && location=="Seatle" || location == "Chicago")>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "atlanta"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 20)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "Seatle")))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "Chicago"))))))
+
+/**
+ * test Constraint Connectives Precedence With Bracks
+ */
+	<<Person( age < 42 && ( location=="atlanta" || age > 20 && location=="Seatle") || location == "Chicago")>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "atlanta")) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 20)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "Seatle"))))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "Chicago"))))))
+
+/**
+ * test Constraint Connectives Precedence With Bracks2
+ */
+	<< Person( ( age == 70 && hair == "black" ) || ( age == 40 && hair == "pink" ) || ( age == 12 && ( hair == "yellow" || hair == "blue" ) ) ) >>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 70)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "black"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 40)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "pink")))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 12)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "yellow")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "blue"))))))))
+
+/**
+ * test Constraint Connectives Matches
+ */
+	<< Person( name matches "mark" || matches "bob" ) >>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (|| (matches "mark") (matches "bob"))))))
+
+/**
+ * test Not Contains
+ */
+	<<
+	City( $city : city )
+	Country( cities not contains $city )
+	>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE City) (VT_BIND_FIELD $city (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT city)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Country) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT cities)) (contains not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $city)))))))
+
+/**
+ * test Not Matches
+ */
+	<< Message( text not matches '[abc]*' ) >>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Message) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT text)) (matches not '[abc]*')))))
+	
+/**
+ * test Restrictions
+ */
+	<<Foo( bar > 1 || == 1 )>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (|| (> 1) (== 1))))))
+
+/**
+ * test Rule Parse Lhs 3
+ */
+	<<
+	(or
+	not Person()
+		(and Cheese()
+			Meat()
+			Wine()))
+	>>
+		-> (VT_AND_IMPLICIT (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person)))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Meat))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine))))))
+
+/**
+ * test Restriction Connectives
+ */
+	<<Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == "black" ) || ( age == 40 && hair == "pink" ) || ( age == 12 && ( hair == "yellow" || hair == "blue" ) ))>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (|| (|| (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (&& (> 60) (< 70)) (&& (> 50) (< 55)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "black"))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 40)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "pink")))) (&& (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 12)) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "yellow")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT hair)) (== "blue"))))))))
+
+/**
+ * test Accessor Paths
+ */
+	<<org   .   drools/*comment*/	  .Message( text not matches $c#comment
+. property )
+>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE org drools Message) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT text)) (matches not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $c) (VT_ACCESSOR_ELEMENT property)))))))
+
+/**
+ * test General Lhs
+ */
+<< $id : Something( duration == "foo") >>
+	->  (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $id (VT_FACT (VT_PATTERN_TYPE Something) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT duration)) (== "foo"))))))
+"foo3 : Bar(" FAIL
+<<
+Cheese(name == "Stilton", age==2001)
+Wine(name == "Grange", age == "1978", accolades contains "world champion")
+>> -> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Stilton")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== 2001)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Wine) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Grange")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (== "1978")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT accolades)) (contains "world champion")))))
+"Foo()"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))))
+<<not Cheese(type == "stilton")>>
+	-> (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))))
+<<
+Person(age < 42, location=="atlanta") 
+or
+Person(name=="bob")
+>>
+	-> (VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 42)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT location)) (== "atlanta")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "bob"))))))
+<<
+Foo(bar == false)
+Foo(boo > -42)
+Foo(boo > -42.42)
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== false)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT boo)) (> -42.42)))))
+"Cheese( )" 
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese))))
+	
+<<
+Col1() from something.doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+Col2()
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))
+<<
+Col1() from doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+Col2()
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt ( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] ))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))	
+<<
+Col1() from something.doIt
+Col2()
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))	
+<<
+Col1() from something.doIt["key"]
+Col2()
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE something (. doIt ["key"]))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))
+<<
+Col1() from doIt1( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] )
+            .doIt2(bar, [a, "b", 42]).field["key"]
+Col2()
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col1))) (VT_FROM_SOURCE doIt1 ( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] ) (. doIt2 (bar, [a, "b", 42]) (. field ["key"])))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Col2))))
+<<
+foo3 : Bar(a==3)
+foo4 : Bar(a4:a==4)
+Baz()
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz))))
+<<
+Person(age > 30 && < 40)
+Vehicle(type == "sedan" || == "wagon", age < 3)
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (|| (== "sedan") (== "wagon"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))
+"    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo3 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 3))))) (VT_PATTERN (VT_FACT_BINDING foo4 (VT_FACT (VT_PATTERN_TYPE Bar) (VT_BIND_FIELD a4 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT a)) (== 4)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Baz))))
+<<
+not ( Cheese(type == "stilton") )
+exists ( Foo() )
+>>
+	-> (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))))
+<<
+not ( Cheese(type == "stilton") )
+exists ( Foo() )
+>>
+	-> (VT_AND_IMPLICIT (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (exists (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo)))))
+<<
+a : (not ( Cheese(type == "stilton") ))
+exists ( Foo() )
+>>
+	FAIL
+<< Cheese( t:type == "cheddar" ) >>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD t (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "cheddar"))))))
+
+"Cheese( $type:type )"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)))))))
+<<
+    Cheese($type : type == "stilton")
+    $person : Person($name : name == "bob", likes == $type)        
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $name (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "bob"))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $type))))))))
+<<
+Person(name == "mark") or 
+( Person(type == "fan") and Cheese(type == "green") )
+>>
+	-> (VT_AND_IMPLICIT (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "green")))))))
+<<
+Person(name == "mark") && Cheese(type == "stilton")
+Person(name == "mark") || Cheese(type == "stilton")
+>>
+	-> (VT_AND_IMPLICIT (&& (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))) (|| (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark")))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))))
+<<
+foo :  ( Person(name == "mark") or Person(type == "fan") ) 
+Cheese(type == "green")
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "green")))))
+<<
+foo : ( Person(name == "mark") 
+	or 
+	Person(type == "fan") )
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))))))
+<<
+foo : ( 
+	Person(name == "mark") or Person(type == "fan") 
+	)
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING foo (or (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "mark"))) (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "fan")))))))
+<<
+ ( (not Foo(x=="a") or Foo(x=="y") ) and ( Shoes() or Butt() ) )
+>>
+	-> (VT_AND_IMPLICIT (and (or (not (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== "a"))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT x)) (== "y"))))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Shoes))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Butt))))))
+<<
+eval(abc("foo") + 5)
+Foo()
+eval(qed())
+Bar()
+>>
+	-> (VT_AND_IMPLICIT (eval (abc("foo") + 5)) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (eval (qed())) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))))
+<<
+Foo()
+Bar()
+eval(abc("foo"))
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (abc("foo"))))
+"Foo(name== (a + b))"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== (a + b))))))
+
+"Person( $age2:age -> ($age2 == $age1+2 ) )"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age2 (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)))) (-> ($age2 == $age1+2 )))))
+
+"Foo(bar == Foo.BAR)"
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT Foo) (VT_ACCESSOR_ELEMENT BAR)))))))
+<<
+p: Person( name soundslike "Michael" )
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (soundslike "Michael"))))))
+
+<<
+Foo()
+Bar()
+eval(
+
+
+
+       abc(
+       
+       "foo") + 
+       5
+       
+       
+       
+        
+       )
+>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Bar))) (eval (
+
+
+
+       abc(
+       
+       "foo") + 
+       5
+       
+       
+       
+        
+       )))
+
+"eval(abc();)"
+	FAIL
+
+<<
+Foo(
+  bar == baz, la==laz
+  )
+ >>
+ 	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Foo) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT bar)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT baz)))) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT la)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT laz)))))))
+
+<<com.cheeseco.Cheese($type : type == "stilton")>>
+	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE com cheeseco Cheese) (VT_BIND_FIELD $type (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "stilton"))))))
+
+<<
+     Integer() from accumulate( Person( age > 21 ),
+                            init( int x = 0; ),
+                            action( x++; ),
+                            result( new Integer(x) ) );
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))
+
+<<
+ $counter:Integer() from accumulate( $person : Person( age > 21 ),
+                                     init( int x = 0; ),
+                                     action( x++; ),
+                                     result( new Integer(x) ) );
+>>
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))
+
+"$personList : ArrayList() from collect( Person( age > 21 ) );"
+	-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))))))
+
+
+<<
+	not ( State( $state : state ) and
+          not( Person( status == $state, $likes : likes ) and
+               Cheese( type == $likes ) ) )
+    Person( name == "Bob" )
+    ( Cheese( price == 10 ) or Cheese( type == "brie" ) )
+>>
+	-> (VT_AND_IMPLICIT (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE State) (VT_BIND_FIELD $state (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT state)))))) (not (and (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT status)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $state)))) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes)))))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "Bob")))) (or (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== "brie"))))))
+
+<<
+ forall( Person( age > 21, $likes : likes )
+         Cheese( type == $likes ) );
+>>
+	-> (VT_AND_IMPLICIT (forall (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_BIND_FIELD $likes (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT likes)))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $likes))))))))
+
+
+	<<
+  	Person(age > 30 && < 40)
+  	Vehicle(type in ( "sedan", "wagon" ), age < 3)
+	>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in "sedan" "wagon")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))
+
+	<<
+  	Person(age > 30 && < 40)
+  	Vehicle(type not in ( "sedan", "wagon" ), age < 3)
+	>>
+		-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (&& (> 30) (< 40))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Vehicle) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (in not "sedan" "wagon")) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 3)))))
+
+		<<
+		Pattern1();
+		Pattern2() from x.y.z;
+		Pattern5();
+		Pattern6();
+		Pattern7();
+		Pattern3();
+		Pattern4() from collect( Pattern5() );
+		>>
+			-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern1))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern2))) (VT_FROM_SOURCE x (. y (. z)))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern6))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern7))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern3))) (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern4))) (collect (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Pattern5))))))
+
+		<< eval( 3==3 ) >>
+			-> (VT_AND_IMPLICIT (eval ( 3==3 )))
+
+		<<
+		Integer() from accumulate( Person( age > 21 ),
+		                           init( int x = 0; ),
+		                           action( x++; ),
+		                           reverse( x--; ),
+		                           result( new Integer(x) ) );
+		>>
+			-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Integer))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (reverse ( x--; )) (result ( new Integer(x) ))))))
+
+		<<
+	     Number() from accumulate( Person( $age : age > 21 ),
+	                               average( $age ) );
+		>>
+			-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Number))) (accumulate (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_ACCUMULATE_ID_CLAUSE average ( $age )))))
+
+		<<
+	     #bellow statement makes no sense, but is useful to test parsing recursiveness
+	     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );
+		>>
+			-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (collect (from (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (|| (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21)) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))))))
+
+		<<
+	     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),
+	                                                max( $age ) );
+		>>
+			-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $personList (VT_FACT (VT_PATTERN_TYPE ArrayList)))) (accumulate (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Person) (VT_BIND_FIELD $age (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (|| (> 21) (< 10)))))) (collect (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE People))) (VT_FROM_SOURCE $town (. getPeople ()))))) (VT_ACCUMULATE_ID_CLAUSE max ( $age )))))
+
+		<<
+	    $p : Person( name == "bob" )
+	    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )
+	    >>
+	    	-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $p (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT name)) (== "bob"))))) (|| (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $p) (VT_ACCESSOR_ELEMENT likes))))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT price)) (== 10))))))
+			<<
+		     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),
+		                                         init( int x = 0; ),
+		                                         action( x++; ),
+		                                         result( new Integer(x) ) );
+			>>
+				-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT_BINDING $counter (VT_FACT (VT_PATTERN_TYPE Integer)))) (accumulate (and (VT_PATTERN (VT_FACT_BINDING $person (VT_FACT (VT_PATTERN_TYPE Person) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT age)) (> 21))))) (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE Cheese) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT type)) (== (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $person) (VT_ACCESSOR_ELEMENT likes))))))) (VT_ACCUMULATE_INIT_CLAUSE (init ( int x = 0; )) (action ( x++; )) (result ( new Integer(x) ))))))
+
+			<<
+		    $a : EventA()
+		    $b : EventB( this `after[1,10] $a )
+		    $c : EventC( this finishes $b )
+		    $d : EventD( this not starts $a )
+		    $e : EventE( this not `before [1, 10] $b )
+			>>
+				-> (VT_AND_IMPLICIT (VT_PATTERN (VT_FACT_BINDING $a (VT_FACT (VT_PATTERN_TYPE EventA)))) (VT_PATTERN (VT_FACT_BINDING $b (VT_FACT (VT_PATTERN_TYPE EventB) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (after [1,10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $c (VT_FACT (VT_PATTERN_TYPE EventC) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (finishes (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))) (VT_PATTERN (VT_FACT_BINDING $d (VT_FACT (VT_PATTERN_TYPE EventD) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (starts not (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $a))))))) (VT_PATTERN (VT_FACT_BINDING $e (VT_FACT (VT_PATTERN_TYPE EventE) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT this)) (before not [1, 10] (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT $b))))))))
+
+			<<StockTick( symbol=="ACME") from entry-point StreamA>>
+				-> (VT_AND_IMPLICIT (from (VT_PATTERN (VT_FACT (VT_PATTERN_TYPE StockTick) (VT_FIELD (VT_ACCESSOR_PATH (VT_ACCESSOR_ELEMENT symbol)) (== "ACME")))) (entry-point StreamA)))
+
+/**
+ * test Constraint
+ */
+constraints:
+	<<eval( $var.equals("xyz") )>>
+		-> (eval ( $var.equals("xyz") ))
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTreeWalkerTest.testsuite (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/gUnitTreeWalkerTest.testsuite)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTreeWalkerTest.testsuite	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/gUnitTreeWalkerTest.testsuite	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,1640 @@
+gunit Tree2TestDRL walks DRL;
+
+ at header{
+package org.drools.lang;
+}
+
+package_statement walks package_statement:
+
+/**
+ * test Package One Segment
+ */
+	"package foo" 
+		OK
+
+/**
+ * test Package Multiple Segments
+ */
+	"package foo.bar.baz;"
+		OK
+
+compilation_unit walks compilation_unit:
+/**
+ * test Empty Compilation Unit
+ */
+	""
+		OK
+/**
+ * test Compilation Unit
+ */
+	"package foo; import com.foo.Bar; import com.foo.Baz;"
+		OK
+/**
+ * test Empty Rule
+ */
+	<<rule empty 
+
+then
+  
+end>>
+		OK
+
+/**
+ * test Damaged syntax
+ */
+	<<#the purpose of this is to see what happens when we have some partially damaged syntax
+#as the IDE uses the parsers AST to work out completion suggestions.
+package test
+
+
+rule simple_rule 
+  when
+    foo3 : Bar(
+
+>>
+		FAIL
+/**
+ * test Templates
+ */
+	<<package test.templates
+
+template Cheese
+	String 	name
+	Integer age
+end
+
+template "Wine"
+	String 		name
+	String 		year
+	String[] 	accolades
+end
+
+
+rule "a rule"
+  when
+	Cheese(name == "Stilton", age==2001)
+	Wine(name == "Grange", age == "1978", accolades contains "world champion")
+  then
+  	baz();
+end>>
+		OK
+/**
+ * test Ternary Expression
+ */
+	<<package foo
+
+rule rule_one 
+  when
+  	Foo()
+  then
+  	 if (speed > speedLimit ? true : false;)
+     pullEmOver();
+end>>
+		OK
+/**
+ * test Function With Arrays
+ */
+	<<package foo
+
+function String[] yourFunction(String args[]) {
+     baz();
+}
+
+rule "new rule"
+
+	when
+		Something()
+	then
+		yourFunction(new String[3] {"a","b","c"});
+		
+end>>
+		OK
+/**
+ * test Almost Empty Rule
+ */
+	<<
+rule almost_empty 
+  when
+  then
+end>>
+		OK
+/**
+ * test Quoted String Name Rule
+ */
+	<<rule "quoted string name"
+  when
+  then
+end>>
+		OK
+/**
+ * test No Loop
+ */
+	<<
+rule rule1 
+  no-loop false
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Auto focus
+ */
+	<<
+rule rule1 
+  auto-focus true
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Rule Flow Group
+ */
+	<<
+rule rule1 
+  ruleflow-group "a group"
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Consequence With Declaration
+ */
+	<<
+
+rule myrule 
+  when
+  then
+  	int i = 0;
+	i = 1;
+	i / 1;
+	i == 1;
+	i(i);
+	i = 'i';
+	i.i.i;
+	i\i;
+	i<i;
+	i>i;
+	i="i";	
+	++i;
+	i++;
+	--i;
+	i--;
+	i += i;
+	i -= i;
+	i *= i;
+	i /= i;
+	int i = 5;
+	for(int j; j<i; ++j) {
+	  System.out.println(j);
+	}	
+	Object o = new String("Hello");
+	String s = (String) o;	
+	
+end>>
+		OK
+/**
+ * test Literal Bool And Negative Numbers Rule
+ */
+	<<#check that it can handle true/false literals, and 
+#negative numbers
+rule simple_rule 
+  when
+	Foo(bar == false)
+	Foo(boo > -42)
+	Foo(boo > -42.42)
+  then
+	cons();
+end>>
+		OK
+<<package org.drools.test;
+ 
+import org.drools.Cheese;
+ 
+rule "simple rule"
+    when
+        Cheese( )
+    then
+end >>
+		OK
+/**
+ * test Simple Method Call With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+	Col2()
+ then
+	partay();
+end	>>
+		OK
+/**
+ * test Simple Function Call With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+	Col2()
+ then
+	partay();
+end	>>
+		OK
+/**
+ * test Simple Accessor With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt
+	Col2()
+ then
+	partay();
+end	>>
+		OK
+/**
+ * test Simple Accessor And Arg With From
+ */
+	<<
+rule blah
+
+ when 
+
+	Col1() from something.doIt["key"]
+	Col2()
+ then
+	partay();
+end	>>
+		OK
+/**
+ * test Complex Chained Acessor
+ */
+	<<rule blah
+ when 
+	Col1() from doIt1( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] )
+	            .doIt2(bar, [a, "b", 42]).field["key"]
+	Col2()
+ then
+	partay();
+end	>>
+		OK
+/**
+ * test Simple Rule
+ */
+	<<
+rule simple_rule 
+  when
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+  then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end>>
+		OK
+/**
+ * test Restrictions Multiple
+ */
+	<<#this is for showing off all the new multi restriction stuff
+
+
+
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type == "sedan" || == "wagon", age < 3)
+  then
+	consequence();
+end>>
+		OK
+/**
+ * test Line Number Including Comments In RHS
+ */
+	<<package la
+
+
+rule simple_rule 
+  when
+  	Baz()
+  then
+  	//woot
+  	first
+  	
+  	#
+  	
+  	/* lala
+  	
+  	*/
+  	second  
+end>>
+		OK
+/**
+ * test Lhs Semicolon Delim
+ */
+	<<
+rule simple_rule 
+  when
+    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()
+  then
+  if ( a == b ) {
+    assert( foo3 );
+  } else {
+    retract( foo4 );
+  } 
+  System.out.println( a4 );
+end>>
+		OK
+/**
+ * test Not Node
+ */
+	<<
+rule simple_rule 
+  when
+  	not Cheese(type == "stilton")
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Function Import
+ */
+	<<package HR1
+
+import function abd.def.x
+import function qed.wah.*
+
+rule simple_rule 
+  when  		  	
+  	not ( Cheese(type == "stilton") )
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Not Exist With Brackets
+ */
+	<<package HR1
+
+rule simple_rule 
+  when  		  	
+  	not ( Cheese(type == "stilton") )
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		OK
+/**
+ * test Damaged syntax
+ */
+	<<package HR2
+
+rule simple_rule 
+  when  		  	
+  	a : (not ( Cheese(type == "stilton") ))
+  	exists ( Foo() )
+  then
+	funky();
+end>>
+		FAIL
+/**
+ * test Simple Query
+ */
+	<<
+
+query "simple_query" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end>>
+		OK
+/**
+ * test Query Rule Mixed
+ */
+	<<
+package foo
+
+rule bar
+	when
+		Baz()
+	then
+		Boo()
+end
+
+query "simple_query" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end
+
+rule bar2
+	when
+		Baz()
+	then
+		Boo()
+end
+
+query "simple_query2" 
+    foo3 : Bar(a==3)
+    foo4 : Bar(a4:a==4)
+    Baz()
+	
+end
+	>>
+		OK
+/**
+ * test Multiple Rules
+ */
+	<<package org.drools.test;
+
+import org.drools.integrationtests.Cheese;
+
+rule "Like Stilton"
+    when
+        Cheese( t:type == "stilton" )
+    then
+        System.out.println("I like " + t);
+end    
+
+rule "Like Cheddar"
+    when
+        Cheese( t:type == "cheddar" )
+    then
+        System.out.println("I like " + t );
+end    >>
+		OK
+/**
+ * test Basic Binding
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+rule "like cheddar"
+    when
+        Cheese( $type:type )
+    then
+        System.out.println("I like " + $type);
+end    >>
+		OK
+/**
+ * test Bound Variables
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+import org.drools.Person;
+
+rule "Who likes Stilton"
+    when
+        Cheese($type : type == "stilton")
+        $person : Person($name : name == "bob", likes == $type)        
+    then
+        System.out.println( $name + " likes " + $type);
+end    >>
+		OK
+/**
+ * test Or Nesting
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+	Person(name == "mark") or 
+	( Person(type == "fan") and Cheese(type == "green") )
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		OK
+/**
+ * test And Or Rules
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+    Person(name == "mark") && Cheese(type == "stilton")
+    Person(name == "mark") || Cheese(type == "stilton")
+  then
+	System.out.println( "Mark and Michael" );
+end>>
+		OK
+/**
+ * test Or With Binding
+ */
+	<<
+import org.drools.Person
+
+rule simple_rule 
+  when
+	foo :  ( Person(name == "mark") or Person(type == "fan") ) 
+	Cheese(type == "green")
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		OK
+/**
+ * test Or Binding Complex
+ */
+	<<
+
+rule simple_rule 
+  when
+	foo : ( Person(name == "mark") 
+		or 
+		Person(type == "fan") )
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		OK
+/**
+ * test Or Binding With Brackets
+ */
+	<<rule simple_rule 
+  when
+	foo : ( 
+		Person(name == "mark") or Person(type == "fan") 
+		)
+  then
+	System.out.println( "Mark and Michael" + bar );
+end>>
+		OK
+/**
+ * test Brackets Precedence
+ */
+	<<
+rule simple_rule 
+  when
+	 ( (not Foo(x=="a") or Foo(x=="y") ) and ( Shoes() or Butt() ) )
+  then
+	go wild
+end>>
+		OK
+/**
+ * test Eval Multiple
+ */
+	<<
+rule simple_rule 
+  when
+	eval(abc("foo") + 5)
+	Foo()
+	eval(qed())
+	Bar()
+  then
+	Kapow
+	Poof
+	
+end>>
+		OK
+/**
+ * test With Eval
+ */
+	<<
+rule simple_rule 
+  when
+	Foo()
+	Bar()
+	eval(abc("foo"))
+  then
+	Kapow
+	
+end>>
+		OK
+/**
+ * test With Retval
+ */
+	<<
+rule simple_rule 
+  when
+	Foo(name== (a + b))
+  then
+	Kapow
+	
+end>>
+		OK
+/**
+ * test With Predicate
+ */
+	<<
+rule simple_rule 
+  when
+  	Person( $age2:age -> ($age2 == $age1+2 ) ) 
+  then
+	foo bar
+end>>
+		OK
+/**
+ * test Not With Constraint
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+global java.util.List list;
+global java.lang.Integer five;
+
+rule "not rule test"
+    when
+        $person : Person( $likes:like )
+        not Cheese( type == $likes )
+    then
+		list.add( $person );
+end    >>
+		OK
+/**
+ * test Global
+ */
+	<<package org.drools.test;
+
+import org.drools.Cheese;
+
+global java.lang.String foo
+global java.lang.Integer bar;
+
+rule baz
+    when
+        Cheese( )
+    then
+
+end    >>
+		OK
+/**
+ * test Functions
+ */
+	<<
+import java.lang.String
+
+function String functionA(String s, Integer i) {
+	
+	foo();
+
+}
+
+function void functionB() {
+	bar();	
+}
+
+
+rule something 
+	when
+	then
+end
+
+rule "one more thing"
+	when
+	then
+end
+
+
+
+	>>
+		OK
+/**
+ * test Comment
+ */
+	<<#this starts with a comment
+package foo.bar
+
+//and another comment
+
+/*
+yet
+	   another
+   				style
+*/
+
+rule "test"
+  when
+  then
+end>>
+		OK
+/**
+ * test Attributes
+ */
+	<<
+
+
+rule simple_rule 
+		#attributes keywork (and colon) is totally optional
+		salience 42
+		agenda-group "my_group"
+		no-loop 
+		duration 42
+		activation-group "my_activation_group"
+		lock-on-active true
+	when
+		Foo()
+	then
+		bar();
+end>>
+		OK
+/**
+ * test Attributes alternate Syntax
+ */
+	<<
+
+
+rule simple_rule 
+	attributes: 
+		salience 42, agenda-group "my_group", no-loop,  lock-on-active, duration 42, activation-group "my_activation_group"
+	when
+		Foo()
+	then
+		bar();
+end>>
+		OK
+/**
+ * test Enumeration
+ */
+	<<
+rule simple_rule 
+  when
+  	Foo(bar == Foo.BAR)
+  then
+end>>
+		OK
+/**
+ * test Syntax Damage
+ */
+	<<rule one
+  when
+    exists Foo()
+    exits Bar()
+  then
+end
+
+rule two 
+  when
+    ford = ford = ford
+  then
+end>>
+		FAIL
+/**
+ * test Extra Lhs Newline
+ */
+	<<
+rule "another test"
+    when
+        s : String()
+        eval(s.equals("foo") && s.startsWith("f"))
+        
+        
+    then
+        list.add( s );
+end >>
+		OK
+/**
+ * test Sounds Like
+ */
+	<<package nesting;
+
+
+
+
+rule "test something"
+
+	when
+		p: Person( name soundslike "Michael" )
+	then
+		p.name = "goober"
+		System.out.println(p.name)
+end>>
+		OK
+/**
+ * test Package Attributes
+ */
+	<<package com.foo;
+
+agenda-group "x"
+
+import goo.ber
+import wee.waa
+
+
+dialect "java"
+
+
+
+
+rule bar
+  when
+  then
+end
+
+rule baz
+  dialect "mvel"
+  when
+  then
+end>>
+		OK
+/**
+ * test Statement Ordering 1
+ */
+	<<
+package com.foo;
+
+import im.one
+
+import im.two
+
+rule foo
+  when
+  then
+end
+
+function cheeseIt() {
+
+}
+
+import im.three;
+
+rule bar
+  when
+  then
+end
+
+function uncheeseIt() {
+
+}
+
+import im.four;>>
+		OK
+/**
+ * test Rule Names Starting With Numbers
+ */
+	<<
+rule "1. Do Stuff!"
+  when
+  then
+end
+
+rule "2. Do More Stuff!"
+  when
+  then
+end>>
+		OK
+/**
+ * test Eval With Newline
+ */
+	<<
+rule simple_rule 
+  when
+	Foo()
+	Bar()
+	eval(
+	
+	
+	
+	       abc(
+	       
+	       "foo") + 
+	       5
+	       
+	       
+	       
+	        
+	       )
+  then
+	Kapow
+	Poof
+	
+end>>
+		OK
+/**
+ * test Syntax Damage
+ */
+	<<
+rule simple_rule 
+  when
+	eval(abc();)
+  then
+	Kapow
+	Poof
+end>>
+		FAIL
+/**
+ * test End Position
+ */
+	<<
+
+
+rule simple_rule 
+  when
+	Foo(
+	  bar == baz, la==laz
+	  )
+  then
+	Kapow
+	Poof
+end
+	>>
+		OK
+/**
+ * test Qualified Classname
+ */
+	<<package org.drools.test;
+
+rule "Who likes Stilton"
+    when
+        com.cheeseco.Cheese($type : type == "stilton")
+    then
+        System.out.println( $name + " likes " + $type);
+end    >>
+		OK
+/**
+ * test Accumulate
+ */
+	<<rule "AccumulateParserTest"
+when
+     Integer() from accumulate( Person( age > 21 ),
+                                init( int x = 0; ),
+                                action( x++; ),
+                                result( new Integer(x) ) );
+then
+end>>
+		OK
+/**
+ * test Accumulate With Bindings
+ */
+	<<rule "AccumulateParserTest"
+when
+     $counter:Integer() from accumulate( $person : Person( age > 21 ),
+                                         init( int x = 0; ),
+                                         action( x++; ),
+                                         result( new Integer(x) ) );
+then
+end>>
+		OK
+/**
+ * test Collect
+ */
+	<<rule "CollectParserTest"
+when
+     $personList : ArrayList() from collect( Person( age > 21 ) );
+then
+end>>
+		OK
+	<<rule "test_Quotes"
+   when
+      InitialFact()
+   then
+      String s = "\"\n\t\\";
+end >>
+		OK
+/**
+ * test Nested CEs
+ */
+	<<rule "test nested CEs"	
+	when
+	    not ( State( $state : state ) and
+	          not( Person( status == $state, $likes : likes ) and
+	               Cheese( type == $likes ) ) )
+	    Person( name == "Bob" )
+	    ( Cheese( price == 10 ) or Cheese( type == "brie" ) )
+	then 
+		results.add("OK");		
+end>>
+		OK
+/**
+ * test For All
+ */
+	<<rule "ForallParserTest"
+when
+     forall( Person( age > 21, $likes : likes )
+             Cheese( type == $likes ) );
+then
+end>>
+		OK
+/**
+ * test In Operator
+ */
+	<<#testing 'in' operator
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type in ( "sedan", "wagon" ), age < 3)
+  then
+	consequence();
+end>>
+		OK
+/**
+ * test Not In Operator
+ */
+	<<#testing not 'in' operator
+
+rule simple_rule 
+  when
+  	Person(age > 30 && < 40)
+  	Vehicle(type not in ( "sedan", "wagon" ), age < 3)
+  then
+	consequence();
+end>>
+		OK
+/**
+ * test Semicolon
+ */
+	<<package org.drools;
+
+global java.util.List list;
+
+rule "rule1"
+when
+    Pattern1();
+    Pattern2() from x.y.z;
+then
+    System.out.println("Test");
+end;
+
+query "query1"
+	Pattern5();
+	Pattern6();
+	Pattern7();
+end;
+
+rule "rule2"
+when
+    Pattern3();
+    Pattern4() from collect( Pattern5() );
+then
+    System.out.println("Test");
+end;
+
+	>>
+		OK
+/**
+ * test Eval
+ */
+	<<package org.drools
+
+rule "Test Parse"
+
+when
+    eval( 3==3 )
+then
+    System.out.println("OK");
+end >>
+		OK
+/**
+ * test Accumulate Reverse
+ */
+	<<rule "AccumulateReverseParserTest"
+when
+     Integer() from accumulate( Person( age > 21 ),
+                                init( int x = 0; ),
+                                action( x++; ),
+                                reverse( x--; ),
+                                result( new Integer(x) ) );
+then
+end>>
+		OK
+/**
+ * test Accumulate External Function
+ */
+	<<rule "AccumulateReverseParserTest"
+when
+     Number() from accumulate( Person( $age : age > 21 ),
+                               average( $age ) );
+then
+end>>
+		OK
+/**
+ * test Collect With Nested From
+ */
+	<<rule "CollectParserTest"
+when
+     #bellow statement makes no sense, but is useful to test parsing recursiveness
+     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );
+then
+end
+
+	>>
+		OK
+/**
+ * test Accumulate With Nested From
+ */
+	<<rule "AccumulateParserTest"
+when
+     #bellow statement makes no sense, but is useful to test parsing recursiveness
+     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),
+                                                max( $age ) );
+then
+end
+
+	>>
+		OK
+/**
+ * test Or CE
+ */
+	<<package org.drools;
+
+rule "testing OR CE"
+when
+    $p : Person( name == "bob" )
+    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )
+then
+    // do something
+end >>
+		OK
+/**
+ * test Rule Single Line
+ */
+	<<rule "another test" salience 10 when eval( true ) then System.out.println(1); end>>
+		OK
+/**
+ * test Rule Two Lines
+ */
+	<<rule "another test" salience 10 when eval( true ) then System.out.println(1);
+end>>
+		OK
+
+/**
+ * test Accumulate Multi Pattern
+ */
+	<<rule "AccumulateMultiPatternParserTest"
+when
+     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),
+                                         init( int x = 0; ),
+                                         action( x++; ),
+                                         result( new Integer(x) ) );
+then
+end>>
+		OK
+/**
+ * test Syntax Damage
+ */
+	<<package org.drools;
+
+rule "test rule"
+	salience 10
+	when
+		$c: WorkerPerformanceContext(eval)$c.getBalanceMonth() != null))
+	then
+		retract($p);
+end
+	>>
+		FAIL
+/**
+ * test Syntax Damage
+ */
+	<<package org.drools;
+
+rule "Avoid NPE on wrong syntax"
+when
+    not( Cheese( ( type == "stilton", price == 10 ) || ( type == "brie", price == 15 ) ) from $cheeseList )
+then
+    System.out.println("OK");
+end>>
+		FAIL
+
+/**
+ * test Pluggable Operators
+ */
+	<<package org.drools;
+
+rule "test pluggable operators"
+when
+    $a : EventA()
+    $b : EventB( this `after[1,10] $a )
+    $c : EventC( this finishes $b )
+    $d : EventD( this not starts $a )
+    $e : EventE( this not `before [1, 10] $b )
+then
+end>>
+		OK
+
+lhs walks pattern_source:
+/**
+ * test Entry Point
+ */
+	<<StockTick( symbol=="ACME") from entry-point StreamA>>
+		OK
+
+lhs_block walks normal_lhs_block:
+
+/**
+ * test Empty lhs
+ */
+	"" OK
+/**
+ * test Member Of
+ */
+	<<
+     Country( $cities : city )
+     Person( city memberOf $cities )
+    >>
+    	OK
+/**
+ * test Not Member Of
+ */
+	<<
+     Country( $cities : city )
+     Person( city not memberOf $cities )
+    >>
+    	OK
+/**
+ * test Constraint And Connective
+ */
+	<< Person( age < 42 && location=="atlanta") >>
+		OK
+
+/**
+ * test Constraint Or Connective
+ */
+	<< Person( age < 42 || location=="atlanta") >>
+		OK
+
+/**
+ * test Constraint Connectives Precedence
+ */
+	<<Person( age < 42 && location=="atlanta" || age > 20 && location=="Seatle" || location == "Chicago")>>
+		OK
+
+/**
+ * test Constraint Connectives Precedence With Bracks
+ */
+	<<Person( age < 42 && ( location=="atlanta" || age > 20 && location=="Seatle") || location == "Chicago")>>
+		OK
+
+/**
+ * test Constraint Connectives Precedence With Bracks2
+ */
+	<< Person( ( age == 70 && hair == "black" ) || ( age == 40 && hair == "pink" ) || ( age == 12 && ( hair == "yellow" || hair == "blue" ) ) ) >>
+		OK
+
+/**
+ * test Constraint Connectives Matches
+ */
+	<< Person( name matches "mark" || matches "bob" ) >>
+		OK
+
+/**
+ * test Not Contains
+ */
+	<<
+	City( $city : city )
+	Country( cities not contains $city )
+	>>
+		OK
+
+/**
+ * test Not Matches
+ */
+	<< Message( text not matches '[abc]*' ) >>
+		OK
+	
+/**
+ * test Restrictions
+ */
+	<<Foo( bar > 1 || == 1 )>>
+		OK
+
+/**
+ * test Rule Parse Lhs 3
+ */
+	<<
+	(or
+	not Person()
+		(and Cheese()
+			Meat()
+			Wine()))
+	>>
+		OK
+
+/**
+ * test Restriction Connectives
+ */
+	<<Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == "black" ) || ( age == 40 && hair == "pink" ) || ( age == 12 && ( hair == "yellow" || hair == "blue" ) ))>>
+		OK
+
+/**
+ * test Accessor Paths
+ */
+	<<org   .   drools/*comment*/	  .Message( text not matches $c#comment
+. property )
+>>
+		OK
+
+/**
+ * test General Lhs
+ */
+<< $id : Something( duration == "foo") >>
+	OK
+"foo3 : Bar(" FAIL
+<<
+Cheese(name == "Stilton", age==2001)
+Wine(name == "Grange", age == "1978", accolades contains "world champion")
+>> OK
+"Foo()"
+	OK
+<<not Cheese(type == "stilton")>>
+	OK
+<<
+Person(age < 42, location=="atlanta") 
+or
+Person(name=="bob")
+>>
+	OK
+<<
+Foo(bar == false)
+Foo(boo > -42)
+Foo(boo > -42.42)
+>>
+	OK
+"Cheese( )" 
+	OK
+	
+<<
+Col1() from something.doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+Col2()
+>>
+	OK
+<<
+Col1() from doIt( foo,bar,42,"hello",{ a => "b", "something" => 42, "a" => foo, x => {x=>y}},"end", [a, "b", 42] )
+Col2()
+>>
+	OK	
+<<
+Col1() from something.doIt
+Col2()
+>>
+	OK
+<<
+Col1() from something.doIt["key"]
+Col2()
+>>
+	OK
+<<
+Col1() from doIt1( foo,bar,42,"hello",{ a => "b"}, [a, "b", 42] )
+            .doIt2(bar, [a, "b", 42]).field["key"]
+Col2()
+>>
+	OK
+<<
+foo3 : Bar(a==3)
+foo4 : Bar(a4:a==4)
+Baz()
+>>
+	OK
+<<
+Person(age > 30 && < 40)
+Vehicle(type == "sedan" || == "wagon", age < 3)
+>>
+	OK
+"    foo3 : Bar(a==3) ; foo4 : Bar(a4:a==4) ; Baz()"
+	OK
+<<
+not ( Cheese(type == "stilton") )
+exists ( Foo() )
+>>
+	OK
+<<
+not ( Cheese(type == "stilton") )
+exists ( Foo() )
+>>
+	OK
+<<
+a : (not ( Cheese(type == "stilton") ))
+exists ( Foo() )
+>>
+	FAIL
+<< Cheese( t:type == "cheddar" ) >>
+	OK
+
+"Cheese( $type:type )"
+	OK
+<<
+    Cheese($type : type == "stilton")
+    $person : Person($name : name == "bob", likes == $type)        
+>>
+	OK
+<<
+Person(name == "mark") or 
+( Person(type == "fan") and Cheese(type == "green") )
+>>
+	OK
+<<
+Person(name == "mark") && Cheese(type == "stilton")
+Person(name == "mark") || Cheese(type == "stilton")
+>>
+	OK
+<<
+foo :  ( Person(name == "mark") or Person(type == "fan") ) 
+Cheese(type == "green")
+>>
+	OK
+<<
+foo : ( Person(name == "mark") 
+	or 
+	Person(type == "fan") )
+>>
+	OK
+<<
+foo : ( 
+	Person(name == "mark") or Person(type == "fan") 
+	)
+>>
+	OK
+<<
+ ( (not Foo(x=="a") or Foo(x=="y") ) and ( Shoes() or Butt() ) )
+>>
+	OK
+<<
+eval(abc("foo") + 5)
+Foo()
+eval(qed())
+Bar()
+>>
+	OK
+<<
+Foo()
+Bar()
+eval(abc("foo"))
+>>
+	OK
+"Foo(name== (a + b))"
+	OK
+
+"Person( $age2:age -> ($age2 == $age1+2 ) )"
+	OK
+
+"Foo(bar == Foo.BAR)"
+	OK
+<<
+p: Person( name soundslike "Michael" )
+>>
+	OK
+
+<<
+Foo()
+Bar()
+eval(
+
+
+
+       abc(
+       
+       "foo") + 
+       5
+       
+       
+       
+        
+       )
+>>
+	OK
+
+"eval(abc();)"
+	FAIL
+
+<<
+Foo(
+  bar == baz, la==laz
+  )
+ >>
+ 	OK
+
+<<com.cheeseco.Cheese($type : type == "stilton")>>
+	OK
+
+<<
+     Integer() from accumulate( Person( age > 21 ),
+                            init( int x = 0; ),
+                            action( x++; ),
+                            result( new Integer(x) ) );
+>>
+	OK
+
+<<
+ $counter:Integer() from accumulate( $person : Person( age > 21 ),
+                                     init( int x = 0; ),
+                                     action( x++; ),
+                                     result( new Integer(x) ) );
+>>
+	OK
+
+"$personList : ArrayList() from collect( Person( age > 21 ) );"
+	OK
+
+
+<<
+	not ( State( $state : state ) and
+          not( Person( status == $state, $likes : likes ) and
+               Cheese( type == $likes ) ) )
+    Person( name == "Bob" )
+    ( Cheese( price == 10 ) or Cheese( type == "brie" ) )
+>>
+	OK
+
+<<
+ forall( Person( age > 21, $likes : likes )
+         Cheese( type == $likes ) );
+>>
+	OK
+
+
+	<<
+  	Person(age > 30 && < 40)
+  	Vehicle(type in ( "sedan", "wagon" ), age < 3)
+	>>
+		OK
+
+	<<
+  	Person(age > 30 && < 40)
+  	Vehicle(type not in ( "sedan", "wagon" ), age < 3)
+	>>
+		OK
+
+		<<
+		Pattern1();
+		Pattern2() from x.y.z;
+		Pattern5();
+		Pattern6();
+		Pattern7();
+		Pattern3();
+		Pattern4() from collect( Pattern5() );
+		>>
+			OK
+
+		<< eval( 3==3 ) >>
+			OK
+
+		<<
+		Integer() from accumulate( Person( age > 21 ),
+		                           init( int x = 0; ),
+		                           action( x++; ),
+		                           reverse( x--; ),
+		                           result( new Integer(x) ) );
+		>>
+			OK
+
+		<<
+	     Number() from accumulate( Person( $age : age > 21 ),
+	                               average( $age ) );
+		>>
+			OK
+
+		<<
+	     #bellow statement makes no sense, but is useful to test parsing recursiveness
+	     $personList : ArrayList() from collect( $p : Person( age > 21 || age < 10 ) from collect( People() from $town.getPeople() ) );
+		>>
+			OK
+
+		<<
+	     $personList : ArrayList() from accumulate( Person( $age : age > 21 || < 10 ) from collect( People() from $town.getPeople() ),
+	                                                max( $age ) );
+		>>
+			OK
+
+		<<
+	    $p : Person( name == "bob" )
+	    $c : Cheese( type == $p.likes ) || Cheese( price == 10 )
+	    >>
+	    	OK
+			<<
+		     $counter:Integer() from accumulate( $person : Person( age > 21 ) and Cheese( type == $person.likes ),
+		                                         init( int x = 0; ),
+		                                         action( x++; ),
+		                                         result( new Integer(x) ) );
+			>>
+				OK
+
+			<<
+		    $a : EventA()
+		    $b : EventB( this `after[1,10] $a )
+		    $c : EventC( this finishes $b )
+		    $d : EventD( this not starts $a )
+		    $e : EventE( this not `before [1, 10] $b )
+			>>
+				OK
+
+			<<StockTick( symbol=="ACME") from entry-point StreamA>>
+				OK
+
+/**
+ * test Constraint
+ */
+fact_expression walks constraints:
+	<<eval( $var.equals("xyz") )>>
+		OK
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	2008-07-21 16:09:44 UTC (rev 21145)
@@ -24,7 +24,7 @@
 rule "coincides operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~coincides $a )
+    $b : StockTick( company == "ACME", this coincides $a )
 then
     results_coincides.add( $b );
 end
@@ -32,7 +32,7 @@
 rule "before operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~before[5,8] $a )
+    $b : StockTick( company == "ACME", this before[5,8] $a )
 then
     results_before.add( $b );
 end
@@ -40,7 +40,7 @@
 rule "after operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~after[5,8] $a )
+    $b : StockTick( company == "ACME", this after[5,8] $a )
 then
     results_after.add( $b );
 end
@@ -48,7 +48,7 @@
 rule "meets operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~meets[1] $a )
+    $b : StockTick( company == "ACME", this meets[1] $a )
 then
     results_meets.add( $b );
 end
@@ -56,7 +56,7 @@
 rule "met-by operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~metby[1] $a )
+    $b : StockTick( company == "ACME", this metby[1] $a )
 then
     results_met_by.add( $b );
 end
@@ -65,7 +65,7 @@
 rule "overlaps operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~overlaps[1] $a )
+    $b : StockTick( company == "DROO", this overlaps[1] $a )
 then
     results_overlaps.add( $b );
 end
@@ -73,7 +73,7 @@
 rule "overlapped-by operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~overlappedby[1] $a )
+    $b : StockTick( company == "ACME", this overlappedby[1] $a )
 then
     results_overlapped_by.add( $b );
 end
@@ -81,7 +81,7 @@
 rule "during operator"
 when
     $a : StockTick( company == "DROO" )
-    $b : StockTick( company == "ACME", this ~during[1] $a )
+    $b : StockTick( company == "ACME", this during[1] $a )
 then
     results_during.add( $b );
 end
@@ -89,7 +89,7 @@
 rule "includes operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "DROO", this ~includes[1] $a )
+    $b : StockTick( company == "DROO", this includes[1] $a )
 then
     results_includes.add( $b );
 end
@@ -97,7 +97,7 @@
 rule "starts operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "ACME", this ~starts[2] $a )
+    $b : StockTick( company == "ACME", this starts[2] $a )
 then
     results_starts.add( $b );
 end
@@ -105,7 +105,7 @@
 rule "started-by operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "ACME", this ~startedby[2] $a )
+    $b : StockTick( company == "ACME", this startedby[2] $a )
 then
     results_started_by.add( $b );
 end
@@ -113,7 +113,7 @@
 rule "finishes operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "ACME", this ~finishes[2] $a )
+    $b : StockTick( company == "ACME", this finishes[2] $a )
 then
     results_finishes.add( $b );
 end
@@ -121,7 +121,7 @@
 rule "finished-by operator"
 when
     $a : StockTick( company == "ACME" )
-    $b : StockTick( company == "ACME", this ~finishedby[2] $a )
+    $b : StockTick( company == "ACME", this finishedby[2] $a )
 then
     results_finished_by.add( $b );
 end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/not_pluggable_operator.drl (from rev 20351, labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/resources/org/drools/lang/not_pluggable_operator.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/not_pluggable_operator.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/not_pluggable_operator.drl	2008-07-21 16:09:44 UTC (rev 21145)
@@ -0,0 +1,5 @@
+rule "test something"
+    when
+      p: Person( street == "Low" && sss[1] == 234 )
+    then
+    end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl	2008-07-21 16:09:44 UTC (rev 21145)
@@ -3,9 +3,9 @@
 rule "test pluggable operators"
 when
     $a : EventA()
-    $b : EventB( this ~after[1,10] $a )
-    $c : EventC( this ~finishes $b )
-    $d : EventD( this not ~starts $a )
-    $e : EventE( this not ~before [1, 10] $b )
+    $b : EventB( this ` after[1,10] $a )
+    $c : EventC( this finishes $b )
+    $d : EventD( this not starts $a )
+    $e : EventE( this not ` before [1, 10] $b )
 then
 end
\ No newline at end of file

Modified: labs/jbossrules/trunk/pom.xml
===================================================================
--- labs/jbossrules/trunk/pom.xml	2008-07-21 15:22:11 UTC (rev 21144)
+++ labs/jbossrules/trunk/pom.xml	2008-07-21 16:09:44 UTC (rev 21145)
@@ -858,9 +858,14 @@
             <dependency>
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr-runtime</artifactId>
-                <version>3.0</version>
+                <version>3.0.1</version>
             </dependency>
             <dependency>
+			    <groupId>org.antlr</groupId>
+			    <artifactId>gunit</artifactId>
+                <version>1.0.1</version>
+            </dependency>
+            <dependency>
                 <groupId>org.eclipse.jdt</groupId>
                 <artifactId>core</artifactId>
                 <version>3.2.3.v_686_R32x</version>




More information about the jboss-svn-commits mailing list