[jboss-svn-commits] JBL Code SVN: r6167 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/lang drools-compiler/src/main/java/org/drools/lang/descr drools-compiler/src/main/java/org/drools/semantics/java drools-compiler/src/main/resources/org/drools/lang drools-compiler/src/test/java/org/drools/integrationtests drools-compiler/src/test/java/org/drools/lang drools-compiler/src/test/resources/org/drools/integrationtests drools-compiler/src/test/resources/org/drools/lang drools-core/src/main/java/org/drools/reteoo drools-core/src/main/java/org/drools/rule drools-core/src/test/java/org/drools/reteoo

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Sep 12 08:08:50 EDT 2006


Author: tirelli
Date: 2006-09-12 08:08:19 -0400 (Tue, 12 Sep 2006)
New Revision: 6167

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/CollectDescr.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Collect.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/collect.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParser.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParserLexer.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/semantics/java/RuleBuilder.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/IntegrationCases.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
Log:
JBRULES-486:
  
  * Adding Collect conditional element support to core and compiler
  * Adding test cases




Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParser.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParser.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParser.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0ea8 D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g 2006-09-06 10:48:01
+// $ANTLR 3.0ea8 D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g 2006-09-11 08:58:37
 
 	package org.drools.lang;
 	import java.util.List;
@@ -17,7 +17,7 @@
 
 public class RuleParser extends Parser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "EOL", "ID", "INT", "BOOL", "STRING", "FLOAT", "MISC", "WS", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT", "\';\'", "\'package\'", "\'import\'", "\'function\'", "\'.\'", "\'.*\'", "\'expander\'", "\'global\'", "\'(\'", "\',\'", "\')\'", "\'{\'", "\'}\'", "\'query\'", "\'end\'", "\'template\'", "\'rule\'", "\'when\'", "\':\'", "\'then\'", "\'attributes\'", "\'salience\'", "\'no-loop\'", "\'auto-focus\'", "\'activation-group\'", "\'agenda-group\'", "\'duration\'", "\'from\'", "\'accumulate\'", "\'init\'", "\'action\'", "\'result\'", "\'null\'", "\'=>\'", "\'[\'", "\']\'", "\'or\'", "\'||\'", "\'&\'", "\'|\'", "\'->\'", "\'and\'", "\'&&\'", "\'exists\'", "\'not\'", "\'eval\'", "\'use\'", "\'==\'", "\'=\'", "\'>\'", "\'>=\'", "\'<\'", "\'<=\'", "\'!=\'", "\'contains\'", "\'matches\'", "\'excludes\'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "EOL", "ID", "INT", "BOOL", "STRING", "FLOAT", "MISC", "WS", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT", "\';\'", "\'package\'", "\'import\'", "\'function\'", "\'.\'", "\'.*\'", "\'expander\'", "\'global\'", "\'(\'", "\',\'", "\')\'", "\'{\'", "\'}\'", "\'query\'", "\'end\'", "\'template\'", "\'rule\'", "\'when\'", "\':\'", "\'then\'", "\'attributes\'", "\'salience\'", "\'no-loop\'", "\'auto-focus\'", "\'activation-group\'", "\'agenda-group\'", "\'duration\'", "\'from\'", "\'accumulate\'", "\'init\'", "\'action\'", "\'result\'", "\'collect\'", "\'null\'", "\'=>\'", "\'[\'", "\']\'", "\'or\'", "\'||\'", "\'&\'", "\'|\'", "\'->\'", "\'and\'", "\'&&\'", "\'exists\'", "\'not\'", "\'eval\'", "\'use\'", "\'==\'", "\'=\'", "\'>\'", "\'>=\'", "\'<\'", "\'<=\'", "\'!=\'", "\'contains\'", "\'matches\'", "\'excludes\'"
     };
     public static final int BOOL=7;
     public static final int INT=6;
@@ -1319,7 +1319,7 @@
                     throw nvae;
                 }
                 break;
-            case 58:
+            case 59:
                 int LA18_4 = input.LA(2);
                 if (  expander != null  ) {
                     alt18=1;
@@ -1334,7 +1334,7 @@
                     throw nvae;
                 }
                 break;
-            case 59:
+            case 60:
                 int LA18_5 = input.LA(2);
                 if (  expander != null  ) {
                     alt18=1;
@@ -1349,7 +1349,7 @@
                     throw nvae;
                 }
                 break;
-            case 60:
+            case 61:
                 int LA18_6 = input.LA(2);
                 if (  expander != null  ) {
                     alt18=1;
@@ -1443,7 +1443,7 @@
             case 55:
             case 56:
             case 57:
-            case 61:
+            case 58:
             case 62:
             case 63:
             case 64:
@@ -1454,6 +1454,7 @@
             case 69:
             case 70:
             case 71:
+            case 72:
                 alt18=1;
                 break;
             default:
@@ -1789,7 +1790,7 @@
                                     throw nvae;
                                 }
                             }
