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 22002d7c7adfd8b980d7764682760b2c19a9fa63
Author: Livio Benčik <[email protected]>
AuthorDate: Fri Mar 25 14:57:25 2022 +0100

    Fix basic completion (#4)
    
    * Add Java grammar, fix DRL grammar, simplify token index calculation, 
remove template code
    
    * Add ignored tokens to completion
    
    Co-authored-by: livio <[email protected]>
---
 drools-drl/drools-drl10-parser/.gitignore          |    1 +
 drools-drl/drools-drl10-parser/pom.xml             |    1 +
 .../src/main/antlr4/org/drools/parser/DRL.g4       | 1019 --------------------
 .../src/main/antlr4/org/drools/parser/DRLLexer.g4  |   77 ++
 .../src/main/antlr4/org/drools/parser/DRLParser.g4 |   97 ++
 .../src/main/antlr4/org/drools/parser/JavaLexer.g4 |  245 +++++
 .../main/antlr4/org/drools/parser/JavaParser.g4    |  752 +++++++++++++++
 .../java/org/drools/parser/DRLParserHelper.java    |  100 +-
 .../java/org/drools/parser/DRLVisitorImpl.java     |   33 +-
 .../test/java/org/drools/parser/DRLParserTest.java |   67 +-
 10 files changed, 1231 insertions(+), 1161 deletions(-)

diff --git a/drools-drl/drools-drl10-parser/.gitignore 
b/drools-drl/drools-drl10-parser/.gitignore
index 372e03f026..6fc57b48ec 100644
--- a/drools-drl/drools-drl10-parser/.gitignore
+++ b/drools-drl/drools-drl10-parser/.gitignore
@@ -1,4 +1,5 @@
 target/
+gen/
 local/
 
 # Eclipse, Netbeans and IntelliJ files
diff --git a/drools-drl/drools-drl10-parser/pom.xml 
b/drools-drl/drools-drl10-parser/pom.xml
index 53ae3c502c..2b88baa153 100644
--- a/drools-drl/drools-drl10-parser/pom.xml
+++ b/drools-drl/drools-drl10-parser/pom.xml
@@ -63,6 +63,7 @@
             <configuration>
               <visitor>true</visitor>
               <listener>false</listener>
+              <libDirectory>src/main/antlr4/org/drools/parser/</libDirectory>
             </configuration>
           </execution>
         </executions>
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
deleted file mode 100644
index 6cc31c5e2b..0000000000
--- a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRL.g4
+++ /dev/null
@@ -1,1019 +0,0 @@
-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* ;
-
-packagedef : PACKAGE name=qualifiedIdentifier SEMICOLON? ;
-
-unitdef : UNIT name=qualifiedIdentifier SEMICOLON? ;
-
-importdef : IMPORT (FUNCTION|STATIC)? qualifiedIdentifier (DOT STAR)? 
SEMICOLON? ;
-
-globaldef : GLOBAL type ID SEMICOLON? ;
-
-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 ;
-
-stringId : ( ID | STRING ) ;
-
-qualifiedIdentifier : ID ( DOT ID )* ;
-
-type : ID typeArguments? ( DOT ID typeArguments? )* (LEFT_SQUARE 
RIGHT_SQUARE)* ;
-
-typeArguments : LESS typeArgument (COMMA typeArgument)* GREATER ;
-typeArgument : QUESTION (( EXTENDS | SUPER ) type )? |  type ;
-
-arguments : LEFT_PAREN argument (COMMA argument)* RIGHT_PAREN ;
-argument : ( stringId | FLOAT | BOOL | NULL ) ;
-
-annotation : AT name=qualifiedIdentifier arguments? ;
-
-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 ) ;
-
-assignmentOperator : EQUALS_ASSIGN
-                   |   PLUS_ASSIGN
-                   |   MINUS_ASSIGN
-                   |   MULT_ASSIGN
-                   |   DIV_ASSIGN
-                   |   AND_ASSIGN
-                   |   OR_ASSIGN
-                   |   XOR_ASSIGN
-                   |   MOD_ASSIGN
-                   |   LESS LESS EQUALS_ASSIGN ;
-
-label : ID COLON ;
-unif : ID UNIFY ;
-
-fragment TEXT : .+ ;
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
new file mode 100644
index 0000000000..732a0d3bcc
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
@@ -0,0 +1,77 @@
+lexer grammar DRLLexer;
+
+import JavaLexer;
+
+@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';
+
+NOT : 'not';
+IN : 'in';
+
+SALIENCE : 'salience';
+ENABLED : 'enabled';
+NO_LOOP : 'no-loop';
+AUTO_FOCUS : 'auto-focus';
+LOCK_ON_ACTIVE : 'lock-on-active';
+REFRACT : 'refract';
+DIRECT : 'direct';
+AGENDA_GROUP : 'agenda-group';
+ACTIVATION_GROUP : 'activation-group';
+RULEFLOW_GROUP : 'ruleflow-group';
+DATE_EFFECTIVE : 'date-effective';
+DATE_EXPIRES : 'date-expires';
+DIALECT : 'dialect';
+CALENDARS : 'calendars';
+TIMER : 'timer';
+DURATION : 'duration';
+
+/////////////////
+// LEXER
+/////////////////
+
+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')
+    ;
+
+
+/////////////////
+// SYMBOLS
+/////////////////
+
+HASH : '#';
+UNIFY :        ':=' ;
+NULL_SAFE_DOT :        '!.' ;
+QUESTION_DIV : '?/' ;
+
+MISC : '\'' | '\\' | '$' ;
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
new file mode 100644
index 0000000000..31bf8c80ee
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
@@ -0,0 +1,97 @@
+parser grammar DRLParser;
+
+options { tokenVocab=DRLLexer; }
+
+import JavaParser;
+
+
+compilationUnit : packagedef? unitdef? importdef* globaldef* ruledef* ;
+
+packagedef : PACKAGE name=qualifiedName SEMI? ;
+
+unitdef : UNIT name=qualifiedName SEMI? ;
+
+importdef : IMPORT (FUNCTION|STATIC)? qualifiedName (DOT MUL)? SEMI? ;
+
+globaldef : GLOBAL type IDENTIFIER SEMI? ;
+
+ruledef : RULE name=stringId (EXTENDS stringId)? drlAnnotation* attributes? 
WHEN lhs THEN rhs END ;
+
+lhs : lhsExpression ;
+lhsExpression : lhsOr* ;
+lhsOr : LPAREN OR lhsAnd+ RPAREN | lhsAnd (OR lhsAnd)* ;
+lhsAnd : LPAREN AND lhsUnary+ RPAREN | lhsUnary (AND lhsUnary)* ;
+
+/*
+lhsUnary : ( lhsExists namedConsequence?
+           | lhsNot namedConsequence?
+           | lhsEval consequenceInvocation*
+           | lhsForall
+           | lhsAccumulate
+           | LPAREN lhsOr RPAREN namedConsequence?
+           | lhsPatternBind consequenceInvocation*
+           ) SEMI? ;
+*/
+
+lhsUnary : lhsPatternBind ;
+lhsPatternBind : label? ( LPAREN lhsPattern (OR lhsPattern)* RPAREN | 
lhsPattern ) ;
+
+/*
+lhsPattern : xpathPrimary (OVER patternFilter)? |
+             ( QUESTION? qualifiedIdentifier LPAREN positionalConstraints? 
constraints? RPAREN (OVER patternFilter)? (FROM patternSource)? ) ;
+*/
+
+lhsPattern : QUESTION? objectType=qualifiedName LPAREN positionalConstraints? 
constraints? RPAREN ;
+positionalConstraints : constraint (COMMA constraint)* SEMI ;
+constraints : constraint (COMMA constraint)* ;
+constraint : label? ( nestedConstraint | conditionalOrExpression ) ;
+nestedConstraint : ( IDENTIFIER ( DOT | HASH ) )* IDENTIFIER DOT LPAREN 
constraints RPAREN ;
+conditionalOrExpression : left=conditionalAndExpression (OR 
right=conditionalAndExpression)* ;
+conditionalAndExpression : left=inclusiveOrExpression (AND 
right=inclusiveOrExpression)* ;
+inclusiveOrExpression : left=exclusiveOrExpression (BITOR 
right=exclusiveOrExpression)* ;
+exclusiveOrExpression : left=andExpression (CARET right=andExpression)* ;
+andExpression : left=equalityExpression (BITAND right=equalityExpression)* ;
+equalityExpression : left=instanceOfExpression ( ( op=EQUAL | op=NOTEQUAL ) 
right=instanceOfExpression )* ;
+instanceOfExpression : left=inExpression ( 'instanceof' right=type )? ;
+inExpression : left=relationalExpression ( 'not'? 'in' LPAREN drlExpression 
(COMMA drlExpression)* RPAREN )? ;
+relationalExpression : expression? ; // TODO
+
+drlExpression : conditionalExpression ( op=assignmentOperator 
right=drlExpression )? ;
+conditionalExpression : left=conditionalOrExpression ternaryExpression? ;
+ternaryExpression : QUESTION ts=drlExpression COLON fs=drlExpression ;
+
+rhs : blockStatement+ ;
+
+stringId : ( IDENTIFIER | STRING_LITERAL ) ;
+
+type : IDENTIFIER typeArguments? ( DOT IDENTIFIER typeArguments? )* (LBRACK 
RBRACK)* ;
+
+//typeArguments : LT typeArgument (COMMA typeArgument)* GT ;
+//typeArgument : QUESTION (( EXTENDS | SUPER ) type )? |  type ;
+
+drlArguments : LPAREN drlArgument (COMMA drlArgument)* RPAREN ;
+drlArgument : ( stringId | floatLiteral | BOOL_LITERAL | NULL_LITERAL ) ;
+
+drlAnnotation : AT name=qualifiedName drlArguments? ;
+
+attributes : attribute ( COMMA? attribute )* ;
+attribute : ( 'salience' DECIMAL_LITERAL )
+          | ( 'enabled' | 'no-loop' | 'auto-focus' | 'lock-on-active' | 
'refract' | 'direct' ) BOOLEAN?
+          | ( 'agenda-group' | 'activation-group' | 'ruleflow-group' | 
'date-effective' | 'date-expires' | 'dialect' ) STRING_LITERAL
+          |   'calendars' STRING_LITERAL ( COMMA STRING_LITERAL )*
+          |   'timer' ( DECIMAL_LITERAL | TEXT )
+          |   'duration' ( DECIMAL_LITERAL | TEXT ) ;
+
+assignmentOperator : ASSIGN
+                   |   ADD_ASSIGN
+                   |   SUB_ASSIGN
+                   |   MUL_ASSIGN
+                   |   DIV_ASSIGN
+                   |   AND_ASSIGN
+                   |   OR_ASSIGN
+                   |   XOR_ASSIGN
+                   |   MOD_ASSIGN
+                   |   LT LT ASSIGN ;
+
+label : IDENTIFIER COLON ;
+unif : IDENTIFIER UNIFY ;
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaLexer.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaLexer.g4
new file mode 100644
index 0000000000..1af884db09
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaLexer.g4
@@ -0,0 +1,245 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2013 Terence Parr, Sam Harwell
+ Copyright (c) 2017 Ivan Kochurkin (upgrade to Java 8)
+ Copyright (c) 2021 Michał Lorek (upgrade to Java 11)
+ Copyright (c) 2022 Michał Lorek (upgrade to Java 17)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// source: https://github.com/antlr/grammars-v4/tree/master/java/java
+
+lexer grammar JavaLexer;
+
+// Keywords
+
+ABSTRACT:           'abstract';
+ASSERT:             'assert';
+BOOLEAN:            'boolean';
+BREAK:              'break';
+BYTE:               'byte';
+CASE:               'case';
+CATCH:              'catch';
+CHAR:               'char';
+CLASS:              'class';
+CONST:              'const';
+CONTINUE:           'continue';
+DEFAULT:            'default';
+DO:                 'do';
+DOUBLE:             'double';
+ELSE:               'else';
+ENUM:               'enum';
+EXTENDS:            'extends';
+FINAL:              'final';
+FINALLY:            'finally';
+FLOAT:              'float';
+FOR:                'for';
+IF:                 'if';
+GOTO:               'goto';
+IMPLEMENTS:         'implements';
+IMPORT:             'import';
+INSTANCEOF:         'instanceof';
+INT:                'int';
+INTERFACE:          'interface';
+LONG:               'long';
+NATIVE:             'native';
+NEW:                'new';
+PACKAGE:            'package';
+PRIVATE:            'private';
+PROTECTED:          'protected';
+PUBLIC:             'public';
+RETURN:             'return';
+SHORT:              'short';
+STATIC:             'static';
+STRICTFP:           'strictfp';
+SUPER:              'super';
+SWITCH:             'switch';
+SYNCHRONIZED:       'synchronized';
+THIS:               'this';
+THROW:              'throw';
+THROWS:             'throws';
+TRANSIENT:          'transient';
+TRY:                'try';
+VOID:               'void';
+VOLATILE:           'volatile';
+WHILE:              'while';
+
+// Module related keywords
+MODULE:             'module';
+OPEN:               'open';
+REQUIRES:           'requires';
+EXPORTS:            'exports';
+OPENS:              'opens';
+TO:                 'to';
+USES:               'uses';
+PROVIDES:           'provides';
+WITH:               'with';
+TRANSITIVE:         'transitive';
+
+// Local Variable Type Inference
+VAR:                'var'; // reserved type name
+
+// Switch Expressions
+YIELD:              'yield';
+
+// Records
+RECORD:             'record';
+
+// Sealed Classes
+SEALED:             'sealed';
+PERMITS:            'permits';
+NON_SEALED:         'non-sealed';
+
+// Literals
+
+DECIMAL_LITERAL:    ('0' | [1-9] (Digits? | '_'+ Digits)) [lL]?;
+HEX_LITERAL:        '0' [xX] [0-9a-fA-F] ([0-9a-fA-F_]* [0-9a-fA-F])? [lL]?;
+OCT_LITERAL:        '0' '_'* [0-7] ([0-7_]* [0-7])? [lL]?;
+BINARY_LITERAL:     '0' [bB] [01] ([01_]* [01])? [lL]?;
+
+FLOAT_LITERAL:      (Digits '.' Digits? | '.' Digits) ExponentPart? [fFdD]?
+             |       Digits (ExponentPart [fFdD]? | [fFdD])
+             ;
+
+HEX_FLOAT_LITERAL:  '0' [xX] (HexDigits '.'? | HexDigits? '.' HexDigits) [pP] 
[+-]? Digits [fFdD]?;
+
+BOOL_LITERAL:       'true'
+            |       'false'
+            ;
+
+CHAR_LITERAL:       '\'' (~['\\\r\n] | EscapeSequence) '\'';
+
+STRING_LITERAL:     '"' (~["\\\r\n] | EscapeSequence)* '"';
+
+TEXT_BLOCK:         '"""' [ \t]* [\r\n] (. | EscapeSequence)*? '"""';
+
+NULL_LITERAL:       'null';
+
+// Separators
+
+LPAREN:             '(';
+RPAREN:             ')';
+LBRACE:             '{';
+RBRACE:             '}';
+LBRACK:             '[';
+RBRACK:             ']';
+SEMI:               ';';
+COMMA:              ',';
+DOT:                '.';
+
+// Operators
+
+ASSIGN:             '=';
+GT:                 '>';
+LT:                 '<';
+BANG:               '!';
+TILDE:              '~';
+QUESTION:           '?';
+COLON:              ':';
+EQUAL:              '==';
+LE:                 '<=';
+GE:                 '>=';
+NOTEQUAL:           '!=';
+AND:                '&&';
+OR:                 '||';
+INC:                '++';
+DEC:                '--';
+ADD:                '+';
+SUB:                '-';
+MUL:                '*';
+DIV:                '/';
+BITAND:             '&';
+BITOR:              '|';
+CARET:              '^';
+MOD:                '%';
+
+ADD_ASSIGN:         '+=';
+SUB_ASSIGN:         '-=';
+MUL_ASSIGN:         '*=';
+DIV_ASSIGN:         '/=';
+AND_ASSIGN:         '&=';
+OR_ASSIGN:          '|=';
+XOR_ASSIGN:         '^=';
+MOD_ASSIGN:         '%=';
+LSHIFT_ASSIGN:      '<<=';
+RSHIFT_ASSIGN:      '>>=';
+URSHIFT_ASSIGN:     '>>>=';
+
+// Java 8 tokens
+
+ARROW:              '->';
+COLONCOLON:         '::';
+
+// Additional symbols not defined in the lexical specification
+
+AT:                 '@';
+ELLIPSIS:           '...';
+
+// Whitespace and comments
+
+WS:                 [ \t\r\n\u000C]+ -> channel(HIDDEN);
+COMMENT:            '/*' .*? '*/'    -> channel(HIDDEN);
+LINE_COMMENT:       '//' ~[\r\n]*    -> channel(HIDDEN);
+
+// Identifiers
+
+IDENTIFIER:         Letter LetterOrDigit*;
+
+// Fragment rules
+
+fragment ExponentPart
+    : [eE] [+-]? Digits
+    ;
+
+fragment EscapeSequence
+    : '\\' [btnfr"'\\]
+    | '\\' ([0-3]? [0-7])? [0-7]
+    | '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
+    ;
+
+fragment HexDigits
+    : HexDigit ((HexDigit | '_')* HexDigit)?
+    ;
+
+fragment HexDigit
+    : [0-9a-fA-F]
+    ;
+
+fragment Digits
+    : [0-9] ([0-9_]* [0-9])?
+    ;
+
+fragment LetterOrDigit
+    : Letter
+    | [0-9]
+    ;
+
+fragment Letter
+    : [a-zA-Z$_] // these are the "java letters" below 0x7F
+    | ~[\u0000-\u007F\uD800-\uDBFF] // covers all characters above 0x7F which 
are not a surrogate
+    | [\uD800-\uDBFF] [\uDC00-\uDFFF] // covers UTF-16 surrogate pairs 
encodings for U+10000 to U+10FFFF
+    ;
+
+TEXT : .+? ;
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaParser.g4
 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaParser.g4
new file mode 100644
index 0000000000..9e9f0a6851
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/JavaParser.g4
@@ -0,0 +1,752 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2013 Terence Parr, Sam Harwell
+ Copyright (c) 2017 Ivan Kochurkin (upgrade to Java 8)
+ Copyright (c) 2021 Michał Lorek (upgrade to Java 11)
+ Copyright (c) 2022 Michał Lorek (upgrade to Java 17)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+// source: https://github.com/antlr/grammars-v4/tree/master/java/java
+
+parser grammar JavaParser;
+
+options { tokenVocab=JavaLexer; }
+
+compilationUnit
+    : packageDeclaration? importDeclaration* typeDeclaration*
+    | moduleDeclaration EOF
+    ;
+
+packageDeclaration
+    : annotation* PACKAGE qualifiedName SEMI
+    ;
+
+importDeclaration
+    : IMPORT STATIC? qualifiedName (DOT MUL)? SEMI
+    ;
+
+typeDeclaration
+    : classOrInterfaceModifier*
+      (classDeclaration | enumDeclaration | interfaceDeclaration | 
annotationTypeDeclaration | recordDeclaration)
+    | SEMI
+    ;
+
+modifier
+    : classOrInterfaceModifier
+    | NATIVE
+    | SYNCHRONIZED
+    | TRANSIENT
+    | VOLATILE
+    ;
+
+classOrInterfaceModifier
+    : annotation
+    | PUBLIC
+    | PROTECTED
+    | PRIVATE
+    | STATIC
+    | ABSTRACT
+    | FINAL    // FINAL for class only -- does not apply to interfaces
+    | STRICTFP
+    | SEALED // Java17
+    | NON_SEALED // Java17
+    ;
+
+variableModifier
+    : FINAL
+    | annotation
+    ;
+
+classDeclaration
+    : CLASS identifier typeParameters?
+      (EXTENDS typeType)?
+      (IMPLEMENTS typeList)?
+      (PERMITS typeList)? // Java17
+      classBody
+    ;
+
+typeParameters
+    : LT typeParameter (COMMA typeParameter)* GT
+    ;
+
+typeParameter
+    : annotation* identifier (EXTENDS annotation* typeBound)?
+    ;
+
+typeBound
+    : typeType (BITAND typeType)*
+    ;
+
+enumDeclaration
+    : ENUM identifier (IMPLEMENTS typeList)? LBRACE enumConstants? COMMA? 
enumBodyDeclarations? RBRACE
+    ;
+
+enumConstants
+    : enumConstant (COMMA enumConstant)*
+    ;
+
+enumConstant
+    : annotation* identifier arguments? classBody?
+    ;
+
+enumBodyDeclarations
+    : SEMI classBodyDeclaration*
+    ;
+
+interfaceDeclaration
+    : INTERFACE identifier typeParameters? (EXTENDS typeList)? (PERMITS 
typeList)? interfaceBody
+    ;
+
+classBody
+    : LBRACE classBodyDeclaration* RBRACE
+    ;
+
+interfaceBody
+    : LBRACE interfaceBodyDeclaration* RBRACE
+    ;
+
+classBodyDeclaration
+    : SEMI
+    | STATIC? block
+    | modifier* memberDeclaration
+    ;
+
+memberDeclaration
+    : methodDeclaration
+    | genericMethodDeclaration
+    | fieldDeclaration
+    | constructorDeclaration
+    | genericConstructorDeclaration
+    | interfaceDeclaration
+    | annotationTypeDeclaration
+    | classDeclaration
+    | enumDeclaration
+    | recordDeclaration //Java17
+    ;
+
+/* We use rule this even for void methods which cannot have [] after 
parameters.
+   This simplifies grammar and we can consider void to be a type, which
+   renders the [] matching as a context-sensitive issue or a semantic check
+   for invalid return type after parsing.
+ */
+methodDeclaration
+    : typeTypeOrVoid identifier formalParameters (LBRACK RBRACK)*
+      (THROWS qualifiedNameList)?
+      methodBody
+    ;
+
+methodBody
+    : block
+    | SEMI
+    ;
+
+typeTypeOrVoid
+    : typeType
+    | VOID
+    ;
+
+genericMethodDeclaration
+    : typeParameters methodDeclaration
+    ;
+
+genericConstructorDeclaration
+    : typeParameters constructorDeclaration
+    ;
+
+constructorDeclaration
+    : identifier formalParameters (THROWS qualifiedNameList)? 
constructorBody=block
+    ;
+
+fieldDeclaration
+    : typeType variableDeclarators SEMI
+    ;
+
+interfaceBodyDeclaration
+    : modifier* interfaceMemberDeclaration
+    | SEMI
+    ;
+
+interfaceMemberDeclaration
+    : constDeclaration
+    | interfaceMethodDeclaration
+    | genericInterfaceMethodDeclaration
+    | interfaceDeclaration
+    | annotationTypeDeclaration
+    | classDeclaration
+    | enumDeclaration
+    | recordDeclaration // Java17
+    ;
+
+constDeclaration
+    : typeType constantDeclarator (COMMA constantDeclarator)* SEMI
+    ;
+
+constantDeclarator
+    : identifier (LBRACK RBRACK)* ASSIGN variableInitializer
+    ;
+
+// Early versions of Java allows brackets after the method name, eg.
+// public int[] return2DArray() [] { ... }
+// is the same as
+// public int[][] return2DArray() { ... }
+interfaceMethodDeclaration
+    : interfaceMethodModifier* interfaceCommonBodyDeclaration
+    ;
+
+// Java8
+interfaceMethodModifier
+    : annotation
+    | PUBLIC
+    | ABSTRACT
+    | DEFAULT
+    | STATIC
+    | STRICTFP
+    ;
+
+genericInterfaceMethodDeclaration
+    : interfaceMethodModifier* typeParameters interfaceCommonBodyDeclaration
+    ;
+
+interfaceCommonBodyDeclaration
+    : annotation* typeTypeOrVoid identifier formalParameters (LBRACK RBRACK)* 
(THROWS qualifiedNameList)? methodBody
+    ;
+
+variableDeclarators
+    : variableDeclarator (COMMA variableDeclarator)*
+    ;
+
+variableDeclarator
+    : variableDeclaratorId (ASSIGN variableInitializer)?
+    ;
+
+variableDeclaratorId
+    : identifier (LBRACK RBRACK)*
+    ;
+
+variableInitializer
+    : arrayInitializer
+    | expression
+    ;
+
+arrayInitializer
+    : LBRACE (variableInitializer (COMMA variableInitializer)* (COMMA)? )? 
RBRACE
+    ;
+
+classOrInterfaceType
+    : identifier typeArguments? (DOT identifier typeArguments?)*
+    ;
+
+typeArgument
+    : typeType
+    | annotation* QUESTION ((EXTENDS | SUPER) typeType)?
+    ;
+
+qualifiedNameList
+    : qualifiedName (COMMA qualifiedName)*
+    ;
+
+formalParameters
+    : LPAREN ( receiverParameter?
+          | receiverParameter (COMMA formalParameterList)?
+          | formalParameterList?
+          ) RPAREN
+    ;
+
+receiverParameter
+    : typeType (identifier DOT)* THIS
+    ;
+
+formalParameterList
+    : formalParameter (COMMA formalParameter)* (COMMA lastFormalParameter)?
+    | lastFormalParameter
+    ;
+
+formalParameter
+    : variableModifier* typeType variableDeclaratorId
+    ;
+
+lastFormalParameter
+    : variableModifier* typeType annotation* ELLIPSIS variableDeclaratorId
+    ;
+
+// local variable type inference
+lambdaLVTIList
+    : lambdaLVTIParameter (COMMA lambdaLVTIParameter)*
+    ;
+
+lambdaLVTIParameter
+    : variableModifier* VAR identifier
+    ;
+
+qualifiedName
+    : identifier (DOT identifier)*
+    ;
+
+literal
+    : integerLiteral
+    | floatLiteral
+    | CHAR_LITERAL
+    | STRING_LITERAL
+    | BOOL_LITERAL
+    | NULL_LITERAL
+    | TEXT_BLOCK // Java17
+    ;
+
+integerLiteral
+    : DECIMAL_LITERAL
+    | HEX_LITERAL
+    | OCT_LITERAL
+    | BINARY_LITERAL
+    ;
+
+floatLiteral
+    : FLOAT_LITERAL
+    | HEX_FLOAT_LITERAL
+    ;
+
+// ANNOTATIONS
+altAnnotationQualifiedName
+    : (identifier DOT)* AT identifier
+    ;
+
+annotation
+    : (AT qualifiedName | altAnnotationQualifiedName) (LPAREN ( 
elementValuePairs | elementValue )? RPAREN)?
+    ;
+
+elementValuePairs
+    : elementValuePair (COMMA elementValuePair)*
+    ;
+
+elementValuePair
+    : identifier ASSIGN elementValue
+    ;
+
+elementValue
+    : expression
+    | annotation
+    | elementValueArrayInitializer
+    ;
+
+elementValueArrayInitializer
+    : LBRACE (elementValue (COMMA elementValue)*)? (COMMA)? RBRACE
+    ;
+
+annotationTypeDeclaration
+    : AT INTERFACE identifier annotationTypeBody
+    ;
+
+annotationTypeBody
+    : LBRACE (annotationTypeElementDeclaration)* RBRACE
+    ;
+
+annotationTypeElementDeclaration
+    : modifier* annotationTypeElementRest
+    | SEMI // this is not allowed by the grammar, but apparently allowed by 
the actual compiler
+    ;
+
+annotationTypeElementRest
+    : typeType annotationMethodOrConstantRest SEMI
+    | classDeclaration SEMI?
+    | interfaceDeclaration SEMI?
+    | enumDeclaration SEMI?
+    | annotationTypeDeclaration SEMI?
+    | recordDeclaration SEMI? // Java17
+    ;
+
+annotationMethodOrConstantRest
+    : annotationMethodRest
+    | annotationConstantRest
+    ;
+
+annotationMethodRest
+    : identifier LPAREN RPAREN defaultValue?
+    ;
+
+annotationConstantRest
+    : variableDeclarators
+    ;
+
+defaultValue
+    : DEFAULT elementValue
+    ;
+
+// MODULES - Java9
+
+moduleDeclaration
+    : OPEN? MODULE qualifiedName moduleBody
+    ;
+
+moduleBody
+    : LBRACE moduleDirective* RBRACE
+    ;
+
+moduleDirective
+       : REQUIRES requiresModifier* qualifiedName SEMI
+       | EXPORTS qualifiedName (TO qualifiedName)? SEMI
+       | OPENS qualifiedName (TO qualifiedName)? SEMI
+       | USES qualifiedName SEMI
+       | PROVIDES qualifiedName WITH qualifiedName SEMI
+       ;
+
+requiresModifier
+       : TRANSITIVE
+       | STATIC
+       ;
+
+// RECORDS - Java 17
+
+recordDeclaration
+    : RECORD identifier typeParameters? recordHeader
+      (IMPLEMENTS typeList)?
+      recordBody
+    ;
+
+recordHeader
+    : LPAREN recordComponentList? RPAREN
+    ;
+
+recordComponentList
+    : recordComponent (COMMA recordComponent)*
+    ;
+
+recordComponent
+    : typeType identifier
+    ;
+
+recordBody
+    : LBRACE classBodyDeclaration* RBRACE
+    ;
+
+// STATEMENTS / BLOCKS
+
+block
+    : LBRACE blockStatement* RBRACE
+    ;
+
+blockStatement
+    : localVariableDeclaration SEMI
+    | statement
+    | localTypeDeclaration
+    ;
+
+localVariableDeclaration
+    : variableModifier* (typeType variableDeclarators | VAR identifier ASSIGN 
expression)
+    ;
+
+identifier
+    : IDENTIFIER
+    | MODULE
+    | OPEN
+    | REQUIRES
+    | EXPORTS
+    | OPENS
+    | TO
+    | USES
+    | PROVIDES
+    | WITH
+    | TRANSITIVE
+    | YIELD
+    | SEALED
+    | PERMITS
+    | RECORD
+    | VAR
+    ;
+
+localTypeDeclaration
+    : classOrInterfaceModifier*
+      (classDeclaration | interfaceDeclaration | recordDeclaration)
+    | SEMI
+    ;
+
+statement
+    : blockLabel=block
+    | ASSERT expression (COLON expression)? SEMI
+    | IF parExpression statement (ELSE statement)?
+    | FOR LPAREN forControl RPAREN statement
+    | WHILE parExpression statement
+    | DO statement WHILE parExpression SEMI
+    | TRY block (catchClause+ finallyBlock? | finallyBlock)
+    | TRY resourceSpecification block catchClause* finallyBlock?
+    | SWITCH parExpression LBRACE switchBlockStatementGroup* switchLabel* 
RBRACE
+    | SYNCHRONIZED parExpression block
+    | RETURN expression? SEMI
+    | THROW expression SEMI
+    | BREAK identifier? SEMI
+    | CONTINUE identifier? SEMI
+    | YIELD expression SEMI // Java17
+    | SEMI
+    | statementExpression=expression SEMI
+    | switchExpression SEMI? // Java17
+    | identifierLabel=identifier COLON statement
+    ;
+
+catchClause
+    : CATCH LPAREN variableModifier* catchType identifier RPAREN block
+    ;
+
+catchType
+    : qualifiedName (BITOR qualifiedName)*
+    ;
+
+finallyBlock
+    : FINALLY block
+    ;
+
+resourceSpecification
+    : LPAREN resources SEMI? RPAREN
+    ;
+
+resources
+    : resource (SEMI resource)*
+    ;
+
+resource
+    : variableModifier* ( classOrInterfaceType variableDeclaratorId | VAR 
identifier ) ASSIGN expression
+    | identifier
+    ;
+
+/** Matches cases then statements, both of which are mandatory.
+ *  To handle empty cases at the end, we add switchLabel* to statement.
+ */
+switchBlockStatementGroup
+    : switchLabel+ blockStatement+
+    ;
+
+switchLabel
+    : CASE (constantExpression=expression | enumConstantName=IDENTIFIER | 
typeType varName=identifier) COLON
+    | DEFAULT COLON
+    ;
+
+forControl
+    : enhancedForControl
+    | forInit? SEMI expression? SEMI forUpdate=expressionList?
+    ;
+
+forInit
+    : localVariableDeclaration
+    | expressionList
+    ;
+
+enhancedForControl
+    : variableModifier* (typeType | VAR) variableDeclaratorId COLON expression
+    ;
+
+// EXPRESSIONS
+
+parExpression
+    : LPAREN expression RPAREN
+    ;
+
+expressionList
+    : expression (COMMA expression)*
+    ;
+
+methodCall
+    : identifier LPAREN expressionList? RPAREN
+    | THIS LPAREN expressionList? RPAREN
+    | SUPER LPAREN expressionList? RPAREN
+    ;
+
+expression
+    : primary
+    | expression bop=DOT
+      (
+         identifier
+       | methodCall
+       | THIS
+       | NEW nonWildcardTypeArguments? innerCreator
+       | SUPER superSuffix
+       | explicitGenericInvocation
+      )
+    | expression LBRACK expression RBRACK
+    | methodCall
+    | NEW creator
+    | LPAREN annotation* typeType (BITAND typeType)* RPAREN expression
+    | expression postfix=(INC | DEC)
+    | prefix=(ADD|SUB|INC|DEC) expression
+    | prefix=(TILDE|BANG) expression
+    | expression bop=(MUL|DIV|MOD) expression
+    | expression bop=(ADD|SUB) expression
+    | expression (LT LT | GT GT GT | GT GT) expression
+    | expression bop=(LE | GE | GT | LT) expression
+    | expression bop=INSTANCEOF (typeType | pattern)
+    | expression bop=(EQUAL | NOTEQUAL) expression
+    | expression bop=BITAND expression
+    | expression bop=CARET expression
+    | expression bop=BITOR expression
+    | expression bop=AND expression
+    | expression bop=OR expression
+    | <assoc=right> expression bop=QUESTION expression COLON expression
+    | <assoc=right> expression
+      bop=(ASSIGN | ADD_ASSIGN | SUB_ASSIGN | MUL_ASSIGN | DIV_ASSIGN | 
AND_ASSIGN | OR_ASSIGN | XOR_ASSIGN | RSHIFT_ASSIGN | URSHIFT_ASSIGN | 
LSHIFT_ASSIGN | MOD_ASSIGN)
+      expression
+    | lambdaExpression // Java8
+    | switchExpression // Java17
+
+    // Java 8 methodReference
+    | expression COLONCOLON typeArguments? identifier
+    | typeType COLONCOLON (typeArguments? identifier | NEW)
+    | classType COLONCOLON typeArguments? NEW
+    ;
+
+// Java17
+pattern
+    : variableModifier* typeType annotation* identifier
+    ;
+
+// Java8
+lambdaExpression
+    : lambdaParameters ARROW lambdaBody
+    ;
+
+// Java8
+lambdaParameters
+    : identifier
+    | LPAREN formalParameterList? RPAREN
+    | LPAREN identifier (COMMA identifier)* RPAREN
+    | LPAREN lambdaLVTIList? RPAREN
+    ;
+
+// Java8
+lambdaBody
+    : expression
+    | block
+    ;
+
+primary
+    : LPAREN expression RPAREN
+    | THIS
+    | SUPER
+    | literal
+    | identifier
+    | typeTypeOrVoid DOT CLASS
+    | nonWildcardTypeArguments (explicitGenericInvocationSuffix | THIS 
arguments)
+    ;
+
+// Java17
+switchExpression
+    : SWITCH parExpression LBRACE switchLabeledRule* RBRACE
+    ;
+
+// Java17
+switchLabeledRule
+    : CASE (expressionList | NULL_LITERAL | guardedPattern) (ARROW | COLON) 
switchRuleOutcome
+    | DEFAULT (ARROW | COLON) switchRuleOutcome
+    ;
+
+// Java17
+guardedPattern
+    : LPAREN guardedPattern RPAREN
+    | variableModifier* typeType annotation* identifier (AND expression)*
+    | guardedPattern AND expression
+    ;
+
+// Java17
+switchRuleOutcome
+    : block
+    | blockStatement*
+    ;
+
+classType
+    : (classOrInterfaceType DOT)? annotation* identifier typeArguments?
+    ;
+
+creator
+    : nonWildcardTypeArguments createdName classCreatorRest
+    | createdName (arrayCreatorRest | classCreatorRest)
+    ;
+
+createdName
+    : identifier typeArgumentsOrDiamond? (DOT identifier 
typeArgumentsOrDiamond?)*
+    | primitiveType
+    ;
+
+innerCreator
+    : identifier nonWildcardTypeArgumentsOrDiamond? classCreatorRest
+    ;
+
+arrayCreatorRest
+    : LBRACK (RBRACK (LBRACK RBRACK)* arrayInitializer | expression RBRACK 
(LBRACK expression RBRACK)* (LBRACK RBRACK)*)
+    ;
+
+classCreatorRest
+    : arguments classBody?
+    ;
+
+explicitGenericInvocation
+    : nonWildcardTypeArguments explicitGenericInvocationSuffix
+    ;
+
+typeArgumentsOrDiamond
+    : LT GT
+    | typeArguments
+    ;
+
+nonWildcardTypeArgumentsOrDiamond
+    : LT GT
+    | nonWildcardTypeArguments
+    ;
+
+nonWildcardTypeArguments
+    : LT typeList GT
+    ;
+
+typeList
+    : typeType (COMMA typeType)*
+    ;
+
+typeType
+    : annotation* (classOrInterfaceType | primitiveType) (annotation* LBRACK 
RBRACK)*
+    ;
+
+primitiveType
+    : BOOLEAN
+    | CHAR
+    | BYTE
+    | SHORT
+    | INT
+    | LONG
+    | FLOAT
+    | DOUBLE
+    ;
+
+typeArguments
+    : LT typeArgument (COMMA typeArgument)* GT
+    ;
+
+superSuffix
+    : arguments
+    | DOT typeArguments? identifier arguments?
+    ;
+
+explicitGenericInvocationSuffix
+    : SUPER superSuffix
+    | identifier arguments
+    ;
+
+arguments
+    : LPAREN expressionList? RPAREN
+    ;
\ No newline at end of file
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 f1c254fa33..6c39a73323 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
@@ -3,11 +3,8 @@ package org.drools.parser;
 import org.antlr.v4.runtime.CharStream;
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.RuleContext;
 import org.antlr.v4.runtime.Token;
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.antlr.v4.runtime.tree.TerminalNode;
 import org.drools.drl.ast.descr.PackageDescr;
 
 public class DRLParserHelper {
@@ -17,7 +14,7 @@ public class DRLParserHelper {
     }
 
     public static ParseTree createParseTree(String drl) {
-        return createDrlParser(drl).compilationunit();
+        return createDrlParser(drl).compilationUnit();
     }
 
     public static DRLParser createDrlParser(String drl) {
@@ -34,90 +31,19 @@ public class DRLParserHelper {
         return visitor.getPackageDescr();
     }
 
-    public static ParseTree findNodeAtPosition(ParseTree root, int row, int 
col) {
-        ParseTree lastChild = null;
-        for (int i = 0; i < root.getChildCount(); i++) {
-            ParseTree child = root.getChild(i);
 
-            if (i > 0 && startsAfter(child, row, col)) {
-                return findNodeAtPosition(lastChild, row, col);
-            }
-
-            if (endsAfter(child, row, col)) {
-                return findNodeAtPosition(child, row, col);
-            }
-
-            lastChild = child;
-        }
-        return root;
-    }
-
-    public static Token getStartToken(ParseTree child) {
-        return child instanceof TerminalNode ? ((TerminalNode) 
child).getSymbol() : ((ParserRuleContext) child).getStart();
-    }
-
-    public static Token getStopToken(ParseTree child) {
-        return child instanceof TerminalNode ? ((TerminalNode) 
child).getSymbol() : ((ParserRuleContext) child).getStop();
-    }
-
-    private static boolean endsBefore(ParseTree node, int row, int col) {
-        Token token = getStopToken(node);
-        if (token.getLine() != row) {
-            return token.getLine() < row;
-        }
-        int tokenLength = (token.getStopIndex() - token.getStartIndex()) + 1;
-        int lastTokenPosition = token.getCharPositionInLine() + tokenLength;
-        return lastTokenPosition < col;
-    }
-
-    private static boolean endsAfter(ParseTree node, int row, int col) {
-        Token token = getStopToken(node);
-        if (token.getLine() != row) {
-            return token.getLine() > row;
-        }
-        int tokenLength = (token.getStopIndex() - token.getStartIndex()) + 1;
-        int lastTokenPosition = token.getCharPositionInLine() + tokenLength;
-        return lastTokenPosition >= col;
-    }
-
-    private static boolean startsAfter(ParseTree node, int row, int col) {
-        Token token = getStartToken(node);
-        if (token.getLine() != row) {
-            return token.getLine() > row;
-        }
-        return token.getCharPositionInLine() > col;
-    }
-
-    public static boolean hasParentOfType(ParseTree leaf, int type) {
-        return findParentOfType(leaf, type) != null;
-    }
-
-    public static ParseTree findParentOfType(ParseTree leaf, int type) {
-        if (leaf == null || (leaf instanceof RuleContext && ((RuleContext) 
leaf).getRuleIndex() == type)) {
-            return leaf;
-        }
-        return findParentOfType(leaf.getParent(), type);
-    }
-
-    public static int symbolType(ParseTree node) {
-        if (node instanceof TerminalNode) {
-            return ((TerminalNode) node).getSymbol().getType();
-        }
-        return -1;
-    }
-
-    public static boolean isSymbol(ParseTree node, int symbol) {
-        return symbolType(node) == symbol;
-    }
-
-    public static boolean isAfterSymbol(ParseTree node, int symbol, int row, 
int col) {
-        return isSymbol(node, symbol) && endsBefore(node, row, col);
-    }
-
-    public static int getNodeIndex(ParseTree node) {
-        if (node instanceof TerminalNode) {
-            return ((TerminalNode) node).getSymbol().getTokenIndex();
+    public static Integer computeTokenIndex(DRLParser parser, int row, int 
col) {
+        for (int i = 0; i < parser.getInputStream().size(); i++) {
+            Token token = parser.getInputStream().get(i);
+            int start = token.getCharPositionInLine();
+            int stop = token.getCharPositionInLine() + 
token.getText().length();
+            if (token.getLine() > row)
+                return token.getTokenIndex() - 1;
+            else if (token.getLine() == row && start >= col)
+                return token.getTokenIndex() == 0 ? 0 : token.getTokenIndex() 
- 1;
+            else if (token.getLine() == row && start < col && stop >= col)
+                return token.getTokenIndex();
         }
-        return node.getChildCount() == 0 ? 0: getNodeIndex(node.getChild(0));
+        return null;
     }
 }
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 9aa2fbce87..459fcf291d 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,23 +1,16 @@
 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;
+import org.drools.drl.ast.descr.*;
 
-public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
+public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> {
 
     private final PackageDescr packageDescr = new PackageDescr();
 
     private RuleDescr ruleDescr;
 
     @Override
-    public Object visitCompilationunit(DRLParser.CompilationunitContext ctx) {
-        return super.visitCompilationunit(ctx);
+    public Object visitCompilationUnit(DRLParser.CompilationUnitContext ctx) {
+        return super.visitCompilationUnit(ctx);
     }
 
     @Override
@@ -34,13 +27,13 @@ public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
 
     @Override
     public Object visitGlobaldef(DRLParser.GlobaldefContext ctx) {
-        packageDescr.addGlobal(new GlobalDescr(ctx.ID().getText(), 
ctx.type().getText()));
+        packageDescr.addGlobal(new GlobalDescr(ctx.IDENTIFIER().getText(), 
ctx.type().getText()));
         return super.visitGlobaldef(ctx);
     }
 
     @Override
     public Object visitImportdef(DRLParser.ImportdefContext ctx) {
-        String imp = ctx.qualifiedIdentifier().getText() + (ctx.STAR() != null 
? ".*" : "");
+        String imp = ctx.qualifiedName().getText() + (ctx.MUL() != null ? ".*" 
: "");
         packageDescr.addImport(new ImportDescr(imp));
         return super.visitImportdef(ctx);
     }
@@ -58,10 +51,10 @@ public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
 
     @Override
     public Object visitLhsPatternBind(DRLParser.LhsPatternBindContext ctx) {
-        if ( ctx.lhsPattern().size() == 1 ) {
+        if (ctx.lhsPattern().size() == 1) {
             PatternDescr patternDescr = new 
PatternDescr(ctx.lhsPattern(0).objectType.getText());
             if (ctx.label() != null) {
-                patternDescr.setIdentifier(ctx.label().ID().getText());
+                patternDescr.setIdentifier(ctx.label().IDENTIFIER().getText());
             }
             ruleDescr.getLhs().addDescr(patternDescr);
         }
@@ -69,18 +62,18 @@ public class DRLVisitorImpl extends DRLBaseVisitor<Object> {
     }
 
     @Override
-    public Object visitAnnotation(DRLParser.AnnotationContext ctx) {
+    public Object visitDrlAnnotation(DRLParser.DrlAnnotationContext ctx) {
         AnnotationDescr annotationDescr = new 
AnnotationDescr(ctx.name.getText());
-        annotationDescr.setValue(ctx.arguments().argument(0).getText());
+        annotationDescr.setValue(ctx.drlArguments().drlArgument(0).getText());
         ruleDescr.addAnnotation(annotationDescr);
-        return super.visitAnnotation(ctx);
+        return super.visitDrlAnnotation(ctx);
     }
 
     @Override
     public Object visitAttribute(DRLParser.AttributeContext ctx) {
-        AttributeDescr attributeDescr = new AttributeDescr( 
ctx.getChild(0).getText() );
+        AttributeDescr attributeDescr = new 
AttributeDescr(ctx.getChild(0).getText());
         if (ctx.getChildCount() > 1) {
-            attributeDescr.setValue( ctx.getChild(1).getText() );
+            attributeDescr.setValue(ctx.getChild(1).getText());
         }
         ruleDescr.addAttribute(attributeDescr);
         return super.visitAttribute(ctx);
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 5d8bd5b42d..f51710e1b8 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
@@ -1,24 +1,11 @@
 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.drools.drl.ast.descr.*;
 import org.junit.Test;
 
-import static org.drools.parser.DRLParserHelper.createParseTree;
-import static org.drools.parser.DRLParserHelper.findNodeAtPosition;
-import static org.drools.parser.DRLParserHelper.findParentOfType;
-import static org.drools.parser.DRLParserHelper.isAfterSymbol;
-import static org.drools.parser.DRLParserHelper.parse;
+import static org.drools.parser.DRLParserHelper.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
 public class DRLParserTest {
 
@@ -29,6 +16,7 @@ public class DRLParserTest {
             "rule TestRule @Test(true) no-loop salience 15 when \n" +
             "  $p:Person()\n" +
             "then\n" +
+            "  int a = 4;\n" +
             "  System.out.println($p.getName());\n" +
             "end\n";
 
@@ -52,37 +40,46 @@ public class DRLParserTest {
         assertNotNull(annotationDescr);
         assertEquals("true", annotationDescr.getValue());
 
-        assertEquals( 2, ruleDescr.getAttributes().size() );
-        assertNotNull( ruleDescr.getAttributes().get("no-loop") );
+        assertEquals(2, ruleDescr.getAttributes().size());
+        assertNotNull(ruleDescr.getAttributes().get("no-loop"));
         AttributeDescr salience = ruleDescr.getAttributes().get("salience");
-        assertNotNull( salience );
-        assertEquals( "15", salience.getValue() );
+        assertNotNull(salience);
+        assertEquals("15", salience.getValue());
 
         assertEquals("TestRule", ruleDescr.getName());
 
-        assertEquals( 1, ruleDescr.getLhs().getDescrs().size() );
+        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());
+        assertEquals("inta=4;System.out.println($p.getName());", 
ruleDescr.getConsequence());
     }
 
     @Test
-    public void testCursorPosition() {
-        ParseTree parseTree = createParseTree(drl);
-        ParseTree node = findNodeAtPosition(parseTree, 5, 7);
-        assertEquals("Person", node.getText());
-        ParseTree lhs = findParentOfType(node, DRLParser.RULE_lhs);
-        assertEquals(DRLParser.RULE_lhs, ((RuleContext) lhs).getRuleIndex());
-        assertEquals("$p:Person()", lhs.getText());
-    }
+    public void testComputeTokenIndex() {
+        DRLParser parser = createDrlParser(drl);
+        parser.compilationUnit();
 
-    @Test
-    public void testCursorPosition2() {
-        ParseTree parseTree = createParseTree(drl);
-        ParseTree node = findNodeAtPosition(parseTree, 4, 51);
-        assertEquals("when", node.getText());
-        assertTrue(isAfterSymbol(node, DRLParser.WHEN, 4, 51));
+        assertEquals(0, (int) computeTokenIndex(parser, 1, 0));
+        assertEquals(0, (int) computeTokenIndex(parser, 1, 1));
+        assertEquals(0, (int) computeTokenIndex(parser, 1, 7));
+        assertEquals(1, (int) computeTokenIndex(parser, 1, 8));
+        assertEquals(2, (int) computeTokenIndex(parser, 1, 9));
+        assertEquals(2, (int) computeTokenIndex(parser, 1, 9));
+        assertEquals(3, (int) computeTokenIndex(parser, 1, 12));
+        assertEquals(4, (int) computeTokenIndex(parser, 1, 13));
+        assertEquals(5, (int) computeTokenIndex(parser, 1, 17));
+        assertEquals(6, (int) computeTokenIndex(parser, 1, 18));
+        assertEquals(6, (int) computeTokenIndex(parser, 2, 0));
+        assertEquals(7, (int) computeTokenIndex(parser, 2, 1));
+        assertEquals(7, (int) computeTokenIndex(parser, 2, 6));
+        assertEquals(8, (int) computeTokenIndex(parser, 2, 7));
+        assertEquals(73, (int) computeTokenIndex(parser, 9, 0));
+        assertEquals(74, (int) computeTokenIndex(parser, 9, 1));
+        assertEquals(75, (int) computeTokenIndex(parser, 9, 4));
+        assertEquals(75, (int) computeTokenIndex(parser, 9, 5));
+        assertEquals(75, (int) computeTokenIndex(parser, 10, 0));  // EOF
     }
+
 }


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

Reply via email to