This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git

commit 2703aa1f376d0feef4cc870871b232873bc9209d
Author: mariofusco <[email protected]>
AuthorDate: Mon Feb 14 19:08:30 2022 +0100

    improve drl parser
---
 .../src/main/antlr4/org/drools/parser/DRL.g4       | 1023 +++++++++++++++++++-
 .../java/org/drools/parser/DRLParserHelper.java    |    2 +-
 .../java/org/drools/parser/DRLVisitorImpl.java     |   64 +-
 .../test/java/org/drools/parser/DRLParserTest.java |   43 +-
 4 files changed, 1085 insertions(+), 47 deletions(-)

diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRL.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRL.g4
index e83e84dd5f..6cc31c5e2b 100644
--- a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRL.g4
+++ b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRL.g4
@@ -1,64 +1,1019 @@
 grammar DRL;
 
+@members {
+    public String normalizeString( String input ) {
+        if( input != null && (input.length() == 2 || input.length() >= 4) ) {
+            input = input.substring( 1, input.length() - 1 );
+            input = input.replaceAll( "\'", "'" );
+            input = input.replaceAll( "\"", "\\\"" );
+            input = "\"" + input + "\"";
+        }
+        return input;
+    }
+}
+
+/////////////////
 // KEYWORDS
+/////////////////
 
 PACKAGE : 'package';
+UNIT : 'unit';
 IMPORT : 'import';
+FUNCTION : 'function';
+STATIC : 'static';
+GLOBAL : 'global';
 RULE : 'rule';
+QUERY : 'query';
+EXTENDS : 'extends';
+SUPER : 'super';
 WHEN : 'when';
 THEN : 'then';
 END : 'end';
 
+/////////////////
+// LEXER
+/////////////////
+
+WS : [ \t\r\n\u000C\u00A0]+ -> skip ;
+
+fragment
+EOL    :
+           (        '\r'    // Macintosh
+            |       '\n'    // Unix (the right way)
+            )
+        ;
+
+FLOAT
+    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
+    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent FloatTypeSuffix?
+    |   ('0'..'9')+ FloatTypeSuffix
+    ;
+
+fragment
+Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
+
+fragment
+FloatTypeSuffix : ('f'|'F'|'d'|'D'|'B') ;
+
+HEX    : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
+
+DECIMAL        : ('0'..'9')+ IntegerTypeSuffix? ;
+
+fragment
+IntegerTypeSuffix : ('l'|'L'|'I') ;
+
+STRING
+    :  ('"' ( EscapeSequence | ~('\\'|'"') )* '"')
+    |  ('\'' ( EscapeSequence | ~('\\'|'\'') )* '\'') { setText( 
normalizeString( getText() ) ); }
+    ;
+
+
+TIME_INTERVAL
+    : (('0'..'9')+ 'd') (('0'..'9')+ 'h')?(('0'..'9')+ 'm')?(('0'..'9')+ 
's')?(('0'..'9')+ 'ms'?)?
+    | (('0'..'9')+ 'h') (('0'..'9')+ 'm')?(('0'..'9')+ 's')?(('0'..'9')+ 
'ms'?)?
+    | (('0'..'9')+ 'm') (('0'..'9')+ 's')?(('0'..'9')+ 'ms'?)?
+    | (('0'..'9')+ 's') (('0'..'9')+ 'ms'?)?
+    | (('0'..'9')+ 'ms'?)
+    ;
+
+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
+    ;
+
+/////////////////
+// SYMBOLS
+/////////////////
+
+BOOL : ('true'|'false') ;
+NULL : 'null' ;
+AT : '@' ;
+PLUS_ASSIGN : '+=' ;
+MINUS_ASSIGN : '-=' ;
+MULT_ASSIGN : '*=' ;
+DIV_ASSIGN : '/=' ;
+AND_ASSIGN : '&=' ;
+OR_ASSIGN :    '|=' ;
+XOR_ASSIGN : '^=' ;
+MOD_ASSIGN : '%=' ;
+UNIFY :        ':=' ;
+DECR : '--' ;
+INCR : '++' ;
+ARROW :        '->' ;
+SEMICOLON :    ';' ;
+COLON :        ':' ;
+EQUALS : '==' ;
+NOT_EQUALS : '!=' ;
+GREATER_EQUALS : '>=' ;
+LESS_EQUALS : '<=' ;
+GREATER : '>' ;
+LESS : '<' ;
+EQUALS_ASSIGN :        '=' ;
+LEFT_PAREN : '(' ;
+RIGHT_PAREN : ')' ;
+
+LEFT_SQUARE
+        :      '['
+        ;
+
+RIGHT_SQUARE
+        :      ']'
+        ;
+
+LEFT_CURLY
+        :      '{'
+        ;
+
+RIGHT_CURLY
+        :      '}'
+        ;
+
+COMMA  :       ','
+    ;
+
+DOT    :       '.'
+    ;
+
+NULL_SAFE_DOT :        '!.'
+              ;
+
+DOUBLE_AMPER
+    :  '&&'
+    ;
+
+DOUBLE_PIPE
+    :  '||'
+    ;
+
+QUESTION
+    :  '?'
+    ;
+
+NEGATION
+    :  '!'
+    ;
+
+TILDE
+    :  '~'
+    ;
+
+PIPE
+    :  '|'
+    ;
+
+AMPER
+    :  '&'
+    ;
+
+XOR
+    :  '^'
+    ;
+
+MOD
+    :  '%'
+    ;
+
+STAR   :       '*'
+    ;
+
+MINUS  :       '-'
+    ;
+
+PLUS   :       '+'
+    ;
+
+HASH    :   '#'
+    ;
+
+C_STYLE_SINGLE_LINE_COMMENT
+    :  '//' (~('\r'|'\n'))* (EOL|EOF) -> skip
+    ;
+
+MULTI_LINE_COMMENT
+    :  '/*' (options{greedy=false;} : .)* '*/' -> skip
+    ;
+
+ID
+    :  IdentifierStart IdentifierPart*
+    |  '`' IdentifierStart IdentifierPart* '`'
+    ;
+
+// must come after the commentaries that use 2-character sequences with /
+DIV    :       '/'
+    ;
+
+QUESTION_DIV
+    :  '?/'
+    ;
+
+MISC   :
+        '\'' | '\\' | '$'
+    ;
+
+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')
+    ;
+
+/////////////////
 // PARSER