-                            else if ( (LA21_0>=EOL && LA21_0<=32)||(LA21_0>=34 && LA21_0<=71) ) {
+                            else if ( (LA21_0>=EOL && LA21_0<=32)||(LA21_0>=34 && LA21_0<=72) ) {
                                 alt21=2;
                             }
                             else {
@@ -1895,7 +1896,7 @@
                                     throw nvae;
                                 }
                                 break;
-                            case 58:
+                            case 59:
                                 int LA22_6 = input.LA(2);
                                 if (  expander != null  ) {
                                     alt22=1;
@@ -1910,7 +1911,7 @@
                                     throw nvae;
                                 }
                                 break;
-                            case 59:
+                            case 60:
                                 int LA22_7 = input.LA(2);
                                 if (  expander != null  ) {
                                     alt22=1;
@@ -1925,7 +1926,7 @@
                                     throw nvae;
                                 }
                                 break;
-                            case 60:
+                            case 61:
                                 int LA22_8 = input.LA(2);
                                 if (  expander != null  ) {
                                     alt22=1;
@@ -2003,7 +2004,7 @@
                             case 55:
                             case 56:
                             case 57:
-                            case 61:
+                            case 58:
                             case 62:
                             case 63:
                             case 64:
@@ -2014,6 +2015,7 @@
                             case 69:
                             case 70:
                             case 71:
+                            case 72:
                                 alt22=1;
                                 break;
                             default:
@@ -2087,7 +2089,7 @@
                             if ( LA24_0==33 ) {
                                 alt24=1;
                             }
-                            else if ( (LA24_0>=EOL && LA24_0<=32)||(LA24_0>=34 && LA24_0<=71) ) {
+                            else if ( (LA24_0>=EOL && LA24_0<=32)||(LA24_0>=34 && LA24_0<=72) ) {
                                 alt24=2;
                             }
                             else {
@@ -2120,7 +2122,7 @@
                                 if ( LA26_0==29 ) {
                                     alt26=2;
                                 }
-                                else if ( (LA26_0>=EOL && LA26_0<=28)||(LA26_0>=30 && LA26_0<=71) ) {
+                                else if ( (LA26_0>=EOL && LA26_0<=28)||(LA26_0>=30 && LA26_0<=72) ) {
                                     alt26=1;
                                 }
 
@@ -3189,7 +3191,7 @@
             do {
                 int alt45=2;
                 int LA45_0 = input.LA(1);
-                if ( LA45_0==ID||LA45_0==23||(LA45_0>=58 && LA45_0<=60) ) {
+                if ( LA45_0==ID||LA45_0==23||(LA45_0>=59 && LA45_0<=61) ) {
                     alt45=1;
                 }
 
@@ -3329,6 +3331,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     alt47=1;
                     break;
                 case 15:
@@ -3819,8 +3822,69 @@
     // $ANTLR end accumulate_statement
 
 
+    // $ANTLR start collect_statement
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:814:1: collect_statement returns [CollectDescr d] : loc= 'from' opt_eol 'collect' opt_eol '(' opt_eol column= lhs_column opt_eol ')' ;
+    public CollectDescr collect_statement() throws RecognitionException {   
+        CollectDescr d;
+        Token loc=null;
+        PatternDescr column = null;
+
+
+        
+        		d = factory.createCollect();
+        	
+        try {
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:17: (loc= 'from' opt_eol 'collect' opt_eol '(' opt_eol column= lhs_column opt_eol ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:17: loc= 'from' opt_eol 'collect' opt_eol '(' opt_eol column= lhs_column opt_eol ')'
+            {
+            loc=(Token)input.LT(1);
+            match(input,42,FOLLOW_42_in_collect_statement1982); 
+            following.push(FOLLOW_opt_eol_in_collect_statement1984);
+            opt_eol();
+            following.pop();
+
+            match(input,47,FOLLOW_47_in_collect_statement1986); 
+            following.push(FOLLOW_opt_eol_in_collect_statement1988);
+            opt_eol();
+            following.pop();
+
+             
+            			d.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+            		
+            match(input,23,FOLLOW_23_in_collect_statement1998); 
+            following.push(FOLLOW_opt_eol_in_collect_statement2000);
+            opt_eol();
+            following.pop();
+
+            following.push(FOLLOW_lhs_column_in_collect_statement2004);
+            column=lhs_column();
+            following.pop();
+
+            following.push(FOLLOW_opt_eol_in_collect_statement2006);
+            opt_eol();
+            following.pop();
+
+            match(input,25,FOLLOW_25_in_collect_statement2008); 
+            
+            		        d.setSourceColumn( (ColumnDescr)column );
+            		
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return d;
+    }
+    // $ANTLR end collect_statement
+
+
     // $ANTLR start argument_list
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:814:1: argument_list returns [ArrayList args] : (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )? ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:829:1: argument_list returns [ArrayList args] : (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )? ;
     public ArrayList argument_list() throws RecognitionException {   
         ArrayList args;
         ArgumentValueDescr param = null;
@@ -3830,13 +3894,13 @@
         		args = new ArrayList();
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:17: ( (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )? )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:17: (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:834:17: ( (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )? )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:834:17: (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )?
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:17: (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:834:17: (param= argument_value ( opt_eol ',' opt_eol param= argument_value )* )?
             int alt51=2;
             int LA51_0 = input.LA(1);
-            if ( (LA51_0>=ID && LA51_0<=FLOAT)||LA51_0==26||LA51_0==47||LA51_0==49 ) {
+            if ( (LA51_0>=ID && LA51_0<=FLOAT)||LA51_0==26||LA51_0==48||LA51_0==50 ) {
                 alt51=1;
             }
             else if ( LA51_0==EOL||LA51_0==15||LA51_0==25 ) {
@@ -3844,15 +3908,15 @@
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("819:17: (param= argument_value ( opt_eol \',\' opt_eol param= argument_value )* )?", 51, 0, input);
+                    new NoViableAltException("834:17: (param= argument_value ( opt_eol \',\' opt_eol param= argument_value )* )?", 51, 0, input);
 
                 throw nvae;
             }
             switch (alt51) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:819:18: param= argument_value ( opt_eol ',' opt_eol param= argument_value )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:834:18: param= argument_value ( opt_eol ',' opt_eol param= argument_value )*
                     {
-                    following.push(FOLLOW_argument_value_in_argument_list1976);
+                    following.push(FOLLOW_argument_value_in_argument_list2041);
                     param=argument_value();
                     following.pop();
 
@@ -3861,25 +3925,25 @@
                     				args.add(param);
                     			}
                     		
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:825:17: ( opt_eol ',' opt_eol param= argument_value )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:840:17: ( opt_eol ',' opt_eol param= argument_value )*
                     loop50:
                     do {
                         int alt50=2;
                         alt50 = dfa50.predict(input); 
                         switch (alt50) {
                     	case 1 :
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:826:25: opt_eol ',' opt_eol param= argument_value
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:841:25: opt_eol ',' opt_eol param= argument_value
                     	    {
-                    	    following.push(FOLLOW_opt_eol_in_argument_list1992);
+                    	    following.push(FOLLOW_opt_eol_in_argument_list2057);
                     	    opt_eol();
                     	    following.pop();
 
-                    	    match(input,24,FOLLOW_24_in_argument_list1994); 
-                    	    following.push(FOLLOW_opt_eol_in_argument_list1996);
+                    	    match(input,24,FOLLOW_24_in_argument_list2059); 
+                    	    following.push(FOLLOW_opt_eol_in_argument_list2061);
                     	    opt_eol();
                     	    following.pop();
 
-                    	    following.push(FOLLOW_argument_value_in_argument_list2000);
+                    	    following.push(FOLLOW_argument_value_in_argument_list2065);
                     	    param=argument_value();
                     	    following.pop();
 
@@ -3919,7 +3983,7 @@
 
 
     // $ANTLR start argument_value
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:835:1: argument_value returns [ArgumentValueDescr value] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:850:1: argument_value returns [ArgumentValueDescr value] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array ) ;
     public ArgumentValueDescr argument_value() throws RecognitionException {   
         ArgumentValueDescr value;
         Token t=null;
@@ -3933,10 +3997,10 @@
         		String text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:840:17: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:840:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:855:17: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:855:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:840:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:855:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= 'null' | t= 'null' | m= inline_map | a= inline_array )
             int alt52=9;
             switch ( input.LA(1) ) {
             case STRING:
@@ -3954,90 +4018,90 @@
             case ID:
                 alt52=5;
                 break;
-            case 47:
+            case 48:
                 alt52=6;
                 break;
             case 26:
                 alt52=8;
                 break;
-            case 49:
+            case 50:
                 alt52=9;
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("840:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= \'null\' | t= \'null\' | m= inline_map | a= inline_array )", 52, 0, input);
+                    new NoViableAltException("855:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= ID | t= \'null\' | t= \'null\' | m= inline_map | a= inline_array )", 52, 0, input);
 
                 throw nvae;
             }
 
             switch (alt52) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:840:25: t= STRING
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:855:25: t= STRING
                     {
                     t=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_argument_value2040); 
+                    match(input,STRING,FOLLOW_STRING_in_argument_value2105); 
                      text = getString( t );  value=new ArgumentValueDescr(ArgumentValueDescr.STRING, text);
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:841:25: t= INT
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:856:25: t= INT
                     {
                     t=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_argument_value2051); 
+                    match(input,INT,FOLLOW_INT_in_argument_value2116); 
                      text = t.getText();  value=new ArgumentValueDescr(ArgumentValueDescr.INTEGRAL, text);
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:842:25: t= FLOAT
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:857:25: t= FLOAT
                     {
                     t=(Token)input.LT(1);
-                    match(input,FLOAT,FOLLOW_FLOAT_in_argument_value2064); 
+                    match(input,FLOAT,FOLLOW_FLOAT_in_argument_value2129); 
                      text = t.getText(); value=new ArgumentValueDescr(ArgumentValueDescr.DECIMAL, text); 
 
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:843:25: t= BOOL
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:858:25: t= BOOL
                     {
                     t=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_argument_value2075); 
+                    match(input,BOOL,FOLLOW_BOOL_in_argument_value2140); 
                      text = t.getText(); value=new ArgumentValueDescr(ArgumentValueDescr.BOOLEAN, text); 
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:844:25: t= ID
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:859:25: t= ID
                     {
                     t=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_argument_value2087); 
+                    match(input,ID,FOLLOW_ID_in_argument_value2152); 
                      text = t.getText(); value=new ArgumentValueDescr(ArgumentValueDescr.VARIABLE, text);
 
                     }
                     break;
                 case 6 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:845:25: t= 'null'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:860:25: t= 'null'
                     {
                     t=(Token)input.LT(1);
-                    match(input,47,FOLLOW_47_in_argument_value2098); 
+                    match(input,48,FOLLOW_48_in_argument_value2163); 
                      text = "null"; value=new ArgumentValueDescr(ArgumentValueDescr.NULL, text);
 
                     }
                     break;
                 case 7 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:846:25: t= 'null'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:861:25: t= 'null'
                     {
                     t=(Token)input.LT(1);
-                    match(input,47,FOLLOW_47_in_argument_value2109); 
+                    match(input,48,FOLLOW_48_in_argument_value2174); 
                      text = "null"; value=new ArgumentValueDescr(ArgumentValueDescr.NULL, text);
 
                     }
                     break;
                 case 8 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:847:25: m= inline_map
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:862:25: m= inline_map
                     {
-                    following.push(FOLLOW_inline_map_in_argument_value2128);
+                    following.push(FOLLOW_inline_map_in_argument_value2193);
                     m=inline_map();
                     following.pop();
 
@@ -4046,9 +4110,9 @@
                     }
                     break;
                 case 9 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:848:25: a= inline_array
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:863:25: a= inline_array
                     {
-                    following.push(FOLLOW_inline_array_in_argument_value2144);
+                    following.push(FOLLOW_inline_array_in_argument_value2209);
                     a=inline_array();
                     following.pop();
 
@@ -4075,7 +4139,7 @@
 
 
     // $ANTLR start inline_map
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:852:1: inline_map returns [ArgumentValueDescr.MapDescr mapDescr] : '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}' ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:867:1: inline_map returns [ArgumentValueDescr.MapDescr mapDescr] : '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}' ;
     public ArgumentValueDescr.MapDescr inline_map() throws RecognitionException {   
         ArgumentValueDescr.MapDescr mapDescr;
         ArgumentValueDescr key = null;
@@ -4087,19 +4151,19 @@
                 mapDescr = new ArgumentValueDescr.MapDescr();
             
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:856:8: ( '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:856:8: '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:871:8: ( '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:871:8: '{' (key= argument_value '=>' value= argument_value ) ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )* '}'
             {
-            match(input,26,FOLLOW_26_in_inline_map2184); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:857:12: (key= argument_value '=>' value= argument_value )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:857:14: key= argument_value '=>' value= argument_value
+            match(input,26,FOLLOW_26_in_inline_map2249); 
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:872:12: (key= argument_value '=>' value= argument_value )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:872:14: key= argument_value '=>' value= argument_value
             {
-            following.push(FOLLOW_argument_value_in_inline_map2202);
+            following.push(FOLLOW_argument_value_in_inline_map2267);
             key=argument_value();
             following.pop();
 
-            match(input,48,FOLLOW_48_in_inline_map2204); 
-            following.push(FOLLOW_argument_value_in_inline_map2208);
+            match(input,49,FOLLOW_49_in_inline_map2269); 
+            following.push(FOLLOW_argument_value_in_inline_map2273);
             value=argument_value();
             following.pop();
 
@@ -4111,7 +4175,7 @@
 
             }
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:12: ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:12: ( ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value )*
             loop55:
             do {
                 int alt55=2;
@@ -4123,9 +4187,9 @@
 
                 switch (alt55) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:14: ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:14: ( EOL )? ',' ( EOL )? key= argument_value '=>' value= argument_value
             	    {
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:14: ( EOL )?
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:14: ( EOL )?
             	    int alt53=2;
             	    int LA53_0 = input.LA(1);
             	    if ( LA53_0==EOL ) {
@@ -4136,54 +4200,54 @@
             	    }
             	    else {
             	        NoViableAltException nvae =
-            	            new NoViableAltException("864:14: ( EOL )?", 53, 0, input);
+            	            new NoViableAltException("879:14: ( EOL )?", 53, 0, input);
 
             	        throw nvae;
             	    }
             	    switch (alt53) {
             	        case 1 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:15: EOL
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:15: EOL
             	            {
-            	            match(input,EOL,FOLLOW_EOL_in_inline_map2251); 
+            	            match(input,EOL,FOLLOW_EOL_in_inline_map2316); 
 
             	            }
             	            break;
 
             	    }
 
-            	    match(input,24,FOLLOW_24_in_inline_map2255); 
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:25: ( EOL )?
+            	    match(input,24,FOLLOW_24_in_inline_map2320); 
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:25: ( EOL )?
             	    int alt54=2;
             	    int LA54_0 = input.LA(1);
             	    if ( LA54_0==EOL ) {
             	        alt54=1;
             	    }
-            	    else if ( (LA54_0>=ID && LA54_0<=FLOAT)||LA54_0==26||LA54_0==47||LA54_0==49 ) {
+            	    else if ( (LA54_0>=ID && LA54_0<=FLOAT)||LA54_0==26||LA54_0==48||LA54_0==50 ) {
             	        alt54=2;
             	    }
             	    else {
             	        NoViableAltException nvae =
-            	            new NoViableAltException("864:25: ( EOL )?", 54, 0, input);
+            	            new NoViableAltException("879:25: ( EOL )?", 54, 0, input);
 
             	        throw nvae;
             	    }
             	    switch (alt54) {
             	        case 1 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:864:26: EOL
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:879:26: EOL
             	            {
-            	            match(input,EOL,FOLLOW_EOL_in_inline_map2258); 
+            	            match(input,EOL,FOLLOW_EOL_in_inline_map2323); 
 
             	            }
             	            break;
 
             	    }
 
-            	    following.push(FOLLOW_argument_value_in_inline_map2264);
+            	    following.push(FOLLOW_argument_value_in_inline_map2329);
             	    key=argument_value();
             	    following.pop();
 
-            	    match(input,48,FOLLOW_48_in_inline_map2266); 
-            	    following.push(FOLLOW_argument_value_in_inline_map2270);
+            	    match(input,49,FOLLOW_49_in_inline_map2331); 
+            	    following.push(FOLLOW_argument_value_in_inline_map2335);
             	    value=argument_value();
             	    following.pop();
 
@@ -4201,7 +4265,7 @@
                 }
             } while (true);
 
-            match(input,27,FOLLOW_27_in_inline_map2306); 
+            match(input,27,FOLLOW_27_in_inline_map2371); 
 
             }
 
@@ -4218,7 +4282,7 @@
 
 
     // $ANTLR start inline_array
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:873:1: inline_array returns [List list] : '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']' ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:888:1: inline_array returns [List list] : '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']' ;
     public List inline_array() throws RecognitionException {   
         List list;
         ArgumentValueDescr arg = null;
@@ -4228,16 +4292,16 @@
             	list = new ArrayList();
             
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:878:5: ( '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:878:5: '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:893:5: ( '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:893:5: '[' arg= argument_value ( ( EOL )? ',' ( EOL )? arg= argument_value )* ']'
             {
-            match(input,49,FOLLOW_49_in_inline_array2350); 
-            following.push(FOLLOW_argument_value_in_inline_array2354);
+            match(input,50,FOLLOW_50_in_inline_array2415); 
+            following.push(FOLLOW_argument_value_in_inline_array2419);
             arg=argument_value();
             following.pop();
 
              list.add(arg); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:10: ( ( EOL )? ',' ( EOL )? arg= argument_value )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:10: ( ( EOL )? ',' ( EOL )? arg= argument_value )*
             loop58:
             do {
                 int alt58=2;
@@ -4249,9 +4313,9 @@
 
                 switch (alt58) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:12: ( EOL )? ',' ( EOL )? arg= argument_value
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:12: ( EOL )? ',' ( EOL )? arg= argument_value
             	    {
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:12: ( EOL )?
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:12: ( EOL )?
             	    int alt56=2;
             	    int LA56_0 = input.LA(1);
             	    if ( LA56_0==EOL ) {
@@ -4262,49 +4326,49 @@
             	    }
             	    else {
             	        NoViableAltException nvae =
-            	            new NoViableAltException("880:12: ( EOL )?", 56, 0, input);
+            	            new NoViableAltException("895:12: ( EOL )?", 56, 0, input);
 
             	        throw nvae;
             	    }
             	    switch (alt56) {
             	        case 1 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:12: EOL
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:12: EOL
             	            {
-            	            match(input,EOL,FOLLOW_EOL_in_inline_array2372); 
+            	            match(input,EOL,FOLLOW_EOL_in_inline_array2437); 
 
             	            }
             	            break;
 
             	    }
 
-            	    match(input,24,FOLLOW_24_in_inline_array2375); 
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:21: ( EOL )?
+            	    match(input,24,FOLLOW_24_in_inline_array2440); 
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:21: ( EOL )?
             	    int alt57=2;
             	    int LA57_0 = input.LA(1);
             	    if ( LA57_0==EOL ) {
             	        alt57=1;
             	    }
-            	    else if ( (LA57_0>=ID && LA57_0<=FLOAT)||LA57_0==26||LA57_0==47||LA57_0==49 ) {
+            	    else if ( (LA57_0>=ID && LA57_0<=FLOAT)||LA57_0==26||LA57_0==48||LA57_0==50 ) {
             	        alt57=2;
             	    }
             	    else {
             	        NoViableAltException nvae =
-            	            new NoViableAltException("880:21: ( EOL )?", 57, 0, input);
+            	            new NoViableAltException("895:21: ( EOL )?", 57, 0, input);
 
             	        throw nvae;
             	    }
             	    switch (alt57) {
             	        case 1 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:880:21: EOL
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:895:21: EOL
             	            {
-            	            match(input,EOL,FOLLOW_EOL_in_inline_array2377); 
+            	            match(input,EOL,FOLLOW_EOL_in_inline_array2442); 
 
             	            }
             	            break;
 
             	    }
 
-            	    following.push(FOLLOW_argument_value_in_inline_array2382);
+            	    following.push(FOLLOW_argument_value_in_inline_array2447);
             	    arg=argument_value();
             	    following.pop();
 
@@ -4318,7 +4382,7 @@
                 }
             } while (true);
 
-            match(input,50,FOLLOW_50_in_inline_array2395); 
+            match(input,51,FOLLOW_51_in_inline_array2460); 
 
             }
 
@@ -4335,7 +4399,7 @@
 
 
     // $ANTLR start fact_binding
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:885:1: fact_binding returns [PatternDescr d] : id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()] ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:900:1: fact_binding returns [PatternDescr d] : id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()] ;
     public PatternDescr fact_binding() throws RecognitionException {   
         PatternDescr d;
         Token id=null;
@@ -4347,21 +4411,21 @@
         		boolean multi=false;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:891:17: (id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()] )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:891:17: id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()]
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:906:17: (id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()] )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:906:17: id= ID opt_eol ':' opt_eol fe= fact_expression[id.getText()]
             {
             id=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_fact_binding2438); 
-            following.push(FOLLOW_opt_eol_in_fact_binding2448);
+            match(input,ID,FOLLOW_ID_in_fact_binding2503); 
+            following.push(FOLLOW_opt_eol_in_fact_binding2513);
             opt_eol();
             following.pop();
 
-            match(input,33,FOLLOW_33_in_fact_binding2450); 
-            following.push(FOLLOW_opt_eol_in_fact_binding2452);
+            match(input,33,FOLLOW_33_in_fact_binding2515); 
+            following.push(FOLLOW_opt_eol_in_fact_binding2517);
             opt_eol();
             following.pop();
 
-            following.push(FOLLOW_fact_expression_in_fact_binding2456);
+            following.push(FOLLOW_fact_expression_in_fact_binding2521);
             fe=fact_expression(id.getText());
             following.pop();
 
@@ -4384,7 +4448,7 @@
 
 
     // $ANTLR start fact_expression
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:899:2: fact_expression[String id] returns [PatternDescr pd] : ( '(' opt_eol fe= fact_expression[id] opt_eol ')' | f= fact opt_eol ( ('or'|'||') opt_eol f= fact )* );
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:914:2: fact_expression[String id] returns [PatternDescr pd] : ( '(' opt_eol fe= fact_expression[id] opt_eol ')' | f= fact opt_eol ( ('or'|'||') opt_eol f= fact )* );
     public PatternDescr fact_expression(String id) throws RecognitionException {   
         PatternDescr pd;
         PatternDescr fe = null;
@@ -4397,7 +4461,7 @@
          		boolean multi = false;
          	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:904:17: ( '(' opt_eol fe= fact_expression[id] opt_eol ')' | f= fact opt_eol ( ('or'|'||') opt_eol f= fact )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:919:17: ( '(' opt_eol fe= fact_expression[id] opt_eol ')' | f= fact opt_eol ( ('or'|'||') opt_eol f= fact )* )
             int alt60=2;
             int LA60_0 = input.LA(1);
             if ( LA60_0==23 ) {
@@ -4408,40 +4472,40 @@
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("899:2: fact_expression[String id] returns [PatternDescr pd] : ( \'(\' opt_eol fe= fact_expression[id] opt_eol \')\' | f= fact opt_eol ( (\'or\'|\'||\') opt_eol f= fact )* );", 60, 0, input);
+                    new NoViableAltException("914:2: fact_expression[String id] returns [PatternDescr pd] : ( \'(\' opt_eol fe= fact_expression[id] opt_eol \')\' | f= fact opt_eol ( (\'or\'|\'||\') opt_eol f= fact )* );", 60, 0, input);
 
                 throw nvae;
             }
             switch (alt60) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:904:17: '(' opt_eol fe= fact_expression[id] opt_eol ')'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:919:17: '(' opt_eol fe= fact_expression[id] opt_eol ')'
                     {
-                    match(input,23,FOLLOW_23_in_fact_expression2488); 
-                    following.push(FOLLOW_opt_eol_in_fact_expression2490);
+                    match(input,23,FOLLOW_23_in_fact_expression2553); 
+                    following.push(FOLLOW_opt_eol_in_fact_expression2555);
                     opt_eol();
                     following.pop();
 
-                    following.push(FOLLOW_fact_expression_in_fact_expression2494);
+                    following.push(FOLLOW_fact_expression_in_fact_expression2559);
                     fe=fact_expression(id);
                     following.pop();
 
-                    following.push(FOLLOW_opt_eol_in_fact_expression2496);
+                    following.push(FOLLOW_opt_eol_in_fact_expression2561);
                     opt_eol();
                     following.pop();
 
-                    match(input,25,FOLLOW_25_in_fact_expression2498); 
+                    match(input,25,FOLLOW_25_in_fact_expression2563); 
                      pd=fe; 
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:905:17: f= fact opt_eol ( ('or'|'||') opt_eol f= fact )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:920:17: f= fact opt_eol ( ('or'|'||') opt_eol f= fact )*
                     {
-                    following.push(FOLLOW_fact_in_fact_expression2509);
+                    following.push(FOLLOW_fact_in_fact_expression2574);
                     f=fact();
                     following.pop();
 
-                    following.push(FOLLOW_opt_eol_in_fact_expression2511);
+                    following.push(FOLLOW_opt_eol_in_fact_expression2576);
                     opt_eol();
                     following.pop();
 
@@ -4449,31 +4513,31 @@
                      			((ColumnDescr)f).setIdentifier( id );
                      			pd = f;
                      		
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:910:17: ( ('or'|'||') opt_eol f= fact )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:925:17: ( ('or'|'||') opt_eol f= fact )*
                     loop59:
                     do {
                         int alt59=2;
                         int LA59_0 = input.LA(1);
-                        if ( (LA59_0>=51 && LA59_0<=52) ) {
+                        if ( (LA59_0>=52 && LA59_0<=53) ) {
                             alt59=1;
                         }
 
 
                         switch (alt59) {
                     	case 1 :
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:910:25: ('or'|'||') opt_eol f= fact
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:925:25: ('or'|'||') opt_eol f= fact
                     	    {
-                    	    if ( (input.LA(1)>=51 && input.LA(1)<=52) ) {
+                    	    if ( (input.LA(1)>=52 && input.LA(1)<=53) ) {
                     	        input.consume();
                     	        errorRecovery=false;
                     	    }
                     	    else {
                     	        MismatchedSetException mse =
                     	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_fact_expression2524);    throw mse;
+                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_fact_expression2589);    throw mse;
                     	    }
 
-                    	    following.push(FOLLOW_opt_eol_in_fact_expression2529);
+                    	    following.push(FOLLOW_opt_eol_in_fact_expression2594);
                     	    opt_eol();
                     	    following.pop();
 
@@ -4484,7 +4548,7 @@
                     	     					multi=true;
                     	     				}
                     	     			
-                    	    following.push(FOLLOW_fact_in_fact_expression2543);
+                    	    following.push(FOLLOW_fact_in_fact_expression2608);
                     	    f=fact();
                     	    following.pop();
 
@@ -4519,7 +4583,7 @@
 
 
     // $ANTLR start fact
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:926:1: fact returns [PatternDescr d] : id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:941:1: fact returns [PatternDescr d] : id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol ;
     public PatternDescr fact() throws RecognitionException {   
         PatternDescr d;
         Token loc=null;
@@ -4533,37 +4597,37 @@
         		d=null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:930:17: (id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:930:17: id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:945:17: (id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:945:17: id= dotted_name opt_eol loc= '(' opt_eol (c= constraints )? opt_eol endLoc= ')' opt_eol
             {
-            following.push(FOLLOW_dotted_name_in_fact2582);
+            following.push(FOLLOW_dotted_name_in_fact2647);
             id=dotted_name();
             following.pop();
 
              
              			d = new ColumnDescr( id ); 
              		
-            following.push(FOLLOW_opt_eol_in_fact2590);
+            following.push(FOLLOW_opt_eol_in_fact2655);
             opt_eol();
             following.pop();
 
             loc=(Token)input.LT(1);
-            match(input,23,FOLLOW_23_in_fact2598); 
+            match(input,23,FOLLOW_23_in_fact2663); 
             
              				d.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
              			
-            following.push(FOLLOW_opt_eol_in_fact2601);
+            following.push(FOLLOW_opt_eol_in_fact2666);
             opt_eol();
             following.pop();
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:936:34: (c= constraints )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:951:34: (c= constraints )?
             int alt61=2;
             alt61 = dfa61.predict(input); 
             switch (alt61) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:936:41: c= constraints
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:951:41: c= constraints
                     {
-                    following.push(FOLLOW_constraints_in_fact2607);
+                    following.push(FOLLOW_constraints_in_fact2672);
                     c=constraints();
                     following.pop();
 
@@ -4578,13 +4642,13 @@
 
             }
 
-            following.push(FOLLOW_opt_eol_in_fact2626);
+            following.push(FOLLOW_opt_eol_in_fact2691);
             opt_eol();
             following.pop();
 
             endLoc=(Token)input.LT(1);
-            match(input,25,FOLLOW_25_in_fact2630); 
-            following.push(FOLLOW_opt_eol_in_fact2632);
+            match(input,25,FOLLOW_25_in_fact2695); 
+            following.push(FOLLOW_opt_eol_in_fact2697);
             opt_eol();
             following.pop();
 
@@ -4607,21 +4671,21 @@
 
 
     // $ANTLR start constraints
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:950:1: constraints returns [List constraints] : opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:965:1: constraints returns [List constraints] : opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol ;
     public List constraints() throws RecognitionException {   
         List constraints;
         
         		constraints = new ArrayList();
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:954:17: ( opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:954:17: opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:969:17: ( opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:969:17: opt_eol ( constraint[constraints] | predicate[constraints] ) ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )* opt_eol
             {
-            following.push(FOLLOW_opt_eol_in_constraints2664);
+            following.push(FOLLOW_opt_eol_in_constraints2729);
             opt_eol();
             following.pop();
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:955:17: ( constraint[constraints] | predicate[constraints] )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:970:17: ( constraint[constraints] | predicate[constraints] )
             int alt62=2;
             int LA62_0 = input.LA(1);
             if ( LA62_0==EOL||LA62_0==15 ) {
@@ -4633,15 +4697,15 @@
                     int LA62_3 = input.LA(3);
                     if ( LA62_3==ID ) {
                         int LA62_17 = input.LA(4);
-                        if ( LA62_17==55 ) {
+                        if ( LA62_17==56 ) {
                             alt62=2;
                         }
-                        else if ( LA62_17==EOL||LA62_17==15||(LA62_17>=24 && LA62_17<=25)||(LA62_17>=62 && LA62_17<=71) ) {
+                        else if ( LA62_17==EOL||LA62_17==15||(LA62_17>=24 && LA62_17<=25)||(LA62_17>=63 && LA62_17<=72) ) {
                             alt62=1;
                         }
                         else {
                             NoViableAltException nvae =
-                                new NoViableAltException("955:17: ( constraint[constraints] | predicate[constraints] )", 62, 17, input);
+                                new NoViableAltException("970:17: ( constraint[constraints] | predicate[constraints] )", 62, 17, input);
 
                             throw nvae;
                         }
@@ -4651,32 +4715,32 @@
                     }
                     else {
                         NoViableAltException nvae =
-                            new NoViableAltException("955:17: ( constraint[constraints] | predicate[constraints] )", 62, 3, input);
+                            new NoViableAltException("970:17: ( constraint[constraints] | predicate[constraints] )", 62, 3, input);
 
                         throw nvae;
                     }
                 }
-                else if ( LA62_2==EOL||LA62_2==15||(LA62_2>=24 && LA62_2<=25)||(LA62_2>=62 && LA62_2<=71) ) {
+                else if ( LA62_2==EOL||LA62_2==15||(LA62_2>=24 && LA62_2<=25)||(LA62_2>=63 && LA62_2<=72) ) {
                     alt62=1;
                 }
                 else {
                     NoViableAltException nvae =
-                        new NoViableAltException("955:17: ( constraint[constraints] | predicate[constraints] )", 62, 2, input);
+                        new NoViableAltException("970:17: ( constraint[constraints] | predicate[constraints] )", 62, 2, input);
 
                     throw nvae;
                 }
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("955:17: ( constraint[constraints] | predicate[constraints] )", 62, 0, input);
+                    new NoViableAltException("970:17: ( constraint[constraints] | predicate[constraints] )", 62, 0, input);
 
                 throw nvae;
             }
             switch (alt62) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:955:18: constraint[constraints]
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:970:18: constraint[constraints]
                     {
-                    following.push(FOLLOW_constraint_in_constraints2669);
+                    following.push(FOLLOW_constraint_in_constraints2734);
                     constraint(constraints);
                     following.pop();
 
@@ -4684,9 +4748,9 @@
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:955:42: predicate[constraints]
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:970:42: predicate[constraints]
                     {
-                    following.push(FOLLOW_predicate_in_constraints2672);
+                    following.push(FOLLOW_predicate_in_constraints2737);
                     predicate(constraints);
                     following.pop();
 
@@ -4696,25 +4760,25 @@
 
             }
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:956:17: ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:971:17: ( opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] ) )*
             loop64:
             do {
                 int alt64=2;
                 alt64 = dfa64.predict(input); 
                 switch (alt64) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:956:19: opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] )
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:971:19: opt_eol ',' opt_eol ( constraint[constraints] | predicate[constraints] )
             	    {
-            	    following.push(FOLLOW_opt_eol_in_constraints2680);
+            	    following.push(FOLLOW_opt_eol_in_constraints2745);
             	    opt_eol();
             	    following.pop();
 
-            	    match(input,24,FOLLOW_24_in_constraints2682); 
-            	    following.push(FOLLOW_opt_eol_in_constraints2684);
+            	    match(input,24,FOLLOW_24_in_constraints2747); 
+            	    following.push(FOLLOW_opt_eol_in_constraints2749);
             	    opt_eol();
             	    following.pop();
 
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:956:39: ( constraint[constraints] | predicate[constraints] )
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:971:39: ( constraint[constraints] | predicate[constraints] )
             	    int alt63=2;
             	    int LA63_0 = input.LA(1);
             	    if ( LA63_0==EOL||LA63_0==15 ) {
@@ -4726,15 +4790,15 @@
             	            int LA63_3 = input.LA(3);
             	            if ( LA63_3==ID ) {
             	                int LA63_17 = input.LA(4);
-            	                if ( LA63_17==55 ) {
+            	                if ( LA63_17==56 ) {
             	                    alt63=2;
             	                }
-            	                else if ( LA63_17==EOL||LA63_17==15||(LA63_17>=24 && LA63_17<=25)||(LA63_17>=62 && LA63_17<=71) ) {
+            	                else if ( LA63_17==EOL||LA63_17==15||(LA63_17>=24 && LA63_17<=25)||(LA63_17>=63 && LA63_17<=72) ) {
             	                    alt63=1;
             	                }
             	                else {
             	                    NoViableAltException nvae =
-            	                        new NoViableAltException("956:39: ( constraint[constraints] | predicate[constraints] )", 63, 17, input);
+            	                        new NoViableAltException("971:39: ( constraint[constraints] | predicate[constraints] )", 63, 17, input);
 
             	                    throw nvae;
             	                }
@@ -4744,32 +4808,32 @@
             	            }
             	            else {
             	                NoViableAltException nvae =
-            	                    new NoViableAltException("956:39: ( constraint[constraints] | predicate[constraints] )", 63, 3, input);
+            	                    new NoViableAltException("971:39: ( constraint[constraints] | predicate[constraints] )", 63, 3, input);
 
             	                throw nvae;
             	            }
             	        }
-            	        else if ( LA63_2==EOL||LA63_2==15||(LA63_2>=24 && LA63_2<=25)||(LA63_2>=62 && LA63_2<=71) ) {
+            	        else if ( LA63_2==EOL||LA63_2==15||(LA63_2>=24 && LA63_2<=25)||(LA63_2>=63 && LA63_2<=72) ) {
             	            alt63=1;
             	        }
             	        else {
             	            NoViableAltException nvae =
-            	                new NoViableAltException("956:39: ( constraint[constraints] | predicate[constraints] )", 63, 2, input);
+            	                new NoViableAltException("971:39: ( constraint[constraints] | predicate[constraints] )", 63, 2, input);
 
             	            throw nvae;
             	        }
             	    }
             	    else {
             	        NoViableAltException nvae =
-            	            new NoViableAltException("956:39: ( constraint[constraints] | predicate[constraints] )", 63, 0, input);
+            	            new NoViableAltException("971:39: ( constraint[constraints] | predicate[constraints] )", 63, 0, input);
 
             	        throw nvae;
             	    }
             	    switch (alt63) {
             	        case 1 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:956:40: constraint[constraints]
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:971:40: constraint[constraints]
             	            {
-            	            following.push(FOLLOW_constraint_in_constraints2687);
+            	            following.push(FOLLOW_constraint_in_constraints2752);
             	            constraint(constraints);
             	            following.pop();
 
@@ -4777,9 +4841,9 @@
             	            }
             	            break;
             	        case 2 :
-            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:956:64: predicate[constraints]
+            	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:971:64: predicate[constraints]
             	            {
-            	            following.push(FOLLOW_predicate_in_constraints2690);
+            	            following.push(FOLLOW_predicate_in_constraints2755);
             	            predicate(constraints);
             	            following.pop();
 
@@ -4798,7 +4862,7 @@
                 }
             } while (true);
 
-            following.push(FOLLOW_opt_eol_in_constraints2698);
+            following.push(FOLLOW_opt_eol_in_constraints2763);
             opt_eol();
             following.pop();
 
@@ -4818,7 +4882,7 @@
 
 
     // $ANTLR start constraint
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:960:1: constraint[List constraints] : opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:975:1: constraint[List constraints] : opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol ;
     public void constraint(List constraints) throws RecognitionException {   
         Token fb=null;
         Token f=null;
@@ -4835,28 +4899,28 @@
         		PatternDescr d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:964:17: ( opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:964:17: opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:979:17: ( opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:979:17: opt_eol (fb= ID opt_eol ':' opt_eol )? f= ID opt_eol (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )? opt_eol
             {
-            following.push(FOLLOW_opt_eol_in_constraint2717);
+            following.push(FOLLOW_opt_eol_in_constraint2782);
             opt_eol();
             following.pop();
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:965:17: (fb= ID opt_eol ':' opt_eol )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:980:17: (fb= ID opt_eol ':' opt_eol )?
             int alt65=2;
             alt65 = dfa65.predict(input); 
             switch (alt65) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:965:19: fb= ID opt_eol ':' opt_eol
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:980:19: fb= ID opt_eol ':' opt_eol
                     {
                     fb=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_constraint2725); 
-                    following.push(FOLLOW_opt_eol_in_constraint2727);
+                    match(input,ID,FOLLOW_ID_in_constraint2790); 
+                    following.push(FOLLOW_opt_eol_in_constraint2792);
                     opt_eol();
                     following.pop();
 
-                    match(input,33,FOLLOW_33_in_constraint2729); 
-                    following.push(FOLLOW_opt_eol_in_constraint2731);
+                    match(input,33,FOLLOW_33_in_constraint2794); 
+                    following.push(FOLLOW_opt_eol_in_constraint2796);
                     opt_eol();
                     following.pop();
 
@@ -4867,7 +4931,7 @@
             }
 
             f=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_constraint2741); 
+            match(input,ID,FOLLOW_ID_in_constraint2806); 
             
             
             			if ( fb != null ) {
@@ -4884,14 +4948,14 @@
             									
             			
             		
-            following.push(FOLLOW_opt_eol_in_constraint2755);
+            following.push(FOLLOW_opt_eol_in_constraint2820);
             opt_eol();
             following.pop();
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:983:33: (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:998:33: (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )?
             int alt69=2;
             int LA69_0 = input.LA(1);
-            if ( (LA69_0>=62 && LA69_0<=71) ) {
+            if ( (LA69_0>=63 && LA69_0<=72) ) {
                 alt69=1;
             }
             else if ( LA69_0==EOL||LA69_0==15||(LA69_0>=24 && LA69_0<=25) ) {
@@ -4899,23 +4963,23 @@
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("983:33: (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= (\'&\'|\'|\')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )?", 69, 0, input);
+                    new NoViableAltException("998:33: (op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= (\'&\'|\'|\')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )* )?", 69, 0, input);
 
                 throw nvae;
             }
             switch (alt69) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:983:41: op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:998:41: op= operator opt_eol (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )*
                     {
-                    following.push(FOLLOW_operator_in_constraint2761);
+                    following.push(FOLLOW_operator_in_constraint2826);
                     op=operator();
                     following.pop();
 
-                    following.push(FOLLOW_opt_eol_in_constraint2763);
+                    following.push(FOLLOW_opt_eol_in_constraint2828);
                     opt_eol();
                     following.pop();
 
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:985:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1000:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
                     int alt66=4;
                     switch ( input.LA(1) ) {
                     case ID:
@@ -4923,12 +4987,12 @@
                         if ( LA66_1==19 ) {
                             alt66=2;
                         }
-                        else if ( LA66_1==EOL||LA66_1==15||(LA66_1>=24 && LA66_1<=25)||(LA66_1>=53 && LA66_1<=54) ) {
+                        else if ( LA66_1==EOL||LA66_1==15||(LA66_1>=24 && LA66_1<=25)||(LA66_1>=54 && LA66_1<=55) ) {
                             alt66=1;
                         }
                         else {
                             NoViableAltException nvae =
-                                new NoViableAltException("985:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 66, 1, input);
+                                new NoViableAltException("1000:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 66, 1, input);
 
                             throw nvae;
                         }
@@ -4937,7 +5001,7 @@
                     case BOOL:
                     case STRING:
                     case FLOAT:
-                    case 47:
+                    case 48:
                         alt66=3;
                         break;
                     case 23:
@@ -4945,17 +5009,17 @@
                         break;
                     default:
                         NoViableAltException nvae =
-                            new NoViableAltException("985:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 66, 0, input);
+                            new NoViableAltException("1000:41: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 66, 0, input);
 
                         throw nvae;
                     }
 
                     switch (alt66) {
                         case 1 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:985:49: bvc= ID
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1000:49: bvc= ID
                             {
                             bvc=(Token)input.LT(1);
-                            match(input,ID,FOLLOW_ID_in_constraint2781); 
+                            match(input,ID,FOLLOW_ID_in_constraint2846); 
                             
                             							
                             														
@@ -4969,9 +5033,9 @@
                             }
                             break;
                         case 2 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:996:49: lc= enum_constraint
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1011:49: lc= enum_constraint
                             {
-                            following.push(FOLLOW_enum_constraint_in_constraint2806);
+                            following.push(FOLLOW_enum_constraint_in_constraint2871);
                             lc=enum_constraint();
                             following.pop();
 
@@ -4986,9 +5050,9 @@
                             }
                             break;
                         case 3 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1005:49: lc= literal_constraint
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1020:49: lc= literal_constraint
                             {
-                            following.push(FOLLOW_literal_constraint_in_constraint2838);
+                            following.push(FOLLOW_literal_constraint_in_constraint2903);
                             lc=literal_constraint();
                             following.pop();
 
@@ -5003,9 +5067,9 @@
                             }
                             break;
                         case 4 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1013:49: rvc= retval_constraint
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1028:49: rvc= retval_constraint
                             {
-                            following.push(FOLLOW_retval_constraint_in_constraint2858);
+                            following.push(FOLLOW_retval_constraint_in_constraint2923);
                             rvc=retval_constraint();
                             following.pop();
 
@@ -5024,29 +5088,29 @@
 
                     }
 
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1024:41: (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1039:41: (con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint ) )*
                     loop68:
                     do {
                         int alt68=2;
                         int LA68_0 = input.LA(1);
-                        if ( (LA68_0>=53 && LA68_0<=54) ) {
+                        if ( (LA68_0>=54 && LA68_0<=55) ) {
                             alt68=1;
                         }
 
 
                         switch (alt68) {
                     	case 1 :
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1025:49: con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1040:49: con= ('&'|'|')op= operator (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
                     	    {
                     	    con=(Token)input.LT(1);
-                    	    if ( (input.LA(1)>=53 && input.LA(1)<=54) ) {
+                    	    if ( (input.LA(1)>=54 && input.LA(1)<=55) ) {
                     	        input.consume();
                     	        errorRecovery=false;
                     	    }
                     	    else {
                     	        MismatchedSetException mse =
                     	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_constraint2893);    throw mse;
+                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_constraint2958);    throw mse;
                     	    }
 
                     	    
@@ -5056,11 +5120,11 @@
                     	    								fc.addRestriction(new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR));	
                     	    							}							
                     	    						
-                    	    following.push(FOLLOW_operator_in_constraint2915);
+                    	    following.push(FOLLOW_operator_in_constraint2980);
                     	    op=operator();
                     	    following.pop();
 
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1035:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1050:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )
                     	    int alt67=4;
                     	    switch ( input.LA(1) ) {
                     	    case ID:
@@ -5068,12 +5132,12 @@
                     	        if ( LA67_1==19 ) {
                     	            alt67=2;
                     	        }
-                    	        else if ( LA67_1==EOL||LA67_1==15||(LA67_1>=24 && LA67_1<=25)||(LA67_1>=53 && LA67_1<=54) ) {
+                    	        else if ( LA67_1==EOL||LA67_1==15||(LA67_1>=24 && LA67_1<=25)||(LA67_1>=54 && LA67_1<=55) ) {
                     	            alt67=1;
                     	        }
                     	        else {
                     	            NoViableAltException nvae =
-                    	                new NoViableAltException("1035:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 67, 1, input);
+                    	                new NoViableAltException("1050:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 67, 1, input);
 
                     	            throw nvae;
                     	        }
@@ -5082,7 +5146,7 @@
                     	    case BOOL:
                     	    case STRING:
                     	    case FLOAT:
-                    	    case 47:
+                    	    case 48:
                     	        alt67=3;
                     	        break;
                     	    case 23:
@@ -5090,17 +5154,17 @@
                     	        break;
                     	    default:
                     	        NoViableAltException nvae =
-                    	            new NoViableAltException("1035:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 67, 0, input);
+                    	            new NoViableAltException("1050:49: (bvc= ID | lc= enum_constraint | lc= literal_constraint | rvc= retval_constraint )", 67, 0, input);
 
                     	        throw nvae;
                     	    }
 
                     	    switch (alt67) {
                     	        case 1 :
-                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1035:57: bvc= ID
+                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1050:57: bvc= ID
                     	            {
                     	            bvc=(Token)input.LT(1);
-                    	            match(input,ID,FOLLOW_ID_in_constraint2927); 
+                    	            match(input,ID,FOLLOW_ID_in_constraint2992); 
                     	            
                     	            								VariableRestrictionDescr vd = new VariableRestrictionDescr(op, bvc.getText());
                     	            								fc.addRestriction(vd);
@@ -5109,9 +5173,9 @@
                     	            }
                     	            break;
                     	        case 2 :
-                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1041:57: lc= enum_constraint
+                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1056:57: lc= enum_constraint
                     	            {
-                    	            following.push(FOLLOW_enum_constraint_in_constraint2955);
+                    	            following.push(FOLLOW_enum_constraint_in_constraint3020);
                     	            lc=enum_constraint();
                     	            following.pop();
 
@@ -5124,9 +5188,9 @@
                     	            }
                     	            break;
                     	        case 3 :
-                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1048:57: lc= literal_constraint
+                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1063:57: lc= literal_constraint
                     	            {
-                    	            following.push(FOLLOW_literal_constraint_in_constraint2990);
+                    	            following.push(FOLLOW_literal_constraint_in_constraint3055);
                     	            lc=literal_constraint();
                     	            following.pop();
 
@@ -5139,9 +5203,9 @@
                     	            }
                     	            break;
                     	        case 4 :
-                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1054:57: rvc= retval_constraint
+                    	            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1069:57: rvc= retval_constraint
                     	            {
-                    	            following.push(FOLLOW_retval_constraint_in_constraint3012);
+                    	            following.push(FOLLOW_retval_constraint_in_constraint3077);
                     	            rvc=retval_constraint();
                     	            following.pop();
 
@@ -5171,7 +5235,7 @@
 
             }
 
-            following.push(FOLLOW_opt_eol_in_constraint3068);
+            following.push(FOLLOW_opt_eol_in_constraint3133);
             opt_eol();
             following.pop();
 
@@ -5191,7 +5255,7 @@
 
 
     // $ANTLR start literal_constraint
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1067:1: literal_constraint returns [String text] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1082:1: literal_constraint returns [String text] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' ) ;
     public String literal_constraint() throws RecognitionException {   
         String text;
         Token t=null;
@@ -5200,10 +5264,10 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1071:17: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1071:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1086:17: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1086:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1071:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1086:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= 'null' )
             int alt70=5;
             switch ( input.LA(1) ) {
             case STRING:
@@ -5218,58 +5282,58 @@
             case BOOL:
                 alt70=4;
                 break;
-            case 47:
+            case 48:
                 alt70=5;
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("1071:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= \'null\' )", 70, 0, input);
+                    new NoViableAltException("1086:17: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= \'null\' )", 70, 0, input);
 
                 throw nvae;
             }
 
             switch (alt70) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1071:25: t= STRING
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1086:25: t= STRING
                     {
                     t=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_literal_constraint3095); 
+                    match(input,STRING,FOLLOW_STRING_in_literal_constraint3160); 
                      text = getString( t ); 
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1072:25: t= INT
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1087:25: t= INT
                     {
                     t=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_literal_constraint3106); 
+                    match(input,INT,FOLLOW_INT_in_literal_constraint3171); 
                      text = t.getText(); 
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1073:25: t= FLOAT
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1088:25: t= FLOAT
                     {
                     t=(Token)input.LT(1);
-                    match(input,FLOAT,FOLLOW_FLOAT_in_literal_constraint3119); 
+                    match(input,FLOAT,FOLLOW_FLOAT_in_literal_constraint3184); 
                      text = t.getText(); 
 
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1074:25: t= BOOL
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1089:25: t= BOOL
                     {
                     t=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_literal_constraint3130); 
+                    match(input,BOOL,FOLLOW_BOOL_in_literal_constraint3195); 
                      text = t.getText(); 
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1075:25: t= 'null'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1090:25: t= 'null'
                     {
                     t=(Token)input.LT(1);
-                    match(input,47,FOLLOW_47_in_literal_constraint3142); 
+                    match(input,48,FOLLOW_48_in_literal_constraint3207); 
                      text = null; 
 
                     }
@@ -5293,7 +5357,7 @@
 
 
     // $ANTLR start enum_constraint
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1079:1: enum_constraint returns [String text] : (cls= ID '.' en= ID ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1094:1: enum_constraint returns [String text] : (cls= ID '.' en= ID ) ;
     public String enum_constraint() throws RecognitionException {   
         String text;
         Token cls=null;
@@ -5303,17 +5367,17 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1083:17: ( (cls= ID '.' en= ID ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1083:17: (cls= ID '.' en= ID )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1098:17: ( (cls= ID '.' en= ID ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1098:17: (cls= ID '.' en= ID )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1083:17: (cls= ID '.' en= ID )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1083:18: cls= ID '.' en= ID
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1098:17: (cls= ID '.' en= ID )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1098:18: cls= ID '.' en= ID
             {
             cls=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_enum_constraint3173); 
-            match(input,19,FOLLOW_19_in_enum_constraint3175); 
+            match(input,ID,FOLLOW_ID_in_enum_constraint3238); 
+            match(input,19,FOLLOW_19_in_enum_constraint3240); 
             en=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_enum_constraint3179); 
+            match(input,ID,FOLLOW_ID_in_enum_constraint3244); 
 
             }
 
@@ -5334,7 +5398,7 @@
 
 
     // $ANTLR start retval_constraint
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1086:1: retval_constraint returns [String text] : '(' c= paren_chunk ')' ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1101:1: retval_constraint returns [String text] : '(' c= paren_chunk ')' ;
     public String retval_constraint() throws RecognitionException {   
         String text;
         String c = null;
@@ -5344,15 +5408,15 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1091:17: ( '(' c= paren_chunk ')' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1091:17: '(' c= paren_chunk ')'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1106:17: ( '(' c= paren_chunk ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1106:17: '(' c= paren_chunk ')'
             {
-            match(input,23,FOLLOW_23_in_retval_constraint3208); 
-            following.push(FOLLOW_paren_chunk_in_retval_constraint3213);
+            match(input,23,FOLLOW_23_in_retval_constraint3273); 
+            following.push(FOLLOW_paren_chunk_in_retval_constraint3278);
             c=paren_chunk();
             following.pop();
 
-            match(input,25,FOLLOW_25_in_retval_constraint3216); 
+            match(input,25,FOLLOW_25_in_retval_constraint3281); 
              text = c; 
 
             }
@@ -5370,7 +5434,7 @@
 
 
     // $ANTLR start predicate
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1094:1: predicate[List constraints] : decl= ID ':' field= ID '->' '(' text= paren_chunk ')' ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1109:1: predicate[List constraints] : decl= ID ':' field= ID '->' '(' text= paren_chunk ')' ;
     public void predicate(List constraints) throws RecognitionException {   
         Token decl=null;
         Token field=null;
@@ -5378,21 +5442,21 @@
 
 
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1096:17: (decl= ID ':' field= ID '->' '(' text= paren_chunk ')' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1096:17: decl= ID ':' field= ID '->' '(' text= paren_chunk ')'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1111:17: (decl= ID ':' field= ID '->' '(' text= paren_chunk ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1111:17: decl= ID ':' field= ID '->' '(' text= paren_chunk ')'
             {
             decl=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_predicate3234); 
-            match(input,33,FOLLOW_33_in_predicate3236); 
+            match(input,ID,FOLLOW_ID_in_predicate3299); 
+            match(input,33,FOLLOW_33_in_predicate3301); 
             field=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_predicate3240); 
-            match(input,55,FOLLOW_55_in_predicate3242); 
-            match(input,23,FOLLOW_23_in_predicate3244); 
-            following.push(FOLLOW_paren_chunk_in_predicate3248);
+            match(input,ID,FOLLOW_ID_in_predicate3305); 
+            match(input,56,FOLLOW_56_in_predicate3307); 
+            match(input,23,FOLLOW_23_in_predicate3309); 
+            following.push(FOLLOW_paren_chunk_in_predicate3313);
             text=paren_chunk();
             following.pop();
 
-            match(input,25,FOLLOW_25_in_predicate3250); 
+            match(input,25,FOLLOW_25_in_predicate3315); 
             
             			PredicateDescr d = new PredicateDescr(field.getText(), decl.getText(), text );
             			constraints.add( d );
@@ -5413,7 +5477,7 @@
 
 
     // $ANTLR start paren_chunk
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1103:1: paren_chunk returns [String text] : ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1118:1: paren_chunk returns [String text] : ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )* ;
     public String paren_chunk() throws RecognitionException {   
         String text;
         Token any=null;
@@ -5424,10 +5488,10 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1109:18: ( ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1109:18: ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1124:18: ( ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1124:18: ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )*
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1109:18: ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1124:18: ( options {greedy=false; } : '(' c= paren_chunk ')' | any= . )*
             loop71:
             do {
                 int alt71=3;
@@ -5506,6 +5570,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     alt71=2;
                     break;
 
@@ -5513,14 +5578,14 @@
 
                 switch (alt71) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1110:25: '(' c= paren_chunk ')'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1125:25: '(' c= paren_chunk ')'
             	    {
-            	    match(input,23,FOLLOW_23_in_paren_chunk3296); 
-            	    following.push(FOLLOW_paren_chunk_in_paren_chunk3300);
+            	    match(input,23,FOLLOW_23_in_paren_chunk3361); 
+            	    following.push(FOLLOW_paren_chunk_in_paren_chunk3365);
             	    c=paren_chunk();
             	    following.pop();
 
-            	    match(input,25,FOLLOW_25_in_paren_chunk3302); 
+            	    match(input,25,FOLLOW_25_in_paren_chunk3367); 
             	    
             	    				if ( c == null ) {
             	    					c = "";
@@ -5535,7 +5600,7 @@
             	    }
             	    break;
             	case 2 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1121:19: any= .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1136:19: any= .
             	    {
             	    any=(Token)input.LT(1);
             	    matchAny(input); 
@@ -5571,7 +5636,7 @@
 
 
     // $ANTLR start paren_chunk2
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1133:1: paren_chunk2 returns [String text] : ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1148:1: paren_chunk2 returns [String text] : ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )* ;
     public String paren_chunk2() throws RecognitionException {   
         String text;
         Token any=null;
@@ -5582,10 +5647,10 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1139:18: ( ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1139:18: ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1154:18: ( ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1154:18: ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )*
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1139:18: ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1154:18: ( options {greedy=false; } : '(' c= paren_chunk2 ')' | any= . )*
             loop72:
             do {
                 int alt72=3;
@@ -5662,6 +5727,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     alt72=2;
                     break;
 
@@ -5669,14 +5735,14 @@
 
                 switch (alt72) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1140:25: '(' c= paren_chunk2 ')'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1155:25: '(' c= paren_chunk2 ')'
             	    {
-            	    match(input,23,FOLLOW_23_in_paren_chunk23373); 
-            	    following.push(FOLLOW_paren_chunk2_in_paren_chunk23377);
+            	    match(input,23,FOLLOW_23_in_paren_chunk23438); 
+            	    following.push(FOLLOW_paren_chunk2_in_paren_chunk23442);
             	    c=paren_chunk2();
             	    following.pop();
 
-            	    match(input,25,FOLLOW_25_in_paren_chunk23379); 
+            	    match(input,25,FOLLOW_25_in_paren_chunk23444); 
             	    
             	    				if ( c == null ) {
             	    					c = "";
@@ -5691,7 +5757,7 @@
             	    }
             	    break;
             	case 2 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1151:19: any= .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1166:19: any= .
             	    {
             	    any=(Token)input.LT(1);
             	    matchAny(input); 
@@ -5727,7 +5793,7 @@
 
 
     // $ANTLR start curly_chunk
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1162:1: curly_chunk returns [String text] : ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1177:1: curly_chunk returns [String text] : ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )* ;
     public String curly_chunk() throws RecognitionException {   
         String text;
         Token any=null;
@@ -5738,10 +5804,10 @@
         		text = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1168:17: ( ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1168:17: ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1183:17: ( ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1183:17: ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )*
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1168:17: ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1183:17: ( options {greedy=false; } : '{' c= curly_chunk '}' | any= . )*
             loop73:
             do {
                 int alt73=3;
@@ -5818,6 +5884,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     alt73=2;
                     break;
 
@@ -5825,14 +5892,14 @@
 
                 switch (alt73) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1169:25: '{' c= curly_chunk '}'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1184:25: '{' c= curly_chunk '}'
             	    {
-            	    match(input,26,FOLLOW_26_in_curly_chunk3448); 
-            	    following.push(FOLLOW_curly_chunk_in_curly_chunk3452);
+            	    match(input,26,FOLLOW_26_in_curly_chunk3513); 
+            	    following.push(FOLLOW_curly_chunk_in_curly_chunk3517);
             	    c=curly_chunk();
             	    following.pop();
 
-            	    match(input,27,FOLLOW_27_in_curly_chunk3454); 
+            	    match(input,27,FOLLOW_27_in_curly_chunk3519); 
             	    
             	    				//System.err.println( "chunk [" + c + "]" );
             	    				if ( c == null ) {
@@ -5848,7 +5915,7 @@
             	    }
             	    break;
             	case 2 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1181:19: any= .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1196:19: any= .
             	    {
             	    any=(Token)input.LT(1);
             	    matchAny(input); 
@@ -5885,7 +5952,7 @@
 
 
     // $ANTLR start lhs_or
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1193:1: lhs_or returns [PatternDescr d] : left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1208:1: lhs_or returns [PatternDescr d] : left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )* ;
     public PatternDescr lhs_or() throws RecognitionException {   
         PatternDescr d;
         PatternDescr left = null;
@@ -5897,44 +5964,44 @@
         		d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1198:17: (left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1198:17: left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1213:17: (left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1213:17: left= lhs_and ( ('or'|'||') opt_eol right= lhs_and )*
             {
              OrDescr or = null; 
-            following.push(FOLLOW_lhs_and_in_lhs_or3512);
+            following.push(FOLLOW_lhs_and_in_lhs_or3577);
             left=lhs_and();
             following.pop();
 
             d = left; 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1200:17: ( ('or'|'||') opt_eol right= lhs_and )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1215:17: ( ('or'|'||') opt_eol right= lhs_and )*
             loop74:
             do {
                 int alt74=2;
                 int LA74_0 = input.LA(1);
-                if ( (LA74_0>=51 && LA74_0<=52) ) {
+                if ( (LA74_0>=52 && LA74_0<=53) ) {
                     alt74=1;
                 }
 
 
                 switch (alt74) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1200:19: ('or'|'||') opt_eol right= lhs_and
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1215:19: ('or'|'||') opt_eol right= lhs_and
             	    {
-            	    if ( (input.LA(1)>=51 && input.LA(1)<=52) ) {
+            	    if ( (input.LA(1)>=52 && input.LA(1)<=53) ) {
             	        input.consume();
             	        errorRecovery=false;
             	    }
             	    else {
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_or3521);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_or3586);    throw mse;
             	    }
 
-            	    following.push(FOLLOW_opt_eol_in_lhs_or3526);
+            	    following.push(FOLLOW_opt_eol_in_lhs_or3591);
             	    opt_eol();
             	    following.pop();
 
-            	    following.push(FOLLOW_lhs_and_in_lhs_or3533);
+            	    following.push(FOLLOW_lhs_and_in_lhs_or3598);
             	    right=lhs_and();
             	    following.pop();
 
@@ -5972,7 +6039,7 @@
 
 
     // $ANTLR start lhs_and
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1214:1: lhs_and returns [PatternDescr d] : left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1229:1: lhs_and returns [PatternDescr d] : left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )* ;
     public PatternDescr lhs_and() throws RecognitionException {   
         PatternDescr d;
         PatternDescr left = null;
@@ -5984,44 +6051,44 @@
         		d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1219:17: (left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1219:17: left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1234:17: (left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1234:17: left= lhs_unary ( ('and'|'&&') opt_eol right= lhs_unary )*
             {
              AndDescr and = null; 
-            following.push(FOLLOW_lhs_unary_in_lhs_and3573);
+            following.push(FOLLOW_lhs_unary_in_lhs_and3638);
             left=lhs_unary();
             following.pop();
 
              d = left; 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1221:17: ( ('and'|'&&') opt_eol right= lhs_unary )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1236:17: ( ('and'|'&&') opt_eol right= lhs_unary )*
             loop75:
             do {
                 int alt75=2;
                 int LA75_0 = input.LA(1);
-                if ( (LA75_0>=56 && LA75_0<=57) ) {
+                if ( (LA75_0>=57 && LA75_0<=58) ) {
                     alt75=1;
                 }
 
 
                 switch (alt75) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1221:19: ('and'|'&&') opt_eol right= lhs_unary
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1236:19: ('and'|'&&') opt_eol right= lhs_unary
             	    {
-            	    if ( (input.LA(1)>=56 && input.LA(1)<=57) ) {
+            	    if ( (input.LA(1)>=57 && input.LA(1)<=58) ) {
             	        input.consume();
             	        errorRecovery=false;
             	    }
             	    else {
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_and3582);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_and3647);    throw mse;
             	    }
 
-            	    following.push(FOLLOW_opt_eol_in_lhs_and3587);
+            	    following.push(FOLLOW_opt_eol_in_lhs_and3652);
             	    opt_eol();
             	    following.pop();
 
-            	    following.push(FOLLOW_lhs_unary_in_lhs_and3594);
+            	    following.push(FOLLOW_lhs_unary_in_lhs_and3659);
             	    right=lhs_unary();
             	    following.pop();
 
@@ -6059,7 +6126,7 @@
 
 
     // $ANTLR start lhs_unary
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1235:1: lhs_unary returns [PatternDescr d] : (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )? | '(' opt_eol u= lhs opt_eol ')' ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1250:1: lhs_unary returns [PatternDescr d] : (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )? | '(' opt_eol u= lhs opt_eol ')' ) ;
     public PatternDescr lhs_unary() throws RecognitionException {   
         PatternDescr d;
         PatternDescr u = null;
@@ -6068,24 +6135,26 @@
 
         AccumulateDescr ac = null;
 
+        CollectDescr cs = null;
 
+
         
         		d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1239:17: ( (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )? | '(' opt_eol u= lhs opt_eol ')' ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1239:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )? | '(' opt_eol u= lhs opt_eol ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1254:17: ( (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )? | '(' opt_eol u= lhs opt_eol ')' ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1254:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )? | '(' opt_eol u= lhs opt_eol ')' )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1239:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )? | '(' opt_eol u= lhs opt_eol ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1254:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )? | '(' opt_eol u= lhs opt_eol ')' )
             int alt77=5;
             switch ( input.LA(1) ) {
-            case 58:
+            case 59:
                 alt77=1;
                 break;
-            case 59:
+            case 60:
                 alt77=2;
                 break;
-            case 60:
+            case 61:
                 alt77=3;
                 break;
             case ID:
@@ -6096,16 +6165,16 @@
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("1239:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )? | \'(\' opt_eol u= lhs opt_eol \')\' )", 77, 0, input);
+                    new NoViableAltException("1254:17: (u= lhs_exist | u= lhs_not | u= lhs_eval | u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )? | \'(\' opt_eol u= lhs opt_eol \')\' )", 77, 0, input);
 
                 throw nvae;
             }
 
             switch (alt77) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1239:25: u= lhs_exist
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1254:25: u= lhs_exist
                     {
-                    following.push(FOLLOW_lhs_exist_in_lhs_unary3632);
+                    following.push(FOLLOW_lhs_exist_in_lhs_unary3697);
                     u=lhs_exist();
                     following.pop();
 
@@ -6114,9 +6183,9 @@
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1240:25: u= lhs_not
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1255:25: u= lhs_not
                     {
-                    following.push(FOLLOW_lhs_not_in_lhs_unary3642);
+                    following.push(FOLLOW_lhs_not_in_lhs_unary3707);
                     u=lhs_not();
                     following.pop();
 
@@ -6125,9 +6194,9 @@
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1241:25: u= lhs_eval
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1256:25: u= lhs_eval
                     {
-                    following.push(FOLLOW_lhs_eval_in_lhs_unary3652);
+                    following.push(FOLLOW_lhs_eval_in_lhs_unary3717);
                     u=lhs_eval();
                     following.pop();
 
@@ -6136,24 +6205,24 @@
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1242:25: u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) )?
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1257:25: u= lhs_column ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )?
                     {
-                    following.push(FOLLOW_lhs_column_in_lhs_unary3666);
+                    following.push(FOLLOW_lhs_column_in_lhs_unary3731);
                     u=lhs_column();
                     following.pop();
 
                     d=u;
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1243:27: ( (fm= from_statement ) | (ac= accumulate_statement ) )?
-                    int alt76=3;
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1258:27: ( (fm= from_statement ) | (ac= accumulate_statement ) | (cs= collect_statement ) )?
+                    int alt76=4;
                     alt76 = dfa76.predict(input); 
                     switch (alt76) {
                         case 1 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1243:28: (fm= from_statement )
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1258:28: (fm= from_statement )
                             {
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1243:28: (fm= from_statement )
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1243:29: fm= from_statement
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1258:28: (fm= from_statement )
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1258:29: fm= from_statement
                             {
-                            following.push(FOLLOW_from_statement_in_lhs_unary3687);
+                            following.push(FOLLOW_from_statement_in_lhs_unary3752);
                             fm=from_statement();
                             following.pop();
 
@@ -6165,12 +6234,12 @@
                             }
                             break;
                         case 2 :
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1244:28: (ac= accumulate_statement )
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1259:28: (ac= accumulate_statement )
                             {
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1244:28: (ac= accumulate_statement )
-                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1244:29: ac= accumulate_statement
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1259:28: (ac= accumulate_statement )
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1259:29: ac= accumulate_statement
                             {
-                            following.push(FOLLOW_accumulate_statement_in_lhs_unary3709);
+                            following.push(FOLLOW_accumulate_statement_in_lhs_unary3774);
                             ac=accumulate_statement();
                             following.pop();
 
@@ -6181,29 +6250,46 @@
 
                             }
                             break;
+                        case 3 :
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1260:28: (cs= collect_statement )
+                            {
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1260:28: (cs= collect_statement )
+                            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1260:29: cs= collect_statement
+                            {
+                            following.push(FOLLOW_collect_statement_in_lhs_unary3795);
+                            cs=collect_statement();
+                            following.pop();
 
+                            cs.setResultColumn((ColumnDescr) u); d=cs;
+
+                            }
+
+
+                            }
+                            break;
+
                     }
 
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1245:25: '(' opt_eol u= lhs opt_eol ')'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1261:25: '(' opt_eol u= lhs opt_eol ')'
                     {
-                    match(input,23,FOLLOW_23_in_lhs_unary3721); 
-                    following.push(FOLLOW_opt_eol_in_lhs_unary3723);
+                    match(input,23,FOLLOW_23_in_lhs_unary3807); 
+                    following.push(FOLLOW_opt_eol_in_lhs_unary3809);
                     opt_eol();
                     following.pop();
 
-                    following.push(FOLLOW_lhs_in_lhs_unary3727);
+                    following.push(FOLLOW_lhs_in_lhs_unary3813);
                     u=lhs();
                     following.pop();
 
-                    following.push(FOLLOW_opt_eol_in_lhs_unary3729);
+                    following.push(FOLLOW_opt_eol_in_lhs_unary3815);
                     opt_eol();
                     following.pop();
 
-                    match(input,25,FOLLOW_25_in_lhs_unary3731); 
+                    match(input,25,FOLLOW_25_in_lhs_unary3817); 
                     d = u;
 
                     }
@@ -6227,7 +6313,7 @@
 
 
     // $ANTLR start lhs_exist
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1249:1: lhs_exist returns [PatternDescr d] : loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1265:1: lhs_exist returns [PatternDescr d] : loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column ) ;
     public PatternDescr lhs_exist() throws RecognitionException {   
         PatternDescr d;
         Token loc=null;
@@ -6238,12 +6324,12 @@
         		d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1253:17: (loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1253:17: loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1269:17: (loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1269:17: loc= 'exists' ( '(' column= lhs_column ')' | column= lhs_column )
             {
             loc=(Token)input.LT(1);
-            match(input,58,FOLLOW_58_in_lhs_exist3762); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1253:30: ( '(' column= lhs_column ')' | column= lhs_column )
+            match(input,59,FOLLOW_59_in_lhs_exist3848); 
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1269:30: ( '(' column= lhs_column ')' | column= lhs_column )
             int alt78=2;
             int LA78_0 = input.LA(1);
             if ( LA78_0==23 ) {
@@ -6254,27 +6340,27 @@
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("1253:30: ( \'(\' column= lhs_column \')\' | column= lhs_column )", 78, 0, input);
+                    new NoViableAltException("1269:30: ( \'(\' column= lhs_column \')\' | column= lhs_column )", 78, 0, input);
 
                 throw nvae;
             }
             switch (alt78) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1253:31: '(' column= lhs_column ')'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1269:31: '(' column= lhs_column ')'
                     {
-                    match(input,23,FOLLOW_23_in_lhs_exist3765); 
-                    following.push(FOLLOW_lhs_column_in_lhs_exist3769);
+                    match(input,23,FOLLOW_23_in_lhs_exist3851); 
+                    following.push(FOLLOW_lhs_column_in_lhs_exist3855);
                     column=lhs_column();
                     following.pop();
 
-                    match(input,25,FOLLOW_25_in_lhs_exist3771); 
+                    match(input,25,FOLLOW_25_in_lhs_exist3857); 
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1253:59: column= lhs_column
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1269:59: column= lhs_column
                     {
-                    following.push(FOLLOW_lhs_column_in_lhs_exist3777);
+                    following.push(FOLLOW_lhs_column_in_lhs_exist3863);
                     column=lhs_column();
                     following.pop();
 
@@ -6304,7 +6390,7 @@
 
 
     // $ANTLR start lhs_not
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1260:1: lhs_not returns [NotDescr d] : loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column ) ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1276:1: lhs_not returns [NotDescr d] : loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column ) ;
     public NotDescr lhs_not() throws RecognitionException {   
         NotDescr d;
         Token loc=null;
@@ -6315,12 +6401,12 @@
         		d = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1264:17: (loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1264:17: loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1280:17: (loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1280:17: loc= 'not' ( '(' column= lhs_column ')' | column= lhs_column )
             {
             loc=(Token)input.LT(1);
-            match(input,59,FOLLOW_59_in_lhs_not3807); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1264:27: ( '(' column= lhs_column ')' | column= lhs_column )
+            match(input,60,FOLLOW_60_in_lhs_not3893); 
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1280:27: ( '(' column= lhs_column ')' | column= lhs_column )
             int alt79=2;
             int LA79_0 = input.LA(1);
             if ( LA79_0==23 ) {
@@ -6331,27 +6417,27 @@
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("1264:27: ( \'(\' column= lhs_column \')\' | column= lhs_column )", 79, 0, input);
+                    new NoViableAltException("1280:27: ( \'(\' column= lhs_column \')\' | column= lhs_column )", 79, 0, input);
 
                 throw nvae;
             }
             switch (alt79) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1264:28: '(' column= lhs_column ')'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1280:28: '(' column= lhs_column ')'
                     {
-                    match(input,23,FOLLOW_23_in_lhs_not3810); 
-                    following.push(FOLLOW_lhs_column_in_lhs_not3814);
+                    match(input,23,FOLLOW_23_in_lhs_not3896); 
+                    following.push(FOLLOW_lhs_column_in_lhs_not3900);
                     column=lhs_column();
                     following.pop();
 
-                    match(input,25,FOLLOW_25_in_lhs_not3817); 
+                    match(input,25,FOLLOW_25_in_lhs_not3903); 
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1264:57: column= lhs_column
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1280:57: column= lhs_column
                     {
-                    following.push(FOLLOW_lhs_column_in_lhs_not3823);
+                    following.push(FOLLOW_lhs_column_in_lhs_not3909);
                     column=lhs_column();
                     following.pop();
 
@@ -6381,7 +6467,7 @@
 
 
     // $ANTLR start lhs_eval
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1271:1: lhs_eval returns [PatternDescr d] : 'eval' loc= '(' c= paren_chunk2 ')' ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1287:1: lhs_eval returns [PatternDescr d] : 'eval' loc= '(' c= paren_chunk2 ')' ;
     public PatternDescr lhs_eval() throws RecognitionException {   
         PatternDescr d;
         Token loc=null;
@@ -6393,17 +6479,17 @@
         		String text = "";
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1276:17: ( 'eval' loc= '(' c= paren_chunk2 ')' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1276:17: 'eval' loc= '(' c= paren_chunk2 ')'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1292:17: ( 'eval' loc= '(' c= paren_chunk2 ')' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1292:17: 'eval' loc= '(' c= paren_chunk2 ')'
             {
-            match(input,60,FOLLOW_60_in_lhs_eval3849); 
+            match(input,61,FOLLOW_61_in_lhs_eval3935); 
             loc=(Token)input.LT(1);
-            match(input,23,FOLLOW_23_in_lhs_eval3853); 
-            following.push(FOLLOW_paren_chunk2_in_lhs_eval3861);
+            match(input,23,FOLLOW_23_in_lhs_eval3939); 
+            following.push(FOLLOW_paren_chunk2_in_lhs_eval3947);
             c=paren_chunk2();
             following.pop();
 
-            match(input,25,FOLLOW_25_in_lhs_eval3865); 
+            match(input,25,FOLLOW_25_in_lhs_eval3951); 
              
             			checkTrailingSemicolon( c, offset(loc.getLine()) );
             			d = new EvalDescr( c ); 
@@ -6424,7 +6510,7 @@
 
 
     // $ANTLR start dotted_name
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1285:1: dotted_name returns [String name] : id= ID ( '.' id= ID )* ( '[' ']' )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1301:1: dotted_name returns [String name] : id= ID ( '.' id= ID )* ( '[' ']' )* ;
     public String dotted_name() throws RecognitionException {   
         String name;
         Token id=null;
@@ -6433,13 +6519,13 @@
         		name = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:17: (id= ID ( '.' id= ID )* ( '[' ']' )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:17: id= ID ( '.' id= ID )* ( '[' ']' )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:17: (id= ID ( '.' id= ID )* ( '[' ']' )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:17: id= ID ( '.' id= ID )* ( '[' ']' )*
             {
             id=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_dotted_name3897); 
+            match(input,ID,FOLLOW_ID_in_dotted_name3983); 
              name=id.getText(); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:46: ( '.' id= ID )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:46: ( '.' id= ID )*
             loop80:
             do {
                 int alt80=2;
@@ -6451,11 +6537,11 @@
 
                 switch (alt80) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:48: '.' id= ID
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:48: '.' id= ID
             	    {
-            	    match(input,19,FOLLOW_19_in_dotted_name3903); 
+            	    match(input,19,FOLLOW_19_in_dotted_name3989); 
             	    id=(Token)input.LT(1);
-            	    match(input,ID,FOLLOW_ID_in_dotted_name3907); 
+            	    match(input,ID,FOLLOW_ID_in_dotted_name3993); 
             	     name = name + "." + id.getText(); 
 
             	    }
@@ -6466,22 +6552,22 @@
                 }
             } while (true);
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:99: ( '[' ']' )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:99: ( '[' ']' )*
             loop81:
             do {
                 int alt81=2;
                 int LA81_0 = input.LA(1);
-                if ( LA81_0==49 ) {
+                if ( LA81_0==50 ) {
                     alt81=1;
                 }
 
 
                 switch (alt81) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1290:101: '[' ']'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:101: '[' ']'
             	    {
-            	    match(input,49,FOLLOW_49_in_dotted_name3916); 
-            	    match(input,50,FOLLOW_50_in_dotted_name3918); 
+            	    match(input,50,FOLLOW_50_in_dotted_name4002); 
+            	    match(input,51,FOLLOW_51_in_dotted_name4004); 
             	     name = name + "[]";
 
             	    }
@@ -6508,7 +6594,7 @@
 
 
     // $ANTLR start argument_name
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1293:1: argument_name returns [String name] : id= ID ( '[' ']' )* ;
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1309:1: argument_name returns [String name] : id= ID ( '[' ']' )* ;
     public String argument_name() throws RecognitionException {   
         String name;
         Token id=null;
@@ -6517,28 +6603,28 @@
         		name = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1298:17: (id= ID ( '[' ']' )* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1298:17: id= ID ( '[' ']' )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1314:17: (id= ID ( '[' ']' )* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1314:17: id= ID ( '[' ']' )*
             {
             id=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_argument_name3948); 
+            match(input,ID,FOLLOW_ID_in_argument_name4034); 
              name=id.getText(); 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1298:46: ( '[' ']' )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1314:46: ( '[' ']' )*
             loop82:
             do {
                 int alt82=2;
                 int LA82_0 = input.LA(1);
-                if ( LA82_0==49 ) {
+                if ( LA82_0==50 ) {
                     alt82=1;
                 }
 
 
                 switch (alt82) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1298:48: '[' ']'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1314:48: '[' ']'
             	    {
-            	    match(input,49,FOLLOW_49_in_argument_name3954); 
-            	    match(input,50,FOLLOW_50_in_argument_name3956); 
+            	    match(input,50,FOLLOW_50_in_argument_name4040); 
+            	    match(input,51,FOLLOW_51_in_argument_name4042); 
             	     name = name + "[]";
 
             	    }
@@ -6565,7 +6651,7 @@
 
 
     // $ANTLR start word
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1302:1: word returns [String word] : (id= ID | 'import' | 'use' | 'rule' | 'query' | 'salience' | 'no-loop' | 'when' | 'then' | 'end' | str= STRING );
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1318:1: word returns [String word] : (id= ID | 'import' | 'use' | 'rule' | 'query' | 'salience' | 'no-loop' | 'when' | 'then' | 'end' | str= STRING );
     public String word() throws RecognitionException {   
         String word;
         Token id=null;
@@ -6575,7 +6661,7 @@
         		word = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:17: (id= ID | 'import' | 'use' | 'rule' | 'query' | 'salience' | 'no-loop' | 'when' | 'then' | 'end' | str= STRING )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1322:17: (id= ID | 'import' | 'use' | 'rule' | 'query' | 'salience' | 'no-loop' | 'when' | 'then' | 'end' | str= STRING )
             int alt83=11;
             switch ( input.LA(1) ) {
             case ID:
@@ -6584,7 +6670,7 @@
             case 17:
                 alt83=2;
                 break;
-            case 61:
+            case 62:
                 alt83=3;
                 break;
             case 31:
@@ -6613,98 +6699,98 @@
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("1302:1: word returns [String word] : (id= ID | \'import\' | \'use\' | \'rule\' | \'query\' | \'salience\' | \'no-loop\' | \'when\' | \'then\' | \'end\' | str= STRING );", 83, 0, input);
+                    new NoViableAltException("1318:1: word returns [String word] : (id= ID | \'import\' | \'use\' | \'rule\' | \'query\' | \'salience\' | \'no-loop\' | \'when\' | \'then\' | \'end\' | str= STRING );", 83, 0, input);
 
                 throw nvae;
             }
 
             switch (alt83) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1306:17: id= ID
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1322:17: id= ID
                     {
                     id=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_word3984); 
+                    match(input,ID,FOLLOW_ID_in_word4070); 
                      word=id.getText(); 
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1307:17: 'import'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1323:17: 'import'
                     {
-                    match(input,17,FOLLOW_17_in_word3996); 
+                    match(input,17,FOLLOW_17_in_word4082); 
                      word="import"; 
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1308:17: 'use'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1324:17: 'use'
                     {
-                    match(input,61,FOLLOW_61_in_word4005); 
+                    match(input,62,FOLLOW_62_in_word4091); 
                      word="use"; 
 
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1309:17: 'rule'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1325:17: 'rule'
                     {
-                    match(input,31,FOLLOW_31_in_word4017); 
+                    match(input,31,FOLLOW_31_in_word4103); 
                      word="rule"; 
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1310:17: 'query'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1326:17: 'query'
                     {
-                    match(input,28,FOLLOW_28_in_word4028); 
+                    match(input,28,FOLLOW_28_in_word4114); 
                      word="query"; 
 
                     }
                     break;
                 case 6 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1311:17: 'salience'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1327:17: 'salience'
                     {
-                    match(input,36,FOLLOW_36_in_word4038); 
+                    match(input,36,FOLLOW_36_in_word4124); 
                      word="salience"; 
 
                     }
                     break;
                 case 7 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1312:17: 'no-loop'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1328:17: 'no-loop'
                     {
-                    match(input,37,FOLLOW_37_in_word4046); 
+                    match(input,37,FOLLOW_37_in_word4132); 
                      word="no-loop"; 
 
                     }
                     break;
                 case 8 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1313:17: 'when'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1329:17: 'when'
                     {
-                    match(input,32,FOLLOW_32_in_word4054); 
+                    match(input,32,FOLLOW_32_in_word4140); 
                      word="when"; 
 
                     }
                     break;
                 case 9 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1314:17: 'then'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1330:17: 'then'
                     {
-                    match(input,34,FOLLOW_34_in_word4065); 
+                    match(input,34,FOLLOW_34_in_word4151); 
                      word="then"; 
 
                     }
                     break;
                 case 10 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1315:17: 'end'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1331:17: 'end'
                     {
-                    match(input,29,FOLLOW_29_in_word4076); 
+                    match(input,29,FOLLOW_29_in_word4162); 
                      word="end"; 
 
                     }
                     break;
                 case 11 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1316:17: str= STRING
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1332:17: str= STRING
                     {
                     str=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_word4090); 
+                    match(input,STRING,FOLLOW_STRING_in_word4176); 
                      word=getString(str);
 
                     }
@@ -6724,130 +6810,130 @@
 
 
     // $ANTLR start operator
-    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1319:1: operator returns [String str] : ( '==' | '=' | '>' | '>=' | '<' | '<=' | '!=' | 'contains' | 'matches' | 'excludes' );
+    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1335:1: operator returns [String str] : ( '==' | '=' | '>' | '>=' | '<' | '<=' | '!=' | 'contains' | 'matches' | 'excludes' );
     public String operator() throws RecognitionException {   
         String str;
         
         		str = null;
         	
         try {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1325:17: ( '==' | '=' | '>' | '>=' | '<' | '<=' | '!=' | 'contains' | 'matches' | 'excludes' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1341:17: ( '==' | '=' | '>' | '>=' | '<' | '<=' | '!=' | 'contains' | 'matches' | 'excludes' )
             int alt84=10;
             switch ( input.LA(1) ) {
-            case 62:
+            case 63:
                 alt84=1;
                 break;
-            case 63:
+            case 64:
                 alt84=2;
                 break;
-            case 64:
+            case 65:
                 alt84=3;
                 break;
-            case 65:
+            case 66:
                 alt84=4;
                 break;
-            case 66:
+            case 67:
                 alt84=5;
                 break;
-            case 67:
+            case 68:
                 alt84=6;
                 break;
-            case 68:
+            case 69:
                 alt84=7;
                 break;
-            case 69:
+            case 70:
                 alt84=8;
                 break;
-            case 70:
+            case 71:
                 alt84=9;
                 break;
-            case 71:
+            case 72:
                 alt84=10;
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("1319:1: operator returns [String str] : ( \'==\' | \'=\' | \'>\' | \'>=\' | \'<\' | \'<=\' | \'!=\' | \'contains\' | \'matches\' | \'excludes\' );", 84, 0, input);
+                    new NoViableAltException("1335:1: operator returns [String str] : ( \'==\' | \'=\' | \'>\' | \'>=\' | \'<\' | \'<=\' | \'!=\' | \'contains\' | \'matches\' | \'excludes\' );", 84, 0, input);
 
                 throw nvae;
             }
 
             switch (alt84) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1325:17: '=='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1341:17: '=='
                     {
-                    match(input,62,FOLLOW_62_in_operator4119); 
+                    match(input,63,FOLLOW_63_in_operator4205); 
                     str= "==";
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1326:18: '='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:18: '='
                     {
-                    match(input,63,FOLLOW_63_in_operator4126); 
+                    match(input,64,FOLLOW_64_in_operator4212); 
                     str="==";
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1327:18: '>'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:18: '>'
                     {
-                    match(input,64,FOLLOW_64_in_operator4133); 
+                    match(input,65,FOLLOW_65_in_operator4219); 
                     str=">";
 
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1328:18: '>='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:18: '>='
                     {
-                    match(input,65,FOLLOW_65_in_operator4140); 
+                    match(input,66,FOLLOW_66_in_operator4226); 
                     str=">=";
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1329:18: '<'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1345:18: '<'
                     {
-                    match(input,66,FOLLOW_66_in_operator4149); 
+                    match(input,67,FOLLOW_67_in_operator4235); 
                     str="<";
 
                     }
                     break;
                 case 6 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1330:18: '<='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1346:18: '<='
                     {
-                    match(input,67,FOLLOW_67_in_operator4156); 
+                    match(input,68,FOLLOW_68_in_operator4242); 
                     str="<=";
 
                     }
                     break;
                 case 7 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1331:18: '!='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1347:18: '!='
                     {
-                    match(input,68,FOLLOW_68_in_operator4163); 
+                    match(input,69,FOLLOW_69_in_operator4249); 
                     str="!=";
 
                     }
                     break;
                 case 8 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1332:18: 'contains'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1348:18: 'contains'
                     {
-                    match(input,69,FOLLOW_69_in_operator4170); 
+                    match(input,70,FOLLOW_70_in_operator4256); 
                     str="contains";
 
                     }
                     break;
                 case 9 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1333:18: 'matches'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1349:18: 'matches'
                     {
-                    match(input,70,FOLLOW_70_in_operator4177); 
+                    match(input,71,FOLLOW_71_in_operator4263); 
                     str="matches";
 
                     }
                     break;
                 case 10 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1334:18: 'excludes'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1350:18: 'excludes'
                     {
-                    match(input,71,FOLLOW_71_in_operator4184); 
+                    match(input,72,FOLLOW_72_in_operator4270); 
                     str="excludes";
 
                     }
@@ -6872,21 +6958,21 @@
             return predict(input, s0);
         }
         DFA.State s1 = new DFA.State() {{alt=5;}};
+        DFA.State s4 = new DFA.State() {{alt=2;}};
         DFA.State s3 = new DFA.State() {{alt=1;}};
-        DFA.State s4 = new DFA.State() {{alt=2;}};
         DFA.State s5 = new DFA.State() {{alt=3;}};
         DFA.State s2 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 31:
-                    return s3;
+                case 28:
+                    return s4;
 
                 case EOL:
                 case 15:
                     return s2;
 
-                case 28:
-                    return s4;
+                case 31:
+                    return s3;
 
                 case 30:
                     return s5;
@@ -6999,7 +7085,7 @@
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA4_33 = input.LA(1);
                 if ( LA4_33==ID ) {return s22;}
-                if ( LA4_33==49 ) {return s21;}
+                if ( LA4_33==50 ) {return s21;}
 
                 NoViableAltException nvae =
         	    new NoViableAltException("", 4, 33, input);
@@ -7010,7 +7096,7 @@
         DFA.State s21 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA4_21 = input.LA(1);
-                if ( LA4_21==50 ) {return s33;}
+                if ( LA4_21==51 ) {return s33;}
 
                 NoViableAltException nvae =
         	    new NoViableAltException("", 4, 21, input);
@@ -7021,7 +7107,7 @@
         DFA.State s32 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 49:
+                case 50:
                     return s21;
 
                 case ID:
@@ -7054,7 +7140,7 @@
                 case 19:
                     return s20;
 
-                case 49:
+                case 50:
                     return s21;
 
                 case ID:
@@ -7078,6 +7164,8 @@
                 throw nvae;
             }
         };
+        DFA.State s93 = new DFA.State() {{alt=1;}};
+        DFA.State s111 = new DFA.State() {{alt=1;}};
         DFA.State s120 = new DFA.State() {{alt=1;}};
         DFA.State s127 = new DFA.State() {{alt=1;}};
         DFA.State s128 = new DFA.State() {
@@ -7155,6 +7243,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s128;
 
                 default:
@@ -7167,12 +7256,12 @@
         DFA.State s126 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case 26:
+                    return s126;
+
                 case 27:
                     return s127;
 
-                case 26:
-                    return s126;
-
                 case EOL:
                 case ID:
                 case INT:
@@ -7239,6 +7328,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s128;
 
                 default:
@@ -7323,6 +7413,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s128;
 
                 default:
@@ -7407,6 +7498,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s122;
 
                 default:
@@ -7416,7 +7508,7 @@
                     throw nvae;        }
             }
         };
-        DFA.State s111 = new DFA.State() {
+        DFA.State s112 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 27:
@@ -7491,24 +7583,24 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s122;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 111, input);
+                        new NoViableAltException("", 4, 112, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s112 = new DFA.State() {{alt=1;}};
         DFA.State s113 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 27:
-                    return s112;
+                    return s111;
 
                 case 26:
-                    return s111;
+                    return s112;
 
                 case EOL:
                 case ID:
@@ -7576,6 +7668,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s113;
 
                 default:
@@ -7585,13 +7678,13 @@
                     throw nvae;        }
             }
         };
-        DFA.State s93 = new DFA.State() {
+        DFA.State s94 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 26:
+                case 27:
                     return s111;
 
-                case 27:
+                case 26:
                     return s112;
 
                 case EOL:
@@ -7660,24 +7753,24 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s113;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 93, input);
+                        new NoViableAltException("", 4, 94, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s94 = new DFA.State() {{alt=1;}};
         DFA.State s95 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 27:
-                    return s94;
+                    return s93;
 
                 case 26:
-                    return s93;
+                    return s94;
 
                 case EOL:
                 case ID:
@@ -7745,6 +7838,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s95;
 
                 default:
@@ -7757,10 +7851,10 @@
         DFA.State s73 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 26:
+                case 27:
                     return s93;
 
-                case 27:
+                case 26:
                     return s94;
 
                 case EOL:
@@ -7829,6 +7923,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s95;
 
                 default:
@@ -7914,6 +8009,7 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s75;
 
                 default:
@@ -7923,7 +8019,7 @@
                     throw nvae;        }
             }
         };
-        DFA.State s59 = new DFA.State() {
+        DFA.State s57 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 26:
@@ -7998,101 +8094,48 @@
                 case 69:
                 case 70:
                 case 71:
+                case 72:
                     return s75;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 59, input);
+                        new NoViableAltException("", 4, 57, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s58 = new DFA.State() {
+        DFA.State s56 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_58 = input.LA(1);
-                if ( LA4_58==26 ) {return s59;}
-                if ( LA4_58==EOL||LA4_58==15 ) {return s58;}
+                int LA4_56 = input.LA(1);
+                if ( LA4_56==26 ) {return s57;}
+                if ( LA4_56==EOL||LA4_56==15 ) {return s56;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 58, input);
+        	    new NoViableAltException("", 4, 56, input);
 
                 throw nvae;
             }
         };
-        DFA.State s41 = new DFA.State() {
+        DFA.State s39 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_41 = input.LA(1);
-                if ( LA4_41==EOL||LA4_41==15 ) {return s58;}
-                if ( LA4_41==26 ) {return s59;}
+                int LA4_39 = input.LA(1);
+                if ( LA4_39==EOL||LA4_39==15 ) {return s56;}
+                if ( LA4_39==26 ) {return s57;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 41, input);
+        	    new NoViableAltException("", 4, 39, input);
 
                 throw nvae;
             }
         };
-        DFA.State s66 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                switch ( input.LA(1) ) {
-                case 24:
-                    return s56;
-
-                case 25:
-                    return s41;
-
-                case EOL:
-                case 15:
-                    return s66;
-
-                default:
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 4, 66, input);
-
-                    throw nvae;        }
-            }
-        };
-        DFA.State s81 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                switch ( input.LA(1) ) {
-                case EOL:
-                case 15:
-                    return s66;
-
-                case 24:
-                    return s56;
-
-                case 25:
-                    return s41;
-
-                case 49:
-                    return s65;
-
-                default:
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 4, 81, input);
-
-                    throw nvae;        }
-            }
-        };
-        DFA.State s65 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_65 = input.LA(1);
-                if ( LA4_65==50 ) {return s81;}
-
-                NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 65, input);
-
-                throw nvae;
-            }
-        };
         DFA.State s108 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 25:
-                    return s41;
+                    return s39;
 
                 case 24:
-                    return s56;
+                    return s54;
 
                 case EOL:
                 case 15:
@@ -8108,7 +8151,7 @@
         DFA.State s92 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 49:
+                case 50:
                     return s65;
 
                 case EOL:
@@ -8116,10 +8159,10 @@
                     return s108;
 
                 case 25:
-                    return s41;
+                    return s39;
 
                 case 24:
-                    return s56;
+                    return s54;
 
                 default:
                     NoViableAltException nvae =
@@ -8132,10 +8175,10 @@
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 25:
-                    return s41;
+                    return s39;
 
                 case 24:
-                    return s56;
+                    return s54;
 
                 case EOL:
                 case 15:
@@ -8154,18 +8197,18 @@
         DFA.State s70 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 49:
-                    return s53;
+                case 50:
+                    return s51;
 
                 case EOL:
                 case 15:
                     return s88;
 
                 case 25:
-                    return s41;
+                    return s39;
 
                 case 24:
-                    return s56;
+                    return s54;
 
                 case 19:
                     return s20;
@@ -8192,60 +8235,114 @@
                 throw nvae;
             }
         };
-        DFA.State s56 = new DFA.State() {
+        DFA.State s54 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_56 = input.LA(1);
-                if ( LA4_56==EOL||LA4_56==15 ) {return s69;}
-                if ( LA4_56==ID ) {return s70;}
+                int LA4_54 = input.LA(1);
+                if ( LA4_54==EOL||LA4_54==15 ) {return s69;}
+                if ( LA4_54==ID ) {return s70;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 56, input);
+        	    new NoViableAltException("", 4, 54, input);
 
                 throw nvae;
             }
         };
-        DFA.State s55 = new DFA.State() {
+        DFA.State s66 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 49:
-                    return s65;
+                case 24:
+                    return s54;
 
+                case 25:
+                    return s39;
+
                 case EOL:
                 case 15:
                     return s66;
 
+                default:
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 4, 66, input);
+
+                    throw nvae;        }
+            }
+        };
+        DFA.State s81 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                switch ( input.LA(1) ) {
+                case EOL:
+                case 15:
+                    return s66;
+
                 case 24:
-                    return s56;
+                    return s54;
 
                 case 25:
-                    return s41;
+                    return s39;
 
+                case 50:
+                    return s65;
+
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 55, input);
+                        new NoViableAltException("", 4, 81, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s54 = new DFA.State() {
+        DFA.State s65 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA4_65 = input.LA(1);
+                if ( LA4_65==51 ) {return s81;}
+
+                NoViableAltException nvae =
+        	    new NoViableAltException("", 4, 65, input);
+
+                throw nvae;
+            }
+        };
+        DFA.State s53 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case 50:
+                    return s65;
+
+                case EOL:
+                case 15:
+                    return s66;
+
                 case 24:
-                    return s56;
+                    return s54;
 
                 case 25:
-                    return s41;
+                    return s39;
 
+                default:
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 4, 53, input);
+
+                    throw nvae;        }
+            }
+        };
+        DFA.State s52 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                switch ( input.LA(1) ) {
+                case ID:
+                    return s53;
+
                 case EOL:
                 case 15:
+                    return s52;
+
+                case 24:
                     return s54;
 
-                case ID:
-                    return s55;
+                case 25:
+                    return s39;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 54, input);
+                        new NoViableAltException("", 4, 52, input);
 
                     throw nvae;        }
             }
@@ -8255,20 +8352,20 @@
                 switch ( input.LA(1) ) {
                 case EOL:
                 case 15:
+                    return s52;
+
+                case 24:
                     return s54;
 
+                case 25:
+                    return s39;
+
+                case 50:
+                    return s51;
+
                 case ID:
-                    return s55;
-
-                case 49:
                     return s53;
 
-                case 24:
-                    return s56;
-
-                case 25:
-                    return s41;
-
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 4, 60, input);
@@ -8276,126 +8373,126 @@
                     throw nvae;        }
             }
         };
-        DFA.State s53 = new DFA.State() {
+        DFA.State s51 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_53 = input.LA(1);
-                if ( LA4_53==50 ) {return s60;}
+                int LA4_51 = input.LA(1);
+                if ( LA4_51==51 ) {return s60;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 53, input);
+        	    new NoViableAltException("", 4, 51, input);
 
                 throw nvae;
             }
         };
-        DFA.State s40 = new DFA.State() {
+        DFA.State s38 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 19:
                     return s20;
 
-                case 49:
-                    return s53;
+                case 50:
+                    return s51;
 
                 case EOL:
                 case 15:
-                    return s54;
+                    return s52;
 
                 case ID:
-                    return s55;
+                    return s53;
 
                 case 24:
-                    return s56;
+                    return s54;
 
                 case 25:
-                    return s41;
+                    return s39;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 40, input);
+                        new NoViableAltException("", 4, 38, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s39 = new DFA.State() {
+        DFA.State s37 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case ID:
-                    return s40;
+                    return s38;
 
                 case EOL:
                 case 15:
-                    return s39;
+                    return s37;
 
                 case 25:
-                    return s41;
+                    return s39;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 39, input);
+                        new NoViableAltException("", 4, 37, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s29 = new DFA.State() {
+        DFA.State s26 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case EOL:
                 case 15:
-                    return s39;
+                    return s37;
 
                 case ID:
-                    return s40;
+                    return s38;
 
                 case 25:
-                    return s41;
+                    return s39;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 29, input);
+                        new NoViableAltException("", 4, 26, input);
 
                     throw nvae;        }
             }
         };
-        DFA.State s37 = new DFA.State() {
+        DFA.State s40 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_37 = input.LA(1);
-                if ( LA4_37==23 ) {return s29;}
-                if ( LA4_37==EOL||LA4_37==15 ) {return s37;}
+                int LA4_40 = input.LA(1);
+                if ( LA4_40==23 ) {return s26;}
+                if ( LA4_40==EOL||LA4_40==15 ) {return s40;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 37, input);
+        	    new NoViableAltException("", 4, 40, input);
 
                 throw nvae;
             }
         };
-        DFA.State s28 = new DFA.State() {
+        DFA.State s29 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA4_28 = input.LA(1);
-                if ( LA4_28==EOL||LA4_28==15 ) {return s37;}
-                if ( LA4_28==23 ) {return s29;}
+                int LA4_29 = input.LA(1);
+                if ( LA4_29==EOL||LA4_29==15 ) {return s40;}
+                if ( LA4_29==23 ) {return s26;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 4, 28, input);
+        	    new NoViableAltException("", 4, 29, input);
 
                 throw nvae;
             }
         };
-        DFA.State s27 = new DFA.State() {
+        DFA.State s25 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case ID:
-                    return s28;
+                case 23:
+                    return s26;
 
                 case EOL:
                 case 15:
-                    return s27;
+                    return s25;
 
-                case 23:
+                case ID:
                     return s29;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 4, 27, input);
+                        new NoViableAltException("", 4, 25, input);
 
                     throw nvae;        }
             }
@@ -8403,20 +8500,20 @@
         DFA.State s15 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case EOL:
+                case 15:
+                    return s25;
+
+                case 23:
+                    return s26;
+
                 case 19:
                     return s20;
 
-                case 49:
+                case 50:
                     return s21;
 
-                case EOL:
-                case 15:
-                    return s27;
-
                 case ID:
-                    return s28;
-
-                case 23:
                     return s29;
 
                 default:
@@ -8513,7 +8610,7 @@
                 switch ( input.LA(1) ) {
                 case ID:
                 case 19:
-                case 49:
+                case 50:
                     return s3;
 
                 case EOL:
@@ -8547,21 +8644,21 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
+        DFA.State s7 = new DFA.State() {{alt=1;}};
         DFA.State s2 = new DFA.State() {{alt=2;}};
-        DFA.State s7 = new DFA.State() {{alt=1;}};
         DFA.State s4 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 24:
-                case 25:
-                    return s2;
+                case ID:
+                    return s7;
 
                 case EOL:
                 case 15:
                     return s4;
 
-                case ID:
-                    return s7;
+                case 24:
+                case 25:
+                    return s2;
 
                 default:
                     NoViableAltException nvae =
@@ -8577,16 +8674,16 @@
                 case 15:
                     return s4;
 
+                case ID:
+                    return s7;
+
+                case 50:
+                    return s3;
+
                 case 24:
                 case 25:
                     return s2;
 
-                case 49:
-                    return s3;
-
-                case ID:
-                    return s7;
-
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 14, 9, input);
@@ -8597,7 +8694,7 @@
         DFA.State s3 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA14_3 = input.LA(1);
-                if ( LA14_3==50 ) {return s9;}
+                if ( LA14_3==51 ) {return s9;}
 
                 NoViableAltException nvae =
         	    new NoViableAltException("", 14, 3, input);
@@ -8608,7 +8705,7 @@
         DFA.State s1 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 49:
+                case 50:
                     return s3;
 
                 case EOL:
@@ -8647,9 +8744,9 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
-        DFA.State s3 = new DFA.State() {{alt=1;}};
         DFA.State s2 = new DFA.State() {{alt=2;}};
-        DFA.State s5 = new DFA.State() {
+        DFA.State s7 = new DFA.State() {{alt=1;}};
+        DFA.State s4 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 24:
@@ -8658,14 +8755,14 @@
 
                 case EOL:
                 case 15:
-                    return s5;
+                    return s4;
 
                 case ID:
-                    return s3;
+                    return s7;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 15, 5, input);
+                        new NoViableAltException("", 15, 4, input);
 
                     throw nvae;        }
             }
@@ -8675,17 +8772,17 @@
                 switch ( input.LA(1) ) {
                 case EOL:
                 case 15:
-                    return s5;
+                    return s4;
 
                 case 24:
                 case 25:
                     return s2;
 
-                case 49:
-                    return s4;
+                case 50:
+                    return s3;
 
                 case ID:
-                    return s3;
+                    return s7;
 
                 default:
                     NoViableAltException nvae =
@@ -8694,13 +8791,13 @@
                     throw nvae;        }
             }
         };
-        DFA.State s4 = new DFA.State() {
+        DFA.State s3 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA15_4 = input.LA(1);
-                if ( LA15_4==50 ) {return s9;}
+                int LA15_3 = input.LA(1);
+                if ( LA15_3==51 ) {return s9;}
 
                 NoViableAltException nvae =
-        	    new NoViableAltException("", 15, 4, input);
+        	    new NoViableAltException("", 15, 3, input);
 
                 throw nvae;
             }
@@ -8708,21 +8805,21 @@
         DFA.State s1 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case ID:
-                case 19:
+                case 50:
                     return s3;
 
-                case 49:
-                    return s4;
-
                 case EOL:
                 case 15:
-                    return s5;
+                    return s4;
 
                 case 24:
                 case 25:
                     return s2;
 
+                case ID:
+                case 19:
+                    return s7;
+
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 15, 1, input);
@@ -8747,24 +8844,24 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
-        DFA.State s3 = new DFA.State() {{alt=1;}};
-        DFA.State s4 = new DFA.State() {{alt=2;}};
-        DFA.State s2 = new DFA.State() {
+        DFA.State s2 = new DFA.State() {{alt=2;}};
+        DFA.State s6 = new DFA.State() {{alt=1;}};
+        DFA.State s4 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 33:
-                    return s3;
+                    return s6;
 
                 case EOL:
                 case 15:
-                    return s2;
+                    return s4;
 
                 case 23:
-                    return s4;
+                    return s2;
 
                 default:
                     NoViableAltException nvae =
-                        new NoViableAltException("", 48, 2, input);
+                        new NoViableAltException("", 48, 4, input);
 
                     throw nvae;        }
             }
@@ -8772,18 +8869,18 @@
         DFA.State s1 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case 19:
+                case 23:
+                case 50:
+                    return s2;
+
                 case EOL:
                 case 15:
-                    return s2;
+                    return s4;
 
                 case 33:
-                    return s3;
+                    return s6;
 
-                case 19:
-                case 23:
-                case 49:
-                    return s4;
-
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 48, 1, input);
@@ -8812,17 +8909,17 @@
         DFA.State s56 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 23:
-                case 33:
-                    return s8;
+                case 24:
+                case 25:
+                    return s32;
 
                 case EOL:
                 case 15:
                     return s56;
 
-                case 24:
-                case 25:
-                    return s32;
+                case 23:
+                case 33:
+                    return s8;
 
                 default:
                     NoViableAltException nvae =
@@ -8837,7 +8934,7 @@
                 case 19:
                 case 23:
                 case 33:
-                case 49:
+                case 50:
                     return s8;
 
                 case EOL:
@@ -8858,29 +8955,29 @@
         DFA.State s26 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case INT:
+                case BOOL:
+                case STRING:
+                case FLOAT:
+                case 25:
+                case 26:
+                case 48:
+                case 50:
+                    return s32;
+
+                case EOL:
+                case 15:
+                    return s26;
+
                 case 23:
-                case 58:
                 case 59:
                 case 60:
+                case 61:
                     return s8;
 
                 case ID:
                     return s30;
 
-                case EOL:
-                case 15:
-                    return s26;
-
-                case INT:
-                case BOOL:
-                case STRING:
-                case FLOAT:
-                case 25:
-                case 26:
-                case 47:
-                case 49:
-                    return s32;
-
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 49, 26, input);
@@ -8896,9 +8993,9 @@
                     return s26;
 
                 case 23:
-                case 58:
                 case 59:
                 case 60:
+                case 61:
                     return s8;
 
                 case ID:
@@ -8910,8 +9007,8 @@
                 case FLOAT:
                 case 25:
                 case 26:
-                case 47:
-                case 49:
+                case 48:
+                case 50:
                     return s32;
 
                 default:
@@ -8928,9 +9025,9 @@
                 case 25:
                 case 29:
                 case 34:
-                case 58:
                 case 59:
                 case 60:
+                case 61:
                     return s8;
 
                 case EOL:
@@ -8961,13 +9058,13 @@
                 case 25:
                 case 29:
                 case 34:
-                case 51:
                 case 52:
-                case 56:
+                case 53:
                 case 57:
                 case 58:
                 case 59:
                 case 60:
+                case 61:
                     return s8;
 
                 default:
@@ -9069,13 +9166,13 @@
         DFA.State s1 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case ID:
+                    return s2;
+
                 case EOL:
                 case 15:
                     return s1;
 
-                case ID:
-                    return s2;
-
                 case 25:
                     return s3;
 
@@ -9111,14 +9208,11 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
+        DFA.State s2 = new DFA.State() {{alt=2;}};
         DFA.State s3 = new DFA.State() {{alt=1;}};
-        DFA.State s2 = new DFA.State() {{alt=2;}};
         DFA.State s1 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 24:
-                    return s3;
-
                 case EOL:
                 case 15:
                     return s1;
@@ -9126,6 +9220,9 @@
                 case 25:
                     return s2;
 
+                case 24:
+                    return s3;
+
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 64, 1, input);
@@ -9158,14 +9255,17 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
-        DFA.State s3 = new DFA.State() {{alt=2;}};
-        DFA.State s15 = new DFA.State() {{alt=1;}};
+        DFA.State s4 = new DFA.State() {{alt=2;}};
+        DFA.State s3 = new DFA.State() {{alt=1;}};
         DFA.State s2 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case EOL:
+                case 15:
+                    return s2;
+
                 case 24:
                 case 25:
-                case 62:
                 case 63:
                 case 64:
                 case 65:
@@ -9175,14 +9275,11 @@
                 case 69:
                 case 70:
                 case 71:
-                    return s3;
+                case 72:
+                    return s4;
 
-                case EOL:
-                case 15:
-                    return s2;
-
                 case 33:
-                    return s15;
+                    return s3;
 
                 default:
                     NoViableAltException nvae =
@@ -9198,9 +9295,11 @@
                 case 15:
                     return s2;
 
+                case 33:
+                    return s3;
+
                 case 24:
                 case 25:
-                case 62:
                 case 63:
                 case 64:
                 case 65:
@@ -9210,11 +9309,9 @@
                 case 69:
                 case 70:
                 case 71:
-                    return s3;
+                case 72:
+                    return s4;
 
-                case 33:
-                    return s15;
-
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 65, 1, input);
@@ -9238,20 +9335,24 @@
         public int predict(IntStream input) throws RecognitionException {
             return predict(input, s0);
         }
-        DFA.State s15 = new DFA.State() {{alt=1;}};
-        DFA.State s14 = new DFA.State() {{alt=2;}};
+        DFA.State s14 = new DFA.State() {{alt=3;}};
+        DFA.State s16 = new DFA.State() {{alt=1;}};
+        DFA.State s15 = new DFA.State() {{alt=2;}};
         DFA.State s13 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case ID:
-                    return s15;
+                case 47:
+                    return s14;
 
                 case EOL:
                 case 15:
                     return s13;
 
+                case ID:
+                    return s16;
+
                 case 43:
-                    return s14;
+                    return s15;
 
                 default:
                     NoViableAltException nvae =
@@ -9267,12 +9368,15 @@
                 case 15:
                     return s13;
 
-                case 43:
+                case 47:
                     return s14;
 
-                case ID:
+                case 43:
                     return s15;
 
+                case ID:
+                    return s16;
+
                 default:
                     NoViableAltException nvae =
                         new NoViableAltException("", 76, 1, input);
@@ -9280,12 +9384,12 @@
                     throw nvae;        }
             }
         };
-        DFA.State s2 = new DFA.State() {{alt=3;}};
+        DFA.State s2 = new DFA.State() {{alt=4;}};
         DFA.State s0 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA76_0 = input.LA(1);
                 if ( LA76_0==42 ) {return s1;}
-                if ( (LA76_0>=EOL && LA76_0<=ID)||LA76_0==15||LA76_0==23||LA76_0==25||LA76_0==29||LA76_0==34||(LA76_0>=51 && LA76_0<=52)||(LA76_0>=56 && LA76_0<=60) ) {return s2;}
+                if ( (LA76_0>=EOL && LA76_0<=ID)||LA76_0==15||LA76_0==23||LA76_0==25||LA76_0==29||LA76_0==34||(LA76_0>=52 && LA76_0<=53)||(LA76_0>=57 && LA76_0<=61) ) {return s2;}
 
                 NoViableAltException nvae =
         	    new NoViableAltException("", 76, 0, input);
@@ -9358,14 +9462,14 @@
     public static final BitSet FOLLOW_opt_eol_in_function483 = new BitSet(new long[]{0x0000000003000000L});
     public static final BitSet FOLLOW_25_in_function508 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_function512 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_function516 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_26_in_function516 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_curly_chunk_in_function523 = new BitSet(new long[]{0x0000000008000000L});
     public static final BitSet FOLLOW_27_in_function532 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_function540 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_opt_eol_in_query564 = new BitSet(new long[]{0x0000000010000000L});
-    public static final BitSet FOLLOW_28_in_query570 = new BitSet(new long[]{0x20000035B0020120L});
+    public static final BitSet FOLLOW_28_in_query570 = new BitSet(new long[]{0x40000035B0020120L});
     public static final BitSet FOLLOW_word_in_query574 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_query576 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_opt_eol_in_query576 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_expander_lhs_block_in_query592 = new BitSet(new long[]{0x0000000020000000L});
     public static final BitSet FOLLOW_normal_lhs_block_in_query600 = new BitSet(new long[]{0x0000000020000000L});
     public static final BitSet FOLLOW_29_in_query615 = new BitSet(new long[]{0x0000000000008012L});
@@ -9381,21 +9485,21 @@
     public static final BitSet FOLLOW_ID_in_template_slot721 = new BitSet(new long[]{0x0000000000008010L});
     public static final BitSet FOLLOW_set_in_template_slot725 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_opt_eol_in_rule760 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_31_in_rule766 = new BitSet(new long[]{0x20000035B0020120L});
+    public static final BitSet FOLLOW_31_in_rule766 = new BitSet(new long[]{0x40000035B0020120L});
     public static final BitSet FOLLOW_word_in_rule770 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_rule772 = new BitSet(new long[]{0x0000000A00008012L});
     public static final BitSet FOLLOW_rule_attributes_in_rule783 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_rule793 = new BitSet(new long[]{0x0000000120008012L});
     public static final BitSet FOLLOW_32_in_rule802 = new BitSet(new long[]{0x0000000200008012L});
     public static final BitSet FOLLOW_33_in_rule804 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_rule807 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_opt_eol_in_rule807 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_expander_lhs_block_in_rule825 = new BitSet(new long[]{0x0000000020008012L});
     public static final BitSet FOLLOW_normal_lhs_block_in_rule834 = new BitSet(new long[]{0x0000000020008012L});
     public static final BitSet FOLLOW_opt_eol_in_rule857 = new BitSet(new long[]{0x0000000400000000L});
     public static final BitSet FOLLOW_34_in_rule861 = new BitSet(new long[]{0x0000000200008012L});
     public static final BitSet FOLLOW_33_in_rule863 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_rule867 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_EOL_in_rule894 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_opt_eol_in_rule867 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_EOL_in_rule894 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000001FFL});
     public static final BitSet FOLLOW_29_in_rule924 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_rule926 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_import_statement_in_extra_statement946 = new BitSet(new long[]{0x0000000000000002L});
@@ -9453,11 +9557,11 @@
     public static final BitSet FOLLOW_15_in_duration1442 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_duration1445 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_lhs_in_normal_lhs_block1471 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_normal_lhs_block1473 = new BitSet(new long[]{0x1C00000000808032L});
+    public static final BitSet FOLLOW_opt_eol_in_normal_lhs_block1473 = new BitSet(new long[]{0x3800000000808032L});
     public static final BitSet FOLLOW_opt_eol_in_normal_lhs_block1485 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_paren_chunk_in_expander_lhs_block1526 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_EOL_in_expander_lhs_block1530 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_EOL_in_expander_lhs_block1545 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_EOL_in_expander_lhs_block1530 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_EOL_in_expander_lhs_block1545 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_lhs_or_in_lhs1587 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_fact_binding_in_lhs_column1615 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_fact_in_lhs_column1624 = new BitSet(new long[]{0x0000000000000002L});
@@ -9472,14 +9576,14 @@
     public static final BitSet FOLLOW_ID_in_from_source1741 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_from_source1743 = new BitSet(new long[]{0x0000000000800000L});
     public static final BitSet FOLLOW_23_in_from_source1746 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_from_source1748 = new BitSet(new long[]{0x00028000040003E2L});
+    public static final BitSet FOLLOW_opt_eol_in_from_source1748 = new BitSet(new long[]{0x00050000040003E2L});
     public static final BitSet FOLLOW_argument_list_in_from_source1752 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_from_source1754 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_from_source1756 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_ID_in_from_source1778 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_from_source1780 = new BitSet(new long[]{0x0000000000800000L});
     public static final BitSet FOLLOW_23_in_from_source1782 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_from_source1784 = new BitSet(new long[]{0x00028000040003E2L});
+    public static final BitSet FOLLOW_opt_eol_in_from_source1784 = new BitSet(new long[]{0x00050000040003E2L});
     public static final BitSet FOLLOW_argument_list_in_from_source1788 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_from_source1790 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_from_source1792 = new BitSet(new long[]{0x0000000000000002L});
@@ -9495,7 +9599,7 @@
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1869 = new BitSet(new long[]{0x0000100000000000L});
     public static final BitSet FOLLOW_44_in_accumulate_statement1877 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1879 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_accumulate_statement1881 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_23_in_accumulate_statement1881 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_paren_chunk2_in_accumulate_statement1885 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_accumulate_statement1887 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1889 = new BitSet(new long[]{0x0000000001000000L});
@@ -9503,7 +9607,7 @@
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1893 = new BitSet(new long[]{0x0000200000000000L});
     public static final BitSet FOLLOW_45_in_accumulate_statement1901 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1903 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_accumulate_statement1905 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_23_in_accumulate_statement1905 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_paren_chunk2_in_accumulate_statement1909 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_accumulate_statement1911 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1913 = new BitSet(new long[]{0x0000000001000000L});
@@ -9511,183 +9615,193 @@
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1917 = new BitSet(new long[]{0x0000400000000000L});
     public static final BitSet FOLLOW_46_in_accumulate_statement1925 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1927 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_accumulate_statement1929 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
+    public static final BitSet FOLLOW_23_in_accumulate_statement1929 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
     public static final BitSet FOLLOW_paren_chunk2_in_accumulate_statement1933 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_accumulate_statement1935 = new BitSet(new long[]{0x0000000000008012L});
     public static final BitSet FOLLOW_opt_eol_in_accumulate_statement1937 = new BitSet(new long[]{0x0000000002000000L});
     public static final BitSet FOLLOW_25_in_accumulate_statement1939 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_argument_value_in_argument_list1976 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_argument_list1992 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_argument_list1994 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_argument_list1996 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_argument_list2000 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_STRING_in_argument_value2040 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INT_in_argument_value2051 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FLOAT_in_argument_value2064 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BOOL_in_argument_value2075 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_argument_value2087 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_47_in_argument_value2098 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_47_in_argument_value2109 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_inline_map_in_argument_value2128 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_inline_array_in_argument_value2144 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_26_in_inline_map2184 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_map2202 = new BitSet(new long[]{0x0001000000000000L});
-    public static final BitSet FOLLOW_48_in_inline_map2204 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_map2208 = new BitSet(new long[]{0x0000000009000010L});
-    public static final BitSet FOLLOW_EOL_in_inline_map2251 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_inline_map2255 = new BitSet(new long[]{0x00028000040003F0L});
-    public static final BitSet FOLLOW_EOL_in_inline_map2258 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_map2264 = new BitSet(new long[]{0x0001000000000000L});
-    public static final BitSet FOLLOW_48_in_inline_map2266 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_map2270 = new BitSet(new long[]{0x0000000009000010L});
-    public static final BitSet FOLLOW_27_in_inline_map2306 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_49_in_inline_array2350 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_array2354 = new BitSet(new long[]{0x0004000001000010L});
-    public static final BitSet FOLLOW_EOL_in_inline_array2372 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_inline_array2375 = new BitSet(new long[]{0x00028000040003F0L});
-    public static final BitSet FOLLOW_EOL_in_inline_array2377 = new BitSet(new long[]{0x00028000040003E0L});
-    public static final BitSet FOLLOW_argument_value_in_inline_array2382 = new BitSet(new long[]{0x0004000001000010L});
-    public static final BitSet FOLLOW_50_in_inline_array2395 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_fact_binding2438 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_binding2448 = new BitSet(new long[]{0x0000000200000000L});
-    public static final BitSet FOLLOW_33_in_fact_binding2450 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_binding2452 = new BitSet(new long[]{0x0000000000800020L});
-    public static final BitSet FOLLOW_fact_expression_in_fact_binding2456 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_23_in_fact_expression2488 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_expression2490 = new BitSet(new long[]{0x0000000000800020L});
-    public static final BitSet FOLLOW_fact_expression_in_fact_expression2494 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_expression2496 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_fact_expression2498 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_fact_in_fact_expression2509 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_expression2511 = new BitSet(new long[]{0x0018000000000002L});
-    public static final BitSet FOLLOW_set_in_fact_expression2524 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact_expression2529 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_fact_in_fact_expression2543 = new BitSet(new long[]{0x0018000000000002L});
-    public static final BitSet FOLLOW_dotted_name_in_fact2582 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact2590 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_fact2598 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact2601 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_constraints_in_fact2607 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact2626 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_fact2630 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_fact2632 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_opt_eol_in_constraints2664 = new BitSet(new long[]{0x0000000000008032L});
-    public static final BitSet FOLLOW_constraint_in_constraints2669 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_predicate_in_constraints2672 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraints2680 = new BitSet(new long[]{0x0000000001000000L});
-    public static final BitSet FOLLOW_24_in_constraints2682 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraints2684 = new BitSet(new long[]{0x0000000000008032L});
-    public static final BitSet FOLLOW_constraint_in_constraints2687 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_predicate_in_constraints2690 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraints2698 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint2717 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_ID_in_constraint2725 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint2727 = new BitSet(new long[]{0x0000000200000000L});
-    public static final BitSet FOLLOW_33_in_constraint2729 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint2731 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_ID_in_constraint2741 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint2755 = new BitSet(new long[]{0xC000000000008012L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_operator_in_constraint2761 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint2763 = new BitSet(new long[]{0x00008000008003E0L});
-    public static final BitSet FOLLOW_ID_in_constraint2781 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_enum_constraint_in_constraint2806 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_literal_constraint_in_constraint2838 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_retval_constraint_in_constraint2858 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_set_in_constraint2893 = new BitSet(new long[]{0xC000000000000000L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_operator_in_constraint2915 = new BitSet(new long[]{0x00008000008003E0L});
-    public static final BitSet FOLLOW_ID_in_constraint2927 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_enum_constraint_in_constraint2955 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_literal_constraint_in_constraint2990 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_retval_constraint_in_constraint3012 = new BitSet(new long[]{0x0060000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_constraint3068 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_literal_constraint3095 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INT_in_literal_constraint3106 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FLOAT_in_literal_constraint3119 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BOOL_in_literal_constraint3130 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_47_in_literal_constraint3142 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_enum_constraint3173 = new BitSet(new long[]{0x0000000000080000L});
-    public static final BitSet FOLLOW_19_in_enum_constraint3175 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_ID_in_enum_constraint3179 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_23_in_retval_constraint3208 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_paren_chunk_in_retval_constraint3213 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_retval_constraint3216 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_predicate3234 = new BitSet(new long[]{0x0000000200000000L});
-    public static final BitSet FOLLOW_33_in_predicate3236 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_ID_in_predicate3240 = new BitSet(new long[]{0x0080000000000000L});
-    public static final BitSet FOLLOW_55_in_predicate3242 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_predicate3244 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_paren_chunk_in_predicate3248 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_predicate3250 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_23_in_paren_chunk3296 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_paren_chunk_in_paren_chunk3300 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_paren_chunk3302 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_23_in_paren_chunk23373 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_paren_chunk2_in_paren_chunk23377 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_paren_chunk23379 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_26_in_curly_chunk3448 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_curly_chunk_in_curly_chunk3452 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_27_in_curly_chunk3454 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or3512 = new BitSet(new long[]{0x0018000000000002L});
-    public static final BitSet FOLLOW_set_in_lhs_or3521 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_lhs_or3526 = new BitSet(new long[]{0x1C00000000800020L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or3533 = new BitSet(new long[]{0x0018000000000002L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and3573 = new BitSet(new long[]{0x0300000000000002L});
-    public static final BitSet FOLLOW_set_in_lhs_and3582 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_lhs_and3587 = new BitSet(new long[]{0x1C00000000800020L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and3594 = new BitSet(new long[]{0x0300000000000002L});
-    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary3632 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_not_in_lhs_unary3642 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary3652 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_column_in_lhs_unary3666 = new BitSet(new long[]{0x0000040000000002L});
-    public static final BitSet FOLLOW_from_statement_in_lhs_unary3687 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_accumulate_statement_in_lhs_unary3709 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_23_in_lhs_unary3721 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_lhs_unary3723 = new BitSet(new long[]{0x1C00000000800020L});
-    public static final BitSet FOLLOW_lhs_in_lhs_unary3727 = new BitSet(new long[]{0x0000000000008012L});
-    public static final BitSet FOLLOW_opt_eol_in_lhs_unary3729 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_lhs_unary3731 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_58_in_lhs_exist3762 = new BitSet(new long[]{0x0000000000800020L});
-    public static final BitSet FOLLOW_23_in_lhs_exist3765 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_lhs_column_in_lhs_exist3769 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_lhs_exist3771 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_column_in_lhs_exist3777 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_59_in_lhs_not3807 = new BitSet(new long[]{0x0000000000800020L});
-    public static final BitSet FOLLOW_23_in_lhs_not3810 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_lhs_column_in_lhs_not3814 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_lhs_not3817 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_column_in_lhs_not3823 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_60_in_lhs_eval3849 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_lhs_eval3853 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000000FFL});
-    public static final BitSet FOLLOW_paren_chunk2_in_lhs_eval3861 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_lhs_eval3865 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_dotted_name3897 = new BitSet(new long[]{0x0002000000080002L});
-    public static final BitSet FOLLOW_19_in_dotted_name3903 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_ID_in_dotted_name3907 = new BitSet(new long[]{0x0002000000080002L});
-    public static final BitSet FOLLOW_49_in_dotted_name3916 = new BitSet(new long[]{0x0004000000000000L});
-    public static final BitSet FOLLOW_50_in_dotted_name3918 = new BitSet(new long[]{0x0002000000000002L});
-    public static final BitSet FOLLOW_ID_in_argument_name3948 = new BitSet(new long[]{0x0002000000000002L});
-    public static final BitSet FOLLOW_49_in_argument_name3954 = new BitSet(new long[]{0x0004000000000000L});
-    public static final BitSet FOLLOW_50_in_argument_name3956 = new BitSet(new long[]{0x0002000000000002L});
-    public static final BitSet FOLLOW_ID_in_word3984 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_17_in_word3996 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_61_in_word4005 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_31_in_word4017 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_28_in_word4028 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_36_in_word4038 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_37_in_word4046 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_32_in_word4054 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_34_in_word4065 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_29_in_word4076 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_word4090 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_62_in_operator4119 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_63_in_operator4126 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_64_in_operator4133 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_65_in_operator4140 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_66_in_operator4149 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_67_in_operator4156 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_68_in_operator4163 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_69_in_operator4170 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_70_in_operator4177 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_71_in_operator4184 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_42_in_collect_statement1982 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_collect_statement1984 = new BitSet(new long[]{0x0000800000000000L});
+    public static final BitSet FOLLOW_47_in_collect_statement1986 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_collect_statement1988 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_23_in_collect_statement1998 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_collect_statement2000 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_lhs_column_in_collect_statement2004 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_collect_statement2006 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_collect_statement2008 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_argument_value_in_argument_list2041 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_argument_list2057 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_24_in_argument_list2059 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_argument_list2061 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_argument_list2065 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_STRING_in_argument_value2105 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_INT_in_argument_value2116 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FLOAT_in_argument_value2129 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_BOOL_in_argument_value2140 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_argument_value2152 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_48_in_argument_value2163 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_48_in_argument_value2174 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_inline_map_in_argument_value2193 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_inline_array_in_argument_value2209 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_26_in_inline_map2249 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_map2267 = new BitSet(new long[]{0x0002000000000000L});
+    public static final BitSet FOLLOW_49_in_inline_map2269 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_map2273 = new BitSet(new long[]{0x0000000009000010L});
+    public static final BitSet FOLLOW_EOL_in_inline_map2316 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_24_in_inline_map2320 = new BitSet(new long[]{0x00050000040003F0L});
+    public static final BitSet FOLLOW_EOL_in_inline_map2323 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_map2329 = new BitSet(new long[]{0x0002000000000000L});
+    public static final BitSet FOLLOW_49_in_inline_map2331 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_map2335 = new BitSet(new long[]{0x0000000009000010L});
+    public static final BitSet FOLLOW_27_in_inline_map2371 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_50_in_inline_array2415 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_array2419 = new BitSet(new long[]{0x0008000001000010L});
+    public static final BitSet FOLLOW_EOL_in_inline_array2437 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_24_in_inline_array2440 = new BitSet(new long[]{0x00050000040003F0L});
+    public static final BitSet FOLLOW_EOL_in_inline_array2442 = new BitSet(new long[]{0x00050000040003E0L});
+    public static final BitSet FOLLOW_argument_value_in_inline_array2447 = new BitSet(new long[]{0x0008000001000010L});
+    public static final BitSet FOLLOW_51_in_inline_array2460 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_fact_binding2503 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_binding2513 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_33_in_fact_binding2515 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_binding2517 = new BitSet(new long[]{0x0000000000800020L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_binding2521 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_fact_expression2553 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_expression2555 = new BitSet(new long[]{0x0000000000800020L});
+    public static final BitSet FOLLOW_fact_expression_in_fact_expression2559 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_expression2561 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_fact_expression2563 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_in_fact_expression2574 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_expression2576 = new BitSet(new long[]{0x0030000000000002L});
+    public static final BitSet FOLLOW_set_in_fact_expression2589 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact_expression2594 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_fact_in_fact_expression2608 = new BitSet(new long[]{0x0030000000000002L});
+    public static final BitSet FOLLOW_dotted_name_in_fact2647 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact2655 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_23_in_fact2663 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact2666 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_constraints_in_fact2672 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact2691 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_fact2695 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_fact2697 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_opt_eol_in_constraints2729 = new BitSet(new long[]{0x0000000000008032L});
+    public static final BitSet FOLLOW_constraint_in_constraints2734 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_predicate_in_constraints2737 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraints2745 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_24_in_constraints2747 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraints2749 = new BitSet(new long[]{0x0000000000008032L});
+    public static final BitSet FOLLOW_constraint_in_constraints2752 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_predicate_in_constraints2755 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraints2763 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint2782 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_ID_in_constraint2790 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint2792 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_33_in_constraint2794 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint2796 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_ID_in_constraint2806 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint2820 = new BitSet(new long[]{0x8000000000008012L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_operator_in_constraint2826 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint2828 = new BitSet(new long[]{0x00010000008003E0L});
+    public static final BitSet FOLLOW_ID_in_constraint2846 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_enum_constraint_in_constraint2871 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_literal_constraint_in_constraint2903 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_retval_constraint_in_constraint2923 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_set_in_constraint2958 = new BitSet(new long[]{0x8000000000000000L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_operator_in_constraint2980 = new BitSet(new long[]{0x00010000008003E0L});
+    public static final BitSet FOLLOW_ID_in_constraint2992 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_enum_constraint_in_constraint3020 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_literal_constraint_in_constraint3055 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_retval_constraint_in_constraint3077 = new BitSet(new long[]{0x00C0000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_constraint3133 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_literal_constraint3160 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_INT_in_literal_constraint3171 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FLOAT_in_literal_constraint3184 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_BOOL_in_literal_constraint3195 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_48_in_literal_constraint3207 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_enum_constraint3238 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_19_in_enum_constraint3240 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_ID_in_enum_constraint3244 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_retval_constraint3273 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_paren_chunk_in_retval_constraint3278 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_retval_constraint3281 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_predicate3299 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_33_in_predicate3301 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_ID_in_predicate3305 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_56_in_predicate3307 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_23_in_predicate3309 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_paren_chunk_in_predicate3313 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_predicate3315 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_paren_chunk3361 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_paren_chunk_in_paren_chunk3365 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_paren_chunk3367 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_23_in_paren_chunk23438 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_paren_chunk2_in_paren_chunk23442 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_paren_chunk23444 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_26_in_curly_chunk3513 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_curly_chunk_in_curly_chunk3517 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_27_in_curly_chunk3519 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or3577 = new BitSet(new long[]{0x0030000000000002L});
+    public static final BitSet FOLLOW_set_in_lhs_or3586 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_lhs_or3591 = new BitSet(new long[]{0x3800000000800020L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or3598 = new BitSet(new long[]{0x0030000000000002L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and3638 = new BitSet(new long[]{0x0600000000000002L});
+    public static final BitSet FOLLOW_set_in_lhs_and3647 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_lhs_and3652 = new BitSet(new long[]{0x3800000000800020L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and3659 = new BitSet(new long[]{0x0600000000000002L});
+    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary3697 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_not_in_lhs_unary3707 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary3717 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_column_in_lhs_unary3731 = new BitSet(new long[]{0x0000040000000002L});
+    public static final BitSet FOLLOW_from_statement_in_lhs_unary3752 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accumulate_statement_in_lhs_unary3774 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_collect_statement_in_lhs_unary3795 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_23_in_lhs_unary3807 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_lhs_unary3809 = new BitSet(new long[]{0x3800000000800020L});
+    public static final BitSet FOLLOW_lhs_in_lhs_unary3813 = new BitSet(new long[]{0x0000000000008012L});
+    public static final BitSet FOLLOW_opt_eol_in_lhs_unary3815 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_lhs_unary3817 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_59_in_lhs_exist3848 = new BitSet(new long[]{0x0000000000800020L});
+    public static final BitSet FOLLOW_23_in_lhs_exist3851 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_lhs_column_in_lhs_exist3855 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_lhs_exist3857 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_column_in_lhs_exist3863 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_60_in_lhs_not3893 = new BitSet(new long[]{0x0000000000800020L});
+    public static final BitSet FOLLOW_23_in_lhs_not3896 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_lhs_column_in_lhs_not3900 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_lhs_not3903 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_column_in_lhs_not3909 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_61_in_lhs_eval3935 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_23_in_lhs_eval3939 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF2L,0x00000000000001FFL});
+    public static final BitSet FOLLOW_paren_chunk2_in_lhs_eval3947 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_25_in_lhs_eval3951 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_dotted_name3983 = new BitSet(new long[]{0x0004000000080002L});
+    public static final BitSet FOLLOW_19_in_dotted_name3989 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_ID_in_dotted_name3993 = new BitSet(new long[]{0x0004000000080002L});
+    public static final BitSet FOLLOW_50_in_dotted_name4002 = new BitSet(new long[]{0x0008000000000000L});
+    public static final BitSet FOLLOW_51_in_dotted_name4004 = new BitSet(new long[]{0x0004000000000002L});
+    public static final BitSet FOLLOW_ID_in_argument_name4034 = new BitSet(new long[]{0x0004000000000002L});
+    public static final BitSet FOLLOW_50_in_argument_name4040 = new BitSet(new long[]{0x0008000000000000L});
+    public static final BitSet FOLLOW_51_in_argument_name4042 = new BitSet(new long[]{0x0004000000000002L});
+    public static final BitSet FOLLOW_ID_in_word4070 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_17_in_word4082 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_62_in_word4091 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_31_in_word4103 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_28_in_word4114 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_36_in_word4124 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_37_in_word4132 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_32_in_word4140 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_34_in_word4151 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_29_in_word4162 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_word4176 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_63_in_operator4205 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_64_in_operator4212 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_65_in_operator4219 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_66_in_operator4226 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_67_in_operator4235 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_68_in_operator4242 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_69_in_operator4249 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_70_in_operator4256 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_71_in_operator4263 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_72_in_operator4270 = new BitSet(new long[]{0x0000000000000002L});
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParserLexer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParserLexer.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/RuleParserLexer.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0ea8 D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g 2006-09-06 10:48:08
+// $ANTLR 3.0ea8 D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g 2006-09-11 08:58:38
 
 	package org.drools.lang;
 
@@ -41,7 +41,7 @@
     public static final int T39=39;
     public static final int ID=5;
     public static final int T21=21;
-    public static final int Synpred1_fragment=73;
+    public static final int Synpred1_fragment=74;
     public static final int T62=62;
     public static final int T44=44;
     public static final int T55=55;
@@ -61,6 +61,7 @@
     public static final int T71=71;
     public static final int T63=63;
     public static final int T57=57;
+    public static final int T72=72;
     public static final int T65=65;
     public static final int T56=56;
     public static final int T59=59;
@@ -71,7 +72,7 @@
     public static final int T67=67;
     public static final int T47=47;
     public static final int EOL=4;
-    public static final int Tokens=72;
+    public static final int Tokens=73;
     public static final int T53=53;
     public static final int T60=60;
     public static final int T31=31;
@@ -84,7 +85,7 @@
     public RuleParserLexer() {;} 
     public RuleParserLexer(CharStream input) {
         super(input);
-        ruleMemo = new Map[70+1];
+        ruleMemo = new Map[71+1];
      }
 
 
@@ -954,10 +955,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 33) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:38:7: ( 'null' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:38:7: 'null'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:38:7: ( 'collect' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:38:7: 'collect'
             {
-            match("null"); if (failed) return ;
+            match("collect"); if (failed) return ;
 
 
             }
@@ -981,10 +982,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 34) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:39:7: ( '=>' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:39:7: '=>'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:39:7: ( 'null' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:39:7: 'null'
             {
-            match("=>"); if (failed) return ;
+            match("null"); if (failed) return ;
 
 
             }
@@ -1008,11 +1009,12 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 35) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:40:7: ( '[' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:40:7: '['
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:40:7: ( '=>' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:40:7: '=>'
             {
-            match('['); if (failed) return ;
+            match("=>"); if (failed) return ;
 
+
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1034,10 +1036,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 36) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:41:7: ( ']' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:41:7: ']'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:41:7: ( '[' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:41:7: '['
             {
-            match(']'); if (failed) return ;
+            match('['); if (failed) return ;
 
             }
 
@@ -1060,12 +1062,11 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 37) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:42:7: ( 'or' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:42:7: 'or'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:42:7: ( ']' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:42:7: ']'
             {
-            match("or"); if (failed) return ;
+            match(']'); if (failed) return ;
 
-
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1087,10 +1088,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 38) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:43:7: ( '||' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:43:7: '||'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:43:7: ( 'or' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:43:7: 'or'
             {
-            match("||"); if (failed) return ;
+            match("or"); if (failed) return ;
 
 
             }
@@ -1114,11 +1115,12 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 39) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:44:7: ( '&' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:44:7: '&'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:44:7: ( '||' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:44:7: '||'
             {
-            match('&'); if (failed) return ;
+            match("||"); if (failed) return ;
 
+
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1140,10 +1142,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 40) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:45:7: ( '|' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:45:7: '|'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:45:7: ( '&' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:45:7: '&'
             {
-            match('|'); if (failed) return ;
+            match('&'); if (failed) return ;
 
             }
 
@@ -1166,12 +1168,11 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 41) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:46:7: ( '->' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:46:7: '->'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:46:7: ( '|' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:46:7: '|'
             {
-            match("->"); if (failed) return ;
+            match('|'); if (failed) return ;
 
-
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1193,10 +1194,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 42) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:47:7: ( 'and' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:47:7: 'and'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:47:7: ( '->' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:47:7: '->'
             {
-            match("and"); if (failed) return ;
+            match("->"); if (failed) return ;
 
 
             }
@@ -1220,10 +1221,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 43) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:48:7: ( '&&' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:48:7: '&&'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:48:7: ( 'and' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:48:7: 'and'
             {
-            match("&&"); if (failed) return ;
+            match("and"); if (failed) return ;
 
 
             }
@@ -1247,10 +1248,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 44) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:49:7: ( 'exists' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:49:7: 'exists'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:49:7: ( '&&' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:49:7: '&&'
             {
-            match("exists"); if (failed) return ;
+            match("&&"); if (failed) return ;
 
 
             }
@@ -1274,10 +1275,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 45) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:50:7: ( 'not' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:50:7: 'not'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:50:7: ( 'exists' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:50:7: 'exists'
             {
-            match("not"); if (failed) return ;
+            match("exists"); if (failed) return ;
 
 
             }
@@ -1301,10 +1302,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 46) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:51:7: ( 'eval' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:51:7: 'eval'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:51:7: ( 'not' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:51:7: 'not'
             {
-            match("eval"); if (failed) return ;
+            match("not"); if (failed) return ;
 
 
             }
@@ -1328,10 +1329,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 47) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:52:7: ( 'use' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:52:7: 'use'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:52:7: ( 'eval' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:52:7: 'eval'
             {
-            match("use"); if (failed) return ;
+            match("eval"); if (failed) return ;
 
 
             }
@@ -1355,10 +1356,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 48) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:53:7: ( '==' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:53:7: '=='
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:53:7: ( 'use' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:53:7: 'use'
             {
-            match("=="); if (failed) return ;
+            match("use"); if (failed) return ;
 
 
             }
@@ -1382,11 +1383,12 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 49) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:54:7: ( '=' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:54:7: '='
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:54:7: ( '==' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:54:7: '=='
             {
-            match('='); if (failed) return ;
+            match("=="); if (failed) return ;
 
+
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1408,10 +1410,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 50) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:55:7: ( '>' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:55:7: '>'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:55:7: ( '=' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:55:7: '='
             {
-            match('>'); if (failed) return ;
+            match('='); if (failed) return ;
 
             }
 
@@ -1434,12 +1436,11 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 51) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:56:7: ( '>=' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:56:7: '>='
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:56:7: ( '>' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:56:7: '>'
             {
-            match(">="); if (failed) return ;
+            match('>'); if (failed) return ;
 
-
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1461,11 +1462,12 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 52) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:57:7: ( '<' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:57:7: '<'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:57:7: ( '>=' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:57:7: '>='
             {
-            match('<'); if (failed) return ;
+            match(">="); if (failed) return ;
 
+
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1487,12 +1489,11 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 53) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:58:7: ( '<=' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:58:7: '<='
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:58:7: ( '<' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:58:7: '<'
             {
-            match("<="); if (failed) return ;
+            match('<'); if (failed) return ;
 
-
             }
 
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
@@ -1514,10 +1515,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 54) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:59:7: ( '!=' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:59:7: '!='
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:59:7: ( '<=' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:59:7: '<='
             {
-            match("!="); if (failed) return ;
+            match("<="); if (failed) return ;
 
 
             }
@@ -1541,10 +1542,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 55) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:60:7: ( 'contains' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:60:7: 'contains'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:60:7: ( '!=' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:60:7: '!='
             {
-            match("contains"); if (failed) return ;
+            match("!="); if (failed) return ;
 
 
             }
@@ -1568,10 +1569,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 56) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:61:7: ( 'matches' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:61:7: 'matches'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:61:7: ( 'contains' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:61:7: 'contains'
             {
-            match("matches"); if (failed) return ;
+            match("contains"); if (failed) return ;
 
 
             }
@@ -1595,10 +1596,10 @@
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
             if ( backtracking>0 && alreadyParsedRule(input, 57) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:62:7: ( 'excludes' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:62:7: 'excludes'
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:62:7: ( 'matches' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:62:7: 'matches'
             {
-            match("excludes"); if (failed) return ;
+            match("matches"); if (failed) return ;
 
 
             }
@@ -1612,6 +1613,33 @@
     // $ANTLR end T71
 
 
+    // $ANTLR start T72
+    public void mT72() throws RecognitionException {
+        int T72_StartIndex = input.index();
+        try {
+            int type = T72;
+            int start = getCharIndex();
+            int line = getLine();
+            int charPosition = getCharPositionInLine();
+            int channel = Token.DEFAULT_CHANNEL;
+            if ( backtracking>0 && alreadyParsedRule(input, 58) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:63:7: ( 'excludes' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:63:7: 'excludes'
+            {
+            match("excludes"); if (failed) return ;
+
+
+            }
+
+            if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
+        }
+        finally {
+            if ( backtracking>0 ) { memoize(input, 58, T72_StartIndex); }
+        }
+    }
+    // $ANTLR end T72
+
+
     // $ANTLR start MISC
     public void mMISC() throws RecognitionException {
         int MISC_StartIndex = input.index();
@@ -1621,8 +1649,8 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 58) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:17: ( '!' | '@' | '$' | '%' | '^' | '&' | '*' | '_' | '-' | '+' | '?' | '|' | ',' | '{' | '}' | '[' | ']' | '=' | '/' | '(' | ')' | '\'' | '\\' | '||' | '&&' | '<<<' | '++' | '--' | '>>>' | '==' | '+=' | '=+' | '-=' | '=-' | '*=' | '=*' | '/=' | '=/' | '>>=' )
+            if ( backtracking>0 && alreadyParsedRule(input, 59) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:17: ( '!' | '@' | '$' | '%' | '^' | '&' | '*' | '_' | '-' | '+' | '?' | '|' | ',' | '{' | '}' | '[' | ']' | '=' | '/' | '(' | ')' | '\'' | '\\' | '||' | '&&' | '<<<' | '++' | '--' | '>>>' | '==' | '+=' | '=+' | '-=' | '=-' | '*=' | '=*' | '/=' | '=/' | '>>=' )
             int alt1=39;
             switch ( input.LA(1) ) {
             case '!':
@@ -1711,21 +1739,21 @@
                 break;
             case '=':
                 switch ( input.LA(2) ) {
-                case '/':
-                    alt1=38;
+                case '=':
+                    alt1=30;
                     break;
+                case '-':
+                    alt1=34;
+                    break;
                 case '*':
                     alt1=36;
                     break;
+                case '/':
+                    alt1=38;
+                    break;
                 case '+':
                     alt1=32;
                     break;
-                case '=':
-                    alt1=30;
-                    break;
-                case '-':
-                    alt1=34;
-                    break;
                 default:
                     alt1=18;}
 
@@ -1766,7 +1794,7 @@
                     else {
                         if (backtracking>0) {failed=true; return ;}
                         NoViableAltException nvae =
-                            new NoViableAltException("1341:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 46, input);
+                            new NoViableAltException("1357:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 46, input);
 
                         throw nvae;
                     }
@@ -1774,7 +1802,7 @@
                 else {
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1341:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 25, input);
+                        new NoViableAltException("1357:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 25, input);
 
                     throw nvae;
                 }
@@ -1782,175 +1810,175 @@
             default:
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1341:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 0, input);
+                    new NoViableAltException("1357:1: MISC : ( \'!\' | \'@\' | \'$\' | \'%\' | \'^\' | \'&\' | \'*\' | \'_\' | \'-\' | \'+\' | \'?\' | \'|\' | \',\' | \'{\' | \'}\' | \'[\' | \']\' | \'=\' | \'/\' | \'(\' | \')\' | \'\\\'\' | \'\\\\\' | \'||\' | \'&&\' | \'<<<\' | \'++\' | \'--\' | \'>>>\' | \'==\' | \'+=\' | \'=+\' | \'-=\' | \'=-\' | \'*=\' | \'=*\' | \'/=\' | \'=/\' | \'>>=\' );", 1, 0, input);
 
                 throw nvae;
             }
 
             switch (alt1) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:17: '!'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:17: '!'
                     {
                     match('!'); if (failed) return ;
 
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:23: '@'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:23: '@'
                     {
                     match('@'); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:29: '$'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:29: '$'
                     {
                     match('$'); if (failed) return ;
 
                     }
                     break;
                 case 4 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:35: '%'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:35: '%'
                     {
                     match('%'); if (failed) return ;
 
                     }
                     break;
                 case 5 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:41: '^'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:41: '^'
                     {
                     match('^'); if (failed) return ;
 
                     }
                     break;
                 case 6 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:47: '&'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:47: '&'
                     {
                     match('&'); if (failed) return ;
 
                     }
                     break;
                 case 7 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:53: '*'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:53: '*'
                     {
                     match('*'); if (failed) return ;
 
                     }
                     break;
                 case 8 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:59: '_'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:59: '_'
                     {
                     match('_'); if (failed) return ;
 
                     }
                     break;
                 case 9 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:65: '-'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:65: '-'
                     {
                     match('-'); if (failed) return ;
 
                     }
                     break;
                 case 10 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:71: '+'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:71: '+'
                     {
                     match('+'); if (failed) return ;
 
                     }
                     break;
                 case 11 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1342:78: '?'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:78: '?'
                     {
                     match('?'); if (failed) return ;
 
                     }
                     break;
                 case 12 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:19: '|'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:19: '|'
                     {
                     match('|'); if (failed) return ;
 
                     }
                     break;
                 case 13 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:25: ','
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:25: ','
                     {
                     match(','); if (failed) return ;
 
                     }
                     break;
                 case 14 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:31: '{'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:31: '{'
                     {
                     match('{'); if (failed) return ;
 
                     }
                     break;
                 case 15 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:37: '}'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:37: '}'
                     {
                     match('}'); if (failed) return ;
 
                     }
                     break;
                 case 16 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:43: '['
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:43: '['
                     {
                     match('['); if (failed) return ;
 
                     }
                     break;
                 case 17 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:49: ']'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:49: ']'
                     {
                     match(']'); if (failed) return ;
 
                     }
                     break;
                 case 18 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:55: '='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:55: '='
                     {
                     match('='); if (failed) return ;
 
                     }
                     break;
                 case 19 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:61: '/'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:61: '/'
                     {
                     match('/'); if (failed) return ;
 
                     }
                     break;
                 case 20 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:67: '('
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:67: '('
                     {
                     match('('); if (failed) return ;
 
                     }
                     break;
                 case 21 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:73: ')'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:73: ')'
                     {
                     match(')'); if (failed) return ;
 
                     }
                     break;
                 case 22 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:79: '\''
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:79: '\''
                     {
                     match('\''); if (failed) return ;
 
                     }
                     break;
                 case 23 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1343:86: '\\'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:86: '\\'
                     {
                     match('\\'); if (failed) return ;
 
                     }
                     break;
                 case 24 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:19: '||'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:19: '||'
                     {
                     match("||"); if (failed) return ;
 
@@ -1958,7 +1986,7 @@
                     }
                     break;
                 case 25 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:26: '&&'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:26: '&&'
                     {
                     match("&&"); if (failed) return ;
 
@@ -1966,7 +1994,7 @@
                     }
                     break;
                 case 26 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:33: '<<<'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:33: '<<<'
                     {
                     match("<<<"); if (failed) return ;
 
@@ -1974,7 +2002,7 @@
                     }
                     break;
                 case 27 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:41: '++'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:41: '++'
                     {
                     match("++"); if (failed) return ;
 
@@ -1982,7 +2010,7 @@
                     }
                     break;
                 case 28 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:48: '--'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:48: '--'
                     {
                     match("--"); if (failed) return ;
 
@@ -1990,7 +2018,7 @@
                     }
                     break;
                 case 29 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:55: '>>>'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:55: '>>>'
                     {
                     match(">>>"); if (failed) return ;
 
@@ -1998,7 +2026,7 @@
                     }
                     break;
                 case 30 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:63: '=='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:63: '=='
                     {
                     match("=="); if (failed) return ;
 
@@ -2006,7 +2034,7 @@
                     }
                     break;
                 case 31 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:70: '+='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:70: '+='
                     {
                     match("+="); if (failed) return ;
 
@@ -2014,7 +2042,7 @@
                     }
                     break;
                 case 32 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:77: '=+'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:77: '=+'
                     {
                     match("=+"); if (failed) return ;
 
@@ -2022,7 +2050,7 @@
                     }
                     break;
                 case 33 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:84: '-='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:84: '-='
                     {
                     match("-="); if (failed) return ;
 
@@ -2030,7 +2058,7 @@
                     }
                     break;
                 case 34 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:91: '=-'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:91: '=-'
                     {
                     match("=-"); if (failed) return ;
 
@@ -2038,7 +2066,7 @@
                     }
                     break;
                 case 35 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:97: '*='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:97: '*='
                     {
                     match("*="); if (failed) return ;
 
@@ -2046,7 +2074,7 @@
                     }
                     break;
                 case 36 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1344:104: '=*'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1360:104: '=*'
                     {
                     match("=*"); if (failed) return ;
 
@@ -2054,7 +2082,7 @@
                     }
                     break;
                 case 37 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1345:19: '/='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1361:19: '/='
                     {
                     match("/="); if (failed) return ;
 
@@ -2062,7 +2090,7 @@
                     }
                     break;
                 case 38 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1345:26: '=/'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1361:26: '=/'
                     {
                     match("=/"); if (failed) return ;
 
@@ -2070,7 +2098,7 @@
                     }
                     break;
                 case 39 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1345:33: '>>='
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1361:33: '>>='
                     {
                     match(">>="); if (failed) return ;
 
@@ -2082,7 +2110,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 58, MISC_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 59, MISC_StartIndex); }
         }
     }
     // $ANTLR end MISC
@@ -2097,9 +2125,9 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 59) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1349:17: ( (' '|'\t'|'\f'))
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1349:17: (' '|'\t'|'\f')
+            if ( backtracking>0 && alreadyParsedRule(input, 60) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1365:17: ( (' '|'\t'|'\f'))
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1365:17: (' '|'\t'|'\f')
             {
             if ( input.LA(1)=='\t'||input.LA(1)=='\f'||input.LA(1)==' ' ) {
                 input.consume();
@@ -2121,7 +2149,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 59, WS_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 60, WS_StartIndex); }
         }
     }
     // $ANTLR end WS
@@ -2136,11 +2164,11 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 60) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:17: ( ( ( '\r\n' )=> '\r\n' | '\r' | '\n' ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:17: ( ( '\r\n' )=> '\r\n' | '\r' | '\n' )
+            if ( backtracking>0 && alreadyParsedRule(input, 61) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:17: ( ( ( '\r\n' )=> '\r\n' | '\r' | '\n' ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:17: ( ( '\r\n' )=> '\r\n' | '\r' | '\n' )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:17: ( ( '\r\n' )=> '\r\n' | '\r' | '\n' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:17: ( ( '\r\n' )=> '\r\n' | '\r' | '\n' )
             int alt2=3;
             int LA2_0 = input.LA(1);
             if ( LA2_0=='\r' ) {
@@ -2157,13 +2185,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1357:17: ( ( \'\\r\\n\' )=> \'\\r\\n\' | \'\\r\' | \'\\n\' )", 2, 0, input);
+                    new NoViableAltException("1373:17: ( ( \'\\r\\n\' )=> \'\\r\\n\' | \'\\r\' | \'\\n\' )", 2, 0, input);
 
                 throw nvae;
             }
             switch (alt2) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:25: ( '\r\n' )=> '\r\n'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:25: ( '\r\n' )=> '\r\n'
                     {
 
                     match("\r\n"); if (failed) return ;
@@ -2172,14 +2200,14 @@
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1358:25: '\r'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1374:25: '\r'
                     {
                     match('\r'); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1359:25: '\n'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1375:25: '\n'
                     {
                     match('\n'); if (failed) return ;
 
@@ -2194,7 +2222,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 60, EOL_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 61, EOL_StartIndex); }
         }
     }
     // $ANTLR end EOL
@@ -2209,11 +2237,11 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 61) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:17: ( ( '-' )? ( '0' .. '9' )+ )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:17: ( '-' )? ( '0' .. '9' )+
+            if ( backtracking>0 && alreadyParsedRule(input, 62) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:17: ( ( '-' )? ( '0' .. '9' )+ )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:17: ( '-' )? ( '0' .. '9' )+
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:17: ( '-' )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:17: ( '-' )?
             int alt3=2;
             int LA3_0 = input.LA(1);
             if ( LA3_0=='-' ) {
@@ -2225,13 +2253,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1364:17: ( \'-\' )?", 3, 0, input);
+                    new NoViableAltException("1380:17: ( \'-\' )?", 3, 0, input);
 
                 throw nvae;
             }
             switch (alt3) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:18: '-'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:18: '-'
                     {
                     match('-'); if (failed) return ;
 
@@ -2240,7 +2268,7 @@
 
             }
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:23: ( '0' .. '9' )+
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:23: ( '0' .. '9' )+
             int cnt4=0;
             loop4:
             do {
@@ -2253,7 +2281,7 @@
 
                 switch (alt4) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1364:24: '0' .. '9'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:24: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -2276,7 +2304,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 61, INT_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 62, INT_StartIndex); }
         }
     }
     // $ANTLR end INT
@@ -2291,11 +2319,11 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 62) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:17: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:17: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
+            if ( backtracking>0 && alreadyParsedRule(input, 63) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:17: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:17: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:17: ( '-' )?
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:17: ( '-' )?
             int alt5=2;
             int LA5_0 = input.LA(1);
             if ( LA5_0=='-' ) {
@@ -2307,13 +2335,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1368:17: ( \'-\' )?", 5, 0, input);
+                    new NoViableAltException("1384:17: ( \'-\' )?", 5, 0, input);
 
                 throw nvae;
             }
             switch (alt5) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:18: '-'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:18: '-'
                     {
                     match('-'); if (failed) return ;
 
@@ -2322,7 +2350,7 @@
 
             }
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:23: ( '0' .. '9' )+
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:23: ( '0' .. '9' )+
             int cnt6=0;
             loop6:
             do {
@@ -2335,7 +2363,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:24: '0' .. '9'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:24: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -2353,7 +2381,7 @@
             } while (true);
 
             match('.'); if (failed) return ;
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:39: ( '0' .. '9' )+
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:39: ( '0' .. '9' )+
             int cnt7=0;
             loop7:
             do {
@@ -2366,7 +2394,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1368:40: '0' .. '9'
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1384:40: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -2389,7 +2417,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 62, FLOAT_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 63, FLOAT_StartIndex); }
         }
     }
     // $ANTLR end FLOAT
@@ -2404,8 +2432,8 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 63) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:17: ( ( '"' ( options {greedy=false; } : . )* '"' ) | ( '\'' ( options {greedy=false; } : . )* '\'' ) )
+            if ( backtracking>0 && alreadyParsedRule(input, 64) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:17: ( ( '"' ( options {greedy=false; } : . )* '"' ) | ( '\'' ( options {greedy=false; } : . )* '\'' ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
             if ( LA10_0=='"' ) {
@@ -2417,19 +2445,19 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1371:1: STRING : ( ( \'\"\' ( options {greedy=false; } : . )* \'\"\' ) | ( \'\\\'\' ( options {greedy=false; } : . )* \'\\\'\' ) );", 10, 0, input);
+                    new NoViableAltException("1387:1: STRING : ( ( \'\"\' ( options {greedy=false; } : . )* \'\"\' ) | ( \'\\\'\' ( options {greedy=false; } : . )* \'\\\'\' ) );", 10, 0, input);
 
                 throw nvae;
             }
             switch (alt10) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:17: ( '"' ( options {greedy=false; } : . )* '"' )
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:17: ( '"' ( options {greedy=false; } : . )* '"' )
                     {
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:17: ( '"' ( options {greedy=false; } : . )* '"' )
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:18: '"' ( options {greedy=false; } : . )* '"'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:17: ( '"' ( options {greedy=false; } : . )* '"' )
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:18: '"' ( options {greedy=false; } : . )* '"'
                     {
                     match('"'); if (failed) return ;
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:22: ( options {greedy=false; } : . )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:22: ( options {greedy=false; } : . )*
                     loop8:
                     do {
                         int alt8=2;
@@ -2444,7 +2472,7 @@
 
                         switch (alt8) {
                     	case 1 :
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:49: .
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:49: .
                     	    {
                     	    matchAny(); if (failed) return ;
 
@@ -2464,13 +2492,13 @@
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:61: ( '\'' ( options {greedy=false; } : . )* '\'' )
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:61: ( '\'' ( options {greedy=false; } : . )* '\'' )
                     {
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:61: ( '\'' ( options {greedy=false; } : . )* '\'' )
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:62: '\'' ( options {greedy=false; } : . )* '\''
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:61: ( '\'' ( options {greedy=false; } : . )* '\'' )
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:62: '\'' ( options {greedy=false; } : . )* '\''
                     {
                     match('\''); if (failed) return ;
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:67: ( options {greedy=false; } : . )*
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:67: ( options {greedy=false; } : . )*
                     loop9:
                     do {
                         int alt9=2;
@@ -2485,7 +2513,7 @@
 
                         switch (alt9) {
                     	case 1 :
-                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1372:94: .
+                    	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1388:94: .
                     	    {
                     	    matchAny(); if (failed) return ;
 
@@ -2509,7 +2537,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 63, STRING_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 64, STRING_StartIndex); }
         }
     }
     // $ANTLR end STRING
@@ -2524,11 +2552,11 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 64) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1376:17: ( ( 'true' | 'false' ) )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1376:17: ( 'true' | 'false' )
+            if ( backtracking>0 && alreadyParsedRule(input, 65) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:17: ( ( 'true' | 'false' ) )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:17: ( 'true' | 'false' )
             {
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1376:17: ( 'true' | 'false' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:17: ( 'true' | 'false' )
             int alt11=2;
             int LA11_0 = input.LA(1);
             if ( LA11_0=='t' ) {
@@ -2540,13 +2568,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1376:17: ( \'true\' | \'false\' )", 11, 0, input);
+                    new NoViableAltException("1392:17: ( \'true\' | \'false\' )", 11, 0, input);
 
                 throw nvae;
             }
             switch (alt11) {
                 case 1 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1376:18: 'true'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:18: 'true'
                     {
                     match("true"); if (failed) return ;
 
@@ -2554,7 +2582,7 @@
                     }
                     break;
                 case 2 :
-                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1376:25: 'false'
+                    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:25: 'false'
                     {
                     match("false"); if (failed) return ;
 
@@ -2570,7 +2598,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 64, BOOL_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 65, BOOL_StartIndex); }
         }
     }
     // $ANTLR end BOOL
@@ -2585,9 +2613,9 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 65) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:17: ( ('a'..'z'|'A'..'Z'|'_'|'$'|'\u00c0'..'\u00ff') ( ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'))* )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:17: ('a'..'z'|'A'..'Z'|'_'|'$'|'\u00c0'..'\u00ff') ( ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'))*
+            if ( backtracking>0 && alreadyParsedRule(input, 66) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1396:17: ( ('a'..'z'|'A'..'Z'|'_'|'$'|'\u00c0'..'\u00ff') ( ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'))* )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1396:17: ('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();
@@ -2600,7 +2628,7 @@
                 recover(mse);    throw mse;
             }
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:65: ( ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'))*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1396:65: ( ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff'))*
             loop12:
             do {
                 int alt12=2;
@@ -2612,7 +2640,7 @@
 
                 switch (alt12) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1380:66: ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff')
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1396:66: ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u00c0'..'\u00ff')
             	    {
             	    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();
@@ -2640,7 +2668,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 65, ID_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 66, ID_StartIndex); }
         }
     }
     // $ANTLR end ID
@@ -2655,12 +2683,12 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 66) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1386:17: ( '#' ( options {greedy=false; } : . )* EOL )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1386:17: '#' ( options {greedy=false; } : . )* EOL
+            if ( backtracking>0 && alreadyParsedRule(input, 67) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1402:17: ( '#' ( options {greedy=false; } : . )* EOL )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1402:17: '#' ( options {greedy=false; } : . )* EOL
             {
             match('#'); if (failed) return ;
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1386:21: ( options {greedy=false; } : . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1402:21: ( options {greedy=false; } : . )*
             loop13:
             do {
                 int alt13=2;
@@ -2678,7 +2706,7 @@
 
                 switch (alt13) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1386:48: .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1402:48: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2700,7 +2728,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 66, SH_STYLE_SINGLE_LINE_COMMENT_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 67, SH_STYLE_SINGLE_LINE_COMMENT_StartIndex); }
         }
     }
     // $ANTLR end SH_STYLE_SINGLE_LINE_COMMENT
@@ -2715,13 +2743,13 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 67) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:17: ( '//' ( options {greedy=false; } : . )* EOL )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:17: '//' ( options {greedy=false; } : . )* EOL
+            if ( backtracking>0 && alreadyParsedRule(input, 68) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1408:17: ( '//' ( options {greedy=false; } : . )* EOL )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1408:17: '//' ( options {greedy=false; } : . )* EOL
             {
             match("//"); if (failed) return ;
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:22: ( options {greedy=false; } : . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1408:22: ( options {greedy=false; } : . )*
             loop14:
             do {
                 int alt14=2;
@@ -2739,7 +2767,7 @@
 
                 switch (alt14) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1392:49: .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1408:49: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2761,7 +2789,7 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 67, C_STYLE_SINGLE_LINE_COMMENT_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 68, C_STYLE_SINGLE_LINE_COMMENT_StartIndex); }
         }
     }
     // $ANTLR end C_STYLE_SINGLE_LINE_COMMENT
@@ -2776,13 +2804,13 @@
             int line = getLine();
             int charPosition = getCharPositionInLine();
             int channel = Token.DEFAULT_CHANNEL;
-            if ( backtracking>0 && alreadyParsedRule(input, 68) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1397:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1397:17: '/*' ( options {greedy=false; } : . )* '*/'
+            if ( backtracking>0 && alreadyParsedRule(input, 69) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1413:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1413:17: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); if (failed) return ;
 
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1397:22: ( options {greedy=false; } : . )*
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1413:22: ( options {greedy=false; } : . )*
             loop15:
             do {
                 int alt15=2;
@@ -2805,7 +2833,7 @@
 
                 switch (alt15) {
             	case 1 :
-            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1397:48: .
+            	    // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1413:48: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2828,14 +2856,14 @@
             if ( token==null ) {emit(type,line,charPosition,channel,start,getCharIndex()-1);}
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 68, MULTI_LINE_COMMENT_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 69, MULTI_LINE_COMMENT_StartIndex); }
         }
     }
     // $ANTLR end MULTI_LINE_COMMENT
 
     public void mTokens() throws RecognitionException {
-        // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:10: ( T15 | T16 | T17 | T18 | T19 | T20 | T21 | T22 | T23 | T24 | T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | MISC | WS | EOL | INT | FLOAT | STRING | BOOL | ID | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT )
-        int alt16=68;
+        // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:10: ( T15 | T16 | T17 | T18 | T19 | T20 | T21 | T22 | T23 | T24 | T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | T72 | MISC | WS | EOL | INT | FLOAT | STRING | BOOL | ID | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT )
+        int alt16=69;
         alt16 = dfa16.predict(input); if (failed) return ;
         switch (alt16) {
             case 1 :
@@ -3238,78 +3266,85 @@
                 }
                 break;
             case 58 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:238: MISC
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:238: T72
                 {
-                mMISC(); if (failed) return ;
+                mT72(); if (failed) return ;
 
                 }
                 break;
             case 59 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:243: WS
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:242: MISC
                 {
-                mWS(); if (failed) return ;
+                mMISC(); if (failed) return ;
 
                 }
                 break;
             case 60 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:246: EOL
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:247: WS
                 {
-                mEOL(); if (failed) return ;
+                mWS(); if (failed) return ;
 
                 }
                 break;
             case 61 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:250: INT
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:250: EOL
                 {
-                mINT(); if (failed) return ;
+                mEOL(); if (failed) return ;
 
                 }
                 break;
             case 62 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:254: FLOAT
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:254: INT
                 {
-                mFLOAT(); if (failed) return ;
+                mINT(); if (failed) return ;
 
                 }
                 break;
             case 63 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:260: STRING
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:258: FLOAT
                 {
-                mSTRING(); if (failed) return ;
+                mFLOAT(); if (failed) return ;
 
                 }
                 break;
             case 64 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:267: BOOL
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:264: STRING
                 {
-                mBOOL(); if (failed) return ;
+                mSTRING(); if (failed) return ;
 
                 }
                 break;
             case 65 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:272: ID
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:271: BOOL
                 {
-                mID(); if (failed) return ;
+                mBOOL(); if (failed) return ;
 
                 }
                 break;
             case 66 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:275: SH_STYLE_SINGLE_LINE_COMMENT
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:276: ID
                 {
-                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+                mID(); if (failed) return ;
 
                 }
                 break;
             case 67 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:304: C_STYLE_SINGLE_LINE_COMMENT
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:279: SH_STYLE_SINGLE_LINE_COMMENT
                 {
-                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
 
                 }
                 break;
             case 68 :
-                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:332: MULTI_LINE_COMMENT
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:308: C_STYLE_SINGLE_LINE_COMMENT
                 {
+                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 69 :
+                // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1:336: MULTI_LINE_COMMENT
+                {
                 mMULTI_LINE_COMMENT(); if (failed) return ;
 
                 }
@@ -3324,9 +3359,9 @@
     public void mSynpred1_fragment() throws RecognitionException {
         int Synpred1_fragment_StartIndex = input.index();
         try {
-            if ( backtracking>0 && alreadyParsedRule(input, 70) ) { return ; }
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:25: ( '\r\n' )
-            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1357:27: '\r\n'
+            if ( backtracking>0 && alreadyParsedRule(input, 71) ) { return ; }
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:25: ( '\r\n' )
+            // D:\workspace\jboss\jbossrules\drools-compiler\src\main\resources\org\drools\lang\drl.g:1373:27: '\r\n'
             {
             match("\r\n"); if (failed) return ;
 
@@ -3335,7 +3370,7 @@
 
         }
         finally {
-            if ( backtracking>0 ) { memoize(input, 70, Synpred1_fragment_StartIndex); }
+            if ( backtracking>0 ) { memoize(input, 71, Synpred1_fragment_StartIndex); }
         }
     }
     // $ANTLR end Synpred1_fragment
@@ -3352,36 +3387,36 @@
             return predict(input, s0);
         }
         DFA.State s1 = new DFA.State() {{alt=1;}};
-        DFA.State s536 = new DFA.State() {{alt=2;}};
-        DFA.State s51 = new DFA.State() {{alt=65;}};
-        DFA.State s487 = new DFA.State() {
+        DFA.State s549 = new DFA.State() {{alt=2;}};
+        DFA.State s51 = new DFA.State() {{alt=66;}};
+        DFA.State s497 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_487 = input.LA(1);
-                if ( (LA16_487>='0' && LA16_487<='9')||(LA16_487>='A' && LA16_487<='Z')||LA16_487=='_'||(LA16_487>='a' && LA16_487<='z')||(LA16_487>='\u00C0' && LA16_487<='\u00FF') ) {return s51;}
-                return s536;
+                int LA16_497 = input.LA(1);
+                if ( (LA16_497>='0' && LA16_497<='9')||(LA16_497>='A' && LA16_497<='Z')||LA16_497=='_'||(LA16_497>='a' && LA16_497<='z')||(LA16_497>='\u00C0' && LA16_497<='\u00FF') ) {return s51;}
+                return s549;
 
             }
         };
-        DFA.State s429 = new DFA.State() {
+        DFA.State s436 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_429 = input.LA(1);
-                if ( LA16_429=='e' ) {return s487;}
+                int LA16_436 = input.LA(1);
+                if ( LA16_436=='e' ) {return s497;}
                 return s51;
 
             }
         };
-        DFA.State s352 = new DFA.State() {
+        DFA.State s356 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_352 = input.LA(1);
-                if ( LA16_352=='g' ) {return s429;}
+                int LA16_356 = input.LA(1);
+                if ( LA16_356=='g' ) {return s436;}
                 return s51;
 
             }
         };
-        DFA.State s260 = new DFA.State() {
+        DFA.State s261 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_260 = input.LA(1);
-                if ( LA16_260=='a' ) {return s352;}
+                int LA16_261 = input.LA(1);
+                if ( LA16_261=='a' ) {return s356;}
                 return s51;
 
             }
@@ -3389,7 +3424,7 @@
         DFA.State s164 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_164 = input.LA(1);
-                if ( LA16_164=='k' ) {return s260;}
+                if ( LA16_164=='k' ) {return s261;}
                 return s51;
 
             }
@@ -3410,60 +3445,60 @@
 
             }
         };
-        DFA.State s490 = new DFA.State() {{alt=3;}};
-        DFA.State s432 = new DFA.State() {
+        DFA.State s359 = new DFA.State() {{alt=30;}};
+        DFA.State s264 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_432 = input.LA(1);
-                if ( (LA16_432>='0' && LA16_432<='9')||(LA16_432>='A' && LA16_432<='Z')||LA16_432=='_'||(LA16_432>='a' && LA16_432<='z')||(LA16_432>='\u00C0' && LA16_432<='\u00FF') ) {return s51;}
-                return s490;
+                int LA16_264 = input.LA(1);
+                if ( (LA16_264>='0' && LA16_264<='9')||(LA16_264>='A' && LA16_264<='Z')||LA16_264=='_'||(LA16_264>='a' && LA16_264<='z')||(LA16_264>='\u00C0' && LA16_264<='\u00FF') ) {return s51;}
+                return s359;
 
             }
         };
-        DFA.State s355 = new DFA.State() {
+        DFA.State s167 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_355 = input.LA(1);
-                if ( LA16_355=='t' ) {return s432;}
+                int LA16_167 = input.LA(1);
+                if ( LA16_167=='t' ) {return s264;}
                 return s51;
 
             }
         };
-        DFA.State s263 = new DFA.State() {
+        DFA.State s56 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_263 = input.LA(1);
-                if ( LA16_263=='r' ) {return s355;}
+                int LA16_56 = input.LA(1);
+                if ( LA16_56=='i' ) {return s167;}
                 return s51;
 
             }
         };
-        DFA.State s167 = new DFA.State() {
+        DFA.State s500 = new DFA.State() {{alt=3;}};
+        DFA.State s439 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_167 = input.LA(1);
-                if ( LA16_167=='o' ) {return s263;}
-                return s51;
+                int LA16_439 = input.LA(1);
+                if ( (LA16_439>='0' && LA16_439<='9')||(LA16_439>='A' && LA16_439<='Z')||LA16_439=='_'||(LA16_439>='a' && LA16_439<='z')||(LA16_439>='\u00C0' && LA16_439<='\u00FF') ) {return s51;}
+                return s500;
 
             }
         };
-        DFA.State s56 = new DFA.State() {
+        DFA.State s361 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_56 = input.LA(1);
-                if ( LA16_56=='p' ) {return s167;}
+                int LA16_361 = input.LA(1);
+                if ( LA16_361=='t' ) {return s439;}
                 return s51;
 
             }
         };
-        DFA.State s358 = new DFA.State() {{alt=30;}};
-        DFA.State s266 = new DFA.State() {
+        DFA.State s267 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_266 = input.LA(1);
-                if ( (LA16_266>='0' && LA16_266<='9')||(LA16_266>='A' && LA16_266<='Z')||LA16_266=='_'||(LA16_266>='a' && LA16_266<='z')||(LA16_266>='\u00C0' && LA16_266<='\u00FF') ) {return s51;}
-                return s358;
+                int LA16_267 = input.LA(1);
+                if ( LA16_267=='r' ) {return s361;}
+                return s51;
 
             }
         };
         DFA.State s170 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_170 = input.LA(1);
-                if ( LA16_170=='t' ) {return s266;}
+                if ( LA16_170=='o' ) {return s267;}
                 return s51;
 
             }
@@ -3471,7 +3506,7 @@
         DFA.State s57 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_57 = input.LA(1);
-                if ( LA16_57=='i' ) {return s170;}
+                if ( LA16_57=='p' ) {return s170;}
                 return s51;
 
             }
@@ -3479,10 +3514,10 @@
         DFA.State s3 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'm':
+                case 'n':
                     return s56;
 
-                case 'n':
+                case 'm':
                     return s57;
 
                 default:
@@ -3490,19 +3525,27 @@
         	        }
             }
         };
-        DFA.State s360 = new DFA.State() {{alt=28;}};
-        DFA.State s269 = new DFA.State() {
+        DFA.State s392 = new DFA.State() {{alt=65;}};
+        DFA.State s364 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_269 = input.LA(1);
-                if ( (LA16_269>='0' && LA16_269<='9')||(LA16_269>='A' && LA16_269<='Z')||LA16_269=='_'||(LA16_269>='a' && LA16_269<='z')||(LA16_269>='\u00C0' && LA16_269<='\u00FF') ) {return s51;}
-                return s360;
+                int LA16_364 = input.LA(1);
+                if ( (LA16_364>='0' && LA16_364<='9')||(LA16_364>='A' && LA16_364<='Z')||LA16_364=='_'||(LA16_364>='a' && LA16_364<='z')||(LA16_364>='\u00C0' && LA16_364<='\u00FF') ) {return s51;}
+                return s392;
 
             }
         };
+        DFA.State s270 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_270 = input.LA(1);
+                if ( LA16_270=='e' ) {return s364;}
+                return s51;
+
+            }
+        };
         DFA.State s173 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_173 = input.LA(1);
-                if ( LA16_173=='m' ) {return s269;}
+                if ( LA16_173=='s' ) {return s270;}
                 return s51;
 
             }
@@ -3510,89 +3553,81 @@
         DFA.State s60 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_60 = input.LA(1);
-                if ( LA16_60=='o' ) {return s173;}
+                if ( LA16_60=='l' ) {return s173;}
                 return s51;
 
             }
         };
-        DFA.State s385 = new DFA.State() {{alt=64;}};
-        DFA.State s362 = new DFA.State() {
+        DFA.State s585 = new DFA.State() {{alt=4;}};
+        DFA.State s551 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_362 = input.LA(1);
-                if ( (LA16_362>='0' && LA16_362<='9')||(LA16_362>='A' && LA16_362<='Z')||LA16_362=='_'||(LA16_362>='a' && LA16_362<='z')||(LA16_362>='\u00C0' && LA16_362<='\u00FF') ) {return s51;}
-                return s385;
+                int LA16_551 = input.LA(1);
+                if ( (LA16_551>='0' && LA16_551<='9')||(LA16_551>='A' && LA16_551<='Z')||LA16_551=='_'||(LA16_551>='a' && LA16_551<='z')||(LA16_551>='\u00C0' && LA16_551<='\u00FF') ) {return s51;}
+                return s585;
 
             }
         };
-        DFA.State s272 = new DFA.State() {
+        DFA.State s502 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_272 = input.LA(1);
-                if ( LA16_272=='e' ) {return s362;}
+                int LA16_502 = input.LA(1);
+                if ( LA16_502=='n' ) {return s551;}
                 return s51;
 
             }
         };
-        DFA.State s176 = new DFA.State() {
+        DFA.State s444 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_176 = input.LA(1);
-                if ( LA16_176=='s' ) {return s272;}
+                int LA16_444 = input.LA(1);
+                if ( LA16_444=='o' ) {return s502;}
                 return s51;
 
             }
         };
-        DFA.State s61 = new DFA.State() {
+        DFA.State s367 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_61 = input.LA(1);
-                if ( LA16_61=='l' ) {return s176;}
+                int LA16_367 = input.LA(1);
+                if ( LA16_367=='i' ) {return s444;}
                 return s51;
 
             }
         };
-        DFA.State s570 = new DFA.State() {{alt=4;}};
-        DFA.State s538 = new DFA.State() {
+        DFA.State s273 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_538 = input.LA(1);
-                if ( (LA16_538>='0' && LA16_538<='9')||(LA16_538>='A' && LA16_538<='Z')||LA16_538=='_'||(LA16_538>='a' && LA16_538<='z')||(LA16_538>='\u00C0' && LA16_538<='\u00FF') ) {return s51;}
-                return s570;
-
-            }
-        };
-        DFA.State s492 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_492 = input.LA(1);
-                if ( LA16_492=='n' ) {return s538;}
+                int LA16_273 = input.LA(1);
+                if ( LA16_273=='t' ) {return s367;}
                 return s51;
 
             }
         };
-        DFA.State s437 = new DFA.State() {
+        DFA.State s176 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_437 = input.LA(1);
-                if ( LA16_437=='o' ) {return s492;}
+                int LA16_176 = input.LA(1);
+                if ( LA16_176=='c' ) {return s273;}
                 return s51;
 
             }
         };
-        DFA.State s365 = new DFA.State() {
+        DFA.State s61 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_365 = input.LA(1);
-                if ( LA16_365=='i' ) {return s437;}
+                int LA16_61 = input.LA(1);
+                if ( LA16_61=='n' ) {return s176;}
                 return s51;
 
             }
         };
-        DFA.State s275 = new DFA.State() {
+        DFA.State s370 = new DFA.State() {{alt=28;}};
+        DFA.State s276 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_275 = input.LA(1);
-                if ( LA16_275=='t' ) {return s365;}
-                return s51;
+                int LA16_276 = input.LA(1);
+                if ( (LA16_276>='0' && LA16_276<='9')||(LA16_276>='A' && LA16_276<='Z')||LA16_276=='_'||(LA16_276>='a' && LA16_276<='z')||(LA16_276>='\u00C0' && LA16_276<='\u00FF') ) {return s51;}
+                return s370;
 
             }
         };
         DFA.State s179 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_179 = input.LA(1);
-                if ( LA16_179=='c' ) {return s275;}
+                if ( LA16_179=='m' ) {return s276;}
                 return s51;
 
             }
@@ -3600,7 +3635,7 @@
         DFA.State s62 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_62 = input.LA(1);
-                if ( LA16_62=='n' ) {return s179;}
+                if ( LA16_62=='o' ) {return s179;}
                 return s51;
 
             }
@@ -3608,13 +3643,13 @@
         DFA.State s4 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'r':
+                case 'a':
                     return s60;
 
-                case 'a':
+                case 'u':
                     return s61;
 
-                case 'u':
+                case 'r':
                     return s62;
 
                 default:
@@ -3632,44 +3667,36 @@
 
             }
         };
-        DFA.State s368 = new DFA.State() {{alt=46;}};
-        DFA.State s278 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_278 = input.LA(1);
-                if ( (LA16_278>='0' && LA16_278<='9')||(LA16_278>='A' && LA16_278<='Z')||LA16_278=='_'||(LA16_278>='a' && LA16_278<='z')||(LA16_278>='\u00C0' && LA16_278<='\u00FF') ) {return s51;}
-                return s368;
-
-            }
-        };
+        DFA.State s279 = new DFA.State() {{alt=15;}};
         DFA.State s182 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_182 = input.LA(1);
-                if ( LA16_182=='l' ) {return s278;}
-                return s51;
+                if ( (LA16_182>='0' && LA16_182<='9')||(LA16_182>='A' && LA16_182<='Z')||LA16_182=='_'||(LA16_182>='a' && LA16_182<='z')||(LA16_182>='\u00C0' && LA16_182<='\u00FF') ) {return s51;}
+                return s279;
 
             }
         };
         DFA.State s67 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_67 = input.LA(1);
-                if ( LA16_67=='a' ) {return s182;}
+                if ( LA16_67=='d' ) {return s182;}
                 return s51;
 
             }
         };
-        DFA.State s495 = new DFA.State() {{alt=44;}};
-        DFA.State s440 = new DFA.State() {
+        DFA.State s505 = new DFA.State() {{alt=45;}};
+        DFA.State s447 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_440 = input.LA(1);
-                if ( (LA16_440>='0' && LA16_440<='9')||(LA16_440>='A' && LA16_440<='Z')||LA16_440=='_'||(LA16_440>='a' && LA16_440<='z')||(LA16_440>='\u00C0' && LA16_440<='\u00FF') ) {return s51;}
-                return s495;
+                int LA16_447 = input.LA(1);
+                if ( (LA16_447>='0' && LA16_447<='9')||(LA16_447>='A' && LA16_447<='Z')||LA16_447=='_'||(LA16_447>='a' && LA16_447<='z')||(LA16_447>='\u00C0' && LA16_447<='\u00FF') ) {return s51;}
+                return s505;
 
             }
         };
-        DFA.State s370 = new DFA.State() {
+        DFA.State s372 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_370 = input.LA(1);
-                if ( LA16_370=='s' ) {return s440;}
+                int LA16_372 = input.LA(1);
+                if ( LA16_372=='s' ) {return s447;}
                 return s51;
 
             }
@@ -3677,7 +3704,7 @@
         DFA.State s281 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_281 = input.LA(1);
-                if ( LA16_281=='t' ) {return s370;}
+                if ( LA16_281=='t' ) {return s372;}
                 return s51;
 
             }
@@ -3690,35 +3717,35 @@
 
             }
         };
-        DFA.State s572 = new DFA.State() {{alt=57;}};
-        DFA.State s541 = new DFA.State() {
+        DFA.State s587 = new DFA.State() {{alt=58;}};
+        DFA.State s554 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_541 = input.LA(1);
-                if ( (LA16_541>='0' && LA16_541<='9')||(LA16_541>='A' && LA16_541<='Z')||LA16_541=='_'||(LA16_541>='a' && LA16_541<='z')||(LA16_541>='\u00C0' && LA16_541<='\u00FF') ) {return s51;}
-                return s572;
+                int LA16_554 = input.LA(1);
+                if ( (LA16_554>='0' && LA16_554<='9')||(LA16_554>='A' && LA16_554<='Z')||LA16_554=='_'||(LA16_554>='a' && LA16_554<='z')||(LA16_554>='\u00C0' && LA16_554<='\u00FF') ) {return s51;}
+                return s587;
 
             }
         };
-        DFA.State s497 = new DFA.State() {
+        DFA.State s507 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_497 = input.LA(1);
-                if ( LA16_497=='s' ) {return s541;}
+                int LA16_507 = input.LA(1);
+                if ( LA16_507=='s' ) {return s554;}
                 return s51;
 
             }
         };
-        DFA.State s443 = new DFA.State() {
+        DFA.State s450 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_443 = input.LA(1);
-                if ( LA16_443=='e' ) {return s497;}
+                int LA16_450 = input.LA(1);
+                if ( LA16_450=='e' ) {return s507;}
                 return s51;
 
             }
         };
-        DFA.State s373 = new DFA.State() {
+        DFA.State s375 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_373 = input.LA(1);
-                if ( LA16_373=='d' ) {return s443;}
+                int LA16_375 = input.LA(1);
+                if ( LA16_375=='d' ) {return s450;}
                 return s51;
 
             }
@@ -3726,7 +3753,7 @@
         DFA.State s284 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_284 = input.LA(1);
-                if ( LA16_284=='u' ) {return s373;}
+                if ( LA16_284=='u' ) {return s375;}
                 return s51;
 
             }
@@ -3739,35 +3766,35 @@
 
             }
         };
-        DFA.State s574 = new DFA.State() {{alt=7;}};
-        DFA.State s544 = new DFA.State() {
+        DFA.State s589 = new DFA.State() {{alt=7;}};
+        DFA.State s557 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_544 = input.LA(1);
-                if ( (LA16_544>='0' && LA16_544<='9')||(LA16_544>='A' && LA16_544<='Z')||LA16_544=='_'||(LA16_544>='a' && LA16_544<='z')||(LA16_544>='\u00C0' && LA16_544<='\u00FF') ) {return s51;}
-                return s574;
+                int LA16_557 = input.LA(1);
+                if ( (LA16_557>='0' && LA16_557<='9')||(LA16_557>='A' && LA16_557<='Z')||LA16_557=='_'||(LA16_557>='a' && LA16_557<='z')||(LA16_557>='\u00C0' && LA16_557<='\u00FF') ) {return s51;}
+                return s589;
 
             }
         };
-        DFA.State s500 = new DFA.State() {
+        DFA.State s510 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_500 = input.LA(1);
-                if ( LA16_500=='r' ) {return s544;}
+                int LA16_510 = input.LA(1);
+                if ( LA16_510=='r' ) {return s557;}
                 return s51;
 
             }
         };
-        DFA.State s446 = new DFA.State() {
+        DFA.State s453 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_446 = input.LA(1);
-                if ( LA16_446=='e' ) {return s500;}
+                int LA16_453 = input.LA(1);
+                if ( LA16_453=='e' ) {return s510;}
                 return s51;
 
             }
         };
-        DFA.State s376 = new DFA.State() {
+        DFA.State s378 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_376 = input.LA(1);
-                if ( LA16_376=='d' ) {return s446;}
+                int LA16_378 = input.LA(1);
+                if ( LA16_378=='d' ) {return s453;}
                 return s51;
 
             }
@@ -3775,7 +3802,7 @@
         DFA.State s287 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_287 = input.LA(1);
-                if ( LA16_287=='n' ) {return s376;}
+                if ( LA16_287=='n' ) {return s378;}
                 return s51;
 
             }
@@ -3805,19 +3832,27 @@
         	        }
             }
         };
-        DFA.State s290 = new DFA.State() {{alt=15;}};
+        DFA.State s381 = new DFA.State() {{alt=47;}};
+        DFA.State s290 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_290 = input.LA(1);
+                if ( (LA16_290>='0' && LA16_290<='9')||(LA16_290>='A' && LA16_290<='Z')||LA16_290=='_'||(LA16_290>='a' && LA16_290<='z')||(LA16_290>='\u00C0' && LA16_290<='\u00FF') ) {return s51;}
+                return s381;
+
+            }
+        };
         DFA.State s190 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_190 = input.LA(1);
-                if ( (LA16_190>='0' && LA16_190<='9')||(LA16_190>='A' && LA16_190<='Z')||LA16_190=='_'||(LA16_190>='a' && LA16_190<='z')||(LA16_190>='\u00C0' && LA16_190<='\u00FF') ) {return s51;}
-                return s290;
+                if ( LA16_190=='l' ) {return s290;}
+                return s51;
 
             }
         };
         DFA.State s69 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_69 = input.LA(1);
-                if ( LA16_69=='d' ) {return s190;}
+                if ( LA16_69=='a' ) {return s190;}
                 return s51;
 
             }
@@ -3825,13 +3860,13 @@
         DFA.State s6 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'v':
+                case 'n':
                     return s67;
 
                 case 'x':
                     return s68;
 
-                case 'n':
+                case 'v':
                     return s69;
 
                 default:
@@ -3839,27 +3874,27 @@
         	        }
             }
         };
-        DFA.State s503 = new DFA.State() {{alt=8;}};
-        DFA.State s449 = new DFA.State() {
+        DFA.State s513 = new DFA.State() {{alt=8;}};
+        DFA.State s456 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_449 = input.LA(1);
-                if ( (LA16_449>='0' && LA16_449<='9')||(LA16_449>='A' && LA16_449<='Z')||LA16_449=='_'||(LA16_449>='a' && LA16_449<='z')||(LA16_449>='\u00C0' && LA16_449<='\u00FF') ) {return s51;}
-                return s503;
+                int LA16_456 = input.LA(1);
+                if ( (LA16_456>='0' && LA16_456<='9')||(LA16_456>='A' && LA16_456<='Z')||LA16_456=='_'||(LA16_456>='a' && LA16_456<='z')||(LA16_456>='\u00C0' && LA16_456<='\u00FF') ) {return s51;}
+                return s513;
 
             }
         };
-        DFA.State s379 = new DFA.State() {
+        DFA.State s383 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_379 = input.LA(1);
-                if ( LA16_379=='l' ) {return s449;}
+                int LA16_383 = input.LA(1);
+                if ( LA16_383=='l' ) {return s456;}
                 return s51;
 
             }
         };
-        DFA.State s292 = new DFA.State() {
+        DFA.State s293 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_292 = input.LA(1);
-                if ( LA16_292=='a' ) {return s379;}
+                int LA16_293 = input.LA(1);
+                if ( LA16_293=='a' ) {return s383;}
                 return s51;
 
             }
@@ -3867,7 +3902,7 @@
         DFA.State s193 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_193 = input.LA(1);
-                if ( LA16_193=='b' ) {return s292;}
+                if ( LA16_193=='b' ) {return s293;}
                 return s51;
 
             }
@@ -3928,19 +3963,19 @@
 
             }
         };
-        DFA.State s452 = new DFA.State() {{alt=14;}};
-        DFA.State s382 = new DFA.State() {
+        DFA.State s459 = new DFA.State() {{alt=14;}};
+        DFA.State s386 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_382 = input.LA(1);
-                if ( (LA16_382>='0' && LA16_382<='9')||(LA16_382>='A' && LA16_382<='Z')||LA16_382=='_'||(LA16_382>='a' && LA16_382<='z')||(LA16_382>='\u00C0' && LA16_382<='\u00FF') ) {return s51;}
-                return s452;
+                int LA16_386 = input.LA(1);
+                if ( (LA16_386>='0' && LA16_386<='9')||(LA16_386>='A' && LA16_386<='Z')||LA16_386=='_'||(LA16_386>='a' && LA16_386<='z')||(LA16_386>='\u00C0' && LA16_386<='\u00FF') ) {return s51;}
+                return s459;
 
             }
         };
-        DFA.State s295 = new DFA.State() {
+        DFA.State s296 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_295 = input.LA(1);
-                if ( LA16_295=='y' ) {return s382;}
+                int LA16_296 = input.LA(1);
+                if ( LA16_296=='y' ) {return s386;}
                 return s51;
 
             }
@@ -3948,7 +3983,7 @@
         DFA.State s196 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_196 = input.LA(1);
-                if ( LA16_196=='r' ) {return s295;}
+                if ( LA16_196=='r' ) {return s296;}
                 return s51;
 
             }
@@ -3969,75 +4004,75 @@
 
             }
         };
-        DFA.State s298 = new DFA.State() {
+        DFA.State s591 = new DFA.State() {{alt=16;}};
+        DFA.State s560 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_298 = input.LA(1);
-                if ( (LA16_298>='0' && LA16_298<='9')||(LA16_298>='A' && LA16_298<='Z')||LA16_298=='_'||(LA16_298>='a' && LA16_298<='z')||(LA16_298>='\u00C0' && LA16_298<='\u00FF') ) {return s51;}
-                return s385;
+                int LA16_560 = input.LA(1);
+                if ( (LA16_560>='0' && LA16_560<='9')||(LA16_560>='A' && LA16_560<='Z')||LA16_560=='_'||(LA16_560>='a' && LA16_560<='z')||(LA16_560>='\u00C0' && LA16_560<='\u00FF') ) {return s51;}
+                return s591;
 
             }
         };
-        DFA.State s199 = new DFA.State() {
+        DFA.State s515 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_199 = input.LA(1);
-                if ( LA16_199=='e' ) {return s298;}
+                int LA16_515 = input.LA(1);
+                if ( LA16_515=='e' ) {return s560;}
                 return s51;
 
             }
         };
-        DFA.State s83 = new DFA.State() {
+        DFA.State s461 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_83 = input.LA(1);
-                if ( LA16_83=='u' ) {return s199;}
+                int LA16_461 = input.LA(1);
+                if ( LA16_461=='t' ) {return s515;}
                 return s51;
 
             }
         };
-        DFA.State s576 = new DFA.State() {{alt=16;}};
-        DFA.State s547 = new DFA.State() {
+        DFA.State s389 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_547 = input.LA(1);
-                if ( (LA16_547>='0' && LA16_547<='9')||(LA16_547>='A' && LA16_547<='Z')||LA16_547=='_'||(LA16_547>='a' && LA16_547<='z')||(LA16_547>='\u00C0' && LA16_547<='\u00FF') ) {return s51;}
-                return s576;
+                int LA16_389 = input.LA(1);
+                if ( LA16_389=='a' ) {return s461;}
+                return s51;
 
             }
         };
-        DFA.State s505 = new DFA.State() {
+        DFA.State s299 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_505 = input.LA(1);
-                if ( LA16_505=='e' ) {return s547;}
+                int LA16_299 = input.LA(1);
+                if ( LA16_299=='l' ) {return s389;}
                 return s51;
 
             }
         };
-        DFA.State s454 = new DFA.State() {
+        DFA.State s199 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_454 = input.LA(1);
-                if ( LA16_454=='t' ) {return s505;}
+                int LA16_199 = input.LA(1);
+                if ( LA16_199=='p' ) {return s299;}
                 return s51;
 
             }
         };
-        DFA.State s387 = new DFA.State() {
+        DFA.State s83 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_387 = input.LA(1);
-                if ( LA16_387=='a' ) {return s454;}
+                int LA16_83 = input.LA(1);
+                if ( LA16_83=='m' ) {return s199;}
                 return s51;
 
             }
         };
-        DFA.State s301 = new DFA.State() {
+        DFA.State s302 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_301 = input.LA(1);
-                if ( LA16_301=='l' ) {return s387;}
-                return s51;
+                int LA16_302 = input.LA(1);
+                if ( (LA16_302>='0' && LA16_302<='9')||(LA16_302>='A' && LA16_302<='Z')||LA16_302=='_'||(LA16_302>='a' && LA16_302<='z')||(LA16_302>='\u00C0' && LA16_302<='\u00FF') ) {return s51;}
+                return s392;
 
             }
         };
         DFA.State s202 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_202 = input.LA(1);
-                if ( LA16_202=='p' ) {return s301;}
+                if ( LA16_202=='e' ) {return s302;}
                 return s51;
 
             }
@@ -4045,24 +4080,24 @@
         DFA.State s84 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_84 = input.LA(1);
-                if ( LA16_84=='m' ) {return s202;}
+                if ( LA16_84=='u' ) {return s202;}
                 return s51;
 
             }
         };
-        DFA.State s390 = new DFA.State() {{alt=20;}};
-        DFA.State s304 = new DFA.State() {
+        DFA.State s394 = new DFA.State() {{alt=20;}};
+        DFA.State s305 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_304 = input.LA(1);
-                if ( (LA16_304>='0' && LA16_304<='9')||(LA16_304>='A' && LA16_304<='Z')||LA16_304=='_'||(LA16_304>='a' && LA16_304<='z')||(LA16_304>='\u00C0' && LA16_304<='\u00FF') ) {return s51;}
-                return s390;
+                int LA16_305 = input.LA(1);
+                if ( (LA16_305>='0' && LA16_305<='9')||(LA16_305>='A' && LA16_305<='Z')||LA16_305=='_'||(LA16_305>='a' && LA16_305<='z')||(LA16_305>='\u00C0' && LA16_305<='\u00FF') ) {return s51;}
+                return s394;
 
             }
         };
         DFA.State s205 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_205 = input.LA(1);
-                if ( LA16_205=='n' ) {return s304;}
+                if ( LA16_205=='n' ) {return s305;}
                 return s51;
 
             }
@@ -4078,10 +4113,10 @@
         DFA.State s14 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'r':
+                case 'e':
                     return s83;
 
-                case 'e':
+                case 'r':
                     return s84;
 
                 case 'h':
@@ -4092,19 +4127,19 @@
         	        }
             }
         };
-        DFA.State s392 = new DFA.State() {{alt=17;}};
-        DFA.State s307 = new DFA.State() {
+        DFA.State s396 = new DFA.State() {{alt=17;}};
+        DFA.State s308 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_307 = input.LA(1);
-                if ( (LA16_307>='0' && LA16_307<='9')||(LA16_307>='A' && LA16_307<='Z')||LA16_307=='_'||(LA16_307>='a' && LA16_307<='z')||(LA16_307>='\u00C0' && LA16_307<='\u00FF') ) {return s51;}
-                return s392;
+                int LA16_308 = input.LA(1);
+                if ( (LA16_308>='0' && LA16_308<='9')||(LA16_308>='A' && LA16_308<='Z')||LA16_308=='_'||(LA16_308>='a' && LA16_308<='z')||(LA16_308>='\u00C0' && LA16_308<='\u00FF') ) {return s51;}
+                return s396;
 
             }
         };
         DFA.State s208 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_208 = input.LA(1);
-                if ( LA16_208=='e' ) {return s307;}
+                if ( LA16_208=='e' ) {return s308;}
                 return s51;
 
             }
@@ -4117,27 +4152,27 @@
 
             }
         };
-        DFA.State s508 = new DFA.State() {{alt=32;}};
-        DFA.State s457 = new DFA.State() {
+        DFA.State s518 = new DFA.State() {{alt=32;}};
+        DFA.State s464 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_457 = input.LA(1);
-                if ( (LA16_457>='0' && LA16_457<='9')||(LA16_457>='A' && LA16_457<='Z')||LA16_457=='_'||(LA16_457>='a' && LA16_457<='z')||(LA16_457>='\u00C0' && LA16_457<='\u00FF') ) {return s51;}
-                return s508;
+                int LA16_464 = input.LA(1);
+                if ( (LA16_464>='0' && LA16_464<='9')||(LA16_464>='A' && LA16_464<='Z')||LA16_464=='_'||(LA16_464>='a' && LA16_464<='z')||(LA16_464>='\u00C0' && LA16_464<='\u00FF') ) {return s51;}
+                return s518;
 
             }
         };
-        DFA.State s394 = new DFA.State() {
+        DFA.State s398 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_394 = input.LA(1);
-                if ( LA16_394=='t' ) {return s457;}
+                int LA16_398 = input.LA(1);
+                if ( LA16_398=='t' ) {return s464;}
                 return s51;
 
             }
         };
-        DFA.State s310 = new DFA.State() {
+        DFA.State s311 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_310 = input.LA(1);
-                if ( LA16_310=='l' ) {return s394;}
+                int LA16_311 = input.LA(1);
+                if ( LA16_311=='l' ) {return s398;}
                 return s51;
 
             }
@@ -4145,7 +4180,7 @@
         DFA.State s211 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_211 = input.LA(1);
-                if ( LA16_211=='u' ) {return s310;}
+                if ( LA16_211=='u' ) {return s311;}
                 return s51;
 
             }
@@ -4172,19 +4207,19 @@
         	        }
             }
         };
-        DFA.State s397 = new DFA.State() {{alt=18;}};
-        DFA.State s313 = new DFA.State() {
+        DFA.State s401 = new DFA.State() {{alt=18;}};
+        DFA.State s314 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_313 = input.LA(1);
-                if ( (LA16_313>='0' && LA16_313<='9')||(LA16_313>='A' && LA16_313<='Z')||LA16_313=='_'||(LA16_313>='a' && LA16_313<='z')||(LA16_313>='\u00C0' && LA16_313<='\u00FF') ) {return s51;}
-                return s397;
+                int LA16_314 = input.LA(1);
+                if ( (LA16_314>='0' && LA16_314<='9')||(LA16_314>='A' && LA16_314<='Z')||LA16_314=='_'||(LA16_314>='a' && LA16_314<='z')||(LA16_314>='\u00C0' && LA16_314<='\u00FF') ) {return s51;}
+                return s401;
 
             }
         };
         DFA.State s214 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_214 = input.LA(1);
-                if ( LA16_214=='n' ) {return s313;}
+                if ( LA16_214=='n' ) {return s314;}
                 return s51;
 
             }
@@ -4206,309 +4241,309 @@
             }
         };
         DFA.State s17 = new DFA.State() {{alt=19;}};
-        DFA.State s399 = new DFA.State() {{alt=24;}};
-        DFA.State s316 = new DFA.State() {
+        DFA.State s520 = new DFA.State() {{alt=31;}};
+        DFA.State s467 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_316 = input.LA(1);
-                if ( LA16_316=='-' ) {return s399;}
-                return s51;
+                int LA16_467 = input.LA(1);
+                if ( (LA16_467>='0' && LA16_467<='9')||(LA16_467>='A' && LA16_467<='Z')||LA16_467=='_'||(LA16_467>='a' && LA16_467<='z')||(LA16_467>='\u00C0' && LA16_467<='\u00FF') ) {return s51;}
+                return s520;
 
             }
         };
-        DFA.State s217 = new DFA.State() {
+        DFA.State s403 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_217 = input.LA(1);
-                if ( LA16_217=='o' ) {return s316;}
+                int LA16_403 = input.LA(1);
+                if ( LA16_403=='n' ) {return s467;}
                 return s51;
 
             }
         };
-        DFA.State s95 = new DFA.State() {
+        DFA.State s617 = new DFA.State() {{alt=25;}};
+        DFA.State s608 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_95 = input.LA(1);
-                if ( LA16_95=='t' ) {return s217;}
+                int LA16_608 = input.LA(1);
+                if ( LA16_608=='-' ) {return s617;}
                 return s51;
 
             }
         };
-        DFA.State s602 = new DFA.State() {{alt=25;}};
         DFA.State s593 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_593 = input.LA(1);
-                if ( LA16_593=='-' ) {return s602;}
+                if ( LA16_593=='n' ) {return s608;}
                 return s51;
 
             }
         };
-        DFA.State s578 = new DFA.State() {
+        DFA.State s563 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_578 = input.LA(1);
-                if ( LA16_578=='n' ) {return s593;}
+                int LA16_563 = input.LA(1);
+                if ( LA16_563=='o' ) {return s593;}
                 return s51;
 
             }
         };
-        DFA.State s550 = new DFA.State() {
+        DFA.State s522 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_550 = input.LA(1);
-                if ( LA16_550=='o' ) {return s578;}
+                int LA16_522 = input.LA(1);
+                if ( LA16_522=='i' ) {return s563;}
                 return s51;
 
             }
         };
-        DFA.State s510 = new DFA.State() {
+        DFA.State s470 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_510 = input.LA(1);
-                if ( LA16_510=='i' ) {return s550;}
+                int LA16_470 = input.LA(1);
+                if ( LA16_470=='t' ) {return s522;}
                 return s51;
 
             }
         };
-        DFA.State s460 = new DFA.State() {
+        DFA.State s404 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_460 = input.LA(1);
-                if ( LA16_460=='t' ) {return s510;}
+                int LA16_404 = input.LA(1);
+                if ( LA16_404=='a' ) {return s470;}
                 return s51;
 
             }
         };
-        DFA.State s402 = new DFA.State() {
+        DFA.State s317 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_402 = input.LA(1);
-                if ( LA16_402=='a' ) {return s460;}
-                return s51;
-
-            }
-        };
-        DFA.State s513 = new DFA.State() {{alt=31;}};
-        DFA.State s463 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_463 = input.LA(1);
-                if ( (LA16_463>='0' && LA16_463<='9')||(LA16_463>='A' && LA16_463<='Z')||LA16_463=='_'||(LA16_463>='a' && LA16_463<='z')||(LA16_463>='\u00C0' && LA16_463<='\u00FF') ) {return s51;}
-                return s513;
-
-            }
-        };
-        DFA.State s403 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_403 = input.LA(1);
-                if ( LA16_403=='n' ) {return s463;}
-                return s51;
-
-            }
-        };
-        DFA.State s319 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'v':
-                    return s402;
-
                 case 'o':
                     return s403;
 
+                case 'v':
+                    return s404;
+
                 default:
                     return s51;
         	        }
             }
         };
-        DFA.State s220 = new DFA.State() {
+        DFA.State s217 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_220 = input.LA(1);
-                if ( LA16_220=='i' ) {return s319;}
+                int LA16_217 = input.LA(1);
+                if ( LA16_217=='i' ) {return s317;}
                 return s51;
 
             }
         };
-        DFA.State s605 = new DFA.State() {{alt=29;}};
-        DFA.State s596 = new DFA.State() {
+        DFA.State s620 = new DFA.State() {{alt=29;}};
+        DFA.State s611 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_596 = input.LA(1);
-                if ( (LA16_596>='0' && LA16_596<='9')||(LA16_596>='A' && LA16_596<='Z')||LA16_596=='_'||(LA16_596>='a' && LA16_596<='z')||(LA16_596>='\u00C0' && LA16_596<='\u00FF') ) {return s51;}
-                return s605;
+                int LA16_611 = input.LA(1);
+                if ( (LA16_611>='0' && LA16_611<='9')||(LA16_611>='A' && LA16_611<='Z')||LA16_611=='_'||(LA16_611>='a' && LA16_611<='z')||(LA16_611>='\u00C0' && LA16_611<='\u00FF') ) {return s51;}
+                return s620;
 
             }
         };
-        DFA.State s581 = new DFA.State() {
+        DFA.State s596 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_581 = input.LA(1);
-                if ( LA16_581=='e' ) {return s596;}
+                int LA16_596 = input.LA(1);
+                if ( LA16_596=='e' ) {return s611;}
                 return s51;
 
             }
         };
-        DFA.State s553 = new DFA.State() {
+        DFA.State s566 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_553 = input.LA(1);
-                if ( LA16_553=='t' ) {return s581;}
+                int LA16_566 = input.LA(1);
+                if ( LA16_566=='t' ) {return s596;}
                 return s51;
 
             }
         };
-        DFA.State s515 = new DFA.State() {
+        DFA.State s525 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_515 = input.LA(1);
-                if ( LA16_515=='a' ) {return s553;}
+                int LA16_525 = input.LA(1);
+                if ( LA16_525=='a' ) {return s566;}
                 return s51;
 
             }
         };
