[jboss-svn-commits] JBL Code SVN: r32805 - in labs/jbossrules/branches/DRLv6: lib and 15 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 10 18:38:42 EDT 2010
Author: dsotty
Date: 2010-05-10 18:38:41 -0400 (Mon, 10 May 2010)
New Revision: 32805
Added:
labs/jbossrules/branches/DRLv6/bin/
labs/jbossrules/branches/DRLv6/lib/
labs/jbossrules/branches/DRLv6/lib/antlrworks-1.3.1.jar
labs/jbossrules/branches/DRLv6/out/
labs/jbossrules/branches/DRLv6/out/DRLv6Log.txt
labs/jbossrules/branches/DRLv6/src/
labs/jbossrules/branches/DRLv6/src/main/
labs/jbossrules/branches/DRLv6/src/main/java/
labs/jbossrules/branches/DRLv6/src/main/java/org/
labs/jbossrules/branches/DRLv6/src/main/java/org/drools/
labs/jbossrules/branches/DRLv6/src/main/java/org/drools/Visitor.java
labs/jbossrules/branches/DRLv6/src/main/java/org/drools/lang/
labs/jbossrules/branches/DRLv6/src/main/java/org/drools/util/
labs/jbossrules/branches/DRLv6/src/main/java/org/drools/util/ReflectiveVisitor.java
labs/jbossrules/branches/DRLv6/src/main/resources/
labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Lexer.g
labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Parser.g
labs/jbossrules/branches/DRLv6/src/test/
labs/jbossrules/branches/DRLv6/src/test/java/
labs/jbossrules/branches/DRLv6/src/test/java/org/
labs/jbossrules/branches/DRLv6/src/test/java/org/drools/
labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/
labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/Rule_Test.java
labs/jbossrules/branches/DRLv6/src/test/java/org/drools/util/
labs/jbossrules/branches/DRLv6/src/test/java/org/drools/util/ParsingResult.java
labs/jbossrules/branches/DRLv6/src/test/resources/
labs/jbossrules/branches/DRLv6/src/test/resources/langTestAll.drl
labs/jbossrules/branches/DRLv6/src/test/resources/newRuleTest.drl
Modified:
labs/jbossrules/branches/DRLv6/
Log:
Initial
Property changes on: labs/jbossrules/branches/DRLv6
___________________________________________________________________
Name: svn:ignore
+ .settings
.classpath
.project
Added: labs/jbossrules/branches/DRLv6/lib/antlrworks-1.3.1.jar
===================================================================
(Binary files differ)
Property changes on: labs/jbossrules/branches/DRLv6/lib/antlrworks-1.3.1.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossrules/branches/DRLv6/out/DRLv6Log.txt
===================================================================
--- labs/jbossrules/branches/DRLv6/out/DRLv6Log.txt (rev 0)
+++ labs/jbossrules/branches/DRLv6/out/DRLv6Log.txt 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,1504 @@
+**************************************
+compilation_unit
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 8
+>> SOURCE :
+package org.pack.subpack;
+import org.klass;
+
+declare Klass
+end
+
+rule "ruel"
+when
+then
+end
+
+>> OUTPUT :
+
+ (VT_COMPILATION_UNIT
+ (package
+ (VT_PACKAGE_ID org pack subpack
+ )
+ )
+ (import
+ (VT_IMPORT_ID org klass
+ )
+ )
+ (declare Klass
+ )
+ (rule "ruel"
+ (when VT_AND_IMPLICIT
+ )
+ )
+ )
+**************************************
+package_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+package this.isa.pack ;
+>> OUTPUT :
+
+ (package
+ (VT_PACKAGE_ID this isa pack
+ )
+ )
+**************************************
+package_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+package semi.colon.is.optional
+>> OUTPUT :
+
+ (package
+ (VT_PACKAGE_ID semi colon is optional
+ )
+ )
+**************************************
+package_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+package simplePack
+>> OUTPUT :
+
+ (package
+ (VT_PACKAGE_ID simplePack
+ )
+ )
+**************************************
+global
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+global int N
+>> OUTPUT :
+
+ (global
+ (VT_DATA_TYPE 0 int
+ ) N
+ )
+**************************************
+global
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+global org.it.pack.String strix ;
+>> OUTPUT :
+
+ (global
+ (VT_DATA_TYPE 0 org it pack String
+ ) strix
+ )
+**************************************
+data_type
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+String
+>> OUTPUT :
+
+ (VT_DATA_TYPE 0 String
+ )
+**************************************
+data_type
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+int
+>> OUTPUT :
+
+ (VT_DATA_TYPE 0 int
+ )
+**************************************
+data_type
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+float[]
+>> OUTPUT :
+
+ (VT_DATA_TYPE 1 float
+ )
+**************************************
+data_type
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+org.pack.data.Claxx[]
+>> OUTPUT :
+
+ (VT_DATA_TYPE 1 org pack data Claxx
+ )
+**************************************
+data_type
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+int[][][]
+>> OUTPUT :
+
+ (VT_DATA_TYPE 3 int
+ )
+**************************************
+import_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+import jav.lang.String
+>> OUTPUT :
+
+ (import
+ (VT_IMPORT_ID jav lang String
+ )
+ )
+**************************************
+import_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+import Test ;
+>> OUTPUT :
+
+ (import
+ (VT_IMPORT_ID Test
+ )
+ )
+**************************************
+import_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+import jav.pack.*
+>> OUTPUT :
+
+ (import
+ (VT_IMPORT_ID jav pack .*
+ )
+ )
+**************************************
+function_import_statement
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+import function org.pack.square
+>> OUTPUT :
+
+ (import function
+ (VT_IMPORT_ID org pack square
+ )
+ )
+**************************************
+function
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 2
+>> SOURCE :
+function float square( float x ) { ... x*x ... }
+>> OUTPUT :
+
+ (function
+ (VT_DATA_TYPE 0 float
+ ) square
+ (VT_PARAM_LIST
+ (VT_PARAM
+ (VT_DATA_TYPE 0 float
+ ) x
+ )
+ ) { ... x*x ... }
+ )
+**************************************
+function
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+function process( int x, org.String zz ) { ... ... }
+>> OUTPUT :
+
+ (function process
+ (VT_PARAM_LIST
+ (VT_PARAM
+ (VT_DATA_TYPE 0 int
+ ) x
+ )
+ (VT_PARAM
+ (VT_DATA_TYPE 0 org String
+ ) zz
+ )
+ ) { ... ... }
+ )
+**************************************
+parameters
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+( int a, org.klass.AnType obj, String[][] argz )
+>> OUTPUT :
+
+ (VT_PARAM_LIST
+ (VT_PARAM
+ (VT_DATA_TYPE 0 int
+ ) a
+ )
+ (VT_PARAM
+ (VT_DATA_TYPE 0 org klass AnType
+ ) obj
+ )
+ (VT_PARAM
+ (VT_DATA_TYPE 2 String
+ ) argz
+ )
+ )
+**************************************
+type_declaration
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 2
+>> SOURCE :
+declare Student
+ @role(entity)
+ @namespace(myNS="http:\\www.stix.com\domain\subd#")
+ @subclass(Person)
+ age : int
+ name : String
+ end
+
+>> OUTPUT :
+
+ (declare Student
+ (VT_ATTRIBUTES
+ (role entity
+ )
+ (namespace myNS "http:\\www.stix.com\domain\subd#"
+ )
+ (subclass Person
+ )
+ )
+ (VT_FIELD age
+ (VT_DATA_TYPE 0 int
+ )
+ )
+ (VT_FIELD name
+ (VT_DATA_TYPE 0 String
+ )
+ )
+ )
+**************************************
+type_declaration
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+declare HasFriend
+ at role(property)
+ at namespace(myNS="http:\\www.somens.com\arg\test#")
+ at subproperty(Knows)
+ at disjoint(HasEnemy)
+ at symmetric
+subject : Person
+object : Person
+end
+
+>> OUTPUT :
+
+ (declare HasFriend
+ (VT_ATTRIBUTES
+ (role property
+ )
+ (namespace myNS "http:\\www.somens.com\arg\test#"
+ )
+ (subproperty Knows
+ )
+ (disjoint HasEnemy
+ ) symmetric
+ )
+ (VT_FIELD subject
+ (VT_DATA_TYPE 0 Person
+ )
+ )
+ (VT_FIELD object
+ (VT_DATA_TYPE 0 Person
+ )
+ )
+ )
+**************************************
+type_declaration
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+declare HasSpouse
+ at role(property)
+ at namespace(myNS="http:\\www.somens.com\arg\test#")
+ at symmetric
+ at transitive
+ at inverse(HasSpouse)
+subject = ("john") : Person @[key]
+object : Person @[key]
+end
+
+>> OUTPUT :
+
+ (declare HasSpouse
+ (VT_ATTRIBUTES
+ (role property
+ )
+ (namespace myNS "http:\\www.somens.com\arg\test#"
+ ) symmetric transitive
+ (inverse HasSpouse
+ )
+ )
+ (VT_FIELD
+ (VT_ATTRIBUTES key
+ ) subject
+ (VT_DATA_TYPE 0 Person
+ )
+ (=
+ ("john"
+ )
+ )
+ )
+ (VT_FIELD
+ (VT_ATTRIBUTES key
+ ) object
+ (VT_DATA_TYPE 0 Person
+ )
+ )
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at role(event)
+>> OUTPUT :
+
+ (role event
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at role(type)
+>> OUTPUT :
+
+ (role type
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+ at role(entity)
+>> OUTPUT :
+
+ (role entity
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at role(property)
+>> OUTPUT :
+
+ (role property
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at namespace( alias = "http:\\www.org.dom\arg# ")
+>> OUTPUT :
+
+ (namespace alias "http:\\www.org.dom\arg# "
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at subclass(Type)
+>> OUTPUT :
+
+ (subclass Type
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at subproperty(SomeProperty)
+>> OUTPUT :
+
+ (subproperty SomeProperty
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at disjoint(AnotherType)
+>> OUTPUT :
+
+ (disjoint AnotherType
+ )
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at symmetric
+>> OUTPUT :
+symmetric
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+ at transitive
+>> OUTPUT :
+transitive
+**************************************
+type_declare_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ at inverse(ReverseProperty)
+>> OUTPUT :
+
+ (inverse ReverseProperty
+ )
+**************************************
+decl_field
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+field = (...) : datatype[][] @[key]
+>> OUTPUT :
+
+ (VT_FIELD
+ (VT_ATTRIBUTES key
+ ) field
+ (VT_DATA_TYPE 2 datatype
+ )
+ (=
+ (...
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "ruleName" extends "anotherRule"
+ salience 100
+ no-loop
+ calendar "s1" , "s2"
+when
+then
+end
+
+>> OUTPUT :
+
+ (rule "ruleName"
+ (extends "anotherRule"
+ )
+ (VT_ATTRIBUTES
+ (salience 100
+ ) no-loop
+ (calendar [ "s1", "s2" ]
+ )
+ )
+ (when VT_AND_IMPLICIT
+ )
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+salience 100
+>> OUTPUT :
+
+ (salience 100
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+no-loop true
+>> OUTPUT :
+
+ (no-loop true
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+agenda-group "test-group"
+>> OUTPUT :
+
+ (agenda-group "test-group"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+activation-group "act-group"
+>> OUTPUT :
+
+ (activation-group "act-group"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+auto-focus false
+>> OUTPUT :
+
+ (auto-focus false
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+effective "2010-04-12"
+>> OUTPUT :
+
+ (effective "2010-04-12"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+expires "2010-04-12"
+>> OUTPUT :
+
+ (expires "2010-04-12"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+enabled true
+>> OUTPUT :
+
+ (enabled true
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+ruleflow-group "act-group"
+>> OUTPUT :
+
+ (ruleflow-group "act-group"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+agenda-group "act-group"
+>> OUTPUT :
+
+ (agenda-group "act-group"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+duration 100
+>> OUTPUT :
+
+ (duration 100
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+timer 100
+>> OUTPUT :
+
+ (timer 100
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+dialect "java"
+>> OUTPUT :
+
+ (dialect "java"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+lock-on-active true
+>> OUTPUT :
+
+ (lock-on-active true
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+defeats "anotherRule"
+>> OUTPUT :
+
+ (defeats "anotherRule"
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+deductive
+>> OUTPUT :
+deductive
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+abductive
+>> OUTPUT :
+abductive
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+equivalence
+>> OUTPUT :
+equivalence
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+deduction @[crisp]
+>> OUTPUT :
+
+ (deduction
+ (VT_ATTRIBUTES crisp
+ )
+ )
+**************************************
+rule_attribute
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+implication @[crisp]
+>> OUTPUT :
+
+ (implication
+ (VT_ATTRIBUTES crisp
+ )
+ )
+**************************************
+operator_attributes
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 3
+>> SOURCE :
+@[
+kind="lukasiewicz",
+id="myID",
+params="addit,args,2,more",
+degree="[0.3,0.2]",
+crisp,
+default,
+defeat,
+merge="mStrat",
+filter="fStrat",
+missing="sStrat"
+]
+>> OUTPUT :
+
+ (VT_ATTRIBUTES
+ (kind = "lukasiewicz"
+ )
+ (id = "myID"
+ )
+ (params = "addit,args,2,more"
+ )
+ (degree = "[0.3,0.2]"
+ ) crisp default defeat
+ (merge = "mStrat"
+ )
+ (filter = "fStrat"
+ )
+ (missing = "sStrat"
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 2
+>> SOURCE :
+rule test when Bus() Car() Taxi()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Bus
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Car
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Taxi
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule test when $p : Person() implies @[kind="anImpl"] Dog()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_IMPLIES
+ (VT_ATTRIBUTES
+ (kind = "anImpl"
+ )
+ )
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule test when Car() or @[kind="anOr"] Taxi() or @[kind="anotherOr"] Bus()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_OR
+ (VT_ATTRIBUTES
+ (kind = "anotherOr"
+ )
+ )
+ (VT_OR
+ (VT_ATTRIBUTES
+ (kind = "anOr"
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Car
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Taxi
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Bus
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule test when $p : Person() xor Dog()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_XOR
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule test when (Person() xor Dog()) equiv Cat()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_EQUIV
+ (VT_AND_IMPLICIT
+ (VT_XOR
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Cat
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule test when Car() and Taxi() and Bus()then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND
+ (VT_AND
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Car
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Taxi
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Bus
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule test when (P() implies Q()) implies ( (K() equiv K()) or Z() and X() )then end
+>> OUTPUT :
+
+ (rule test
+ (when
+ (VT_AND_IMPLICIT
+ (VT_IMPLIES
+ (VT_AND_IMPLICIT
+ (VT_IMPLIES
+ (VT_AND VT_ENABLED
+ (VT_PATTERN P
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Q
+ )
+ )
+ )
+ )
+ (VT_AND_IMPLICIT
+ (VT_OR
+ (VT_AND_IMPLICIT
+ (VT_EQUIV
+ (VT_AND VT_ENABLED
+ (VT_PATTERN K
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN K
+ )
+ )
+ )
+ )
+ (VT_AND
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Z
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN X
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when neg @[crisp] very @[crisp] Person() then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_NEG
+ (VT_ATTRIBUTES crisp
+ )
+ (VT_HEDGE_VERY
+ (VT_ATTRIBUTES crisp
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when $lab : Person()then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_BINDING $lab :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when (Person() implies Dog())then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND_IMPLICIT
+ (VT_IMPLIES
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when exists @[crisp] ( $p : Person() and $d : Dog() ) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_EXISTS
+ (VT_ATTRIBUTES crisp
+ )
+ (VT_AND_IMPLICIT
+ (VT_AND
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_BINDING $d :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when $p : exists Person() then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_BINDING $p :
+ (VT_EXISTS
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when not @[crisp] ( $p : Person() and $d : Dog() ) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_NEXISTS
+ (VT_ATTRIBUTES crisp
+ )
+ (VT_AND_IMPLICIT
+ (VT_AND
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_BINDING $d :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when not Person() then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_NEXISTS
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when forall @[crisp] Person() then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_FORALL
+ (VT_ATTRIBUTES crisp
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when forall ( $p : Person() Person() ) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_FORALL
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when forall ( $p : Person() (Person() Dog()) ) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_FORALL
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_AND_IMPLICIT
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when forall ( ($p : Person() $d : Dog() ) ( Person() Dog() ) ) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_FORALL
+ (VT_AND_IMPLICIT
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ (VT_BINDING $d :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ (VT_AND_IMPLICIT
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Dog
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when $p : Person() then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_BINDING $p :
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 0
+>> SOURCE :
+rule "r" when Person() @[crisp]then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND
+ (VT_ATTRIBUTES crisp
+ ) VT_ENABLED
+ (VT_PATTERN Person
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 3
+>> SOURCE :
+rule "r" when Person( "john" , 18, height > 150) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ (VT_AND
+ (VT_POSITIONAL_CONST 0 "john"
+ )
+ (VT_POSITIONAL_CONST 1 18
+ )
+ (> 150
+ (VT_EXPR height
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+rule
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+rule "r" when Person( "john" , 18, 2.0, true, null, new Dog(), {12, $x, "test" }, $var) then end
+>> OUTPUT :
+
+ (rule "r"
+ (when
+ (VT_AND_IMPLICIT
+ (VT_AND VT_ENABLED
+ (VT_PATTERN Person
+ )
+ (VT_AND
+ (VT_POSITIONAL_CONST 0 "john"
+ )
+ (VT_POSITIONAL_CONST 1 18
+ )
+ (VT_POSITIONAL_CONST 2 2.0
+ )
+ (VT_POSITIONAL_CONST 3 true
+ )
+ (VT_POSITIONAL_CONST 4 null
+ )
+ (VT_POSITIONAL_CONST 5
+ (VT_NEW_OBJ
+ (VT_TYPE Dog
+ )
+ )
+ )
+ (VT_POSITIONAL_CONST 6
+ (VT_LIST 12 $x "test"
+ )
+ )
+ (VT_POSITIONAL_VAR 7 $var
+ )
+ )
+ )
+ )
+ )
+ )
+**************************************
+literal_object
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+new Thing(13, $var, true)
+>> OUTPUT :
+
+ (VT_NEW_OBJ
+ (VT_TYPE Thing
+ )
+ (VT_ARGS 13 $var true
+ )
+ )
+**************************************
+literal_object
+**************************************
+>>>> RESULT : SUCCESS
+>> TIME to parse 1
+>> SOURCE :
+new Obj(12 - 13*($var*2 + sqrt(4)))
+>> OUTPUT :
+
+ (VT_NEW_OBJ
+ (VT_TYPE Obj
+ )
+ (VT_ARGS 12 - 13 * $var * 2 + sqrt 4
+ )
+ )
Added: labs/jbossrules/branches/DRLv6/src/main/java/org/drools/Visitor.java
===================================================================
--- labs/jbossrules/branches/DRLv6/src/main/java/org/drools/Visitor.java (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/main/java/org/drools/Visitor.java 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,21 @@
+package org.drools;
+
+/*
+ * 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.
+ */
+
+public interface Visitor {
+ void visit(Object o);
+}
\ No newline at end of file
Added: labs/jbossrules/branches/DRLv6/src/main/java/org/drools/util/ReflectiveVisitor.java
===================================================================
--- labs/jbossrules/branches/DRLv6/src/main/java/org/drools/util/ReflectiveVisitor.java (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/main/java/org/drools/util/ReflectiveVisitor.java 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,104 @@
+package org.drools.util;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.lang.reflect.Method;
+
+import org.drools.Visitor;
+
+/**
+ * Java Tip 98: Reflect on the Visitor design pattern. Implement visitors in
+ * Java, using reflection.
+ * http://www.javaworld.com/javaworld/javatips/jw-javatip98.html
+ *
+ * Michael Neale says: I really hate this code. Not really a helpful use
+ * of reflection, always annoys me.
+ *
+ * @author Jeremy Blosser
+ */
+public abstract class ReflectiveVisitor
+ implements
+ Visitor {
+ static final String newline = System.getProperty( "line.separator" );
+
+ public void visit(final Object object) {
+ Method method = null;
+ try {
+ if ( object != null ) {
+ method = getMethod( object.getClass() );
+ method.invoke( this,
+ new Object[]{object} );
+ } else {
+ method = getClass().getMethod( "visitNull",
+ (Class[]) null );
+ method.invoke( this,
+ (Object[]) null );
+ }
+ } catch ( final Exception e ) {
+ throw new RuntimeException( e.toString() + " : " + object,
+ e.getCause() );
+ }
+ }
+
+ private Method getMethod(final Class clazz) {
+ Class newClazz = clazz;
+ Method method = null;
+
+ // Try the superclasses
+ while ( method == null && newClazz != Object.class ) {
+ String methodName = newClazz.getName();
+ methodName = "visit" + methodName.substring( methodName.lastIndexOf( '.' ) + 1 );
+ try {
+ method = getClass().getMethod( methodName,
+ new Class[]{newClazz} );
+ } catch ( final NoSuchMethodException e ) {
+ newClazz = newClazz.getSuperclass();
+ }
+ }
+
+ // Try the interfaces.
+ if ( newClazz == Object.class ) {
+ final Class[] interfaces = clazz.getInterfaces();
+ for ( int i = 0; i < interfaces.length; i++ ) {
+ String methodName = interfaces[i].getName();
+ methodName = "visit" + methodName.substring( methodName.lastIndexOf( '.' ) + 1 );
+ try {
+ method = getClass().getMethod( methodName,
+ new Class[]{interfaces[i]} );
+ } catch ( final NoSuchMethodException e ) {
+ // swallow
+ }
+ }
+ }
+ if ( method == null ) {
+ try {
+ method = getClass().getMethod( "visitObject",
+ new Class[]{Object.class} );
+ } catch ( final Exception e ) {
+ // Shouldn't happen as long as all Visitors extend this class
+ // and this class continues to implement visitObject(Object).
+ throw new RuntimeException( e.toString() + " : " + clazz,
+ e.getCause() );
+ }
+ }
+ return method;
+ }
+
+ public void visitObject(final Object object) {
+ System.err.println( "no visitor implementation for : " + object.getClass() + " : " + object );
+ }
+}
Added: labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Lexer.g
===================================================================
--- labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Lexer.g (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Lexer.g 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,1344 @@
+lexer grammar DRLv6Lexer;
+
+options {
+ language = Java;
+}
+
+ at lexer::header {
+ package org.drools.lang;
+
+}
+
+WS : ( ' '
+ | '\t'
+ | '\f'
+ | EOL
+ )+
+ { $channel=HIDDEN; }
+ ;
+
+fragment
+EOL :
+ ( ( '\r\n' )=> '\r\n' // Evil DOS
+ | '\r' // Macintosh
+ | '\n' // Unix (the right way)
+ )
+ ;
+
+FLOAT
+options { k=*; }
+ : ('-')?('0'..'9')+ '.' ('0'..'9')+
+ ;
+
+INT
+options { k=*; }
+ : ('-')?('0'..'9')+
+ ;
+
+STRING
+ : ('"' ( EscapeSequence | ~('\\'|'"') )+ '"')
+ | ('\'' ( EscapeSequence | ~('\\'|'\'') )+ '\'')
+ ;
+
+fragment
+HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+EscapeSequence
+ : '\\' ('b'|'B'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\'|'.'|'o'|
+ 'x'|'a'|'e'|'c'|'d'|'D'|'s'|'S'|'w'|'W'|'p'|'A'|
+ 'G'|'Z'|'z'|'Q'|'E'|'*'|'['|']'|'('|')'|'$'|'^'|
+ '{'|'}'|'?'|'+'|'-'|'&'|'|')
+ | UnicodeEscape
+ | OctalEscape
+ ;
+
+fragment
+OctalEscape
+ : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7') ('0'..'7')
+ | '\\' ('0'..'7')
+ ;
+
+fragment
+UnicodeEscape
+ : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
+ ;
+
+
+
+
+
+
+
+A_DATE_EFFECTIVE
+ : 'effective'
+ ;
+
+A_DATE_EXPIRES
+ : 'expires'
+ ;
+
+A_ENABLED
+ : 'enabled'
+ ;
+
+A_SALIENCE
+ : 'salience'
+ ;
+
+A_NOLOOP
+ : 'no-loop'
+ ;
+
+A_AUTOFOCUS
+ : 'auto-focus'
+ ;
+
+A_ACTGROUP
+ : 'activation-group'
+ ;
+
+A_RULEFLOWGROUP
+ : 'ruleflow-group'
+ ;
+
+A_AGENDAGROUP
+ : 'agenda-group'
+ ;
+
+A_DURATION
+ : 'duration'
+ ;
+
+A_TIMER
+ : 'timer'
+ ;
+
+A_CALENDAR
+ : 'calendar'
+ ;
+
+
+A_DIALECT
+ : 'dialect'
+ ;
+
+A_LOCKONACTIVE
+ : 'lock-on-active'
+ ;
+
+A_DEDUCTION
+ : 'deduction'
+ ;
+
+A_IMPLICATION
+ : 'implication'
+ ;
+
+A_DIRECTION
+ : 'deductive'
+ | 'abductive'
+ | 'equivalence'
+ ;
+
+OA_KIND
+ : 'kind'
+ ;
+
+OA_ID
+ : 'id'
+ ;
+
+OA_PARAMS
+ : 'params'
+ ;
+
+OA_DEGREE
+ : 'degree'
+ ;
+
+OA_CRISP
+ : 'crisp'
+ ;
+
+OA_MERGE
+ : 'merge'
+ ;
+
+OA_FILTER
+ : 'filter'
+ ;
+
+OA_MISSING
+ : 'missing'
+ ;
+
+OA_DEFEAT
+ : 'defeat'
+ ;
+
+OA_DEFAULT
+ : 'default'
+ ;
+
+
+
+
+ACCUMULATE
+ : 'acc'
+ ;
+
+ACCUMULATE_LEFT
+ : 'accL'
+ ;
+
+ACCUMULATE_RIGHT
+ : 'accR'
+ ;
+
+ACTION
+ : 'action'
+ ;
+
+ALL
+ : 'all'
+ ;
+
+AND
+ : 'and'
+ ;
+
+ATTRIBUTES
+ : 'attributes'
+ ;
+
+BOOL
+ : ('true'|'false')
+ ;
+
+COLLECT
+ : 'collect'
+ ;
+
+CONTAINS
+ : 'contains'
+ ;
+
+COUNT
+ : 'count'
+ ;
+
+DECLARE
+ : 'declare'
+ ;
+
+DEFEATS
+ : 'defeats'
+ ;
+
+DISJOINT
+ : 'disjoint'
+ ;
+
+DO
+ : 'do'
+ ;
+
+END
+ : 'end'
+ ;
+
+
+ENTITY
+ : 'entity'
+ ;
+
+ENTRYPOINT
+ : 'entry-point'
+ ;
+
+EQUIV
+ : 'equiv'
+ ;
+
+EVENT
+ : 'event'
+ ;
+
+EXISTS
+ : 'exists'
+ ;
+
+EXTEND
+ : 'extends'
+ ;
+
+FORALL
+ : 'forall'
+ ;
+
+FROM
+ : 'from'
+ ;
+
+FUNCTION
+ : 'function'
+ ;
+
+GLOBAL
+ : 'global'
+ ;
+
+IMPLIES
+ : 'implies'
+ ;
+
+IMPORT
+ : 'import'
+ ;
+
+IN
+ : 'in'
+ ;
+
+INIT
+ : 'init'
+ ;
+
+INSERT
+ : 'insert'
+ ;
+
+INSERT_LOG
+ : 'insertLogical'
+ ;
+
+INVERSE
+ : 'inverse'
+ ;
+
+JAVA
+ : 'java'
+ ;
+
+KEY
+ : 'key'
+ ;
+
+LENGTH
+ : 'length'
+ ;
+
+MAX
+ : 'max'
+ ;
+
+MIN
+ : 'min'
+ ;
+
+MODIFY
+ : 'modify'
+ ;
+
+MVEL
+ : 'mvel'
+ ;
+
+NEG
+ : 'neg'
+ ;
+
+NEW
+ : 'new'
+ ;
+
+NOT
+ : 'not'
+ ;
+
+MOL
+ : 'mol'
+ ;
+
+
+NAMESPACE
+ : 'namespace'
+ ;
+
+NULL
+ : 'null'
+ ;
+
+OR
+ : 'or'
+ ;
+
+OVER
+ : 'over'
+ ;
+
+PACKAGE
+ : 'package'
+ ;
+
+PROPERTY
+ : 'property'
+ ;
+
+QUERY
+ : 'query'
+ ;
+
+RESULT
+ : 'result'
+ ;
+
+RETRACT
+ : 'retract'
+ ;
+
+RETRACT_LOG
+ : 'retractLogical'
+ ;
+
+REVERSE
+ : 'reverse'
+ ;
+
+ROLE
+ : 'role'
+ ;
+
+RULE
+ : 'rule'
+ ;
+
+SOME
+ : 'some'
+ ;
+
+SUBCLASS
+ : 'subclass'
+ ;
+
+SUBPROPERTY
+ : 'subproperty'
+ ;
+
+SYMMETRIC
+ : 'symmetric'
+ ;
+
+TEMPLATE
+ : 'template'
+ ;
+
+THEN
+ : 'then'
+ ;
+
+TIME
+ : 'time'
+ ;
+
+TRANSITIVE
+ : 'transitive'
+ ;
+
+TYPE
+ : 'type'
+ ;
+
+UPDATE
+ : 'update'
+ ;
+
+VALUE
+ : 'value'
+ ;
+
+
+VERY
+ : 'very'
+ ;
+
+WHEN
+ : 'when'
+ ;
+
+WINDOW
+ : 'window'
+ ;
+
+XOR
+ : 'xor'
+ ;
+
+
+
+
+AT : '@'
+ ;
+
+
+ARROW
+ : '->'
+ ;
+
+COLON
+ : ':'
+ ;
+
+COMMA : ','
+ ;
+
+DOLLAR
+ : '$'
+ ;
+
+DOT : '.'
+ ;
+
+DOT_STAR
+ : '.*'
+ ;
+
+DOUBLE_AMPER
+ : '&&'
+ ;
+
+DOUBLE_ANG
+ : '<>'
+ ;
+
+DOUBLE_CAP
+ : '^^'
+ ;
+
+DOUBLE_GREATER
+ : '>>'
+ ;
+
+DOUBLE_LESS
+ : '<<'
+ ;
+
+DOUBLE_PIPE
+ : '||'
+ ;
+
+
+EQUAL
+ : '=='
+ ;
+
+EQUALS
+ : '='
+ ;
+
+GATE
+ : '#'
+ ;
+
+GREATER
+ : '>'
+ ;
+
+GREATER_EQUAL
+ : '>='
+ ;
+
+LESS
+ : '<'
+ ;
+
+LESS_EQUAL
+ : '<='
+ ;
+
+MINUS
+ : '-'
+ ;
+
+NOT_EQUAL
+ : '!='
+ ;
+
+PLUS
+ : '+'
+ ;
+
+QUESTION_MARK
+ : '?'
+ ;
+
+SEMICOLON
+ : ';'
+ ;
+
+SLASH
+ : '/'
+ ;
+
+TILDE
+ : '~'
+ ;
+
+TIMES
+ : '*'
+ ;
+
+
+
+
+LEFT_PAREN
+ : '('
+ ;
+
+RIGHT_PAREN
+ : ')'
+ ;
+
+LEFT_SQUARE
+ : '['
+ ;
+
+RIGHT_SQUARE
+ : ']'
+ ;
+
+LEFT_CURLY
+ : '{'
+ ;
+
+RIGHT_CURLY
+ : '}'
+ ;
+
+
+
+
+
+/* removed due to the use of '#'
+SH_STYLE_SINGLE_LINE_COMMENT
+ : '#' (~('\r'|'\n'))* EOL?
+ { $channel=HIDDEN; setText("//"+getText().substring(1));}
+ ;
+*/
+
+C_STYLE_SINGLE_LINE_COMMENT
+ : '//' (~('\r'|'\n'))* EOL?
+ { $channel=HIDDEN; }
+ ;
+
+MULTI_LINE_COMMENT
+ : '/*' (options{greedy=false;} : .)* '*/'
+ { $channel=HIDDEN; }
+ ;
+
+ID
+ : IdentifierStart IdentifierPart*
+ | '`' IdentifierStart IdentifierPart* '`'
+ { state.text = $text.substring(1, $text.length() - 1); }
+ ;
+
+
+MISC :
+ //'!' | '%' | '^' | '*' | '-' | '+' | '?' | '/' | '\'' | '\\' | '|' | '&'
+ '!' | '%' | '^' | '\'' | '\\' | '|' | '&'
+ ;
+
+
+VAR
+ : '$' IdentifierPart+
+ ;
+
+fragment
+IdentifierStart
+ : //'\u0024'
+ '\u0041'..'\u005a'
+ | '\u005f'
+ | '\u0061'..'\u007a'
+ | '\u00a2'..'\u00a5'
+ | '\u00aa'
+ | '\u00b5'
+ | '\u00ba'
+ | '\u00c0'..'\u00d6'
+ | '\u00d8'..'\u00f6'
+ | '\u00f8'..'\u0236'
+ | '\u0250'..'\u02c1'
+ | '\u02c6'..'\u02d1'
+ | '\u02e0'..'\u02e4'
+ | '\u02ee'
+ | '\u037a'
+ | '\u0386'
+ | '\u0388'..'\u038a'
+ | '\u038c'
+ | '\u038e'..'\u03a1'
+ | '\u03a3'..'\u03ce'
+ | '\u03d0'..'\u03f5'
+ | '\u03f7'..'\u03fb'
+ | '\u0400'..'\u0481'
+ | '\u048a'..'\u04ce'
+ | '\u04d0'..'\u04f5'
+ | '\u04f8'..'\u04f9'
+ | '\u0500'..'\u050f'
+ | '\u0531'..'\u0556'
+ | '\u0559'
+ | '\u0561'..'\u0587'
+ | '\u05d0'..'\u05ea'
+ | '\u05f0'..'\u05f2'
+ | '\u0621'..'\u063a'
+ | '\u0640'..'\u064a'
+ | '\u066e'..'\u066f'
+ | '\u0671'..'\u06d3'
+ | '\u06d5'
+ | '\u06e5'..'\u06e6'
+ | '\u06ee'..'\u06ef'
+ | '\u06fa'..'\u06fc'
+ | '\u06ff'
+ | '\u0710'
+ | '\u0712'..'\u072f'
+ | '\u074d'..'\u074f'
+ | '\u0780'..'\u07a5'
+ | '\u07b1'
+ | '\u0904'..'\u0939'
+ | '\u093d'
+ | '\u0950'
+ | '\u0958'..'\u0961'
+ | '\u0985'..'\u098c'
+ | '\u098f'..'\u0990'
+ | '\u0993'..'\u09a8'
+ | '\u09aa'..'\u09b0'
+ | '\u09b2'
+ | '\u09b6'..'\u09b9'
+ | '\u09bd'
+ | '\u09dc'..'\u09dd'
+ | '\u09df'..'\u09e1'
+ | '\u09f0'..'\u09f3'
+ | '\u0a05'..'\u0a0a'
+ | '\u0a0f'..'\u0a10'
+ | '\u0a13'..'\u0a28'
+ | '\u0a2a'..'\u0a30'
+ | '\u0a32'..'\u0a33'
+ | '\u0a35'..'\u0a36'
+ | '\u0a38'..'\u0a39'
+ | '\u0a59'..'\u0a5c'
+ | '\u0a5e'
+ | '\u0a72'..'\u0a74'
+ | '\u0a85'..'\u0a8d'
+ | '\u0a8f'..'\u0a91'
+ | '\u0a93'..'\u0aa8'
+ | '\u0aaa'..'\u0ab0'
+ | '\u0ab2'..'\u0ab3'
+ | '\u0ab5'..'\u0ab9'
+ | '\u0abd'
+ | '\u0ad0'
+ | '\u0ae0'..'\u0ae1'
+ | '\u0af1'
+ | '\u0b05'..'\u0b0c'
+ | '\u0b0f'..'\u0b10'
+ | '\u0b13'..'\u0b28'
+ | '\u0b2a'..'\u0b30'
+ | '\u0b32'..'\u0b33'
+ | '\u0b35'..'\u0b39'
+ | '\u0b3d'
+ | '\u0b5c'..'\u0b5d'
+ | '\u0b5f'..'\u0b61'
+ | '\u0b71'
+ | '\u0b83'
+ | '\u0b85'..'\u0b8a'
+ | '\u0b8e'..'\u0b90'
+ | '\u0b92'..'\u0b95'
+ | '\u0b99'..'\u0b9a'
+ | '\u0b9c'
+ | '\u0b9e'..'\u0b9f'
+ | '\u0ba3'..'\u0ba4'
+ | '\u0ba8'..'\u0baa'
+ | '\u0bae'..'\u0bb5'
+ | '\u0bb7'..'\u0bb9'
+ | '\u0bf9'
+ | '\u0c05'..'\u0c0c'
+ | '\u0c0e'..'\u0c10'
+ | '\u0c12'..'\u0c28'
+ | '\u0c2a'..'\u0c33'
+ | '\u0c35'..'\u0c39'
+ | '\u0c60'..'\u0c61'
+ | '\u0c85'..'\u0c8c'
+ | '\u0c8e'..'\u0c90'
+ | '\u0c92'..'\u0ca8'
+ | '\u0caa'..'\u0cb3'
+ | '\u0cb5'..'\u0cb9'
+ | '\u0cbd'
+ | '\u0cde'
+ | '\u0ce0'..'\u0ce1'
+ | '\u0d05'..'\u0d0c'
+ | '\u0d0e'..'\u0d10'
+ | '\u0d12'..'\u0d28'
+ | '\u0d2a'..'\u0d39'
+ | '\u0d60'..'\u0d61'
+ | '\u0d85'..'\u0d96'
+ | '\u0d9a'..'\u0db1'
+ | '\u0db3'..'\u0dbb'
+ | '\u0dbd'
+ | '\u0dc0'..'\u0dc6'
+ | '\u0e01'..'\u0e30'
+ | '\u0e32'..'\u0e33'
+ | '\u0e3f'..'\u0e46'
+ | '\u0e81'..'\u0e82'
+ | '\u0e84'
+ | '\u0e87'..'\u0e88'
+ | '\u0e8a'
+ | '\u0e8d'
+ | '\u0e94'..'\u0e97'
+ | '\u0e99'..'\u0e9f'
+ | '\u0ea1'..'\u0ea3'
+ | '\u0ea5'
+ | '\u0ea7'
+ | '\u0eaa'..'\u0eab'
+ | '\u0ead'..'\u0eb0'
+ | '\u0eb2'..'\u0eb3'
+ | '\u0ebd'
+ | '\u0ec0'..'\u0ec4'
+ | '\u0ec6'
+ | '\u0edc'..'\u0edd'
+ | '\u0f00'
+ | '\u0f40'..'\u0f47'
+ | '\u0f49'..'\u0f6a'
+ | '\u0f88'..'\u0f8b'
+ | '\u1000'..'\u1021'
+ | '\u1023'..'\u1027'
+ | '\u1029'..'\u102a'
+ | '\u1050'..'\u1055'
+ | '\u10a0'..'\u10c5'
+ | '\u10d0'..'\u10f8'
+ | '\u1100'..'\u1159'
+ | '\u115f'..'\u11a2'
+ | '\u11a8'..'\u11f9'
+ | '\u1200'..'\u1206'
+ | '\u1208'..'\u1246'
+ | '\u1248'
+ | '\u124a'..'\u124d'
+ | '\u1250'..'\u1256'
+ | '\u1258'
+ | '\u125a'..'\u125d'
+ | '\u1260'..'\u1286'
+ | '\u1288'
+ | '\u128a'..'\u128d'
+ | '\u1290'..'\u12ae'
+ | '\u12b0'
+ | '\u12b2'..'\u12b5'
+ | '\u12b8'..'\u12be'
+ | '\u12c0'
+ | '\u12c2'..'\u12c5'
+ | '\u12c8'..'\u12ce'
+ | '\u12d0'..'\u12d6'
+ | '\u12d8'..'\u12ee'
+ | '\u12f0'..'\u130e'
+ | '\u1310'
+ | '\u1312'..'\u1315'
+ | '\u1318'..'\u131e'
+ | '\u1320'..'\u1346'
+ | '\u1348'..'\u135a'
+ | '\u13a0'..'\u13f4'
+ | '\u1401'..'\u166c'
+ | '\u166f'..'\u1676'
+ | '\u1681'..'\u169a'
+ | '\u16a0'..'\u16ea'
+ | '\u16ee'..'\u16f0'
+ | '\u1700'..'\u170c'
+ | '\u170e'..'\u1711'
+ | '\u1720'..'\u1731'
+ | '\u1740'..'\u1751'
+ | '\u1760'..'\u176c'
+ | '\u176e'..'\u1770'
+ | '\u1780'..'\u17b3'
+ | '\u17d7'
+ | '\u17db'..'\u17dc'
+ | '\u1820'..'\u1877'
+ | '\u1880'..'\u18a8'
+ | '\u1900'..'\u191c'
+ | '\u1950'..'\u196d'
+ | '\u1970'..'\u1974'
+ | '\u1d00'..'\u1d6b'
+ | '\u1e00'..'\u1e9b'
+ | '\u1ea0'..'\u1ef9'
+ | '\u1f00'..'\u1f15'
+ | '\u1f18'..'\u1f1d'
+ | '\u1f20'..'\u1f45'
+ | '\u1f48'..'\u1f4d'
+ | '\u1f50'..'\u1f57'
+ | '\u1f59'
+ | '\u1f5b'
+ | '\u1f5d'
+ | '\u1f5f'..'\u1f7d'
+ | '\u1f80'..'\u1fb4'
+ | '\u1fb6'..'\u1fbc'
+ | '\u1fbe'
+ | '\u1fc2'..'\u1fc4'
+ | '\u1fc6'..'\u1fcc'
+ | '\u1fd0'..'\u1fd3'
+ | '\u1fd6'..'\u1fdb'
+ | '\u1fe0'..'\u1fec'
+ | '\u1ff2'..'\u1ff4'
+ | '\u1ff6'..'\u1ffc'
+ | '\u203f'..'\u2040'
+ | '\u2054'
+ | '\u2071'
+ | '\u207f'
+ | '\u20a0'..'\u20b1'
+ | '\u2102'
+ | '\u2107'
+ | '\u210a'..'\u2113'
+ | '\u2115'
+ | '\u2119'..'\u211d'
+ | '\u2124'
+ | '\u2126'
+ | '\u2128'
+ | '\u212a'..'\u212d'
+ | '\u212f'..'\u2131'
+ | '\u2133'..'\u2139'
+ | '\u213d'..'\u213f'
+ | '\u2145'..'\u2149'
+ | '\u2160'..'\u2183'
+ | '\u3005'..'\u3007'
+ | '\u3021'..'\u3029'
+ | '\u3031'..'\u3035'
+ | '\u3038'..'\u303c'
+ | '\u3041'..'\u3096'
+ | '\u309d'..'\u309f'
+ | '\u30a1'..'\u30ff'
+ | '\u3105'..'\u312c'
+ | '\u3131'..'\u318e'
+ | '\u31a0'..'\u31b7'
+ | '\u31f0'..'\u31ff'
+ | '\u3400'..'\u4db5'
+ | '\u4e00'..'\u9fa5'
+ | '\ua000'..'\ua48c'
+ | '\uac00'..'\ud7a3'
+ | '\uf900'..'\ufa2d'
+ | '\ufa30'..'\ufa6a'
+ | '\ufb00'..'\ufb06'
+ | '\ufb13'..'\ufb17'
+ | '\ufb1d'
+ | '\ufb1f'..'\ufb28'
+ | '\ufb2a'..'\ufb36'
+ | '\ufb38'..'\ufb3c'
+ | '\ufb3e'
+ | '\ufb40'..'\ufb41'
+ | '\ufb43'..'\ufb44'
+ | '\ufb46'..'\ufbb1'
+ | '\ufbd3'..'\ufd3d'
+ | '\ufd50'..'\ufd8f'
+ | '\ufd92'..'\ufdc7'
+ | '\ufdf0'..'\ufdfc'
+ | '\ufe33'..'\ufe34'
+ | '\ufe4d'..'\ufe4f'
+ | '\ufe69'
+ | '\ufe70'..'\ufe74'
+ | '\ufe76'..'\ufefc'
+ | '\uff04'
+ | '\uff21'..'\uff3a'
+ | '\uff3f'
+ | '\uff41'..'\uff5a'
+ | '\uff65'..'\uffbe'
+ | '\uffc2'..'\uffc7'
+ | '\uffca'..'\uffcf'
+ | '\uffd2'..'\uffd7'
+ | '\uffda'..'\uffdc'
+ | '\uffe0'..'\uffe1'
+ | '\uffe5'..'\uffe6'
+// UTF-16: | ('\ud800'..'\udbff') ('\udc00'..'\udfff')
+ ;
+
+fragment
+IdentifierPart
+ : '\u0000'..'\u0008'
+ | '\u000e'..'\u001b'
+ | '\u0024'
+ | '\u0030'..'\u0039'
+ | '\u0041'..'\u005a'
+ | '\u005f'
+ | '\u0061'..'\u007a'
+ | '\u007f'..'\u009f'
+ | '\u00a2'..'\u00a5'
+ | '\u00aa'
+ | '\u00ad'
+ | '\u00b5'
+ | '\u00ba'
+ | '\u00c0'..'\u00d6'
+ | '\u00d8'..'\u00f6'
+ | '\u00f8'..'\u0236'
+ | '\u0250'..'\u02c1'
+ | '\u02c6'..'\u02d1'
+ | '\u02e0'..'\u02e4'
+ | '\u02ee'
+ | '\u0300'..'\u0357'
+ | '\u035d'..'\u036f'
+ | '\u037a'
+ | '\u0386'
+ | '\u0388'..'\u038a'
+ | '\u038c'
+ | '\u038e'..'\u03a1'
+ | '\u03a3'..'\u03ce'
+ | '\u03d0'..'\u03f5'
+ | '\u03f7'..'\u03fb'
+ | '\u0400'..'\u0481'
+ | '\u0483'..'\u0486'
+ | '\u048a'..'\u04ce'
+ | '\u04d0'..'\u04f5'
+ | '\u04f8'..'\u04f9'
+ | '\u0500'..'\u050f'
+ | '\u0531'..'\u0556'
+ | '\u0559'
+ | '\u0561'..'\u0587'
+ | '\u0591'..'\u05a1'
+ | '\u05a3'..'\u05b9'
+ | '\u05bb'..'\u05bd'
+ | '\u05bf'
+ | '\u05c1'..'\u05c2'
+ | '\u05c4'
+ | '\u05d0'..'\u05ea'
+ | '\u05f0'..'\u05f2'
+ | '\u0600'..'\u0603'
+ | '\u0610'..'\u0615'
+ | '\u0621'..'\u063a'
+ | '\u0640'..'\u0658'
+ | '\u0660'..'\u0669'
+ | '\u066e'..'\u06d3'
+ | '\u06d5'..'\u06dd'
+ | '\u06df'..'\u06e8'
+ | '\u06ea'..'\u06fc'
+ | '\u06ff'
+ | '\u070f'..'\u074a'
+ | '\u074d'..'\u074f'
+ | '\u0780'..'\u07b1'
+ | '\u0901'..'\u0939'
+ | '\u093c'..'\u094d'
+ | '\u0950'..'\u0954'
+ | '\u0958'..'\u0963'
+ | '\u0966'..'\u096f'
+ | '\u0981'..'\u0983'
+ | '\u0985'..'\u098c'
+ | '\u098f'..'\u0990'
+ | '\u0993'..'\u09a8'
+ | '\u09aa'..'\u09b0'
+ | '\u09b2'
+ | '\u09b6'..'\u09b9'
+ | '\u09bc'..'\u09c4'
+ | '\u09c7'..'\u09c8'
+ | '\u09cb'..'\u09cd'
+ | '\u09d7'
+ | '\u09dc'..'\u09dd'
+ | '\u09df'..'\u09e3'
+ | '\u09e6'..'\u09f3'
+ | '\u0a01'..'\u0a03'
+ | '\u0a05'..'\u0a0a'
+ | '\u0a0f'..'\u0a10'
+ | '\u0a13'..'\u0a28'
+ | '\u0a2a'..'\u0a30'
+ | '\u0a32'..'\u0a33'
+ | '\u0a35'..'\u0a36'
+ | '\u0a38'..'\u0a39'
+ | '\u0a3c'
+ | '\u0a3e'..'\u0a42'
+ | '\u0a47'..'\u0a48'
+ | '\u0a4b'..'\u0a4d'
+ | '\u0a59'..'\u0a5c'
+ | '\u0a5e'
+ | '\u0a66'..'\u0a74'
+ | '\u0a81'..'\u0a83'
+ | '\u0a85'..'\u0a8d'
+ | '\u0a8f'..'\u0a91'
+ | '\u0a93'..'\u0aa8'
+ | '\u0aaa'..'\u0ab0'
+ | '\u0ab2'..'\u0ab3'
+ | '\u0ab5'..'\u0ab9'
+ | '\u0abc'..'\u0ac5'
+ | '\u0ac7'..'\u0ac9'
+ | '\u0acb'..'\u0acd'
+ | '\u0ad0'
+ | '\u0ae0'..'\u0ae3'
+ | '\u0ae6'..'\u0aef'
+ | '\u0af1'
+ | '\u0b01'..'\u0b03'
+ | '\u0b05'..'\u0b0c'
+ | '\u0b0f'..'\u0b10'
+ | '\u0b13'..'\u0b28'
+ | '\u0b2a'..'\u0b30'
+ | '\u0b32'..'\u0b33'
+ | '\u0b35'..'\u0b39'
+ | '\u0b3c'..'\u0b43'
+ | '\u0b47'..'\u0b48'
+ | '\u0b4b'..'\u0b4d'
+ | '\u0b56'..'\u0b57'
+ | '\u0b5c'..'\u0b5d'
+ | '\u0b5f'..'\u0b61'
+ | '\u0b66'..'\u0b6f'
+ | '\u0b71'
+ | '\u0b82'..'\u0b83'
+ | '\u0b85'..'\u0b8a'
+ | '\u0b8e'..'\u0b90'
+ | '\u0b92'..'\u0b95'
+ | '\u0b99'..'\u0b9a'
+ | '\u0b9c'
+ | '\u0b9e'..'\u0b9f'
+ | '\u0ba3'..'\u0ba4'
+ | '\u0ba8'..'\u0baa'
+ | '\u0bae'..'\u0bb5'
+ | '\u0bb7'..'\u0bb9'
+ | '\u0bbe'..'\u0bc2'
+ | '\u0bc6'..'\u0bc8'
+ | '\u0bca'..'\u0bcd'
+ | '\u0bd7'
+ | '\u0be7'..'\u0bef'
+ | '\u0bf9'
+ | '\u0c01'..'\u0c03'
+ | '\u0c05'..'\u0c0c'
+ | '\u0c0e'..'\u0c10'
+ | '\u0c12'..'\u0c28'
+ | '\u0c2a'..'\u0c33'
+ | '\u0c35'..'\u0c39'
+ | '\u0c3e'..'\u0c44'
+ | '\u0c46'..'\u0c48'
+ | '\u0c4a'..'\u0c4d'
+ | '\u0c55'..'\u0c56'
+ | '\u0c60'..'\u0c61'
+ | '\u0c66'..'\u0c6f'
+ | '\u0c82'..'\u0c83'
+ | '\u0c85'..'\u0c8c'
+ | '\u0c8e'..'\u0c90'
+ | '\u0c92'..'\u0ca8'
+ | '\u0caa'..'\u0cb3'
+ | '\u0cb5'..'\u0cb9'
+ | '\u0cbc'..'\u0cc4'
+ | '\u0cc6'..'\u0cc8'
+ | '\u0cca'..'\u0ccd'
+ | '\u0cd5'..'\u0cd6'
+ | '\u0cde'
+ | '\u0ce0'..'\u0ce1'
+ | '\u0ce6'..'\u0cef'
+ | '\u0d02'..'\u0d03'
+ | '\u0d05'..'\u0d0c'
+ | '\u0d0e'..'\u0d10'
+ | '\u0d12'..'\u0d28'
+ | '\u0d2a'..'\u0d39'
+ | '\u0d3e'..'\u0d43'
+ | '\u0d46'..'\u0d48'
+ | '\u0d4a'..'\u0d4d'
+ | '\u0d57'
+ | '\u0d60'..'\u0d61'
+ | '\u0d66'..'\u0d6f'
+ | '\u0d82'..'\u0d83'
+ | '\u0d85'..'\u0d96'
+ | '\u0d9a'..'\u0db1'
+ | '\u0db3'..'\u0dbb'
+ | '\u0dbd'
+ | '\u0dc0'..'\u0dc6'
+ | '\u0dca'
+ | '\u0dcf'..'\u0dd4'
+ | '\u0dd6'
+ | '\u0dd8'..'\u0ddf'
+ | '\u0df2'..'\u0df3'
+ | '\u0e01'..'\u0e3a'
+ | '\u0e3f'..'\u0e4e'
+ | '\u0e50'..'\u0e59'
+ | '\u0e81'..'\u0e82'
+ | '\u0e84'
+ | '\u0e87'..'\u0e88'
+ | '\u0e8a'
+ | '\u0e8d'
+ | '\u0e94'..'\u0e97'
+ | '\u0e99'..'\u0e9f'
+ | '\u0ea1'..'\u0ea3'
+ | '\u0ea5'
+ | '\u0ea7'
+ | '\u0eaa'..'\u0eab'
+ | '\u0ead'..'\u0eb9'
+ | '\u0ebb'..'\u0ebd'
+ | '\u0ec0'..'\u0ec4'
+ | '\u0ec6'
+ | '\u0ec8'..'\u0ecd'
+ | '\u0ed0'..'\u0ed9'
+ | '\u0edc'..'\u0edd'
+ | '\u0f00'
+ | '\u0f18'..'\u0f19'
+ | '\u0f20'..'\u0f29'
+ | '\u0f35'
+ | '\u0f37'
+ | '\u0f39'
+ | '\u0f3e'..'\u0f47'
+ | '\u0f49'..'\u0f6a'
+ | '\u0f71'..'\u0f84'
+ | '\u0f86'..'\u0f8b'
+ | '\u0f90'..'\u0f97'
+ | '\u0f99'..'\u0fbc'
+ | '\u0fc6'
+ | '\u1000'..'\u1021'
+ | '\u1023'..'\u1027'
+ | '\u1029'..'\u102a'
+ | '\u102c'..'\u1032'
+ | '\u1036'..'\u1039'
+ | '\u1040'..'\u1049'
+ | '\u1050'..'\u1059'
+ | '\u10a0'..'\u10c5'
+ | '\u10d0'..'\u10f8'
+ | '\u1100'..'\u1159'
+ | '\u115f'..'\u11a2'
+ | '\u11a8'..'\u11f9'
+ | '\u1200'..'\u1206'
+ | '\u1208'..'\u1246'
+ | '\u1248'
+ | '\u124a'..'\u124d'
+ | '\u1250'..'\u1256'
+ | '\u1258'
+ | '\u125a'..'\u125d'
+ | '\u1260'..'\u1286'
+ | '\u1288'
+ | '\u128a'..'\u128d'
+ | '\u1290'..'\u12ae'
+ | '\u12b0'
+ | '\u12b2'..'\u12b5'
+ | '\u12b8'..'\u12be'
+ | '\u12c0'
+ | '\u12c2'..'\u12c5'
+ | '\u12c8'..'\u12ce'
+ | '\u12d0'..'\u12d6'
+ | '\u12d8'..'\u12ee'
+ | '\u12f0'..'\u130e'
+ | '\u1310'
+ | '\u1312'..'\u1315'
+ | '\u1318'..'\u131e'
+ | '\u1320'..'\u1346'
+ | '\u1348'..'\u135a'
+ | '\u1369'..'\u1371'
+ | '\u13a0'..'\u13f4'
+ | '\u1401'..'\u166c'
+ | '\u166f'..'\u1676'
+ | '\u1681'..'\u169a'
+ | '\u16a0'..'\u16ea'
+ | '\u16ee'..'\u16f0'
+ | '\u1700'..'\u170c'
+ | '\u170e'..'\u1714'
+ | '\u1720'..'\u1734'
+ | '\u1740'..'\u1753'
+ | '\u1760'..'\u176c'
+ | '\u176e'..'\u1770'
+ | '\u1772'..'\u1773'
+ | '\u1780'..'\u17d3'
+ | '\u17d7'
+ | '\u17db'..'\u17dd'
+ | '\u17e0'..'\u17e9'
+ | '\u180b'..'\u180d'
+ | '\u1810'..'\u1819'
+ | '\u1820'..'\u1877'
+ | '\u1880'..'\u18a9'
+ | '\u1900'..'\u191c'
+ | '\u1920'..'\u192b'
+ | '\u1930'..'\u193b'
+ | '\u1946'..'\u196d'
+ | '\u1970'..'\u1974'
+ | '\u1d00'..'\u1d6b'
+ | '\u1e00'..'\u1e9b'
+ | '\u1ea0'..'\u1ef9'
+ | '\u1f00'..'\u1f15'
+ | '\u1f18'..'\u1f1d'
+ | '\u1f20'..'\u1f45'
+ | '\u1f48'..'\u1f4d'
+ | '\u1f50'..'\u1f57'
+ | '\u1f59'
+ | '\u1f5b'
+ | '\u1f5d'
+ | '\u1f5f'..'\u1f7d'
+ | '\u1f80'..'\u1fb4'
+ | '\u1fb6'..'\u1fbc'
+ | '\u1fbe'
+ | '\u1fc2'..'\u1fc4'
+ | '\u1fc6'..'\u1fcc'
+ | '\u1fd0'..'\u1fd3'
+ | '\u1fd6'..'\u1fdb'
+ | '\u1fe0'..'\u1fec'
+ | '\u1ff2'..'\u1ff4'
+ | '\u1ff6'..'\u1ffc'
+ | '\u200c'..'\u200f'
+ | '\u202a'..'\u202e'
+ | '\u203f'..'\u2040'
+ | '\u2054'
+ | '\u2060'..'\u2063'
+ | '\u206a'..'\u206f'
+ | '\u2071'
+ | '\u207f'
+ | '\u20a0'..'\u20b1'
+ | '\u20d0'..'\u20dc'
+ | '\u20e1'
+ | '\u20e5'..'\u20ea'
+ | '\u2102'
+ | '\u2107'
+ | '\u210a'..'\u2113'
+ | '\u2115'
+ | '\u2119'..'\u211d'
+ | '\u2124'
+ | '\u2126'
+ | '\u2128'
+ | '\u212a'..'\u212d'
+ | '\u212f'..'\u2131'
+ | '\u2133'..'\u2139'
+ | '\u213d'..'\u213f'
+ | '\u2145'..'\u2149'
+ | '\u2160'..'\u2183'
+ | '\u3005'..'\u3007'
+ | '\u3021'..'\u302f'
+ | '\u3031'..'\u3035'
+ | '\u3038'..'\u303c'
+ | '\u3041'..'\u3096'
+ | '\u3099'..'\u309a'
+ | '\u309d'..'\u309f'
+ | '\u30a1'..'\u30ff'
+ | '\u3105'..'\u312c'
+ | '\u3131'..'\u318e'
+ | '\u31a0'..'\u31b7'
+ | '\u31f0'..'\u31ff'
+ | '\u3400'..'\u4db5'
+ | '\u4e00'..'\u9fa5'
+ | '\ua000'..'\ua48c'
+ | '\uac00'..'\ud7a3'
+ | '\uf900'..'\ufa2d'
+ | '\ufa30'..'\ufa6a'
+ | '\ufb00'..'\ufb06'
+ | '\ufb13'..'\ufb17'
+ | '\ufb1d'..'\ufb28'
+ | '\ufb2a'..'\ufb36'
+ | '\ufb38'..'\ufb3c'
+ | '\ufb3e'
+ | '\ufb40'..'\ufb41'
+ | '\ufb43'..'\ufb44'
+ | '\ufb46'..'\ufbb1'
+ | '\ufbd3'..'\ufd3d'
+ | '\ufd50'..'\ufd8f'
+ | '\ufd92'..'\ufdc7'
+ | '\ufdf0'..'\ufdfc'
+ | '\ufe00'..'\ufe0f'
+ | '\ufe20'..'\ufe23'
+ | '\ufe33'..'\ufe34'
+ | '\ufe4d'..'\ufe4f'
+ | '\ufe69'
+ | '\ufe70'..'\ufe74'
+ | '\ufe76'..'\ufefc'
+ | '\ufeff'
+ | '\uff04'
+ | '\uff10'..'\uff19'
+ | '\uff21'..'\uff3a'
+ | '\uff3f'
+ | '\uff41'..'\uff5a'
+ | '\uff65'..'\uffbe'
+ | '\uffc2'..'\uffc7'
+ | '\uffca'..'\uffcf'
+ | '\uffd2'..'\uffd7'
+ | '\uffda'..'\uffdc'
+ | '\uffe0'..'\uffe1'
+ | '\uffe5'..'\uffe6'
+ | '\ufff9'..'\ufffb'
+// UTF-16 | ('\ud800'..'\udbff') ('\udc00'..'\udfff')
+ ;
Added: labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Parser.g
===================================================================
--- labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Parser.g (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/main/resources/DRLv6Parser.g 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,1501 @@
+parser grammar DRLv6Parser;
+
+options {
+ language = Java;
+ output = AST;
+ tokenVocab = DRLv6Lexer;
+ k=5;
+}
+
+
+tokens {
+ VT_COMPILATION_UNIT;
+ VT_PACKAGE_ID;
+
+ VT_GLOBAL_ID;
+ VT_DATA_TYPE;
+ VT_DIM_SIZE;
+
+ VT_FUNCTION_IMPORT;
+ VT_IMPORT_ID;
+ VT_FUNCTION_ID;
+ VT_PARAM;
+ VT_PARAM_LIST;
+
+ VT_TEMPLATE;
+ VT_TEMPLATE_ID;
+ VT_SLOT;
+ VT_SLOT_ID;
+
+ VT_TYPE_DECLARE_ID;
+
+ VT_RULE_ID;
+ VT_ATTRIBUTES;
+ VT_DIALECT;
+
+ VT_RHS_CHUNK;
+ VT_CURLY_CHUNK;
+ VT_SQUARE_CHUNK;
+ VT_PAREN_CHUNK;
+
+ VT_NEW_OBJ;
+ VT_TYPE;
+ VT_ARGS;
+
+ VT_AND_IMPLICIT;
+ VT_IMPLIES;
+ VT_OR;
+ VT_NEG;
+ VT_XOR;
+ VT_EQUIV;
+ VT_AND;
+
+ VT_HEDGE_VERY;
+ VT_HEDGE_MOL;
+
+ VT_EXISTS;
+ VT_FORALL;
+ VT_NEXISTS;
+
+ VT_PATTERN;
+ VT_ENABLED;
+ VT_QUERY_PATTERN;
+
+ VT_POSITIONAL_VAR;
+ VT_POSITIONAL_CONST;
+ VT_POSITIONAL_INDEX;
+
+ VT_BINDING;
+ VT_FIELD;
+ VT_EXPR;
+
+ VT_LIST;
+
+ VT_BEHAVIOR;
+ VT_ENTRYPOINT;
+ VT_ENTRYPOINT_ID;
+ VT_FROM_SOURCE;
+ VT_EXPRESSION_CHAIN;
+
+ VT_ACCUMULATE_INIT_CLAUSE;
+ VT_ACCUMULATE_ID_CLAUSE;
+}
+
+ at parser::header {
+ package org.drools.lang;
+
+ import java.util.List;
+ import java.util.LinkedList;
+}
+
+
+
+/**************************** SCOPE *******************************************/
+
+compilation_unit
+ : package_statement?
+ statement*
+ EOF
+ -> ^(VT_COMPILATION_UNIT package_statement? statement*)
+ ;
+
+
+/**************************** PACKAGE *******************************************/
+
+
+package_statement
+ : PACKAGE
+ package_id SEMICOLON?
+ -> ^(PACKAGE package_id)
+ ;
+
+package_id
+ : id+=ID ( id+=DOT id+=ID )*
+ -> ^(VT_PACKAGE_ID ID+)
+ ;
+
+
+
+
+/**************************** STATEMENTS *******************************************/
+
+statement
+ : function_import_statement
+ | import_statement
+ | global
+ | function
+ // | template
+ | type_declaration
+ | rule
+ | query
+ //| rule_attribute // why???
+ ;
+
+
+/**************************** GLOBAL + DATATYPE *******************************************/
+global
+ : GLOBAL data_type global_id SEMICOLON?
+ -> ^(GLOBAL data_type global_id)
+ ;
+
+global_id
+ : id=ID
+ -> VT_GLOBAL_ID[$id]
+ ;
+
+data_type
+ at init{
+ int dim=0;
+}
+ : id+=ID ( DOT id+=ID )* (dimension_definition {dim++;})*
+ -> ^(VT_DATA_TYPE VT_DIM_SIZE[$start,""+dim] $id+ )
+ ;
+dimension_definition
+ : LEFT_SQUARE RIGHT_SQUARE
+ ;
+
+
+/**************************** IMPORT *******************************************/
+import_statement
+ : IMPORT import_name SEMICOLON?
+ -> ^(IMPORT import_name)
+ ;
+
+function_import_statement
+ : imp=IMPORT FUNCTION import_name SEMICOLON?
+ -> ^(VT_FUNCTION_IMPORT[$imp] FUNCTION import_name)
+ ;
+
+import_name
+ : id+=ID ( id+=DOT id+=ID )* id+=DOT_STAR?
+ -> ^(VT_IMPORT_ID ID+ DOT_STAR?)
+ ;
+
+
+/**************************** FUNCTION *******************************************/
+function
+ : FUNCTION data_type? function_id parameters curly_chunk
+ -> ^(FUNCTION data_type? function_id parameters curly_chunk)
+ ;
+
+function_id
+ : id=ID
+ -> VT_FUNCTION_ID[$id]
+ ;
+
+parameters
+ : LEFT_PAREN
+ ( param_definition (COMMA param_definition)* )?
+ RIGHT_PAREN
+ -> ^(VT_PARAM_LIST param_definition*)
+ ;
+
+param_definition
+ : data_type argument
+ -> ^(VT_PARAM data_type argument)
+ ;
+
+argument
+ : ID //dimension_definition*
+ ;
+
+
+
+/**************************** TEMPLATE *******************************************/
+
+//TODO : What for?? proto-declare??
+/*
+template
+ :
+ TEMPLATE template_id
+ semi1=SEMICOLON?
+ template_slot+
+ end=END semi2=SEMICOLON?
+ -> ^(TEMPLATE template_id template_slot+ END)
+ ;
+
+template_id
+ : id=ID
+ -> VT_TEMPLATE_ID[$id]
+ | id=STRING
+ -> VT_TEMPLATE_ID[$id]
+ ;
+
+template_slot
+ : data_type slot_id SEMICOLON?
+ -> ^(VT_SLOT data_type slot_id)
+ ;
+
+slot_id
+ : id=ID
+ -> VT_SLOT_ID[$id]
+ ;
+*/
+
+
+
+type_declaration
+ : DECLARE type_declare_id
+ type_declare_attributes?
+ decl_field*
+ END SEMICOLON?
+ -> ^(DECLARE type_declare_id type_declare_attributes? decl_field*)
+ ;
+
+type_declare_id
+ : id=ID
+ -> VT_TYPE_DECLARE_ID[$id]
+ ;
+
+type_declare_attributes
+ :
+ type_declare_attribute+
+ -> ^(VT_ATTRIBUTES type_declare_attribute+)
+ ;
+
+type_declare_attribute
+ :
+ tda_role
+ | type_declare_att_semantic
+ ;
+
+type_declare_att_semantic
+ : tda_namespace
+ | tda_subclass
+ | tda_subproperty
+ | tda_disjoint
+ | tda_symmetric
+ | tda_transitive
+ | tda_inverse
+ ;
+
+tda_role
+ : AT! ROLE^ LEFT_PAREN! ( EVENT | ENTITY | PROPERTY | TYPE ) RIGHT_PAREN!
+ ;
+
+tda_namespace
+ : AT! NAMESPACE^ LEFT_PAREN! ID EQUALS! STRING RIGHT_PAREN!
+ ;
+
+tda_subclass
+ : AT! SUBCLASS^ LEFT_PAREN! ID RIGHT_PAREN!
+ ;
+
+tda_subproperty
+ : AT! SUBPROPERTY^ LEFT_PAREN! ID RIGHT_PAREN!
+ ;
+
+tda_disjoint
+ : AT! DISJOINT^ LEFT_PAREN! ID RIGHT_PAREN!
+ ;
+
+tda_inverse
+ : AT! INVERSE^ LEFT_PAREN! ID RIGHT_PAREN!
+ ;
+
+tda_symmetric
+ : AT! SYMMETRIC^
+ ;
+
+ tda_transitive
+ : AT! TRANSITIVE^
+ ;
+
+
+
+
+/*
+decl_metadata
+ : AT^ ID paren_chunk?
+ ;
+*/
+
+decl_field
+ : ID
+ decl_field_initialization?
+ COLON
+ data_type
+ decl_field_attributes?
+ -> ^(VT_FIELD decl_field_attributes? ID data_type decl_field_initialization? )
+ ;
+
+decl_field_initialization
+ : EQUALS paren_chunk
+ -> ^(EQUALS paren_chunk)
+ ;
+
+
+decl_field_attributes
+ :
+ AT LEFT_SQUARE
+ decl_field_attribute (COMMA decl_field_attribute)*
+ RIGHT_SQUARE
+ -> ^(VT_ATTRIBUTES decl_field_attribute+)
+ ;
+
+decl_field_attribute
+ :
+ KEY
+ ;
+
+
+/**************************** RULES *******************************************/
+
+
+
+
+
+rule
+ : RULE rule_id (EXTEND rule_id)?
+ rule_metadata*
+ rule_attributes?
+ when_part?
+ then_part
+ -> ^(RULE rule_id ^(EXTEND rule_id)? rule_metadata* rule_attributes? when_part? then_part)
+ ;
+
+
+
+rule_id
+ : id=ID
+ -> VT_RULE_ID[$id]
+ | id=STRING
+ -> VT_RULE_ID[$id]
+ ;
+
+rule_metadata
+ : AT! ID^ paren_chunk?
+ ;
+
+
+
+/**************************** RULE ATTRIBS *******************************************/
+
+
+rule_attributes
+ : rule_attribute ( COMMA? rule_attribute)*
+ -> ^(VT_ATTRIBUTES rule_attribute+)
+ ;
+
+rule_attribute
+ : ra_salience
+ | ra_no_loop
+ | ra_agenda_group
+ | ra_timer
+ | ra_activation_group
+ | ra_auto_focus
+ | ra_date_effective
+ | ra_date_expires
+ | ra_enabled
+ | ra_ruleflow_group
+ | ra_lock_on_active
+ | ra_dialect
+ | ra_calendars
+ | ra_defeats
+ | ra_direction
+ | ra_deduction
+ | ra_implication
+ ;
+
+ra_date_effective
+ : A_DATE_EFFECTIVE^ STRING
+ ;
+
+ra_date_expires
+ : A_DATE_EXPIRES^ STRING
+ ;
+
+ra_enabled
+ : A_ENABLED^
+ ( BOOL
+ | paren_chunk
+ )
+ ;
+
+ra_salience
+ : A_SALIENCE^
+ ( INT
+ | paren_chunk
+ )
+ ;
+
+ra_no_loop
+ : A_NOLOOP^ BOOL?
+ ;
+
+ra_auto_focus
+ : A_AUTOFOCUS^ BOOL?
+ ;
+
+ra_activation_group
+ : A_ACTGROUP^ STRING
+ ;
+
+ra_ruleflow_group
+ : A_RULEFLOWGROUP^ STRING
+ ;
+
+ra_agenda_group
+ : A_AGENDAGROUP^ STRING
+ ;
+
+ra_timer
+ : (A_DURATION^| A_TIMER^)
+ (INT | paren_chunk )
+ ;
+
+ra_calendars
+ : A_CALENDAR^ string_list
+ ;
+
+string_list
+ at init {
+ StringBuilder buf = new StringBuilder();
+}
+ : first=STRING { buf.append( "[ "+ $first.text ); }
+ (COMMA next=STRING { buf.append( ", " + $next.text ); } )*
+ -> STRING[$first,buf.toString()+" ]"]
+ ;
+
+
+ra_dialect
+ : A_DIALECT^ STRING
+ ;
+
+ra_lock_on_active
+ : A_LOCKONACTIVE^ BOOL?
+ ;
+
+ra_deduction
+ : A_DEDUCTION^ operator_attributes
+ ;
+
+
+ra_implication
+ : A_IMPLICATION^ operator_attributes
+ ;
+
+ra_direction
+ : A_DIRECTION^
+ ;
+
+ra_defeats
+ : DEFEATS^ STRING
+ ;
+
+
+
+
+operator_attributes
+ : AT LEFT_SQUARE single_operator_attribute (COMMA single_operator_attribute)* RIGHT_SQUARE
+ -> ^(VT_ATTRIBUTES single_operator_attribute+)
+ ;
+
+
+single_operator_attribute
+ : oa_kind
+ | oa_id
+ | oa_params
+ | oa_degree
+ | oa_merge
+ | oa_filter
+ | oa_missing
+ | oa_defeat
+ | oa_default
+ | oa_crisp
+ ;
+
+oa_kind
+ : OA_KIND^ EQUALS STRING
+ ;
+
+oa_id
+ : OA_ID^ EQUALS STRING
+ ;
+
+oa_params
+ : OA_PARAMS^ EQUALS STRING
+ ;
+
+oa_degree
+ : OA_DEGREE^ EQUALS STRING
+ ;
+
+oa_crisp
+ : OA_CRISP^
+ ;
+
+oa_merge
+ : OA_MERGE^ EQUALS STRING
+ ;
+
+oa_filter
+ : OA_FILTER^ EQUALS STRING
+ ;
+
+oa_missing
+ : OA_MISSING^ EQUALS STRING
+ ;
+
+oa_defeat
+ : OA_DEFEAT^
+ ;
+
+oa_default
+ : OA_DEFAULT^
+ ;
+
+
+
+
+/**************************** LHS *******************************************/
+
+
+when_part
+ : WHEN^
+ lhs_root
+ ;
+
+lhs_root
+ : lhs_implies*
+ -> ^(VT_AND_IMPLICIT lhs_implies*)
+ ;
+
+
+
+lhs_implies
+ : left=lhs_or (imp=imply_connective operator_attributes? right=lhs_or)?
+ -> {imp != null}? ^($imp operator_attributes? $left $right)
+ -> ^($left)
+ ;
+
+lhs_or
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=lhs_diff
+ {seq=ld;}
+ ( lios=lhs_or_sequitur[seq.getTree()]
+ {seq=lios;}
+ )*
+ -> {lios==null}? ^($ld)
+ -> ^($lios)
+ ;
+
+lhs_or_sequitur[Object leftChild]
+ : or=or_connective^ (atts=operator_attributes!)? rightChild=lhs_diff!
+ {
+ Tree t = ((Tree) or.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+
+lhs_diff
+ : lhs_and (( xor_connective^ | eq_connective^ ) operator_attributes? lhs_and)?
+ ;
+
+
+
+
+
+lhs_and
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=lhs_unary
+ {seq=ld;}
+ ( lias=lhs_and_sequitur[seq.getTree()]
+ {seq=lias;}
+ )*
+ -> {lias==null}? ^($ld)
+ -> ^($lias)
+ ;
+
+lhs_and_sequitur[Object leftChild]
+ : and=and_connective^ (atts=operator_attributes!)? rightChild=lhs_unary!
+ {
+ Tree t = ((Tree) and.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+lhs_unary
+ : lhs_modified_unary
+ | lhs_query
+ ;
+
+lhs_modified_unary
+ :
+ unary_operator^ operator_attributes? lhs_modified_unary
+ | LEFT_PAREN! lhs_root RIGHT_PAREN!
+ | lhs_quantifiexpr
+ | lhs_label_atom_pattern
+ ;
+
+
+lhs_quantifiexpr
+ : lhs_exists
+ | lhs_not
+ | lhs_forall
+ ;
+
+
+lhs_exists
+ : lab=label? EXISTS operator_attributes?
+ (
+ LEFT_PAREN lhs_root RIGHT_PAREN
+ | lhs_atom_pattern
+ )
+ -> {lab==null}? ^(VT_EXISTS operator_attributes? lhs_root? lhs_atom_pattern?)
+ -> ^(VT_BINDING label ^(VT_EXISTS operator_attributes? lhs_root? lhs_atom_pattern?))
+ ;
+
+lhs_forall
+ : FORALL operator_attributes?
+ (
+ pat=lhs_atom_pattern
+ | LEFT_PAREN lhs_unary lhs_unary RIGHT_PAREN
+ )
+ -> {pat!=null}? ^(VT_FORALL operator_attributes? lhs_atom_pattern)
+ -> ^(VT_FORALL operator_attributes? lhs_unary lhs_unary)
+ ;
+
+lhs_not
+ : NOT operator_attributes?
+ (
+ LEFT_PAREN lhs_root RIGHT_PAREN
+ | lhs_atom_pattern
+ )
+ -> ^(VT_NEXISTS operator_attributes? lhs_root? lhs_atom_pattern?)
+ ;
+
+/*
+lhs_atom_pattern
+ : lab=label? ID LEFT_PAREN constraints? RIGHT_PAREN operator_attributes? over_clause? from?
+ -> {lab==null}? ^(VT_AND operator_attributes? VT_ENABLED ^(VT_PATTERN ID) constraints? over_clause? from?)
+ -> ^(label ^(VT_AND operator_attributes? VT_ENABLED ^(VT_PATTERN ID) constraints? over_clause? from?))
+ ;
+*/
+
+lhs_label_atom_pattern
+ : lab=label? lhs_atom_pattern
+ -> {lab==null}? lhs_atom_pattern
+ -> ^(VT_BINDING label lhs_atom_pattern)
+ ;
+
+lhs_atom_pattern
+ : ID LEFT_PAREN constraints? RIGHT_PAREN operator_attributes? over_clause? from?
+ -> ^(VT_AND operator_attributes? VT_ENABLED ^(VT_PATTERN ID) constraints? over_clause? from?)
+ ;
+
+
+/*********************************************** INSIDE PATTERN *****************************************/
+
+
+
+constraints
+ : positional_constraints
+ -> ^(VT_AND positional_constraints)
+ | slotted_constraints
+ -> ^(VT_AND slotted_constraints)
+ ;
+
+positional_constraints
+ at init{
+ int j = 0;
+}
+ : positional_constraint[j++] (COMMA! positional_constraint[j++])* (COMMA! slotted_constraint)*
+ ;
+
+slotted_constraints
+ : slotted_constraint (COMMA! slotted_constraint)*
+ ;
+
+
+
+positional_constraint[int j]
+ at init{
+ String idx = ""+j;
+}
+ : literal
+ -> ^(VT_POSITIONAL_CONST VT_POSITIONAL_INDEX[$start,idx] literal)
+ | VAR
+ -> ^(VT_POSITIONAL_VAR VT_POSITIONAL_INDEX[$start,idx] VAR)
+ ;
+
+slotted_constraint
+ : constr_implies
+ ;
+
+
+
+literal
+options{
+k=6;
+}
+ : STRING
+ | INT
+ | FLOAT
+ | BOOL
+ | NULL
+ | literal_object
+ | list
+ ;
+
+list
+ : LEFT_CURLY list_members? RIGHT_CURLY
+ ->^(VT_LIST list_members?)
+ ;
+
+list_members
+ : (literal|VAR) (COMMA! (literal|VAR))*
+ ;
+
+
+
+literal_object
+ : NEW ID LEFT_PAREN literal_object_args? RIGHT_PAREN
+ -> ^(VT_NEW_OBJ ^(VT_TYPE ID) ^(VT_ARGS literal_object_args)?)
+ ;
+
+literal_object_args
+ : method_args
+ ;
+
+method_args
+ : method_arg (COMMA! method_arg)*
+ ;
+
+
+method_arg
+ : method_expr_root
+ ;
+
+
+// method expr roots can't start with () and have a slightly simpler structure than outer expressions
+method_expr_root
+ : method_expr_atom ( (PLUS | MINUS) method_factor )*
+ ;
+
+method_expr_recur
+ : method_factor ( (PLUS | MINUS) method_factor )*
+ ;
+
+method_factor
+ : method_term ( (TIMES | SLASH) method_term )*
+ ;
+
+method_term
+ : MINUS? method_expr_unary
+ ;
+
+method_expr_unary
+ : method_expr_atom
+ | LEFT_PAREN! method_expr_recur RIGHT_PAREN!
+ ;
+
+method_expr_atom
+ : VAR
+ | literal
+ | method
+ ;
+
+method
+ : ID LEFT_PAREN! method_args? RIGHT_PAREN!
+ ;
+
+
+/************************************* SLOTTED CONSTRAINTS LOGIC HIERARCHY **********************************/
+
+constr_implies
+ : left=constr_or (imp=imply_connective operator_attributes? right=constr_or)?
+ -> {imp != null}? ^($imp operator_attributes? $left $right)
+ -> ^($left)
+ ;
+
+constr_or
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=constr_diff
+ {seq=ld;}
+ ( lios=constr_or_sequitur[seq.getTree()]
+ {seq=lios;}
+ )*
+ -> {lios==null}? ^($ld)
+ -> ^($lios)
+ ;
+
+constr_or_sequitur[Object leftChild]
+ : or=or_connective^ (atts=operator_attributes!)? rightChild=constr_diff!
+ {
+ Tree t = ((Tree) or.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+
+constr_diff
+ : constr_and (( xor_connective^ | eq_connective^ ) operator_attributes? constr_and)?
+ ;
+
+
+
+
+
+constr_and
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=constr_unary
+ {seq=ld;}
+ ( lias=constr_and_sequitur[seq.getTree()]
+ {seq=lias;}
+ )*
+ -> {lias==null}? ^($ld)
+ -> ^($lias)
+ ;
+
+constr_and_sequitur[Object leftChild]
+ : and=and_connective^ (atts=operator_attributes!)? rightChild=constr_unary!
+ {
+ Tree t = ((Tree) and.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+constr_unary
+ : unary_operator operator_attributes? constr_unary
+ | constr_atom
+ | LEFT_PAREN! constr_implies RIGHT_PAREN!
+ ;
+
+constr_atom
+ : left_expression restriction_root^?
+ ;
+
+
+
+restriction_root
+ : restr_implies
+ ;
+
+
+restr_implies
+ : left=restr_or (imp=imply_symbol operator_attributes? right=restr_or)?
+ -> {imp != null}? ^($imp operator_attributes? $left $right)
+ -> ^($left)
+ ;
+
+restr_or
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=restr_diff
+ {seq=ld;}
+ ( lios=restr_or_sequitur[seq.getTree()]
+ {seq=lios;}
+ )*
+ -> {lios==null}? ^($ld)
+ -> ^($lios)
+ ;
+
+restr_or_sequitur[Object leftChild]
+ : or=or_symbol^ (atts=operator_attributes!)? rightChild=restr_diff!
+ {
+ Tree t = ((Tree) or.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+
+restr_diff
+ : restr_and (( xor_symbol^ | eq_symbol^ ) operator_attributes? restr_and)?
+ ;
+
+
+
+
+
+restr_and
+ at init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+}
+ : ld=restr_unary
+ {seq=ld;}
+ ( lias=restr_and_sequitur[seq.getTree()]
+ {seq=lias;}
+ )*
+ -> {lias==null}? ^($ld)
+ -> ^($lias)
+ ;
+
+restr_and_sequitur[Object leftChild]
+ : and=and_symbol^ (atts=operator_attributes!)? rightChild=restr_unary!
+ {
+ Tree t = ((Tree) and.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+restr_unary
+ : unary_operator operator_attributes? restr_unary
+ | LEFT_PAREN! restr_implies RIGHT_PAREN!
+ | restr_atom
+ ;
+
+
+restr_atom
+ : qnt=inner_quantifier? eval=evaluator operator_attributes? right_expression
+ -> {qnt==null}? ^(evaluator operator_attributes? right_expression)
+ -> ^(inner_quantifier ^(evaluator operator_attributes? right_expression))
+ ;
+
+
+
+
+
+
+left_expression
+ : label
+ (
+ left_expr_atom
+ -> ^(VT_BINDING VAR ^(VT_FIELD left_expr_atom))
+ | LEFT_PAREN left_expr_root RIGHT_PAREN
+ -> ^(VT_BINDING VAR ^(VT_EXPR left_expr_root))
+ )
+ | left_expr_root
+ -> ^(VT_EXPR left_expr_root)
+ ;
+
+left_expr_atom
+ : expr_atom
+ ;
+
+
+expr_atom
+ : accessor_path
+ | VAR
+ | literal
+ ;
+
+
+left_expr_root
+ : accessor_path ( (PLUS | MINUS) factor )*
+ ;
+
+factor
+ : term ( (TIMES | SLASH) term )*
+ ;
+
+term
+ : MINUS? expr_unary
+ ;
+
+expr_unary
+ : expr_atom
+ | LEFT_PAREN! expr_root RIGHT_PAREN!
+ ;
+
+expr_root
+ : factor ( (PLUS | MINUS) factor )*
+ ;
+
+
+
+
+accessor_path
+ : accessor (DOT! accessor)*
+ | VAR (DOT! accessor)+
+ ;
+
+/*
+accessor
+ : ID (LEFT_PAREN! method_args? RIGHT_PAREN!)? indexer?
+ | nested_obj_pattern
+ ;
+*/
+
+
+accessor
+options{
+ backtrack = true;
+}
+ : ID indexer?
+ | method
+ | nested_obj_pattern
+ ;
+
+
+nested_obj_pattern
+ : GATE! (ID (DOT! ID)*)? LEFT_PAREN! constraints RIGHT_PAREN!
+ ;
+
+
+indexer
+ : LEFT_SQUARE!
+ (
+ INT
+ | STRING
+ | ID LEFT_PAREN! method_args RIGHT_PAREN!
+ | GATE! lhs_label_atom_pattern
+ )?
+ RIGHT_SQUARE!
+ ;
+
+
+
+right_expression
+ : expr_root
+ ;
+
+
+/*************************************************** PATTERN SOURCES ******************************************/
+
+over_clause
+ : OVER^ over_elements (COMMA! over_elements)*
+ ;
+
+over_elements
+ : id1=WINDOW COLON
+ ( id2=TIME paren_chunk
+ -> ^(VT_BEHAVIOR $id1 $id2 paren_chunk)
+ | id2=LENGTH LEFT_PAREN INT RIGHT_PAREN
+ -> ^(VT_BEHAVIOR $id1 $id2 INT)
+ )
+ ;
+
+from
+ : FROM^
+ ( accumulate_statement
+ | collect_statement
+ | entrypoint_statement
+ | from_source
+ )
+ ;
+
+
+
+
+collect_statement
+ : COLLECT
+ LEFT_PAREN
+ lhs_label_atom_pattern
+ RIGHT_PAREN
+ -> ^(COLLECT lhs_label_atom_pattern)
+ ;
+
+entrypoint_statement
+ : ENTRYPOINT
+ entrypoint_id
+ -> ^(VT_ENTRYPOINT entrypoint_id)
+ ;
+
+entrypoint_id
+ : value=ID
+ -> VT_ENTRYPOINT_ID[$value]
+ | value=STRING
+ -> VT_ENTRYPOINT_ID[$value]
+ ;
+
+from_source
+ : ID
+ //args=paren_chunk?
+ //expression_chain?
+ //-> ^(VT_FROM_SOURCE ID paren_chunk? expression_chain?)
+ ;
+
+//TODO
+/*
+expression_chain
+ : DOT ID ( paren_chunk | square_chunk )? expression_chain?
+ -> ^(VT_EXPRESSION_CHAIN[$DOT] ID square_chunk? paren_chunk? expression_chain?)
+ ;
+*/
+
+
+
+accumulate_statement
+ : ACCUMULATE
+ LEFT_PAREN
+ lhs_implies
+ COMMA?
+ ( accumulate_init_clause
+ | accumulate_id_clause
+ )
+ RIGHT_PAREN
+ -> ^( ACCUMULATE lhs_implies accumulate_init_clause? accumulate_id_clause? )
+ ;
+
+accumulate_init_clause
+ : INIT
+ pc1=accumulate_paren_chunk cm1=COMMA?
+ ACTION pc2=accumulate_paren_chunk cm2=COMMA?
+ ( REVERSE pc3=accumulate_paren_chunk cm3=COMMA? )?
+ res1=RESULT pc4=accumulate_paren_chunk
+ -> ^(VT_ACCUMULATE_INIT_CLAUSE ^(INIT $pc1) ^(ACTION $pc2) ^(REVERSE $pc3)? ^(RESULT $pc4))
+ ;
+
+
+accumulate_paren_chunk
+ at init{
+ String text = "";
+} : pc=accumulate_paren_chunk_data[false] {text = $pc.text;}
+ -> VT_PAREN_CHUNK[$pc.start,text]
+ ;
+
+accumulate_paren_chunk_data[boolean isRecursive]
+ : lp1=LEFT_PAREN
+ (any=~ ( LEFT_PAREN | RIGHT_PAREN ) | accumulate_paren_chunk_data[true] )*
+ rp1=RIGHT_PAREN
+ ;
+
+accumulate_id_clause
+ : ID paren_chunk
+ -> ^(VT_ACCUMULATE_ID_CLAUSE ID paren_chunk)
+ ;
+
+
+
+
+
+/*************************************************** QUERIES ******************************************/
+
+
+query //TODO
+ : QUERY ID
+ //parameters?
+ lhs_root
+ END
+ -> ^(QUERY ID /*parameters?*/ lhs_root)
+ ;
+
+
+lhs_query
+ : QUESTION_MARK ID LEFT_PAREN positional_constraints? RIGHT_PAREN
+ -> ^(VT_QUERY_PATTERN ID positional_constraints?)
+ ;
+
+
+
+
+
+label
+ : VAR COLON
+ ;
+
+
+inner_quantifier
+ : ALL^
+ | SOME^
+ | VALUE^
+ | COUNT^ (AT! LEFT_SQUARE!
+ (
+ INT
+ | (MAX^ EQUALS! INT)? (MIN^ EQUALS! INT)?
+ )
+ RIGHT_SQUARE!)?
+ ;
+
+
+
+evaluator
+ : (TILDE!)?
+ (
+ simple_evaluator
+ | complex_evaluator
+ | custom_evaluator
+ // TODO : | temporal_evaluator
+ )
+
+ ;
+
+simple_evaluator
+ : EQUAL^
+ | GREATER^
+ | GREATER_EQUAL^
+ | LESS^
+ | LESS_EQUAL^
+ | NOT_EQUAL^
+ ;
+
+complex_evaluator
+ : IN
+ | CONTAINS
+ ;
+
+custom_evaluator
+ : ID square_chunk? //TODO: [] is for backward compat.
+ ;
+
+
+
+
+
+
+
+imply_connective
+ : IMPLIES
+ -> ^(VT_IMPLIES)
+ ;
+
+or_connective
+ : OR
+ -> ^(VT_OR)
+ ;
+
+and_connective
+ : AND
+ -> ^(VT_AND)
+ ;
+
+xor_connective
+ : XOR
+ -> ^(VT_XOR)
+ ;
+
+eq_connective
+ : EQUIV
+ -> ^(VT_EQUIV)
+ ;
+
+
+imply_symbol
+ : ARROW
+ -> ^(VT_IMPLIES)
+ ;
+
+or_symbol
+ : DOUBLE_PIPE
+ -> ^(VT_OR)
+ ;
+
+and_symbol
+ : DOUBLE_AMPER
+ -> ^(VT_AND)
+ ;
+
+xor_symbol
+ : DOUBLE_CAP
+ -> ^(VT_XOR)
+ ;
+
+eq_symbol
+ : DOUBLE_ANG
+ -> ^(VT_EQUIV)
+ ;
+
+
+unary_operator
+ : NEG
+ -> ^(VT_NEG)
+ | hedge^
+ ;
+
+
+hedge
+ : VERY
+ -> ^(VT_HEDGE_VERY)
+ | MOL
+ -> ^(VT_HEDGE_VERY)
+ ;
+
+
+
+
+
+then_part
+ :
+ rhs_structured
+ | rhs_chunk
+ ;
+
+
+rhs_structured
+ : DO LEFT_CURLY!
+ rhs_atom*
+ RIGHT_CURLY!
+ ;
+
+rhs_atom
+ : rhs_insert
+ | rhs_insert_logical
+ | rhs_retract
+ | rhs_retract_logical
+ | rhs_update
+ | rhs_modify
+ | rhs_side_effect
+ ;
+
+rhs_insert
+ : INSERT^ literal_object
+ SEMICOLON!
+ ;
+
+rhs_insert_logical
+ : INSERT_LOG^ literal_object
+ SEMICOLON!
+ ;
+
+rhs_retract
+ : RETRACT^
+ ( literal_object
+ | VAR
+ )
+ SEMICOLON!
+ ;
+
+rhs_retract_logical
+ : RETRACT_LOG^
+ ( literal_object
+ | VAR
+ )
+ SEMICOLON!
+ ;
+
+rhs_update
+ : UPDATE^
+ VAR
+ SEMICOLON!
+ ;
+
+rhs_modify
+ : MODIFY^ LEFT_PAREN! VAR RIGHT_PAREN!
+ LEFT_CURLY!
+ accessor_path
+ (COMMA! accessor_path)*
+ RIGHT_CURLY!
+ SEMICOLON?
+ ;
+
+rhs_side_effect
+ at init{
+ String text = "";
+}
+ : (DOUBLE_LESS | LESS dialect=(JAVA | MVEL) LESS)
+ rc=side_effect_chunk {text = $rc.text;}
+ DOUBLE_GREATER
+ -> {dialect==null}? VT_RHS_CHUNK[$rc.start,text]
+ -> ^(VT_DIALECT[dialect] VT_RHS_CHUNK[$rc.start,text])
+ ;
+
+side_effect_chunk
+ : ~ ( END | DOUBLE_GREATER )*
+ ;
+
+
+
+
+
+
+rhs_chunk
+ at init{
+ String text = "";
+} : THEN
+ rc=rhs_chunk_data {text = $rc.text;}
+ END
+ SEMICOLON?
+ -> VT_RHS_CHUNK[$rc.start,text]
+ ;
+
+rhs_chunk_data
+ :
+ ~END*
+ ;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+curly_chunk
+ at init{
+ String text = "";
+} : cc=curly_chunk_data[false] {text = $cc.text;}
+ -> VT_CURLY_CHUNK[$cc.start,text]
+ ;
+
+curly_chunk_data[boolean isRecursive]
+ : lc1=LEFT_CURLY
+ (any=~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk_data[true] )*
+ rc1=RIGHT_CURLY
+ ;
+
+square_chunk
+ at init{
+ String text = "";
+} : sc=square_chunk_data[false] {text = $sc.text;}
+ -> VT_SQUARE_CHUNK[$sc.start,text]
+ ;
+
+square_chunk_data[boolean isRecursive]
+ : ls1=LEFT_SQUARE
+ (any=~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk_data[true] )*
+ rs1=RIGHT_SQUARE
+ ;
+
+
+paren_chunk
+ at init{
+ String text = "";
+} : cc=paren_chunk_data[false] {text = $cc.text;}
+ -> VT_PAREN_CHUNK[$cc.start,text]
+ ;
+
+paren_chunk_data[boolean isRecursive]
+ : lc1=LEFT_PAREN
+ (any=~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk_data[true] )*
+ rc1=RIGHT_PAREN
+ ;
+
Added: labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/Rule_Test.java
===================================================================
--- labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/Rule_Test.java (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/Rule_Test.java 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,1307 @@
+package org.drools.lang;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Date;
+
+import org.antlr.runtime.ANTLRInputStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.ParserRuleReturnScope;
+import org.antlr.runtime.tree.CommonTree;
+import org.drools.util.ParsingResult;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class Rule_Test {
+
+
+ private static FileWriter writer;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ writer = new FileWriter("out/DRLv6Log.txt");
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ writer.flush();
+ writer.close();
+ }
+
+ @Before
+ public void setUp() throws Exception {
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+
+ }
+
+
+ @Test
+ public void test_compilation_unit() {
+ String rule = "compilation_unit";
+ String testDRL = "" +
+ "package org.pack.subpack;\n" +
+ "import org.klass;\n" +
+ "\n" +
+ "declare Klass\n" +
+ "end\n" +
+ "\n" +
+ "rule \"ruel\"\n" +
+ "when\n" +
+ "then\n" +
+ "end\n";
+ ;
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_package_statement() {
+ String rule = "package_statement";
+ String testDRL[] = {
+ "package this.isa.pack ;",
+ "package semi.colon.is.optional ",
+ "package simplePack",
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_global() {
+ String rule = "global";
+ String testDRL[] = {
+ "global int N ",
+ "global org.it.pack.String strix ;"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_data_type() {
+ String rule = "data_type";
+ String[] testDRL = new String[] {
+ "String",
+ "int",
+ "float[]",
+ "org.pack.data.Claxx[]",
+ "int[][][]"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+
+
+ @Test
+ public void test_import_statement() {
+ String rule = "import_statement";
+ String testDRL[] = {
+ "import jav.lang.String",
+ "import Test ; ",
+ "import jav.pack.*"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_function_import_statement() {
+ String rule = "function_import_statement";
+ String testDRL = "import function org.pack.square";
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_function() {
+ String rule = "function";
+ String[] testDRL = {
+ "function float square( float x ) { ... x*x ... }",
+ "function process( int x, org.String zz ) { ... ... }"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_parameters() {
+ String rule = "parameters";
+ String[] testDRL = {
+ "( int a, org.klass.AnType obj, String[][] argz )"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_type_declaration() {
+ String rule = "type_declaration";
+ String[] testDRL = {
+ "declare Student" + "\n" +
+ " @role(entity) " + "\n" +
+ " @namespace(myNS=\"http:\\\\www.stix.com\\domain\\subd#\") " + "\n" +
+ " @subclass(Person)" + "\n" +
+ " age : int " + "\n" +
+ " name : String " + "\n" +
+ " end \n",
+
+ "declare HasFriend " + "\n" +
+ "@role(property) " + "\n" +
+ "@namespace(myNS=\"http:\\\\www.somens.com\\arg\\test#\") " + "\n" +
+ "@subproperty(Knows) " + "\n" +
+ "@disjoint(HasEnemy) " + "\n" +
+ "@symmetric " + "\n" +
+ "subject : Person " + "\n" +
+ "object : Person " + "\n" +
+ "end " + "\n",
+
+ "declare HasSpouse " + "\n" +
+ "@role(property) " + "\n" +
+ "@namespace(myNS=\"http:\\\\www.somens.com\\arg\\test#\") " + "\n" +
+ "@symmetric " + "\n" +
+ "@transitive " + "\n" +
+ "@inverse(HasSpouse) " + "\n" +
+ "subject = (\"john\") : Person @[key] " + "\n" +
+ "object : Person @[key] " + "\n" +
+ "end \n"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_type_declare_attribute() {
+ String rule = "type_declare_attribute";
+ String[] testDRL = {
+ "@role(event)",
+ "@role(type)",
+ "@role(entity)",
+ "@role(property)",
+ "@namespace( alias = \"http:\\\\www.org.dom\\arg# \")",
+ "@subclass(Type)",
+ "@subproperty(SomeProperty)",
+ "@disjoint(AnotherType)",
+ "@symmetric",
+ "@transitive",
+ "@inverse(ReverseProperty)"
+
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_decl_field() {
+ String rule = "decl_field";
+ String[] testDRL = {
+ "field = (...) : datatype[][] @[key]"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_rule() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"ruleName\" extends \"anotherRule\" " + "\n" +
+ " salience 100 " + "\n" +
+ " no-loop " + "\n" +
+ " calendar \"s1\" , \"s2\" " + "\n" +
+ "when" + "\n" +
+ "then" + "\n" +
+ "end" + "\n"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_rule_attributes() {
+ String rule = "rule_attribute";
+ String[] testDRL = {
+ "salience 100",
+ "no-loop true",
+ "agenda-group \"test-group\"",
+ "activation-group \"act-group\"",
+ "auto-focus false",
+ "effective \"2010-04-12\"",
+ "expires \"2010-04-12\"",
+ "enabled true",
+ "ruleflow-group \"act-group\"",
+ "agenda-group \"act-group\"",
+ "duration 100",
+ "timer 100",
+//TODO: fails as stand-alone, but works in context..
+// "calendar \"s1\" , \"s2\" ",
+ "dialect \"java\" ",
+ "lock-on-active true",
+ "defeats \"anotherRule\" ",
+ "deductive",
+ "abductive",
+ "equivalence",
+ "deduction @[crisp]",
+ "implication @[crisp]"
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_operator_attributes() {
+ String rule = "operator_attributes";
+ String[] testDRL = {
+ "@[" + "\n" +
+ "kind=\"lukasiewicz\", " + "\n" +
+ "id=\"myID\", " + "\n" +
+ "params=\"addit,args,2,more\", " + "\n" +
+ "degree=\"[0.3,0.2]\", " + "\n" +
+ "crisp," + "\n" +
+ "default," + "\n" +
+ "defeat," + "\n" +
+ "merge=\"mStrat\", " + "\n" +
+ "filter=\"fStrat\", " + "\n" +
+ "missing=\"sStrat\" " + "\n" +
+ "]",
+ };
+
+ check(rule,testDRL);
+
+ }
+
+
+ @Test
+ public void test_lhs_root() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "Bus() Car() Taxi()" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_lhs_implies() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "$p : Person() implies @[kind=\"anImpl\"] Dog()" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_lhs_or() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "Car() or @[kind=\"anOr\"] Taxi() or @[kind=\"anotherOr\"] Bus()" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_lhs_diff() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "$p : Person() xor Dog()" +
+ "then end",
+
+ "rule test when " +
+ "(Person() xor Dog()) equiv Cat()" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+
+ @Test
+ public void test_lhs_and() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "Car() and Taxi() and Bus()" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_lhs_root_complex() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule test when " +
+ "(P() implies Q()) implies ( (K() equiv K()) or Z() and X() )" +
+ "then end"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_lhs_modified_unary() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "neg @[crisp] very @[crisp] Person() " +
+ "then end",
+
+ "rule \"r\" when " +
+ "$lab : Person()" +
+ "then end",
+
+ "rule \"r\" when " +
+ "(Person() implies Dog())" +
+ "then end"
+
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_lhs_exists() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "exists @[crisp] ( $p : Person() and $d : Dog() ) " +
+ "then end",
+
+ "rule \"r\" when " +
+ " $p : exists Person() " +
+ "then end",
+
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_lhs_not() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "not @[crisp] ( $p : Person() and $d : Dog() ) " +
+ "then end",
+
+ "rule \"r\" when " +
+ " not Person() " +
+ "then end",
+
+ };
+
+ check(rule,testDRL);
+ }
+
+ @Test
+ public void test_lhs_forall() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "forall @[crisp] Person() " +
+ "then end",
+
+ "rule \"r\" when " +
+ "forall ( $p : Person() " +
+ " Person() ) " +
+ "then end",
+
+ "rule \"r\" when " +
+ "forall ( $p : Person() " +
+ " (Person() Dog()) ) " +
+ "then end",
+
+ "rule \"r\" when " +
+ "forall ( ($p : Person() $d : Dog() )" +
+ " ( Person() Dog() ) " +
+ " ) " +
+ "then end",
+
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_lhs_label_atom_pattern() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "$p : Person() " +
+ "then end",
+
+ "rule \"r\" when " +
+ "Person() @[crisp]" +
+ "then end",
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_constraints() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "Person( \"john\" , 18, height > 150) " +
+ "then end",
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_positional_constraint() {
+ String rule = "rule";
+ String[] testDRL = {
+ "rule \"r\" when " +
+ "Person( \"john\" , 18, 2.0, true, null, new Dog(), {12, $x, \"test\" }, $var) " +
+ "then end",
+ };
+
+ check(rule,testDRL);
+ }
+
+
+
+ @Test
+ public void test_literal_object() {
+ String rule = "literal_object";
+ String[] testDRL = {
+ "new Thing(13, $var, true)"
+ };
+
+ check(rule,testDRL);
+ }
+
+
+ @Test
+ public void test_method_args() {
+ String rule = "literal_object";
+ String[] testDRL = {
+ "new Obj(12 - 13*($var*2 + sqrt(4)))"
+ };
+
+ check(rule,testDRL);
+ }
+
+ /*
+ method_expr_root
+ : method_expr_atom ( (PLUS | MINUS) method_factor )*
+ ;
+
+ method_factor
+ : method_term ( (TIMES | SLASH) method_term )*
+ ;
+
+ method_term
+ : MINUS? method_expr_unary
+ ;
+
+ method_expr_unary
+ : method_expr_atom
+ | LEFT_PAREN! method_expr_root RIGHT_PAREN!
+ ;
+
+ method_expr_atom
+ : VAR
+ | literal
+ | method
+ ;
+
+ method
+ : ID LEFT_PAREN! method_args? RIGHT_PAREN!
+ ;
+ */
+
+ /*
+ @Test
+ public void test_ {
+ String rule = "";
+ String[] testDRL = {
+ ""
+ };
+
+ check(rule,testDRL);
+ }
+ */
+
+
+/*
+
+
+
+
+
+
+ // method expr roots can't start with () and have a slightly simpler structure than outer expressions
+
+
+
+ constr_implies
+ : left=constr_or (imp=imply_connective operator_attributes? right=constr_or)?
+ -> {imp != null}? ^($imp operator_attributes? $left $right)
+ -> ^($left)
+ ;
+
+ constr_or
+ @init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+ }
+ : ld=constr_diff
+ {seq=ld;}
+ ( lios=constr_or_sequitur[seq.getTree()]
+ {seq=lios;}
+ )*
+ -> {lios==null}? ^($ld)
+ -> ^($lios)
+ ;
+
+ constr_or_sequitur[Object leftChild]
+ : or=or_connective^ (atts=operator_attributes!)? rightChild=constr_diff!
+ {
+ Tree t = ((Tree) or.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+
+ constr_diff
+ : constr_and (( xor_connective^ | eq_connective^ ) operator_attributes? constr_and)?
+ ;
+
+
+
+
+
+ constr_and
+ @init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+ }
+ : ld=constr_unary
+ {seq=ld;}
+ ( lias=constr_and_sequitur[seq.getTree()]
+ {seq=lias;}
+ )*
+ -> {lias==null}? ^($ld)
+ -> ^($lias)
+ ;
+
+ constr_and_sequitur[Object leftChild]
+ : and=and_connective^ (atts=operator_attributes!)? rightChild=constr_unary!
+ {
+ Tree t = ((Tree) and.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+ constr_unary
+ : unary_operator operator_attributes? constr_unary
+ | constr_atom
+ | LEFT_PAREN! constr_implies RIGHT_PAREN!
+ ;
+
+ constr_atom
+ : left_expression restriction_root^?
+ ;
+
+
+
+ restriction_root
+ : restr_implies
+ ;
+
+
+ restr_implies
+ : left=restr_or (imp=imply_symbol operator_attributes? right=restr_or)?
+ -> {imp != null}? ^($imp operator_attributes? $left $right)
+ -> ^($left)
+ ;
+
+ restr_or
+ @init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+ }
+ : ld=restr_diff
+ {seq=ld;}
+ ( lios=restr_or_sequitur[seq.getTree()]
+ {seq=lios;}
+ )*
+ -> {lios==null}? ^($ld)
+ -> ^($lios)
+ ;
+
+ restr_or_sequitur[Object leftChild]
+ : or=or_symbol^ (atts=operator_attributes!)? rightChild=restr_diff!
+ {
+ Tree t = ((Tree) or.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+
+ restr_diff
+ : restr_and (( xor_symbol^ | eq_symbol^ ) operator_attributes? restr_and)?
+ ;
+
+
+
+
+
+ restr_and
+ @init{
+ Token orToken = null;
+ ParserRuleReturnScope seq = null;
+ }
+ : ld=restr_unary
+ {seq=ld;}
+ ( lias=restr_and_sequitur[seq.getTree()]
+ {seq=lias;}
+ )*
+ -> {lias==null}? ^($ld)
+ -> ^($lias)
+ ;
+
+ restr_and_sequitur[Object leftChild]
+ : and=and_symbol^ (atts=operator_attributes!)? rightChild=restr_unary!
+ {
+ Tree t = ((Tree) and.getTree());
+ if (atts != null)
+ t.addChild((Tree) atts.getTree());
+
+ t.addChild((Tree) leftChild);
+ t.addChild((Tree) rightChild.getTree());
+ }
+ ;
+
+
+
+ restr_unary
+ : unary_operator operator_attributes? restr_unary
+ | LEFT_PAREN! restr_implies RIGHT_PAREN!
+ | restr_atom
+ ;
+
+
+ restr_atom
+ : qnt=inner_quantifier? eval=evaluator operator_attributes? right_expression
+ -> {qnt==null}? ^(evaluator operator_attributes? right_expression)
+ -> ^(inner_quantifier ^(evaluator operator_attributes? right_expression))
+ ;
+
+
+
+
+
+
+ left_expression
+ : label
+ (
+ left_expr_atom
+ -> ^(VT_BINDING VAR ^(VT_FIELD left_expr_atom))
+ | LEFT_PAREN left_expr_root RIGHT_PAREN
+ -> ^(VT_BINDING VAR ^(VT_EXPR left_expr_root))
+ )
+ | left_expr_root
+ -> ^(VT_EXPR left_expr_root)
+ ;
+
+ left_expr_atom
+ : expr_atom
+ ;
+
+
+ expr_atom
+ : accessor_path
+ | VAR
+ | literal
+ ;
+
+
+ left_expr_root
+ : accessor_path ( (PLUS | MINUS) factor )*
+ ;
+
+ factor
+ : term ( (TIMES | SLASH) term )*
+ ;
+
+ term
+ : MINUS? expr_unary
+ ;
+
+ expr_unary
+ : expr_atom
+ | LEFT_PAREN! expr_root RIGHT_PAREN!
+ ;
+
+ expr_root
+ : factor ( (PLUS | MINUS) factor )*
+ ;
+
+
+
+
+ accessor_path
+ : accessor (DOT! accessor)*
+ | VAR (DOT! accessor)+
+ ;
+
+
+ accessor
+ options{
+ backtrack = true;
+ }
+ : ID indexer?
+ | method
+ | nested_obj_pattern
+ ;
+
+
+ nested_obj_pattern
+ : GATE! (ID (DOT! ID)*)? LEFT_PAREN! constraints RIGHT_PAREN!
+ ;
+
+
+ indexer
+ : LEFT_SQUARE!
+ (
+ INT
+ | STRING
+ | ID LEFT_PAREN! method_args RIGHT_PAREN!
+ | GATE! lhs_label_atom_pattern
+ )?
+ RIGHT_SQUARE!
+ ;
+
+
+
+ right_expression
+ : expr_root
+ ;
+
+
+ over_clause
+ : OVER^ over_elements (COMMA! over_elements)*
+ ;
+
+ over_elements
+ : id1=WINDOW COLON
+ ( id2=TIME paren_chunk
+ -> ^(VT_BEHAVIOR $id1 $id2 paren_chunk)
+ | id2=LENGTH LEFT_PAREN INT RIGHT_PAREN
+ -> ^(VT_BEHAVIOR $id1 $id2 INT)
+ )
+ ;
+
+ from
+ : FROM^
+ ( accumulate_statement
+ | collect_statement
+ | entrypoint_statement
+ | from_source
+ )
+ ;
+
+
+
+
+ collect_statement
+ : COLLECT
+ LEFT_PAREN
+ lhs_label_atom_pattern
+ RIGHT_PAREN
+ -> ^(COLLECT lhs_label_atom_pattern)
+ ;
+
+ entrypoint_statement
+ : ENTRYPOINT
+ entrypoint_id
+ -> ^(VT_ENTRYPOINT entrypoint_id)
+ ;
+
+ entrypoint_id
+ : value=ID
+ -> VT_ENTRYPOINT_ID[$value]
+ | value=STRING
+ -> VT_ENTRYPOINT_ID[$value]
+ ;
+
+ from_source
+ : ID
+ //args=paren_chunk?
+ //expression_chain?
+ //-> ^(VT_FROM_SOURCE ID paren_chunk? expression_chain?)
+ ;
+
+ //TODO
+
+ //expression_chain
+ // : DOT ID ( paren_chunk | square_chunk )? expression_chain?
+ // -> ^(VT_EXPRESSION_CHAIN[$DOT] ID square_chunk? paren_chunk? expression_chain?)
+ // ;
+ //
+
+
+
+ accumulate_statement
+ : ACCUMULATE
+ LEFT_PAREN
+ lhs_implies
+ COMMA?
+ ( accumulate_init_clause
+ | accumulate_id_clause
+ )
+ RIGHT_PAREN
+ -> ^( ACCUMULATE lhs_implies accumulate_init_clause? accumulate_id_clause? )
+ ;
+
+ accumulate_init_clause
+ : INIT
+ pc1=accumulate_paren_chunk cm1=COMMA?
+ ACTION pc2=accumulate_paren_chunk cm2=COMMA?
+ ( REVERSE pc3=accumulate_paren_chunk cm3=COMMA? )?
+ res1=RESULT pc4=accumulate_paren_chunk
+ -> ^(VT_ACCUMULATE_INIT_CLAUSE ^(INIT $pc1) ^(ACTION $pc2) ^(REVERSE $pc3)? ^(RESULT $pc4))
+ ;
+
+
+ accumulate_paren_chunk
+ @init{
+ String text = "";
+ } : pc=accumulate_paren_chunk_data[false] {text = $pc.text;}
+ -> VT_PAREN_CHUNK[$pc.start,text]
+ ;
+
+ accumulate_paren_chunk_data[boolean isRecursive]
+ : lp1=LEFT_PAREN
+ (any=~ ( LEFT_PAREN | RIGHT_PAREN ) | accumulate_paren_chunk_data[true] )*
+ rp1=RIGHT_PAREN
+ ;
+
+ accumulate_id_clause
+ : ID paren_chunk
+ -> ^(VT_ACCUMULATE_ID_CLAUSE ID paren_chunk)
+ ;
+
+
+ query //TODO
+ : QUERY ID
+ parameters?
+ lhs_root
+ END
+ -> ^(QUERY ID parameters? lhs_root)
+ ;
+
+
+ lhs_query
+ : QUESTION_MARK ID LEFT_PAREN positional_constraints? RIGHT_PAREN
+ -> ^(VT_QUERY_PATTERN ID positional_constraints?)
+ ;
+
+
+
+
+
+ label
+ : VAR COLON
+ ;
+
+
+ inner_quantifier
+ : ALL^
+ | SOME^
+ | VALUE^
+ | COUNT^ (AT! LEFT_SQUARE!
+ (
+ INT
+ | (MAX^ EQUALS! INT)? (MIN^ EQUALS! INT)?
+ )
+ RIGHT_SQUARE!)?
+ ;
+
+
+
+ evaluator
+ : (TILDE!)?
+ (
+ simple_evaluator
+ | complex_evaluator
+ | custom_evaluator
+ // TODO : | temporal_evaluator
+ )
+
+ ;
+
+ simple_evaluator
+ : EQUAL^
+ | GREATER^
+ | GREATER_EQUAL^
+ | LESS^
+ | LESS_EQUAL^
+ | NOT_EQUAL^
+ ;
+
+ complex_evaluator
+ : IN
+ | CONTAINS
+ ;
+
+ custom_evaluator
+ : ID square_chunk? //TODO: [] is for backward compat.
+ ;
+
+
+
+
+
+
+
+ imply_connective
+ : IMPLIES
+ -> ^(VT_IMPLIES)
+ ;
+
+ or_connective
+ : OR
+ -> ^(VT_OR)
+ ;
+
+ and_connective
+ : AND
+ -> ^(VT_AND)
+ ;
+
+ xor_connective
+ : XOR
+ -> ^(VT_XOR)
+ ;
+
+ eq_connective
+ : EQUIV
+ -> ^(VT_EQUIV)
+ ;
+
+
+ imply_symbol
+ : ARROW
+ -> ^(VT_IMPLIES)
+ ;
+
+ or_symbol
+ : DOUBLE_PIPE
+ -> ^(VT_OR)
+ ;
+
+ and_symbol
+ : DOUBLE_AMPER
+ -> ^(VT_AND)
+ ;
+
+ xor_symbol
+ : DOUBLE_CAP
+ -> ^(VT_XOR)
+ ;
+
+ eq_symbol
+ : DOUBLE_ANG
+ -> ^(VT_EQUIV)
+ ;
+
+
+ unary_operator
+ : NEG
+ -> ^(VT_NEG)
+ | hedge^
+ ;
+
+
+ hedge
+ : VERY
+ -> ^(VT_HEDGE_VERY)
+ | MOL
+ -> ^(VT_HEDGE_VERY)
+ ;
+
+
+
+
+
+ then_part
+ :
+ rhs_structured
+ | rhs_chunk
+ ;
+
+
+ rhs_structured
+ : DO LEFT_CURLY!
+ rhs_atom*
+ RIGHT_CURLY!
+ ;
+
+ rhs_atom
+ : rhs_insert
+ | rhs_insert_logical
+ | rhs_retract
+ | rhs_retract_logical
+ | rhs_update
+ | rhs_modify
+ | rhs_side_effect
+ ;
+
+ rhs_insert
+ : INSERT^ literal_object
+ SEMICOLON!
+ ;
+
+ rhs_insert_logical
+ : INSERT_LOG^ literal_object
+ SEMICOLON!
+ ;
+
+ rhs_retract
+ : RETRACT^
+ ( literal_object
+ | VAR
+ )
+ SEMICOLON!
+ ;
+
+ rhs_retract_logical
+ : RETRACT_LOG^
+ ( literal_object
+ | VAR
+ )
+ SEMICOLON!
+ ;
+
+ rhs_update
+ : UPDATE^
+ VAR
+ SEMICOLON!
+ ;
+
+ rhs_modify
+ : MODIFY^ LEFT_PAREN! VAR RIGHT_PAREN!
+ LEFT_CURLY!
+ accessor_path
+ (COMMA! accessor_path)*
+ RIGHT_CURLY!
+ SEMICOLON?
+ ;
+
+ rhs_side_effect
+ @init{
+ String text = "";
+ }
+ : (DOUBLE_LESS | LESS dialect=(JAVA | MVEL) LESS)
+ rc=side_effect_chunk {text = $rc.text;}
+ DOUBLE_GREATER
+ -> {dialect==null}? VT_RHS_CHUNK[$rc.start,text]
+ -> ^(VT_DIALECT[dialect] VT_RHS_CHUNK[$rc.start,text])
+ ;
+
+ side_effect_chunk
+ : ~ ( END | DOUBLE_GREATER )*
+ ;
+
+
+
+
+
+
+ rhs_chunk
+ @init{
+ String text = "";
+ } : THEN
+ rc=rhs_chunk_data {text = $rc.text;}
+ END
+ SEMICOLON?
+ -> VT_RHS_CHUNK[$rc.start,text]
+ ;
+
+ rhs_chunk_data
+ :
+ ~END*
+ ;
+
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ private void check(String rule, String testDRL) {
+ check(rule, new String[] {testDRL});
+ }
+
+ private void check(String rule, String[] testDRL) {
+ ParsingResult[] res = parseAndTest(rule, testDRL);
+
+ for (int j = 0; j < res.length; j++) {
+ log(rule, res[j].toString(true));
+ assertTrue(res[j].isSuccess());
+ System.out.println("Check " + rule + " >> " + res[j].getParseTime());
+ }
+ }
+
+
+
+ public ParsingResult[] parseAndTest(String rule, String[] drl) {
+ ParsingResult[] ans = new ParsingResult[drl.length];
+ int j = 0;
+
+ Method ruleM;
+ try {
+ ruleM = DRLv6Parser.class.getMethod(rule);
+ } catch (SecurityException e) {
+ return null;
+ } catch (NoSuchMethodException e) {
+ return null;
+ }
+
+
+ for (String drlString : drl) {
+ ParsingResult res = new ParsingResult();
+
+ res.setSource(drlString);
+
+ try {
+ DRLv6Lexer lexer = new DRLv6Lexer( new ANTLRInputStream( new ByteArrayInputStream(drlString.getBytes()) ));
+ DRLv6Parser parser = new DRLv6Parser(new CommonTokenStream( lexer ));
+
+
+ long start = new Date().getTime();
+ ParserRuleReturnScope root;
+ root = (ParserRuleReturnScope) ruleM.invoke(parser);
+ long after = new Date().getTime();
+
+ CommonTree resultTree = (CommonTree) root.getTree();
+
+ int errors = parser.getNumberOfSyntaxErrors();
+
+ res.setNumErrors(errors);
+ res.setTree(resultTree);
+ res.setParseTime(after-start);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ res.setError(e);
+ } finally {
+ ans[j++] = res;
+ }
+ }
+
+ return ans;
+ }
+
+
+
+ private void log(String rule, String body) {
+ try {
+ writer.write("**************************************\n");
+ writer.write(rule+"\n");
+ writer.write("**************************************\n");
+ writer.write(body+"\n");
+ } catch (IOException e) {
+
+ }
+
+ }
+
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
Property changes on: labs/jbossrules/branches/DRLv6/src/test/java/org/drools/lang/Rule_Test.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossrules/branches/DRLv6/src/test/java/org/drools/util/ParsingResult.java
===================================================================
--- labs/jbossrules/branches/DRLv6/src/test/java/org/drools/util/ParsingResult.java (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/test/java/org/drools/util/ParsingResult.java 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,169 @@
+package org.drools.util;
+
+import org.antlr.runtime.tree.CommonTree;
+
+
+public class ParsingResult {
+
+ private CommonTree tree = null;
+ private long parseTime = -1;
+ private int numErrors = -1;
+ private Exception error = null;
+ private String source = null;
+
+
+ public boolean isSuccess() {
+ return source != null && numErrors == 0 && error == null;
+ }
+
+ public String toString(boolean verbose) {
+ StringBuffer buf = new StringBuffer();
+ buf.append(">>>> RESULT : ");
+ if (error != null) {
+ buf.append(" EXCEPTION \n").append(error.toString()).append("\n");
+ } else
+ if (numErrors > 0) {
+ buf.append(" FAILURE ").append(" -- " + numErrors + " errors").append("\n");
+ } else {
+ buf.append(" SUCCESS \n");
+ }
+ buf.append(">> TIME to parse " + parseTime).append("\n");
+
+ if (verbose) {
+ if (source != null)
+ buf.append(">> SOURCE : \n").append(source).append("\n");
+ if (tree != null)
+ buf.append(">> OUTPUT : \n").append(toIndentedStringTree());
+ }
+
+ return buf.toString();
+
+ }
+
+
+ public String toString() {
+ return toString(false);
+ }
+
+
+
+ public String toIndentedStringTree() {
+ String ts = new String(tree.toStringTree());
+
+ //ts = ts.substring(0, ts.indexOf("then"));
+ StringBuilder sb = new StringBuilder();
+ int dep = 0;
+ for (int j = 0; j < ts.length(); j++) {
+ if (ts.charAt(j) == '(') {
+ dep++;
+
+ sb.append("\n");
+ for (int k = 0; k < dep; k++)
+ sb.append("\t");
+ sb.append(ts.charAt(j));
+
+ } else
+ if (ts.charAt(j) == ')') {
+ sb.append("\n");
+ for (int k = 0; k < dep; k++)
+ sb.append("\t");
+ sb.append(ts.charAt(j));
+ dep--;
+ } else {
+ sb.append(ts.charAt(j));
+ }
+ }
+
+ return sb.toString();
+ }
+
+
+
+
+
+
+ public CommonTree getTree() {
+ return tree;
+ }
+
+
+
+
+
+
+ public void setTree(CommonTree resultTree) {
+ this.tree = resultTree;
+ }
+
+
+
+
+
+
+ public long getParseTime() {
+ return parseTime;
+ }
+
+
+
+
+
+
+ public void setParseTime(long parseTime) {
+ this.parseTime = parseTime;
+ }
+
+
+
+
+
+
+ public int getNumErrors() {
+ return numErrors;
+ }
+
+
+
+
+
+
+ public void setNumErrors(int numErrors) {
+ this.numErrors = numErrors;
+ }
+
+
+
+
+
+
+ public Exception getError() {
+ return error;
+ }
+
+
+
+
+
+
+ public void setError(Exception error) {
+ this.error = error;
+ }
+
+
+
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+
+
+
+ public String getSource() {
+ return source;
+ }
+
+
+
+
+}
Added: labs/jbossrules/branches/DRLv6/src/test/resources/langTestAll.drl
===================================================================
--- labs/jbossrules/branches/DRLv6/src/test/resources/langTestAll.drl (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/test/resources/langTestAll.drl 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,194 @@
+
+
+
+
+rule "inner terms"
+when
+ Person( name== "mark", age == 34, address{ city == "london", country == "uk"} )
+then end
+
+rule "positional"
+when
+ Person( "mark", 34 )
+ Person( "mark", 34, address{"london", "uk"} )
+then end
+
+
+rule "mixed positional"
+when
+ Person( "mark", age == 34, address{"london", country == "uk"} )
+then end
+
+rule "full positional with inner"
+when
+ Person( "mark", 34, addres{ "london", "uk" } )
+then end
+
+
+rule "match list"
+when
+ Person( list in {"zis", "iz", "lizt"} )
+then end
+
+
+rule "nested dot-acc"
+when
+ Person( name== "mark", age == 34, address.country == "uk" ) // nested address object
+then end
+
+rule "equivalent forms"
+when
+ Person( name== "mark", age == 34, address.country == "uk" ) // nested address object
+ Person( name== "mark", age == 34, address{country == "uk"} ) // nested address object
+then end
+
+
+
+
+rule "methods"
+when
+ Person( someMethod(1,2) == $x, address.someMethod(3,4) == $y, $z : someOtherMethod(5,6) )
+then end
+
+rule "nested pattern"
+when
+ $p : Person( name == "mark", age == 34, address == /Address( owner == "p, .......) )
+then end
+
+
+
+rule "innerquery"
+when
+ Person( name == "mark", age == 34, address == ?query(.....) )
+then end
+
+rule "querywithterms"
+when
+ ?queryName("a", "b", c{"d", "e", "f"}, "g", h)
+then end
+
+
+
+rule "collection"
+when
+Person( pets[0].age == 15 )
+Person( pets["rover"].age == 15 )
+then end
+
+
+
+
+// not possible, also unclear that iterates for each pet
+// MUST be bound (also resembles JAVA foreach
+/*
+rule "one of many"
+when
+ Person( pets[ {age == 15 } ] )
+then end
+*/
+
+rule "with bindings"
+when
+ $per : Person( $pet : pets[ {age == 15} ] )
+then end
+
+
+rule "method collection"
+when
+$p : Person( $a : someMethodCallToGetAddresses(...)[ {location == "london"} ] )
+then end
+
+
+
+rule "full iteration"
+when
+$per : Person( $pet : pets[] )
+then end
+
+
+
+rule "slight difference :)"
+when
+Person( $p : pets[{15}] ) // would return all pets with an age of 15
+Person( $p : pets[15] ) // would return pet at element 15.
+then end
+
+rule "positional select"
+when
+Person( $p : pets[{"rover"}] ) // a list of pets, get all pets called rover.
+then end
+
+
+
+rule "map access"
+when
+Person( $p : pets["rover"] ) // a map, return the pet called rover.
+then end
+
+
+rule "list accessors"
+when
+Person( pets[last()] )
+then end
+
+
+
+
+
+
+
+rule "bool method"
+when
+Person( someMethodReturnsBoolean(14,"xx") == true )
+then end
+
+
+
+//Person( pets["rover"].age == $otherAge.someMethod( $x ) + 3 ) // notice no (...) delimeter like on return-value
+//Person( pets["rover"].age == ($otherAge.someMethod( $x ) + 3 ) / 2 ) // this has the (...) but it's to indicate ordering in the expr evaluation only
+ // so the / 2 is last
+
+//Person( pets["rover"].age * $v1 == $v2 - 3 ) // expr can be on both sides
+
+
+
+//If we have collection filters, $p will exist for each resulting red pet with appropriate age
+//Person( $p : pets[ { color == "red" ].age * $v1 == $v2 - 3 )
+
+//Although that can be re-wrriten, as mentioned previously
+//Person( $p : pets[ { color == "red", age * $v1 == $v2 - 3 ] )
+
+
+rule "federated"
+when
+?TableName( fieldName == "x", fieldName2 == $y, $v : fieldName3 )
+then end
+
+
+rule "federated_posit"
+when
+?TableName( "x", $y, $v )
+then end
+
+
+
+rule "federated_more"
+when
+ ?Table1( fieldName1 == "x", $v1 : fieldName2 )
+ ?Table2( fieldName2 == $v1, $v2 : fieldNam2 )
+then end
+
+
+rule "quantif query"
+when
+ ?Table1( $v1 :fieldName1 )
+ exists( ?Table2( fieldNAme1 == $v ) )
+then end
+
+
+
+rule "Test"
+when
+ ? Person( $var, 18, $a : age > 18 , ? Address(number == $a) )
+then
+end
Added: labs/jbossrules/branches/DRLv6/src/test/resources/newRuleTest.drl
===================================================================
--- labs/jbossrules/branches/DRLv6/src/test/resources/newRuleTest.drl (rev 0)
+++ labs/jbossrules/branches/DRLv6/src/test/resources/newRuleTest.drl 2010-05-10 22:38:41 UTC (rev 32805)
@@ -0,0 +1,44 @@
+package qualchek;
+
+import org.drools.lang.stix;
+
+
+declare Student
+ @role(entity)
+ @namespace(myNS="http:\\www.somens.com\arg\test#")
+ @subclass(Person)
+ age : int
+ name : String
+end
+
+declare HasFriend
+ @role(property)
+ @namespace(myNS="http:\\www.somens.com\arg\test#")
+ @subproperty(Knows)
+ @disjoint(HasEnemy)
+ @symmetric
+ subject : Person
+ object : Person
+end
+
+declare HasSpouse
+ @role(property)
+ @namespace(myNS="http:\\www.somens.com\arg\test#")
+ @symmetric
+ @transitive
+ @inverse(HasSpouse)
+ subject = ("john") : Person @[key]
+ object : Person @[key]
+end
+
+
+
+
+rule "test"
+calendar "s2", "s3"
+when
+ $b : Bus()
+ and
+ $c : Car()
+then
+end
\ No newline at end of file
More information about the jboss-svn-commits
mailing list