+/////////////////
+
+compilationunit : packagedef? unitdef? importdef* globaldef* ruledef* ;
 
-compilationunit : packagedef? importdef* ruledef* ;
+packagedef : PACKAGE name=qualifiedIdentifier SEMICOLON? ;
 
-packagedef : PACKAGE FQNAME SEMICOLON? ;
+unitdef : UNIT name=qualifiedIdentifier SEMICOLON? ;
 
-importdef : IMPORT FQNAME (DOT STAR)? SEMICOLON? ;
+importdef : IMPORT (FUNCTION|STATIC)? qualifiedIdentifier (DOT STAR)? 
SEMICOLON? ;
 
-ruledef : RULE IDENTIFIER WHEN lhs THEN rhs END ;
+globaldef : GLOBAL type ID SEMICOLON? ;
 
-lhs : TEXT ;
+ruledef : RULE name=stringId (EXTENDS stringId)? annotation* attributes? WHEN 
lhs THEN rhs END ;
+
+lhs : lhsExpression ;
+lhsExpression : lhsOr* ;
+lhsOr : LEFT_PAREN OR lhsAnd+ RIGHT_PAREN | lhsAnd (OR lhsAnd)* ;
+lhsAnd : LEFT_PAREN AND lhsUnary+ RIGHT_PAREN | lhsUnary (AND lhsUnary)* ;
+
+/*
+lhsUnary : ( lhsExists namedConsequence?
+           | lhsNot namedConsequence?
+           | lhsEval consequenceInvocation*
+           | lhsForall
+           | lhsAccumulate
+           | LEFT_PAREN lhsOr RIGHT_PAREN namedConsequence?
+           | lhsPatternBind consequenceInvocation*
+           ) SEMICOLON? ;
+*/
+
+lhsUnary : lhsPatternBind ;
+lhsPatternBind : label? ( LEFT_PAREN lhsPattern (OR lhsPattern)* RIGHT_PAREN | 
lhsPattern ) ;
+
+/*
+lhsPattern : xpathPrimary (OVER patternFilter)? |
+             ( QUESTION? qualifiedIdentifier LEFT_PAREN positionalConstraints? 
constraints? RIGHT_PAREN (OVER patternFilter)? (FROM patternSource)? ) ;
+*/
+
+lhsPattern : QUESTION? objectType=qualifiedIdentifier LEFT_PAREN 
positionalConstraints? constraints? RIGHT_PAREN ;
+positionalConstraints : constraint (COMMA constraint)* SEMICOLON ;
+constraints : constraint (COMMA constraint)* ;
+constraint : nestedConstraint | conditionalOrExpression ;
+nestedConstraint : ( ID ( DOT | HASH ) )* ID DOT LEFT_PAREN constraints 
RIGHT_PAREN ;
+conditionalOrExpression : left=conditionalAndExpression (DOUBLE_PIPE 
right=conditionalAndExpression)* ;
+conditionalAndExpression : left=inclusiveOrExpression (DOUBLE_AMPER 
right=inclusiveOrExpression)* ;
+inclusiveOrExpression : left=exclusiveOrExpression (PIPE 
right=exclusiveOrExpression)* ;
+exclusiveOrExpression : left=andExpression (XOR right=andExpression)* ;
+andExpression : left=equalityExpression (AMPER right=equalityExpression)* ;
+equalityExpression : left=instanceOfExpression ( ( op=EQUALS | op=NOT_EQUALS ) 
right=instanceOfExpression )* ;
+instanceOfExpression : left=inExpression ( 'instanceof' right=type )? ;
+inExpression : left=relationalExpression ( 'not'? 'in' LEFT_PAREN expression 
(COMMA expression)* RIGHT_PAREN )? ;
+relationalExpression : TEXT? ; // TODO
+
+expression : conditionalExpression ( op=assignmentOperator right=expression )? 
;
+conditionalExpression : left=conditionalOrExpression ternaryExpression? ;
+ternaryExpression : QUESTION ts=expression COLON fs=expression ;
 
 rhs : TEXT ;
 