-        DFA.State s466 = new DFA.State() {
+        DFA.State s473 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_466 = input.LA(1);
-                if ( LA16_466=='l' ) {return s515;}
+                int LA16_473 = input.LA(1);
+                if ( LA16_473=='l' ) {return s525;}
                 return s51;
 
             }
         };
-        DFA.State s406 = new DFA.State() {
+        DFA.State s407 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_406 = input.LA(1);
-                if ( LA16_406=='u' ) {return s466;}
+                int LA16_407 = input.LA(1);
+                if ( LA16_407=='u' ) {return s473;}
                 return s51;
 
             }
         };
-        DFA.State s322 = new DFA.State() {
+        DFA.State s320 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_322 = input.LA(1);
-                if ( LA16_322=='m' ) {return s406;}
+                int LA16_320 = input.LA(1);
+                if ( LA16_320=='m' ) {return s407;}
                 return s51;
 
             }
         };
-        DFA.State s221 = new DFA.State() {
+        DFA.State s218 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_221 = input.LA(1);
-                if ( LA16_221=='u' ) {return s322;}
+                int LA16_218 = input.LA(1);
+                if ( LA16_218=='u' ) {return s320;}
                 return s51;
 
             }
         };
-        DFA.State s96 = new DFA.State() {
+        DFA.State s95 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case 't':
-                    return s220;
+                    return s217;
 
                 case 'c':
-                    return s221;
+                    return s218;
 
                 default:
                     return s51;
         	        }
             }
         };
-        DFA.State s325 = new DFA.State() {{alt=42;}};
-        DFA.State s224 = new DFA.State() {
+        DFA.State s622 = new DFA.State() {{alt=21;}};
+        DFA.State s614 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_224 = input.LA(1);
-                if ( (LA16_224>='0' && LA16_224<='9')||(LA16_224>='A' && LA16_224<='Z')||LA16_224=='_'||(LA16_224>='a' && LA16_224<='z')||(LA16_224>='\u00C0' && LA16_224<='\u00FF') ) {return s51;}
-                return s325;
+                int LA16_614 = input.LA(1);
+                if ( (LA16_614>='0' && LA16_614<='9')||(LA16_614>='A' && LA16_614<='Z')||LA16_614=='_'||(LA16_614>='a' && LA16_614<='z')||(LA16_614>='\u00C0' && LA16_614<='\u00FF') ) {return s51;}
+                return s622;
 
             }
         };
-        DFA.State s97 = new DFA.State() {
+        DFA.State s599 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_97 = input.LA(1);
-                if ( LA16_97=='d' ) {return s224;}
+                int LA16_599 = input.LA(1);
+                if ( LA16_599=='s' ) {return s614;}
                 return s51;
 
             }
         };
-        DFA.State s607 = new DFA.State() {{alt=21;}};
-        DFA.State s599 = new DFA.State() {
+        DFA.State s569 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_599 = input.LA(1);
-                if ( (LA16_599>='0' && LA16_599<='9')||(LA16_599>='A' && LA16_599<='Z')||LA16_599=='_'||(LA16_599>='a' && LA16_599<='z')||(LA16_599>='\u00C0' && LA16_599<='\u00FF') ) {return s51;}
-                return s607;
+                int LA16_569 = input.LA(1);
+                if ( LA16_569=='e' ) {return s599;}
+                return s51;
 
             }
         };