-// LITERALS
+stringId : ( ID | STRING ) ;
 
-fragment DIGIT : [0-9] ;
-NUMBER         : DIGIT+ ([.,] DIGIT+)? ;
+qualifiedIdentifier : ID ( DOT ID )* ;
 
-fragment LOWERCASE  : [a-z] ;
-fragment UPPERCASE  : [A-Z] ;
-LETTER : (LOWERCASE | UPPERCASE | '_' | '$') ;
+type : ID typeArguments? ( DOT ID typeArguments? )* (LEFT_SQUARE 
RIGHT_SQUARE)* ;
 
-IDENTIFIER : LETTER (LETTER | DIGIT)* ;
-FQNAME : IDENTIFIER (DOT IDENTIFIER)* ;
+typeArguments : LESS typeArgument (COMMA typeArgument)* GREATER ;
+typeArgument : QUESTION (( EXTENDS | SUPER ) type )? |  type ;
 
-// SEPARATORS
+arguments : LEFT_PAREN argument (COMMA argument)* RIGHT_PAREN ;
+argument : ( stringId | FLOAT | BOOL | NULL ) ;
 
-LPAREN : '(';
-RPAREN : ')';
-LBRACE : '{';
-RBRACE : '}';
-LBRACK : '[';
-RBRACK : ']';
-COMMA : ',';
-ELIPSIS : '..';
-DOT : '.';
-COLON : ':';
-SEMICOLON : ';';
-STAR : '*';
+annotation : AT name=qualifiedIdentifier arguments? ;
 
-// OPERATORS
+attributes : attribute ( COMMA? attribute )* ;
+attribute : ( 'salience' DECIMAL )
+          | ( 'enabled' | 'no-loop' | 'auto-focus' | 'lock-on-active' | 
'refract' | 'direct' ) BOOLEAN?
+          | ( 'agenda-group' | 'activation-group' | 'ruleflow-group' | 
'date-effective' | 'date-expires' | 'dialect' ) STRING
+          |   'calendars' STRING ( COMMA STRING )*
+          |   'timer' ( DECIMAL | TEXT )
+          |   'duration' ( DECIMAL | TEXT ) ;
 
-EQUAL : '=';
-GT : '>';
-LT : '<';
-LE : '<=';
-GE : '>=';
-NOTEQUAL : '!=';
+assignmentOperator : EQUALS_ASSIGN
+                   |   PLUS_ASSIGN
+                   |   MINUS_ASSIGN
+                   |   MULT_ASSIGN
+                   |   DIV_ASSIGN
+                   |   AND_ASSIGN
+                   |   OR_ASSIGN
+                   |   XOR_ASSIGN
+                   |   MOD_ASSIGN
+                   |   LESS LESS EQUALS_ASSIGN ;
 