-        DFA.State s584 = new DFA.State() {
+        DFA.State s528 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_584 = input.LA(1);
-                if ( LA16_584=='s' ) {return s599;}
+                int LA16_528 = input.LA(1);
+                if ( LA16_528=='t' ) {return s569;}
                 return s51;
 
             }
         };
-        DFA.State s556 = new DFA.State() {
+        DFA.State s476 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_556 = input.LA(1);
-                if ( LA16_556=='e' ) {return s584;}
+                int LA16_476 = input.LA(1);
+                if ( LA16_476=='u' ) {return s528;}
                 return s51;
 
             }
         };
-        DFA.State s518 = new DFA.State() {
+        DFA.State s410 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_518 = input.LA(1);
-                if ( LA16_518=='t' ) {return s556;}
+                int LA16_410 = input.LA(1);
+                if ( LA16_410=='b' ) {return s476;}
                 return s51;
 
             }
         };
-        DFA.State s469 = new DFA.State() {
+        DFA.State s323 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_469 = input.LA(1);
-                if ( LA16_469=='u' ) {return s518;}
+                int LA16_323 = input.LA(1);
+                if ( LA16_323=='i' ) {return s410;}
                 return s51;
 
             }
         };
-        DFA.State s409 = new DFA.State() {
+        DFA.State s221 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_409 = input.LA(1);
-                if ( LA16_409=='b' ) {return s469;}
+                int LA16_221 = input.LA(1);
+                if ( LA16_221=='r' ) {return s323;}
                 return s51;
 
             }
         };
-        DFA.State s327 = new DFA.State() {
+        DFA.State s96 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_327 = input.LA(1);
-                if ( LA16_327=='i' ) {return s409;}
+                int LA16_96 = input.LA(1);
+                if ( LA16_96=='t' ) {return s221;}
                 return s51;
 
             }
         };
+        DFA.State s413 = new DFA.State() {{alt=24;}};
+        DFA.State s326 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_326 = input.LA(1);
+                if ( LA16_326=='-' ) {return s413;}
+                return s51;
+
+            }
+        };
+        DFA.State s224 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_224 = input.LA(1);
+                if ( LA16_224=='o' ) {return s326;}
+                return s51;
+
+            }
+        };
+        DFA.State s97 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_97 = input.LA(1);
+                if ( LA16_97=='t' ) {return s224;}
+                return s51;
+
+            }
+        };
+        DFA.State s329 = new DFA.State() {{alt=43;}};
         DFA.State s227 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_227 = input.LA(1);
-                if ( LA16_227=='r' ) {return s327;}
-                return s51;
+                if ( (LA16_227>='0' && LA16_227<='9')||(LA16_227>='A' && LA16_227<='Z')||LA16_227=='_'||(LA16_227>='a' && LA16_227<='z')||(LA16_227>='\u00C0' && LA16_227<='\u00FF') ) {return s51;}
+                return s329;
 
             }
         };
         DFA.State s98 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_98 = input.LA(1);