-WS : [ \t\r\n\u000C\u00A0]+ -> skip ;
+label : ID COLON ;
+unif : ID UNIFY ;
 
 fragment TEXT : .+ ;
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserHelper.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserHelper.java
index f036bc90d6..f1c254fa33 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserHelper.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserHelper.java
@@ -118,6 +118,6 @@ public class DRLParserHelper {
         if (node instanceof TerminalNode) {
             return ((TerminalNode) node).getSymbol().getTokenIndex();
         }
-        return node.getChildCount() == 0 ? 0: 
getNodeIndex(node.getChild(node.getChildCount()-1));
+        return node.getChildCount() == 0 ? 0: getNodeIndex(node.getChild(0));
     }
 }
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
index 780076b9ab..9aa2fbce87 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
@@ -1,13 +1,20 @@
 package org.drools.parser;
 
+import org.drools.drl.ast.descr.AnnotationDescr;
+import org.drools.drl.ast.descr.AttributeDescr;
+import org.drools.drl.ast.descr.GlobalDescr;
 import org.drools.drl.ast.descr.ImportDescr;
 import org.drools.drl.ast.descr.PackageDescr;
+import org.drools.drl.ast.descr.PatternDescr;
 import org.drools.drl.ast.descr.RuleDescr;
+import org.drools.drl.ast.descr.UnitDescr;
 
 public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
 
     private final PackageDescr packageDescr = new PackageDescr();
 