-                if ( LA16_98=='t' ) {return s227;}
+                if ( LA16_98=='d' ) {return s227;}
                 return s51;
 
             }
         };
-        DFA.State s521 = new DFA.State() {{alt=26;}};
-        DFA.State s472 = new DFA.State() {
+        DFA.State s531 = new DFA.State() {{alt=26;}};
+        DFA.State s479 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_472 = input.LA(1);
-                if ( LA16_472=='-' ) {return s521;}
+                int LA16_479 = input.LA(1);
+                if ( LA16_479=='-' ) {return s531;}
                 return s51;
 
             }
         };
-        DFA.State s412 = new DFA.State() {
+        DFA.State s416 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_412 = input.LA(1);
-                if ( LA16_412=='a' ) {return s472;}
+                int LA16_416 = input.LA(1);
+                if ( LA16_416=='a' ) {return s479;}
                 return s51;
 
             }
         };
-        DFA.State s330 = new DFA.State() {
+        DFA.State s331 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_330 = input.LA(1);
-                if ( LA16_330=='d' ) {return s412;}
+                int LA16_331 = input.LA(1);
+                if ( LA16_331=='d' ) {return s416;}
                 return s51;
 
             }
@@ -4516,7 +4551,7 @@
         DFA.State s230 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_230 = input.LA(1);
-                if ( LA16_230=='n' ) {return s330;}
+                if ( LA16_230=='n' ) {return s331;}
                 return s51;
 
             }
@@ -4532,16 +4567,16 @@
         DFA.State s18 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case 'u':
+                case 'c':
                     return s95;
 
-                case 'c':
+                case 't':
                     return s96;
 
-                case 'n':
+                case 'u':
                     return s97;
 
-                case 't':
+                case 'n':
                     return s98;
 
                 case 'g':
@@ -4552,43 +4587,43 @@
         	        }
             }
         };
-        DFA.State s587 = new DFA.State() {{alt=22;}};
-        DFA.State s559 = new DFA.State() {
+        DFA.State s602 = new DFA.State() {{alt=22;}};
+        DFA.State s572 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_559 = input.LA(1);
-                if ( (LA16_559>='0' && LA16_559<='9')||(LA16_559>='A' && LA16_559<='Z')||LA16_559=='_'||(LA16_559>='a' && LA16_559<='z')||(LA16_559>='\u00C0' && LA16_559<='\u00FF') ) {return s51;}
-                return s587;
+                int LA16_572 = input.LA(1);
+                if ( (LA16_572>='0' && LA16_572<='9')||(LA16_572>='A' && LA16_572<='Z')||LA16_572=='_'||(LA16_572>='a' && LA16_572<='z')||(LA16_572>='\u00C0' && LA16_572<='\u00FF') ) {return s51;}
+                return s602;
 
             }
         };
-        DFA.State s524 = new DFA.State() {
+        DFA.State s534 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_524 = input.LA(1);
-                if ( LA16_524=='e' ) {return s559;}
+                int LA16_534 = input.LA(1);
+                if ( LA16_534=='e' ) {return s572;}
                 return s51;
 
             }
         };
-        DFA.State s475 = new DFA.State() {
+        DFA.State s482 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_475 = input.LA(1);
-                if ( LA16_475=='c' ) {return s524;}
+                int LA16_482 = input.LA(1);
+                if ( LA16_482=='c' ) {return s534;}
                 return s51;
 
             }
         };
-        DFA.State s415 = new DFA.State() {
+        DFA.State s419 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_415 = input.LA(1);
-                if ( LA16_415=='n' ) {return s475;}
+                int LA16_419 = input.LA(1);
+                if ( LA16_419=='n' ) {return s482;}
                 return s51;
 
             }
         };
-        DFA.State s333 = new DFA.State() {
+        DFA.State s334 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_333 = input.LA(1);
-                if ( LA16_333=='e' ) {return s415;}
+                int LA16_334 = input.LA(1);
+                if ( LA16_334=='e' ) {return s419;}
                 return s51;
 
             }
@@ -4596,7 +4631,7 @@
         DFA.State s233 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_233 = input.LA(1);
-                if ( LA16_233=='i' ) {return s333;}
+                if ( LA16_233=='i' ) {return s334;}
                 return s51;
 
             }
@@ -4617,23 +4652,23 @@
 
             }
         };
-        DFA.State s236 = new DFA.State() {{alt=23;}};
-        DFA.State s336 = new DFA.State() {{alt=45;}};
-        DFA.State s237 = new DFA.State() {
+        DFA.State s337 = new DFA.State() {{alt=46;}};
+        DFA.State s236 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_237 = input.LA(1);
-                if ( (LA16_237>='0' && LA16_237<='9')||(LA16_237>='A' && LA16_237<='Z')||LA16_237=='_'||(LA16_237>='a' && LA16_237<='z')||(LA16_237>='\u00C0' && LA16_237<='\u00FF') ) {return s51;}
-                return s336;
+                int LA16_236 = input.LA(1);
+                if ( (LA16_236>='0' && LA16_236<='9')||(LA16_236>='A' && LA16_236<='Z')||LA16_236=='_'||(LA16_236>='a' && LA16_236<='z')||(LA16_236>='\u00C0' && LA16_236<='\u00FF') ) {return s51;}
+                return s337;
 
             }
         };
+        DFA.State s237 = new DFA.State() {{alt=23;}};
         DFA.State s105 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case '-':
+                case 't':
                     return s236;
 
-                case 't':
+                case '-':
                     return s237;
 
                 default:
@@ -4641,19 +4676,19 @@
         	        }
             }
         };
-        DFA.State s418 = new DFA.State() {{alt=33;}};
-        DFA.State s338 = new DFA.State() {
+        DFA.State s422 = new DFA.State() {{alt=34;}};
+        DFA.State s339 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_338 = input.LA(1);
-                if ( (LA16_338>='0' && LA16_338<='9')||(LA16_338>='A' && LA16_338<='Z')||LA16_338=='_'||(LA16_338>='a' && LA16_338<='z')||(LA16_338>='\u00C0' && LA16_338<='\u00FF') ) {return s51;}
-                return s418;
+                int LA16_339 = input.LA(1);
+                if ( (LA16_339>='0' && LA16_339<='9')||(LA16_339>='A' && LA16_339<='Z')||LA16_339=='_'||(LA16_339>='a' && LA16_339<='z')||(LA16_339>='\u00C0' && LA16_339<='\u00FF') ) {return s51;}
+                return s422;
 
             }
         };
         DFA.State s240 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_240 = input.LA(1);
-                if ( LA16_240=='l' ) {return s338;}
+                if ( LA16_240=='l' ) {return s339;}
                 return s51;
 
             }
@@ -4680,43 +4715,43 @@
         	        }
             }
         };
-        DFA.State s589 = new DFA.State() {{alt=27;}};
-        DFA.State s562 = new DFA.State() {
+        DFA.State s604 = new DFA.State() {{alt=27;}};
+        DFA.State s575 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_562 = input.LA(1);
-                if ( (LA16_562>='0' && LA16_562<='9')||(LA16_562>='A' && LA16_562<='Z')||LA16_562=='_'||(LA16_562>='a' && LA16_562<='z')||(LA16_562>='\u00C0' && LA16_562<='\u00FF') ) {return s51;}
-                return s589;
+                int LA16_575 = input.LA(1);
+                if ( (LA16_575>='0' && LA16_575<='9')||(LA16_575>='A' && LA16_575<='Z')||LA16_575=='_'||(LA16_575>='a' && LA16_575<='z')||(LA16_575>='\u00C0' && LA16_575<='\u00FF') ) {return s51;}
+                return s604;
 
             }
         };
-        DFA.State s527 = new DFA.State() {
+        DFA.State s537 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_527 = input.LA(1);
-                if ( LA16_527=='n' ) {return s562;}
+                int LA16_537 = input.LA(1);
+                if ( LA16_537=='n' ) {return s575;}
                 return s51;
 
             }
         };
-        DFA.State s478 = new DFA.State() {
+        DFA.State s485 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_478 = input.LA(1);
-                if ( LA16_478=='o' ) {return s527;}
+                int LA16_485 = input.LA(1);
+                if ( LA16_485=='o' ) {return s537;}
                 return s51;
 
             }
         };
-        DFA.State s420 = new DFA.State() {
+        DFA.State s424 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_420 = input.LA(1);
-                if ( LA16_420=='i' ) {return s478;}
+                int LA16_424 = input.LA(1);
+                if ( LA16_424=='i' ) {return s485;}
                 return s51;
 
             }
         };
-        DFA.State s341 = new DFA.State() {
+        DFA.State s342 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_341 = input.LA(1);
-                if ( LA16_341=='t' ) {return s420;}
+                int LA16_342 = input.LA(1);
+                if ( LA16_342=='t' ) {return s424;}
                 return s51;
 
             }
@@ -4724,7 +4759,7 @@
         DFA.State s243 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_243 = input.LA(1);
-                if ( LA16_243=='a' ) {return s341;}
+                if ( LA16_243=='a' ) {return s342;}
                 return s51;
 
             }
@@ -4745,110 +4780,225 @@
 
             }
         };
-        DFA.State s246 = new DFA.State() {{alt=48;}};
+        DFA.State s606 = new DFA.State() {{alt=56;}};
+        DFA.State s578 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_578 = input.LA(1);
+                if ( (LA16_578>='0' && LA16_578<='9')||(LA16_578>='A' && LA16_578<='Z')||LA16_578=='_'||(LA16_578>='a' && LA16_578<='z')||(LA16_578>='\u00C0' && LA16_578<='\u00FF') ) {return s51;}
+                return s606;
+
+            }
+        };
+        DFA.State s540 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_540 = input.LA(1);
+                if ( LA16_540=='s' ) {return s578;}
+                return s51;
+
+            }
+        };
+        DFA.State s488 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_488 = input.LA(1);
+                if ( LA16_488=='n' ) {return s540;}
+                return s51;
+
+            }
+        };
+        DFA.State s427 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_427 = input.LA(1);
+                if ( LA16_427=='i' ) {return s488;}
+                return s51;
+
+            }
+        };
+        DFA.State s345 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_345 = input.LA(1);
+                if ( LA16_345=='a' ) {return s427;}
+                return s51;
+
+            }
+        };
+        DFA.State s246 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_246 = input.LA(1);
+                if ( LA16_246=='t' ) {return s345;}
+                return s51;
+
+            }
+        };
+        DFA.State s581 = new DFA.State() {{alt=33;}};
+        DFA.State s543 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_543 = input.LA(1);
+                if ( (LA16_543>='0' && LA16_543<='9')||(LA16_543>='A' && LA16_543<='Z')||LA16_543=='_'||(LA16_543>='a' && LA16_543<='z')||(LA16_543>='\u00C0' && LA16_543<='\u00FF') ) {return s51;}
+                return s581;
+
+            }
+        };
+        DFA.State s491 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_491 = input.LA(1);
+                if ( LA16_491=='t' ) {return s543;}
+                return s51;
+
+            }
+        };
+        DFA.State s430 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_430 = input.LA(1);
+                if ( LA16_430=='c' ) {return s491;}
+                return s51;
+
+            }
+        };
+        DFA.State s348 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_348 = input.LA(1);
+                if ( LA16_348=='e' ) {return s430;}
+                return s51;
+
+            }
+        };
+        DFA.State s247 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_247 = input.LA(1);
+                if ( LA16_247=='l' ) {return s348;}
+                return s51;
+
+            }
+        };
         DFA.State s112 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_112 = input.LA(1);
-                return s246;
+                switch ( input.LA(1) ) {
+                case 'n':
+                    return s246;
 
+                case 'l':
+                    return s247;
+
+                default:
+                    return s51;
+        	        }
             }
         };
-        DFA.State s35 = new DFA.State() {{alt=58;}};
-        DFA.State s117 = new DFA.State() {{alt=34;}};
-        DFA.State s118 = new DFA.State() {{alt=49;}};
         DFA.State s22 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_22 = input.LA(1);
+                if ( LA16_22=='o' ) {return s112;}
+                return s51;
+
+            }
+        };
+        DFA.State s35 = new DFA.State() {{alt=59;}};
+        DFA.State s250 = new DFA.State() {{alt=49;}};
+        DFA.State s116 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_116 = input.LA(1);
+                return s250;
+
+            }
+        };
+        DFA.State s120 = new DFA.State() {{alt=35;}};
+        DFA.State s121 = new DFA.State() {{alt=50;}};
+        DFA.State s23 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case '=':
-                    return s112;
-
                 case '*':
                 case '+':
                 case '-':
                 case '/':
                     return s35;
 
+                case '=':
+                    return s116;
+
                 case '>':
-                    return s117;
+                    return s120;
 
                 default:
-                    return s118;
+                    return s121;
         	        }
             }
         };
-        DFA.State s119 = new DFA.State() {{alt=35;}};
-        DFA.State s23 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_23 = input.LA(1);
-                return s119;
-
-            }
-        };
-        DFA.State s120 = new DFA.State() {{alt=36;}};
+        DFA.State s122 = new DFA.State() {{alt=36;}};
         DFA.State s24 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_24 = input.LA(1);
-                return s120;
+                return s122;
 
             }
         };
-        DFA.State s247 = new DFA.State() {{alt=37;}};
-        DFA.State s121 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_121 = input.LA(1);
-                if ( (LA16_121>='0' && LA16_121<='9')||(LA16_121>='A' && LA16_121<='Z')||LA16_121=='_'||(LA16_121>='a' && LA16_121<='z')||(LA16_121>='\u00C0' && LA16_121<='\u00FF') ) {return s51;}
-                return s247;
-
-            }
-        };
+        DFA.State s123 = new DFA.State() {{alt=37;}};
         DFA.State s25 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_25 = input.LA(1);
-                if ( LA16_25=='r' ) {return s121;}
-                return s51;
+                return s123;
 
             }
         };
-        DFA.State s249 = new DFA.State() {{alt=38;}};
+        DFA.State s251 = new DFA.State() {{alt=38;}};
         DFA.State s124 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_124 = input.LA(1);
-                return s249;
+                if ( (LA16_124>='0' && LA16_124<='9')||(LA16_124>='A' && LA16_124<='Z')||LA16_124=='_'||(LA16_124>='a' && LA16_124<='z')||(LA16_124>='\u00C0' && LA16_124<='\u00FF') ) {return s51;}
+                return s251;
 
             }
         };
-        DFA.State s125 = new DFA.State() {{alt=40;}};
         DFA.State s26 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_26 = input.LA(1);
-                if ( LA16_26=='|' ) {return s124;}
-                return s125;
+                if ( LA16_26=='r' ) {return s124;}
+                return s51;
 
             }
         };
-        DFA.State s250 = new DFA.State() {{alt=43;}};
-        DFA.State s126 = new DFA.State() {
+        DFA.State s253 = new DFA.State() {{alt=39;}};
+        DFA.State s127 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_126 = input.LA(1);
-                return s250;
+                int LA16_127 = input.LA(1);
+                return s253;
 
             }
         };
-        DFA.State s127 = new DFA.State() {{alt=39;}};
+        DFA.State s128 = new DFA.State() {{alt=41;}};
         DFA.State s27 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_27 = input.LA(1);
-                if ( LA16_27=='&' ) {return s126;}
-                return s127;
+                if ( LA16_27=='|' ) {return s127;}
+                return s128;
 
             }
         };
-        DFA.State s128 = new DFA.State() {{alt=41;}};
-        DFA.State s161 = new DFA.State() {{alt=61;}};
+        DFA.State s254 = new DFA.State() {{alt=44;}};
+        DFA.State s129 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_129 = input.LA(1);
+                return s254;
+
+            }
+        };
+        DFA.State s130 = new DFA.State() {{alt=40;}};
+        DFA.State s28 = new DFA.State() {
+            public DFA.State transition(IntStream input) throws RecognitionException {
+                int LA16_28 = input.LA(1);
+                if ( LA16_28=='&' ) {return s129;}
+                return s130;
+
+            }
+        };
+        DFA.State s133 = new DFA.State() {{alt=42;}};
+        DFA.State s161 = new DFA.State() {{alt=63;}};
         DFA.State s163 = new DFA.State() {{alt=62;}};
         DFA.State s49 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
+                case '.':
+                    return s161;
+
                 case '0':
                 case '1':
                 case '2':
@@ -4861,19 +5011,16 @@
                 case '9':
                     return s49;
 
-                case '.':
+                default:
                     return s163;
-
-                default:
-                    return s161;
         	        }
             }
         };
-        DFA.State s28 = new DFA.State() {
+        DFA.State s29 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case '>':
-                    return s128;
+                    return s133;
 
                 case '0':
                 case '1':
@@ -4892,174 +5039,109 @@
         	        }
             }
         };
-        DFA.State s344 = new DFA.State() {{alt=47;}};
-        DFA.State s251 = new DFA.State() {
+        DFA.State s351 = new DFA.State() {{alt=48;}};
+        DFA.State s255 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_251 = input.LA(1);
-                if ( (LA16_251>='0' && LA16_251<='9')||(LA16_251>='A' && LA16_251<='Z')||LA16_251=='_'||(LA16_251>='a' && LA16_251<='z')||(LA16_251>='\u00C0' && LA16_251<='\u00FF') ) {return s51;}
-                return s344;
+                int LA16_255 = input.LA(1);
+                if ( (LA16_255>='0' && LA16_255<='9')||(LA16_255>='A' && LA16_255<='Z')||LA16_255=='_'||(LA16_255>='a' && LA16_255<='z')||(LA16_255>='\u00C0' && LA16_255<='\u00FF') ) {return s51;}
+                return s351;
 
             }
         };
-        DFA.State s133 = new DFA.State() {
+        DFA.State s136 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_133 = input.LA(1);
-                if ( LA16_133=='e' ) {return s251;}
+                int LA16_136 = input.LA(1);
+                if ( LA16_136=='e' ) {return s255;}
                 return s51;
 
             }
         };
-        DFA.State s29 = new DFA.State() {
+        DFA.State s30 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_29 = input.LA(1);
-                if ( LA16_29=='s' ) {return s133;}
+                int LA16_30 = input.LA(1);
+                if ( LA16_30=='s' ) {return s136;}
                 return s51;
 
             }
         };
-        DFA.State s136 = new DFA.State() {{alt=51;}};
-        DFA.State s138 = new DFA.State() {{alt=50;}};
-        DFA.State s30 = new DFA.State() {
+        DFA.State s140 = new DFA.State() {{alt=52;}};
+        DFA.State s141 = new DFA.State() {{alt=51;}};
+        DFA.State s31 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
-                case '=':
-                    return s136;
-
                 case '>':
                     return s35;
 
+                case '=':
+                    return s140;
+
                 default:
-                    return s138;
+                    return s141;
         	        }
             }
         };
-        DFA.State s140 = new DFA.State() {{alt=53;}};
-        DFA.State s141 = new DFA.State() {{alt=52;}};
-        DFA.State s31 = new DFA.State() {
+        DFA.State s143 = new DFA.State() {{alt=54;}};
+        DFA.State s144 = new DFA.State() {{alt=53;}};
+        DFA.State s32 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case '<':
                     return s35;
 
                 case '=':
-                    return s140;
+                    return s143;
 
                 default:
-                    return s141;
+                    return s144;
         	        }
             }
         };
-        DFA.State s142 = new DFA.State() {{alt=54;}};
-        DFA.State s32 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_32 = input.LA(1);
-                if ( LA16_32=='=' ) {return s142;}
-                return s35;
-
-            }
-        };
-        DFA.State s591 = new DFA.State() {{alt=55;}};
-        DFA.State s565 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_565 = input.LA(1);
-                if ( (LA16_565>='0' && LA16_565<='9')||(LA16_565>='A' && LA16_565<='Z')||LA16_565=='_'||(LA16_565>='a' && LA16_565<='z')||(LA16_565>='\u00C0' && LA16_565<='\u00FF') ) {return s51;}
-                return s591;
-
-            }
-        };
-        DFA.State s530 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_530 = input.LA(1);
-                if ( LA16_530=='s' ) {return s565;}
-                return s51;
-
-            }
-        };
-        DFA.State s481 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_481 = input.LA(1);
-                if ( LA16_481=='n' ) {return s530;}
-                return s51;
-
-            }
-        };
-        DFA.State s423 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_423 = input.LA(1);
-                if ( LA16_423=='i' ) {return s481;}
-                return s51;
-
-            }
-        };
-        DFA.State s346 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_346 = input.LA(1);
-                if ( LA16_346=='a' ) {return s423;}
-                return s51;
-
-            }
-        };
-        DFA.State s254 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_254 = input.LA(1);
-                if ( LA16_254=='t' ) {return s346;}
-                return s51;
-
-            }
-        };
-        DFA.State s144 = new DFA.State() {
-            public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_144 = input.LA(1);
-                if ( LA16_144=='n' ) {return s254;}
-                return s51;
-
-            }
-        };
+        DFA.State s145 = new DFA.State() {{alt=55;}};
         DFA.State s33 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_33 = input.LA(1);
-                if ( LA16_33=='o' ) {return s144;}
-                return s51;
+                if ( LA16_33=='=' ) {return s145;}
+                return s35;
 
             }
         };
-        DFA.State s568 = new DFA.State() {{alt=56;}};
-        DFA.State s533 = new DFA.State() {
+        DFA.State s583 = new DFA.State() {{alt=57;}};
+        DFA.State s546 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_533 = input.LA(1);
-                if ( (LA16_533>='0' && LA16_533<='9')||(LA16_533>='A' && LA16_533<='Z')||LA16_533=='_'||(LA16_533>='a' && LA16_533<='z')||(LA16_533>='\u00C0' && LA16_533<='\u00FF') ) {return s51;}
-                return s568;
+                int LA16_546 = input.LA(1);
+                if ( (LA16_546>='0' && LA16_546<='9')||(LA16_546>='A' && LA16_546<='Z')||LA16_546=='_'||(LA16_546>='a' && LA16_546<='z')||(LA16_546>='\u00C0' && LA16_546<='\u00FF') ) {return s51;}
+                return s583;
 
             }
         };
-        DFA.State s484 = new DFA.State() {
+        DFA.State s494 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_484 = input.LA(1);
-                if ( LA16_484=='s' ) {return s533;}
+                int LA16_494 = input.LA(1);
+                if ( LA16_494=='s' ) {return s546;}
                 return s51;
 
             }
         };
-        DFA.State s426 = new DFA.State() {
+        DFA.State s433 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_426 = input.LA(1);
-                if ( LA16_426=='e' ) {return s484;}
+                int LA16_433 = input.LA(1);
+                if ( LA16_433=='e' ) {return s494;}
                 return s51;
 
             }
         };
-        DFA.State s349 = new DFA.State() {
+        DFA.State s353 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_349 = input.LA(1);
-                if ( LA16_349=='h' ) {return s426;}
+                int LA16_353 = input.LA(1);
+                if ( LA16_353=='h' ) {return s433;}
                 return s51;
 
             }
         };
-        DFA.State s257 = new DFA.State() {
+        DFA.State s258 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
-                int LA16_257 = input.LA(1);
-                if ( LA16_257=='c' ) {return s349;}
+                int LA16_258 = input.LA(1);
+                if ( LA16_258=='c' ) {return s353;}
                 return s51;
 
             }
@@ -5067,7 +5149,7 @@
         DFA.State s147 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_147 = input.LA(1);
-                if ( LA16_147=='t' ) {return s257;}
+                if ( LA16_147=='t' ) {return s258;}
                 return s51;
 
             }
@@ -5080,7 +5162,7 @@
 
             }
         };
-        DFA.State s151 = new DFA.State() {{alt=58;}};
+        DFA.State s151 = new DFA.State() {{alt=59;}};
         DFA.State s36 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_36 = input.LA(1);
@@ -5097,13 +5179,13 @@
 
             }
         };
-        DFA.State s155 = new DFA.State() {{alt=68;}};
-        DFA.State s156 = new DFA.State() {{alt=67;}};
+        DFA.State s154 = new DFA.State() {{alt=69;}};
+        DFA.State s156 = new DFA.State() {{alt=68;}};
         DFA.State s43 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
                 case '*':
-                    return s155;
+                    return s154;
 
                 case '/':
                     return s156;
@@ -5113,7 +5195,7 @@
         	        }
             }
         };
-        DFA.State s50 = new DFA.State() {{alt=63;}};
+        DFA.State s50 = new DFA.State() {{alt=64;}};
         DFA.State s44 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 int LA16_44 = input.LA(1);
@@ -5122,9 +5204,9 @@
 
             }
         };
-        DFA.State s46 = new DFA.State() {{alt=59;}};
-        DFA.State s47 = new DFA.State() {{alt=60;}};
-        DFA.State s52 = new DFA.State() {{alt=66;}};
+        DFA.State s46 = new DFA.State() {{alt=60;}};
+        DFA.State s47 = new DFA.State() {{alt=61;}};
+        DFA.State s52 = new DFA.State() {{alt=67;}};
         DFA.State s0 = new DFA.State() {
             public DFA.State transition(IntStream input) throws RecognitionException {
                 switch ( input.LA(1) ) {
@@ -5191,40 +5273,40 @@
                 case 'd':
                     return s21;
 
-                case '=':
+                case 'c':
                     return s22;
 
-                case '[':
+                case '=':
                     return s23;
 
-                case ']':
+                case '[':
                     return s24;
 
-                case 'o':
+                case ']':
                     return s25;
 
-                case '|':
+                case 'o':
                     return s26;
 
-                case '&':
+                case '|':
                     return s27;
 
-                case '-':
+                case '&':
                     return s28;
 
-                case 'u':
+                case '-':
                     return s29;
 
-                case '>':
+                case 'u':
                     return s30;
 
-                case '<':
+                case '>':
                     return s31;
 
-                case '!':
+                case '<':
                     return s32;
 
-                case 'c':
+                case '!':
                     return s33;
 
                 case 'm':

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/CollectDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/CollectDescr.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/CollectDescr.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+package org.drools.lang.descr;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * An AST class to describe "collect" conditional element
+ * 
+ * @author etirelli
+ *
+ */
+public class CollectDescr extends PatternDescr
+    implements
+    ConditionalElementDescr {
+
+    private static final long serialVersionUID = -78056848363435347L;
+    
+    private ColumnDescr       sourceColumn;
+    private ColumnDescr       resultColumn;
+    private String            classMethodName;
+
+    CollectDescr() {
+        super();
+    }
+
+    public int getLine() {
+        return sourceColumn.getLine();
+    }
+
+    public void setSourceColumn(ColumnDescr sourceColumn) {
+        this.sourceColumn = sourceColumn;
+    }
+
+    public ColumnDescr getSourceColumn() {
+        return sourceColumn;
+    }
+
+    public String getClassMethodName() {
+        return classMethodName;
+    }
+
+    public void setClassMethodName(String classMethodName) {
+        this.classMethodName = classMethodName;
+    }
+
+    public void setResultColumn(ColumnDescr resultColumn) {
+        this.resultColumn = resultColumn;
+    }
+    
+    public ColumnDescr getResultColumn() {
+        return this.resultColumn;
+    }
+
+    public String toString() {
+        return "[Collect: id=" + resultColumn.getIdentifier() + "; objectType=" + resultColumn.getObjectType() + "]";
+    }
+
+    public void addDescr(PatternDescr patternDescr) {
+        // Nothing to do
+    }
+
+    public List getDescrs() {
+        // nothing to do
+        return Collections.EMPTY_LIST;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/CollectDescr.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

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	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -17,4 +17,8 @@
     public AccumulateDescr createAccumulate() {
         return new AccumulateDescr();
     }
+    
+    public CollectDescr createCollect() {
+        return new CollectDescr();
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -51,6 +51,7 @@
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.ArgumentValueDescr;
 import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.CollectDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.ConditionalElementDescr;
 import org.drools.lang.descr.DeclarativeInvokerDescr;
@@ -74,6 +75,7 @@
 import org.drools.rule.Accumulate;
 import org.drools.rule.And;
 import org.drools.rule.AndCompositeRestriction;
+import org.drools.rule.Collect;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
 import org.drools.rule.EvalCondition;
@@ -314,6 +316,9 @@
                 } else if ( object.getClass() == AccumulateDescr.class ) {
                     final Accumulate accumulate = build( (AccumulateDescr) object );
                     this.rule.addPattern( accumulate );
+                } else if ( object.getClass() == CollectDescr.class ) {
+                    final Collect collect = build( (CollectDescr) object );
+                    this.rule.addPattern( collect );
                 }
             } else if ( object.getClass() == ColumnDescr.class ) {
                 final Column column = build( (ColumnDescr) object );
@@ -383,6 +388,9 @@
                 } else if ( object.getClass() == AccumulateDescr.class ) {
                     final Accumulate accumulate = build( (AccumulateDescr) object );
                     this.rule.addPattern( accumulate );
+                } else if ( object.getClass() == CollectDescr.class ) {
+                    final Collect collect = build( (CollectDescr) object );
+                    this.rule.addPattern( collect );
                 }
             } else if ( object.getClass() == ColumnDescr.class ) {
                 if ( decrementOffset && decrementFirst ) {
@@ -1040,9 +1048,6 @@
         Map sourceDeclarations = this.innerDeclarations;
         this.innerDeclarations = null;
 
-        // removing declaration as it is not a real declaration
-        this.declarations.remove( sourceColumn.getDeclaration().getIdentifier() );
-
         // decrementing offset as accumulate fills only one column
         this.columnOffset--;
         Column resultColumn = build( accumDescr.getResultColumn() );
@@ -1130,7 +1135,7 @@
         Accumulate accumulate = new Accumulate( sourceColumn,
                                                 resultColumn,
                                                 declarations,
-                                                sourceDeclArr);
+                                                sourceDeclArr );
         final String invokerClassName = this.pkg.getName() + "." + this.ruleDescr.getClassName() + ucFirst( className ) + "Invoker";
         this.invokers.put( invokerClassName,
                            st.toString() );
@@ -1141,6 +1146,25 @@
         return accumulate;
     }
 
+    private Collect build(final CollectDescr collectDescr) {
+        this.innerDeclarations = new HashMap();
+        Column sourceColumn = build( collectDescr.getSourceColumn() );
+        // remove declarations bound inside source column
+        this.declarations.keySet().removeAll( this.innerDeclarations.keySet() );
+        this.innerDeclarations = null;
+
+        // decrementing offset as collect fills only one column
+        this.columnOffset--;
+        Column resultColumn = build( collectDescr.getResultColumn() );
+
+        final String className = "collect" + this.counter++;
+        collectDescr.setClassMethodName( className );
+
+        Collect collect = new Collect( sourceColumn,
+                                       resultColumn );
+        return collect;
+    }
+
     private void buildConsequence(final RuleDescr ruleDescr) {
         // generate 
         // generate Invoker
@@ -1347,7 +1371,7 @@
 
     static class ColumnCounter {
         // we start with -1 so that we can ++this.value - otherwise the first element has a lower value than the second in an 'or'
-        private int          value = -1;
+        private int value = -1;
 
         public int getNext() {
             return ++this.value;

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	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/drl.g	2006-09-12 12:08:19 UTC (rev 6167)
@@ -811,6 +811,21 @@
 		} 
 	; 		
  		
+collect_statement returns [CollectDescr d]
+	@init {
+		d = factory.createCollect();
+	}
+	:
+	        loc='from' opt_eol 'collect' opt_eol 
+		{ 
+			d.setLocation( offset(loc.getLine()), loc.getCharPositionInLine() );
+		}	
+		'(' opt_eol column=lhs_column opt_eol ')'
+		{
+		        d.setSourceColumn( (ColumnDescr)column );
+		}
+	; 		
+
 argument_list returns [ArrayList args]
 	@init {
 		args = new ArrayList();
@@ -1241,7 +1256,8 @@
 		|	u=lhs_eval {d = u;}				
 		|	u=lhs_column {d=u;} 
 		          ((fm=from_statement {fm.setColumn((ColumnDescr) u); d=fm;}) 
-		          |(ac=accumulate_statement {ac.setResultColumn((ColumnDescr) u); d=ac;}) )?
+		          |(ac=accumulate_statement {ac.setResultColumn((ColumnDescr) u); d=ac;})
+		          |(cs=collect_statement {cs.setResultColumn((ColumnDescr) u); d=cs;}) )?
 		|	'(' opt_eol u=lhs opt_eol ')' {d = u;}
 		) 
 	;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -28,6 +28,7 @@
 import java.io.StringReader;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -3180,4 +3181,113 @@
         Assert.assertEquals( 2, results.size());
         
     }
+    
+    public void testCollect() throws Exception {
+
+        //read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Collect.drl" ) );
+        final DrlParser parser = new DrlParser();
+        final PackageDescr packageDescr = parser.parse( reader );
+
+        //pre build the package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( packageDescr );
+        final Package pkg = builder.getPackage();
+
+        //add the package to a rulebase
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        //load up the rulebase
+
+        final WorkingMemory wm = ruleBase.newWorkingMemory();
+        List results = new ArrayList();
+        
+        wm.setGlobal( "results", results );
+        
+        wm.assertObject( new Cheese("stilton", 10) );
+        wm.assertObject( new Cheese("stilton", 7) );
+        wm.assertObject( new Cheese("stilton", 8) );
+        wm.assertObject( new Cheese("brie", 5) );
+        wm.assertObject( new Cheese("provolone", 150) );
+        wm.assertObject( new Cheese("provolone", 20) );
+        wm.assertObject( new Person("Bob", "stilton") );
+        wm.assertObject( new Person("Mark", "provolone") );
+        
+        wm.fireAllRules();
+        
+        Assert.assertEquals(1, results.size());
+        Assert.assertEquals(3, ((Collection)results.get(0)).size());
+        Assert.assertEquals(ArrayList.class.getName(), results.get(0).getClass().getName());
+    }
+    
+    public void testCollectModify() throws Exception {
+        //read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Collect.drl" ) );
+        final DrlParser parser = new DrlParser();
+        final PackageDescr packageDescr = parser.parse( reader );
+
+        //pre build the package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( packageDescr );
+        final Package pkg = builder.getPackage();
+
+        //add the package to a rulebase
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        //load up the rulebase
+
+        final WorkingMemory wm = ruleBase.newWorkingMemory();
+        List results = new ArrayList();
+        
+        wm.setGlobal( "results", results );
+        
+        Cheese[] cheese = new Cheese[] {
+                       new Cheese("stilton", 10),
+                       new Cheese("stilton", 2),
+                       new Cheese("stilton", 5),
+                       new Cheese("brie", 15),
+                       new Cheese("brie", 16),
+                       new Cheese("provolone", 8)
+        };
+        Person bob =  new Person("Bob", "stilton");
+        
+        FactHandle[] cheeseHandles = new FactHandle[cheese.length];
+        for( int i = 0; i < cheese.length; i++ ) {
+            cheeseHandles[i] = wm.assertObject( cheese[i] );
+        }
+        FactHandle bobHandle = wm.assertObject( bob );
+
+        // ---------------- 1st scenario
+        int fireCount = 0;
+        wm.fireAllRules();
+        Assert.assertEquals( ++fireCount, results.size() );
+        Assert.assertEquals( 3, ((Collection)results.get(fireCount-1)).size());
+        Assert.assertEquals( ArrayList.class.getName(), results.get(fireCount-1).getClass().getName());
+        
+        // ---------------- 2nd scenario
+        int index = 1;
+        cheese[index].setPrice( 9 );
+        wm.modifyObject( cheeseHandles[index], cheese[index] );
+        wm.fireAllRules();
+        
+        Assert.assertEquals( ++fireCount, results.size() );
+        Assert.assertEquals( 3, ((Collection)results.get(fireCount-1)).size());
+        Assert.assertEquals( ArrayList.class.getName(), results.get(fireCount-1).getClass().getName());
+        
+        // ---------------- 3rd scenario
+        bob.setLikes( "brie" );
+        wm.modifyObject( bobHandle, bob );
+        wm.fireAllRules();
+        
+        Assert.assertEquals( fireCount, results.size() );
+        
+        // ---------------- 4th scenario
+        wm.retractObject( cheeseHandles[3] );
+        wm.fireAllRules();
+        
+        // should not have fired as per constraint
+        Assert.assertEquals( fireCount, results.size());
+        
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/LeapsTest.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -435,4 +435,11 @@
         // FIXME
     }
     
+    public void testCollect() throws Exception {
+        // FIXME
+    }
+    
+    public void testCollectModify() throws Exception {
+        // FIXME
+    }
 }

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	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -35,6 +35,7 @@
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.ArgumentValueDescr;
 import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.CollectDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.EvalDescr;
 import org.drools.lang.descr.ExistsDescr;
@@ -2366,6 +2367,30 @@
                       col.getObjectType() );
     }
 