+    private RuleDescr ruleDescr;
+
     @Override
     public Object visitCompilationunit(DRLParser.CompilationunitContext ctx) {
         return super.visitCompilationunit(ctx);
@@ -15,23 +22,68 @@ public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
 
     @Override
     public Object visitPackagedef(DRLParser.PackagedefContext ctx) {
-        packageDescr.setName(ctx.FQNAME().getText());
+        packageDescr.setName(ctx.name.getText());
         return super.visitPackagedef(ctx);
     }
 
+    @Override
+    public Object visitUnitdef(DRLParser.UnitdefContext ctx) {
+        packageDescr.setUnit(new UnitDescr(ctx.name.getText()));
+        return super.visitUnitdef(ctx);
+    }
+
+    @Override
+    public Object visitGlobaldef(DRLParser.GlobaldefContext ctx) {
+        packageDescr.addGlobal(new GlobalDescr(ctx.ID().getText(), 
ctx.type().getText()));
+        return super.visitGlobaldef(ctx);
+    }
+
     @Override
     public Object visitImportdef(DRLParser.ImportdefContext ctx) {
-        String imp = ctx.FQNAME().getText() + (ctx.STAR() != null ? ".*" : "");
+        String imp = ctx.qualifiedIdentifier().getText() + (ctx.STAR() != null 
? ".*" : "");
         packageDescr.addImport(new ImportDescr(imp));
         return super.visitImportdef(ctx);
     }
 
     @Override
     public Object visitRuledef(DRLParser.RuledefContext ctx) {
-        RuleDescr rule = new RuleDescr(ctx.IDENTIFIER().getText());
-        rule.setConsequence(ctx.rhs().getText());
-        packageDescr.addRule(rule);
-        return super.visitRuledef(ctx);
+        ruleDescr = new RuleDescr(ctx.name.getText());
+        ruleDescr.setConsequence(ctx.rhs().getText());
+        packageDescr.addRule(ruleDescr);
+
+        Object result = super.visitRuledef(ctx);
+        ruleDescr = null;
+        return result;
+    }
+
+    @Override
+    public Object visitLhsPatternBind(DRLParser.LhsPatternBindContext ctx) {
+        if ( ctx.lhsPattern().size() == 1 ) {
+            PatternDescr patternDescr = new 
PatternDescr(ctx.lhsPattern(0).objectType.getText());
+            if (ctx.label() != null) {
+                patternDescr.setIdentifier(ctx.label().ID().getText());
+            }
+            ruleDescr.getLhs().addDescr(patternDescr);
+        }
+        return super.visitLhsPatternBind(ctx);
+    }
+
+    @Override
+    public Object visitAnnotation(DRLParser.AnnotationContext ctx) {
+        AnnotationDescr annotationDescr = new 
AnnotationDescr(ctx.name.getText());
+        annotationDescr.setValue(ctx.arguments().argument(0).getText());
+        ruleDescr.addAnnotation(annotationDescr);
+        return super.visitAnnotation(ctx);
+    }
+
+    @Override
+    public Object visitAttribute(DRLParser.AttributeContext ctx) {
+        AttributeDescr attributeDescr = new AttributeDescr( 
ctx.getChild(0).getText() );
+        if (ctx.getChildCount() > 1) {
+            attributeDescr.setValue( ctx.getChild(1).getText() );
+        }
+        ruleDescr.addAttribute(attributeDescr);
+        return super.visitAttribute(ctx);
     }
 
     public PackageDescr getPackageDescr() {
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
index fc99fc644c..5d8bd5b42d 100644
--- 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
@@ -2,7 +2,13 @@ package org.drools.parser;
 
 import org.antlr.v4.runtime.RuleContext;
 import org.antlr.v4.runtime.tree.ParseTree;
+import org.drools.drl.ast.descr.AnnotationDescr;
+import org.drools.drl.ast.descr.AttributeDescr;
+import org.drools.drl.ast.descr.BaseDescr;
+import org.drools.drl.ast.descr.GlobalDescr;
 import org.drools.drl.ast.descr.PackageDescr;
+import org.drools.drl.ast.descr.PatternDescr;
+import org.drools.drl.ast.descr.RuleDescr;
 import org.junit.Test;
 
 import static org.drools.parser.DRLParserHelper.createParseTree;
@@ -11,6 +17,7 @@ import static 
org.drools.parser.DRLParserHelper.findParentOfType;
 import static org.drools.parser.DRLParserHelper.isAfterSymbol;
 import static org.drools.parser.DRLParserHelper.parse;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 public class DRLParserTest {
@@ -18,7 +25,8 @@ public class DRLParserTest {
     private static final String drl =
             "package org.test;\n" +
             "import org.test.model.Person;\n" +
-            "rule TestRule when \n" +
+            "global String result;\n" +
+            "rule TestRule @Test(true) no-loop salience 15 when \n" +
             "  $p:Person()\n" +
             "then\n" +
             "  System.out.println($p.getName());\n" +
@@ -32,15 +40,38 @@ public class DRLParserTest {
         assertEquals(1, packageDescr.getImports().size());
         assertEquals("org.test.model.Person", 
packageDescr.getImports().get(0).getTarget());
 
+        assertEquals(1, packageDescr.getGlobals().size());
+        GlobalDescr globalDescr = packageDescr.getGlobals().get(0);
+        assertEquals("String", globalDescr.getType());
+        assertEquals("result", globalDescr.getIdentifier());
+
         assertEquals(1, packageDescr.getRules().size());
-        assertEquals("TestRule", packageDescr.getRules().get(0).getName());
-        assertEquals("System.out.println($p.getName());", 
packageDescr.getRules().get(0).getConsequence());
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
+        AnnotationDescr annotationDescr = ruleDescr.getAnnotation("Test");
+        assertNotNull(annotationDescr);
+        assertEquals("true", annotationDescr.getValue());
+
+        assertEquals( 2, ruleDescr.getAttributes().size() );
+        assertNotNull( ruleDescr.getAttributes().get("no-loop") );
+        AttributeDescr salience = ruleDescr.getAttributes().get("salience");
+        assertNotNull( salience );
+        assertEquals( "15", salience.getValue() );
+
+        assertEquals("TestRule", ruleDescr.getName());
+
+        assertEquals( 1, ruleDescr.getLhs().getDescrs().size() );
+        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
+        assertEquals("$p", patternDescr.getIdentifier());
+        assertEquals("Person", patternDescr.getObjectType());
+
+        assertEquals("System.out.println($p.getName());", 
ruleDescr.getConsequence());
     }
 
     @Test
     public void testCursorPosition() {
         ParseTree parseTree = createParseTree(drl);
-        ParseTree node = findNodeAtPosition(parseTree, 4, 7);
+        ParseTree node = findNodeAtPosition(parseTree, 5, 7);
         assertEquals("Person", node.getText());
         ParseTree lhs = findParentOfType(node, DRLParser.RULE_lhs);
         assertEquals(DRLParser.RULE_lhs, ((RuleContext) lhs).getRuleIndex());
@@ -50,8 +81,8 @@ public class DRLParserTest {
     @Test
     public void testCursorPosition2() {
         ParseTree parseTree = createParseTree(drl);
-        ParseTree node = findNodeAtPosition(parseTree, 3, 19);
+        ParseTree node = findNodeAtPosition(parseTree, 4, 51);
         assertEquals("when", node.getText());
-        assertTrue(isAfterSymbol(node, DRLParser.WHEN, 3, 19));
+        assertTrue(isAfterSymbol(node, DRLParser.WHEN, 4, 51));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to