+    public void testCollect() throws Exception {
+        final RuleParser 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 CollectDescr collect = (CollectDescr) rule.getLhs().getDescrs().get( 0 );
+
+        final ColumnDescr col = (ColumnDescr) collect.getSourceColumn();
+        assertEquals( "Person",
+                      col.getObjectType() );
+    }
+
     private RuleParser parse(final String text) throws Exception {
         this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
         return this.parser;

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Collect.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Collect.drl	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Collect.drl	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,16 @@
+package org.drools.test;
+
+import org.drools.Cheese;
+import org.drools.Person;
+import java.util.ArrayList;
+
+global java.util.List results;
+
+rule "Collect Test" salience 70
+    when
+        $person      : Person( name == "Bob", $likes : likes )
+    	$cheeseList  : ArrayList(size > 2) from collect( Cheese( type == $likes ) );
+    then
+        //System.out.println($person.getName() +" will buy "+ $cheeseList.size() + " pieces of cheese");
+        results.add($cheeseList);
+end


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_Collect.drl
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/collect.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/collect.drl	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/collect.drl	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,5 @@
+rule "CollectParserTest"
+when
+     $personList : ArrayList() from collect( Person( age > 21 ) );
+then
+end
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/collect.drl
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -51,10 +51,14 @@
     /**
      * Construct.
      * 
+     * @param id
+     *            The id for the node
      * @param leftInput
      *            The left input <code>TupleSource</code>.
      * @param rightInput
-     *            The right input <code>TupleSource</code>.
+     *            The right input <code>ObjectSource</code>.
+     * @param accumulate
+     *            The accumulate conditional element
      */
     AccumulateNode(final int id,
                    final TupleSource leftInput,

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,363 @@
+/*
+ * 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.
+ */
+
+package org.drools.reteoo;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.common.BetaNodeBinder;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.rule.Collect;
+import org.drools.spi.FieldConstraint;
+import org.drools.spi.PropagationContext;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListObjectWrapper;
+
+/**
+ * @author etirelli
+ *
+ */
+public class CollectNode extends BetaNode
+    implements
+    TupleSink,
+    ObjectSink {
+
+    private static final long serialVersionUID = -8321568626178187047L;
+    
+    private final Collect           collect;
+    private final FieldConstraint[] resultConstraints;
+    private final BetaNodeBinder    resultsBinder;
+
+    /**
+     * Constructor.
+     * 
+     * @param id
+     *            The id for the node
+     * @param leftInput
+     *            The left input <code>TupleSource</code>.
+     * @param rightInput
+     *            The right input <code>ObjectSource</code>.
+     * @param collect
+     *            The collect conditional element
+     */
+    CollectNode(final int id,
+                final TupleSource leftInput,
+                final ObjectSource rightInput,
+                final Collect collect) {
+        this( id,
+              leftInput,
+              rightInput,
+              new FieldConstraint[0],
+              new BetaNodeBinder(),
+              new BetaNodeBinder(),
+              collect );
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param id
+     *            The id for the node
+     * @param leftInput
+     *            The left input <code>TupleSource</code>.
+     * @param rightInput
+     *            The right input <code>ObjectSource</code>.
+     * @param resultConstraints
+     *            The alpha constraints to be applied to the resulting collection
+     * @param sourceBinder
+     *            The beta binder to be applied to the source facts
+     * @param resultsBinder
+     *            The beta binder to be applied to the resulting collection
+     * @param collect
+     *            The collect conditional element
+     */
+    public CollectNode(final int id,
+                       final TupleSource leftInput,
+                       final ObjectSource rightInput,
+                       final FieldConstraint[] resultConstraints,
+                       final BetaNodeBinder sourceBinder,
+                       final BetaNodeBinder resultsBinder,
+                       final Collect collect) {
+        super( id,
+               leftInput,
+               rightInput,
+               sourceBinder );
+        this.resultsBinder = resultsBinder;
+        this.resultConstraints = resultConstraints;
+        this.collect = collect;
+    }
+
+    /**
+     * @inheritDoc
+     * 
+     *  When a new tuple is asserted into a CollectNode, do this:
+     *  
+     *  1. Select all matching objects from right memory
+     *  2. Add them to the resulting collection object
+     *  3. Apply resultConstraints and resultsBinder to the resulting collection
+     *  4. In case all of them evaluates to true do the following:
+     *  4.1. Create a new InternalFactHandle for the resulting collection and add it to the tuple
+     *  4.2. Propagate the tuple
+     *  
+     */
+    public void assertTuple(ReteTuple leftTuple,
+                            PropagationContext context,
+                            ReteooWorkingMemory workingMemory) {
+
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
+        memory.add( workingMemory,
+                    leftTuple );
+
+        //final BetaNodeBinder binder = getJoinNodeBinder();
+
+        Collection result = this.collect.instantiateResultObject();
+        for ( final Iterator it = memory.rightObjectIterator( workingMemory,
+                                                              leftTuple ); it.hasNext(); ) {
+            final ObjectMatches objectMatches = (ObjectMatches) it.next();
+            final DefaultFactHandle handle = objectMatches.getFactHandle();
+
+            if ( attemptJoin( leftTuple,
+                              handle,
+                              objectMatches,
+                              this.resultsBinder,
+                              workingMemory ) != null ) {
+                result.add( handle.getObject() );
+            }
+        }
+
+        // First alpha node filters
+        boolean isAllowed = true;
+        for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
+            if ( !this.resultConstraints[i].isAllowed( result,
+                                                       leftTuple,
+                                                       workingMemory ) ) {
+                isAllowed = false;
+                break;
+            }
+        }
+        if ( isAllowed ) {
+            DefaultFactHandle handle = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( result );
+
+            if ( this.resultsBinder.isAllowed( handle,
+                                               leftTuple,
+                                               workingMemory ) ) {
+                propagateAssertTuple( leftTuple,
+                                      handle,
+                                      context,
+                                      workingMemory );
+            }
+        }
+    }
+
+    /**
+     * @inheritDoc
+     * 
+     * As the collect node will propagate the tuple,
+     * but will recalculate the collection result object every time,
+     * a modify is really a retract + assert. 
+     * 
+     */
+    public void modifyTuple(ReteTuple leftTuple,
+                            PropagationContext context,
+                            ReteooWorkingMemory workingMemory) {
+
+        this.retractTuple( leftTuple,
+                           context,
+                           workingMemory );
+        this.assertTuple( leftTuple,
+                          context,
+                          workingMemory );
+
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void retractTuple(ReteTuple leftTuple,
+                             PropagationContext context,
+                             ReteooWorkingMemory workingMemory) {
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+        memory.remove( workingMemory,
+                       leftTuple );
+
+        final Map matches = leftTuple.getTupleMatches();
+
+        if ( !matches.isEmpty() ) {
+            for ( final Iterator it = matches.values().iterator(); it.hasNext(); ) {
+                final TupleMatch tupleMatch = (TupleMatch) it.next();
+                tupleMatch.getObjectMatches().remove( tupleMatch );
+                it.remove();
+            }
+        }
+
+        // if tuple was propagated
+        if ( (leftTuple.getLinkedTuples() != null) && (leftTuple.getLinkedTuples().size() > 0) ) {
+            // Need to store the collection result object for later disposal
+            InternalFactHandle[] handles = ((ReteTuple) ((LinkedListObjectWrapper) leftTuple.getLinkedTuples().getFirst()).getObject()).getFactHandles();
+            InternalFactHandle lastHandle = handles[handles.length - 1];
+
+            propagateRetractTuple( leftTuple,
+                                   context,
+                                   workingMemory );
+
+            // Destroying the acumulate result object 
+            workingMemory.getFactHandleFactory().destroyFactHandle( lastHandle );
+        }
+    }
+
+    /**
+     * @inheritDoc
+     * 
+     *  When a new object is asserted into a CollectNode, do this:
+     *  
+     *  1. Select all matching tuples from left memory
+     *  2. For each matching tuple, call a modify tuple
+     *  
+     */
+    public void assertObject(DefaultFactHandle handle,
+                             PropagationContext context,
+                             ReteooWorkingMemory workingMemory) {
+
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+        memory.add( workingMemory,
+                    handle );
+
+        final BetaNodeBinder binder = getJoinNodeBinder();
+        for ( final Iterator it = memory.leftTupleIterator( workingMemory,
+                                                            handle ); it.hasNext(); ) {
+            final ReteTuple leftTuple = (ReteTuple) it.next();
+
+            if ( binder.isAllowed( handle,
+                                   leftTuple,
+                                   workingMemory ) ) {
+                this.modifyTuple( leftTuple,
+                                  context,
+                                  workingMemory );
+            }
+        }
+
+    }
+
+    /**
+     * @inheritDoc
+     * 
+     * If an object is modified, iterate over all matching tuples
+     * and propagate a modify tuple for them.
+     * 
+     * NOTE: a modify tuple for collect node is exactly the 
+     * same as a retract+assert tuple, since the collection object changes.
+     * So, a modify object is in fact a retract+assert object.
+     * 
+     */
+    public void modifyObject(DefaultFactHandle handle,
+                             PropagationContext context,
+                             ReteooWorkingMemory workingMemory) {
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
+        // Remove the FactHandle from memory
+        final ObjectMatches objectMatches = memory.remove( workingMemory,
+                                                           handle );
+
+        // remove references from tuple to the handle
+        for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {
+            final ReteTuple leftTuple = tupleMatch.getTuple();
+            leftTuple.removeMatch( handle );
+        }
+
+        // reassert object modifying appropriate tuples
+        this.assertObject( handle,
+                           context,
+                           workingMemory );
+    }
+
+    /**
+     *  @inheritDoc
+     *  
+     *  If an object is retract, call modify tuple for each
+     *  tuple match.
+     */
+    public void retractObject(DefaultFactHandle handle,
+                              PropagationContext context,
+                              ReteooWorkingMemory workingMemory) {
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
+        // Remove the FactHandle from memory
+        final ObjectMatches objectMatches = memory.remove( workingMemory,
+                                                           handle );
+
+        for ( TupleMatch tupleMatch = objectMatches.getFirstTupleMatch(); tupleMatch != null; tupleMatch = (TupleMatch) tupleMatch.getNext() ) {
+            final ReteTuple leftTuple = tupleMatch.getTuple();
+            leftTuple.removeMatch( handle );
+
+            this.modifyTuple( leftTuple,
+                              context,
+                              workingMemory );
+        }
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public List getPropagatedTuples(ReteooWorkingMemory workingMemory,
+                                    TupleSink sink) {
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+        final int index = this.getTupleSinks().indexOf( sink );
+        final List propagatedTuples = new ArrayList();
+
+        for ( final Iterator it = memory.getLeftTupleMemory().iterator(); it.hasNext(); ) {
+            final ReteTuple leftTuple = (ReteTuple) it.next();
+            final LinkedList linkedTuples = leftTuple.getLinkedTuples();
+
+            LinkedListObjectWrapper wrapper = (LinkedListObjectWrapper) linkedTuples.getFirst();
+            for ( int i = 0; i < index; i++ ) {
+                wrapper = (LinkedListObjectWrapper) wrapper.getNext();
+            }
+            propagatedTuples.add( wrapper.getObject() );
+        }
+        return propagatedTuples;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void updateNewNode(ReteooWorkingMemory workingMemory,
+                              PropagationContext context) {
+        this.attachingNewNode = true;
+
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
+
+        for ( final Iterator it = memory.getLeftTupleMemory().iterator(); it.hasNext(); ) {
+            final ReteTuple leftTuple = (ReteTuple) it.next();
+            final ReteTuple child = new ReteTuple( leftTuple );
+            leftTuple.addLinkedTuple( child );
+            ((TupleSink) getTupleSinks().get( getTupleSinks().size() - 1 )).assertTuple( child,
+                                                                                         context,
+                                                                                         workingMemory );
+        }
+        this.attachingNewNode = false;
+    }
+
+    public String toString() {
+        return "[ " + this.getClass().getName() + "(" + this.id + ") ]";
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooBuilder.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -38,6 +38,7 @@
 import org.drools.common.InstanceNotEqualsConstraint;
 import org.drools.rule.Accumulate;
 import org.drools.rule.And;
+import org.drools.rule.Collect;
 import org.drools.rule.Column;
 import org.drools.rule.Declaration;
 import org.drools.rule.EvalCondition;
@@ -49,7 +50,6 @@
 import org.drools.rule.Not;
 import org.drools.rule.Query;
 import org.drools.rule.Rule;
-import org.drools.spi.Evaluator;
 import org.drools.spi.FieldConstraint;
 import org.drools.spi.FieldValue;
 import org.drools.spi.ObjectTypeResolver;
@@ -322,6 +322,10 @@
                 attachAccumulate( this.tupleSource,
                                   and,
                                   (Accumulate) object );
+            } else if ( object.getClass() == Collect.class ) {
+                attachCollect( this.tupleSource,
+                               and,
+                               (Collect) object );
             } else if ( this.objectSource != null ) {
                 this.tupleSource = attachNode( new JoinNode( this.id++,
                                                              this.tupleSource,
@@ -643,9 +647,9 @@
         }
 
         final Column sourceColumn = accumulate.getSourceColumn();
-        final BetaNodeBinder sourceBinder = attachColumn(sourceColumn,
-                                                   parent,
-                                                   true);
+        final BetaNodeBinder sourceBinder = attachColumn( sourceColumn,
+                                                          parent,
+                                                          true );
 
         Column column = accumulate.getResultColumn();
         // Adjusting offset in case a previous Initial-Fact was added to the network
@@ -697,9 +701,85 @@
                                                            (FieldConstraint[]) alphaNodeConstraints.toArray( new FieldConstraint[alphaNodeConstraints.size()] ),
                                                            sourceBinder,
                                                            resultsBinder,
-                                                           accumulate) );
+                                                           accumulate ) );
     }
 
+    private void attachCollect(final TupleSource tupleSource,
+                               final And parent,
+                               final Collect collect) {
+        // If a tupleSource does not exist then we need to adapt an
+        // InitialFact into a a TupleSource using LeftInputAdapterNode
+        if ( this.tupleSource == null ) {
+            // adjusting offset as all tuples will now contain initial-fact at index 0
+            this.currentOffsetAdjustment = 1;
+
+            final ObjectSource auxObjectSource = attachNode( new ObjectTypeNode( this.id++,
+                                                                                 this.sinklistFactory.newObjectSinkList( ObjectTypeNode.class ),
+                                                                                 new ClassObjectType( InitialFact.class ),
+                                                                                 this.rete ) );
+
+            this.tupleSource = attachNode( new LeftInputAdapterNode( this.id++,
+                                                                     auxObjectSource ) );
+        }
+
+        final Column sourceColumn = collect.getSourceColumn();
+        final BetaNodeBinder sourceBinder = attachColumn( sourceColumn,
+                                                          parent,
+                                                          true );
+
+        Column column = collect.getResultColumn();
+        // Adjusting offset in case a previous Initial-Fact was added to the network
+        column.adjustOffset( this.currentOffsetAdjustment );
+
+        final List constraints = column.getConstraints();
+
+        // Check if the Column is bound
+        if ( column.getDeclaration() != null ) {
+            final Declaration declaration = column.getDeclaration();
+            // Add the declaration the map of previously bound declarations
+            this.declarations.put( declaration.getIdentifier(),
+                                   declaration );
+        }
+
+        final List predicateConstraints = new ArrayList();
+        final List alphaNodeConstraints = new ArrayList();
+
+        for ( final Iterator it = constraints.iterator(); it.hasNext(); ) {
+            final Object object = it.next();
+            // Check if its a declaration
+            if ( object instanceof Declaration ) {
+                final Declaration declaration = (Declaration) object;
+                // Add the declaration the map of previously bound declarations
+                this.declarations.put( declaration.getIdentifier(),
+                                       declaration );
+                continue;
+            }
+
+            final FieldConstraint fieldConstraint = (FieldConstraint) object;
+            if ( fieldConstraint instanceof LiteralConstraint ) {
+                alphaNodeConstraints.add( fieldConstraint );
+            } else {
+                checkUnboundDeclarations( fieldConstraint.getRequiredDeclarations() );
+                predicateConstraints.add( fieldConstraint );
+            }
+        }
+
+        BetaNodeBinder resultsBinder = null;
+        if ( !predicateConstraints.isEmpty() ) {
+            resultsBinder = new BetaNodeBinder( (FieldConstraint[]) predicateConstraints.toArray( new FieldConstraint[predicateConstraints.size()] ) );
+        } else {
+            resultsBinder = new BetaNodeBinder();
+        }
+
+        this.tupleSource = attachNode( new CollectNode( id++,
+                                                        this.tupleSource,
+                                                        this.objectSource,
+                                                        (FieldConstraint[]) alphaNodeConstraints.toArray( new FieldConstraint[alphaNodeConstraints.size()] ),
+                                                        sourceBinder,
+                                                        resultsBinder,
+                                                        collect ) );
+    }
+
     private ObjectSource attachNode(final ObjectSource candidate) {
         ObjectSource node = (ObjectSource) this.attachedNodes.get( candidate );
 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ */
+
+package org.drools.rule;
+
+import java.util.Collection;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
+
+/**
+ * @author etirelli
+ *
+ */
+public class Collect extends ConditionalElement {
+
+    private static final long serialVersionUID = 6064290134136990287L;
+
+    private Column            sourceColumn;
+    private Column            resultColumn;
+
+    public Collect(final Column sourceColumn,
+                   final Column resultColumn) {
+
+        this.sourceColumn = sourceColumn;
+        this.resultColumn = resultColumn;
+    }
+
+    public Object clone() {
+        return new Collect( this.sourceColumn,
+                            this.resultColumn );
+    }
+
+    public Column getResultColumn() {
+        return resultColumn;
+    }
+
+    public Column getSourceColumn() {
+        return sourceColumn;
+    }
+
+    public Collection instantiateResultObject() throws RuntimeDroolsException {
+        try {
+            // Collect can only be used with a Collection implementation, so
+            // FactTemplateObject type is not allowed
+            return (Collection) ((ClassObjectType)resultColumn.getObjectType()).getClassType().newInstance();
+        } catch (ClassCastException cce) {
+            throw new RuntimeDroolsException("Collect CE requires a Collection implementation as return type", cce);
+        } catch ( InstantiationException e ) {
+            throw new RuntimeDroolsException("Collect CE requires a non-argument constructor for the return type", e);
+        } catch ( IllegalAccessException e ) {
+            throw new RuntimeDroolsException("Collect CE requires an accessible constructor for the return type", e);
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -300,6 +300,8 @@
             addDeclarations( ((From) ce).getColumn() );
         } else if ( ce.getClass() == Accumulate.class ) {
             addDeclarations( ((Accumulate) ce).getResultColumn() );
+        } else if ( ce.getClass() == Collect.class ) {
+            addDeclarations( ((Collect) ce).getResultColumn() );
         }
         this.lhsRoot.addChild( ce );
     }

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java	2006-09-12 10:56:29 UTC (rev 6166)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java	2006-09-12 12:08:19 UTC (rev 6167)
@@ -0,0 +1,501 @@
+/*
+ * 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.
+ */
+
+package org.drools.reteoo;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.drools.DroolsTestCase;
+import org.drools.RuleBaseFactory;
+import org.drools.base.ClassObjectType;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.PropagationContextImpl;
+import org.drools.rule.Collect;
+import org.drools.rule.Column;
+import org.drools.rule.Rule;
+import org.drools.spi.MockConstraint;
+import org.drools.spi.ObjectType;
+import org.drools.spi.PropagationContext;
+
+/**
+ * @author etirelli
+ *
+ */
+public class CollectNodeTest extends DroolsTestCase {
+    Rule                rule;
+    PropagationContext  context;
+    ReteooWorkingMemory workingMemory;
+    MockObjectSource    objectSource;
+    MockTupleSource     tupleSource;
+    MockTupleSink       sink;
+    BetaNode            node;
+    BetaMemory          memory;
+    MockConstraint      constraint = new MockConstraint();
+    Collect             collect;
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.rule = new Rule( "test-rule" );
+        this.context = new PropagationContextImpl( 0,
+                                                   PropagationContext.ASSERTION,
+                                                   null,
+                                                   null );
+        this.workingMemory = new ReteooWorkingMemory( 1,
+                                                      (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+        this.tupleSource = new MockTupleSource( 4 );
+        this.objectSource = new MockObjectSource( 4 );
+        this.sink = new MockTupleSink();
+
+        ObjectType srcObjType = new ClassObjectType( String.class );
+        Column sourceColumn = new Column( 0,
+                                          srcObjType );
+        ObjectType resultObjType = new ClassObjectType( LinkedList.class );
+        Column resultColumn = new Column( 1,
+                                          resultObjType );
+        this.collect = new Collect( sourceColumn,
+                                    resultColumn );
+
+        this.node = new CollectNode( 15,
+                                     this.tupleSource,
+                                     this.objectSource,
+                                     this.collect );
+
+        this.node.addTupleSink( this.sink );
+
+        this.memory = (BetaMemory) this.workingMemory.getNodeMemory( this.node );
+
+        // check memories are empty
+        assertEquals( 0,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 0,
+                      this.memory.getRightObjectMemory().size() );
+    }
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testUpdateNewNode() {
+        this.node.updateNewNode( workingMemory,
+                                 context );
+        Assert.assertEquals( "No tuple should be propagated",
+                             0,
+                             this.sink.getAsserted().size() );
+
+        this.node.assertTuple( new ReteTuple( (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" ) ),
+                               context,
+                               workingMemory );
+        this.node.assertTuple( new ReteTuple( (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" ) ),
+                               context,
+                               workingMemory );
+
+        Assert.assertEquals( "Two tuples should have been propagated",
+                             2,
+                             this.sink.getAsserted().size() );
+
+        final MockTupleSink otherSink = new MockTupleSink();
+
+        this.node.addTupleSink( otherSink );
+        this.node.updateNewNode( workingMemory,
+                                 context );
+
+        Assert.assertEquals( "Two tuples should have been propagated",
+                             2,
+                             otherSink.getAsserted().size() );
+    }
+
+    public void testGetPropagatedTuples() {
+
+        this.node.assertTuple( new ReteTuple( (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" ) ),
+                               context,
+                               workingMemory );
+        this.node.assertTuple( new ReteTuple( (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" ) ),
+                               context,
+                               workingMemory );
+
+        Assert.assertEquals( "Two tuples should have been propagated",
+                             2,
+                             this.sink.getAsserted().size() );
+
+        final ReteTuple t1 = (ReteTuple) ((Object[]) this.sink.getAsserted().get( 0 ))[0];
+        final ReteTuple t2 = (ReteTuple) ((Object[]) this.sink.getAsserted().get( 1 ))[0];
+
+        List propagated = this.node.getPropagatedTuples( workingMemory,
+                                                         sink );
+        Assert.assertEquals( "Wrong Tuple propagated",
+                             t1,
+                             propagated.get( 0 ) );
+        Assert.assertEquals( "Wrong Tuple propagated",
+                             t2,
+                             propagated.get( 1 ) );
+
+    }
+
+    public void testAssertTuple() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        // check memories 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 0,
+                      this.memory.getRightObjectMemory().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).isEmpty() );
+
+        // assert tuple, should add left memory 
+        final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+
+        final ReteTuple tuple1 = new ReteTuple( f1 );
+        this.node.assertTuple( tuple1,
+                               this.context,
+                               this.workingMemory );
+        assertEquals( 2,
+                      this.memory.getLeftTupleMemory().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).isEmpty() );
+
+        final ReteTuple tuple = (ReteTuple) this.memory.getLeftTupleMemory().iterator( this.workingMemory,
+                                                                                       f0 ).next();
+        assertEquals( tuple0,
+                      tuple );
+        assertEquals( tuple1,
+                      tuple.getNext() );
+
+        Assert.assertEquals( "Two tuples should have been propagated",
+                             2,
+                             this.sink.getAsserted().size() );
+    }
+
+    public void testAssertTupleWithObjects() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        this.node.assertObject( f0,
+                                context,
+                                workingMemory );
+        this.node.assertObject( f1,
+                                context,
+                                workingMemory );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        // check memories 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 2,
+                      this.memory.getRightObjectMemory().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).size() );
+
+        // assert tuple, should add left memory 
+        final ReteTuple tuple1 = new ReteTuple( f1 );
+        this.node.assertTuple( tuple1,
+                               this.context,
+                               this.workingMemory );
+        assertEquals( 2,
+                      this.memory.getLeftTupleMemory().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).size() );
+
+        final ReteTuple tuple = (ReteTuple) this.memory.getLeftTupleMemory().iterator( this.workingMemory,
+                                                                                       f0 ).next();
+        assertEquals( tuple0,
+                      tuple );
+        assertEquals( tuple1,
+                      tuple.getNext() );
+
+        Assert.assertEquals( "Two tuples should have been propagated",
+                             2,
+                             this.sink.getAsserted().size() );
+    }
+
+    public void testModifyTuple() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        // check memories 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 0,
+                      this.memory.getRightObjectMemory().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).isEmpty() );
+
+        this.node.modifyTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 1,
+                      this.sink.getRetracted().size() );
+        assertEquals( 2,
+                      this.sink.getAsserted().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).isEmpty() );
+    }
+
+    public void testRetractTuple() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        // check memories 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 0,
+                      this.memory.getRightObjectMemory().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).isEmpty() );
+
+        this.node.retractTuple( tuple0,
+                                this.context,
+                                this.workingMemory );
+        assertEquals( 0,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 1,
+                      this.sink.getRetracted().size() );
+        assertEquals( 1,
+                      this.sink.getAsserted().size() );
+    }
+
+    public void testAssertObject() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+
+        // check memory 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 1,
+                      this.sink.getAsserted().size() );
+        Assert.assertTrue( "An empty collection should be propagated",
+                           ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).isEmpty() );
+
+        this.node.assertObject( f0,
+                                context,
+                                workingMemory );
+        assertEquals( 1,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 2,
+                      this.sink.getAsserted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             1,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).size() );
+
+        this.node.assertObject( f1,
+                                context,
+                                workingMemory );
+
+        assertEquals( 2,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 3,
+                      this.sink.getAsserted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 2 ))[0]).get( 1 )).getObject()).size() );
+
+    }
+
+    public void testModifyObject() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        this.node.assertObject( f0,
+                                context,
+                                workingMemory );
+        this.node.assertObject( f1,
+                                context,
+                                workingMemory );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+        // check memories 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 2,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 1,
+                      this.sink.getAsserted().size() );
+        assertEquals( 0,
+                      this.sink.getRetracted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).size() );
+
+        // assert tuple, should add left memory 
+        this.node.modifyObject( f0,
+                                this.context,
+                                this.workingMemory );
+        assertEquals( 2,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 2,
+                      this.sink.getAsserted().size() );
+        assertEquals( 1,
+                      this.sink.getRetracted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).size() );
+
+        final ReteTuple tuple = (ReteTuple) this.memory.getLeftTupleMemory().iterator( this.workingMemory,
+                                                                                       f0 ).next();
+        assertEquals( tuple0,
+                      tuple );
+
+    }
+
+    public void testRetractObject() {
+        final DefaultFactHandle f0 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+
+        final ReteTuple tuple0 = new ReteTuple( f0 );
+
+        this.node.assertObject( f0,
+                                context,
+                                workingMemory );
+        this.node.assertObject( f1,
+                                context,
+                                workingMemory );
+        assertEquals( 2,
+                      this.memory.getRightObjectMemory().size() );
+
+        // assert tuple, should add one to left memory
+        this.node.assertTuple( tuple0,
+                               this.context,
+                               this.workingMemory );
+
+        // check memory 
+        assertEquals( 1,
+                      this.memory.getLeftTupleMemory().size() );
+        assertEquals( 0,
+                      this.sink.getRetracted().size() );
+        assertEquals( 1,
+                      this.sink.getAsserted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             2,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).size() );
+
+        this.node.retractObject( f1,
+                                 context,
+                                 workingMemory );
+        assertEquals( 1,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 1,
+                      this.sink.getRetracted().size() );
+        assertEquals( 2,
+                      this.sink.getAsserted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             1,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 1 ))[0]).get( 1 )).getObject()).size() );
+
+        this.node.retractObject( f0,
+                                 context,
+                                 workingMemory );
+        assertEquals( 0,
+                      this.memory.getRightObjectMemory().size() );
+        assertEquals( 2,
+                      this.sink.getRetracted().size() );
+        assertEquals( 3,
+                      this.sink.getAsserted().size() );
+        Assert.assertEquals( "Wrong number of elements in matching objects list ",
+                             0,
+                             ((Collection) ((DefaultFactHandle)((ReteTuple) ((Object[])this.sink.getAsserted().get( 2 ))[0]).get( 1 )).getObject()).size() );
+
+    }
+
+    public void testAttach() throws Exception {
+        assertEquals( 15,
+                      this.node.getId() );
+
+        assertLength( 0,
+                      this.objectSource.getObjectSinksAsList() );
+
+        assertLength( 0,
+                      this.tupleSource.getTupleSinks() );
+
+        this.node.attach();
+
+        assertLength( 1,
+                      this.objectSource.getObjectSinksAsList() );
+
+        assertLength( 1,
+                      this.tupleSource.getTupleSinks() );
+
+        assertSame( this.node,
+                    this.objectSource.getObjectSinks().getLastObjectSink() );
+
+        assertSame( this.node,
+                    this.tupleSource.getTupleSinks().get( 0 ) );
+    }
+
+    public void testMemory() {
+        final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
+                                                                           (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
+
+        final MockObjectSource objectSource = new MockObjectSource( 1 );
+        final MockTupleSource tupleSource = new MockTupleSource( 1 );
+
+        final CollectNode collectNode = new CollectNode( 2,
+                                                         tupleSource,
+                                                         objectSource,
+                                                         this.collect );
+
+        final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( collectNode );
+
+        assertNotNull( memory );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list