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

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


The following commit(s) were added to refs/heads/dev-new-parser by this push:
     new 3796779201 [incubator-kie-drools#5776] [new-parser] failed to parse 
when a method name is a drl keyword (#5783)
3796779201 is described below

commit 3796779201e7078757a59aacaabdd5389b5442b0
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon Mar 18 10:23:05 2024 +0900

    [incubator-kie-drools#5776] [new-parser] failed to parse when a method name 
is a drl keyword (#5783)
---
 .../drl/parser/antlr4/DRLExprParserTest.java       | 27 ++++++++
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 15 +++++
 .../drools/drl/parser/antlr4/DRL6Expressions.g4    | 78 ++++++++++++++++++++--
 .../org/drools/drl/parser/antlr4/DRLParser.g4      | 13 +++-
 4 files changed, 126 insertions(+), 7 deletions(-)

diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
index 6fc7eecc6e..c404d2e0ef 100644
--- 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLExprParserTest.java
@@ -212,6 +212,33 @@ public class DRLExprParserTest {
         assertThat(bind.getExpression()).isEqualTo("y[z].foo");
     }
 
+    @Test
+    public void testDrlKeywordMethodCall() throws Exception {
+        String source = "x.contains( 1, a )";
+        ConstraintConnectiveDescr result = parser.parse( source );
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND);
+        assertThat(result.getDescrs().size()).isEqualTo(1);
+
+        AtomicExprDescr descr = (AtomicExprDescr) result.getDescrs().get( 0 );
+        assertThat(descr.getExpression()).isEqualTo("x.contains( 1, a )");
+    }
+
+    @Test
+    public void testDrlKeywordMethodCallBinding() throws Exception {
+        String source = "$x : x.contains( 1, a )";
+        ConstraintConnectiveDescr result = parser.parse( source );
+        
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+        assertThat(result.getConnective()).isEqualTo(ConnectiveType.AND);
+        assertThat(result.getDescrs().size()).isEqualTo(1);
+
+        BindingDescr bind = (BindingDescr) result.getDescrs().get( 0 );
+        assertThat(bind.getVariable()).isEqualTo("$x");
+        assertThat(bind.getExpression()).isEqualTo("x.contains( 1, a )");
+    }
+
     @Test
     public void testDeepBinding() throws Exception {
         String source = "($a : a > $b : b[10].prop || 10 != 20) && $x : 
someMethod(10) == 20";
diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
index 5c82ed73ff..0b394bbdd3 100644
--- 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
@@ -3639,4 +3639,19 @@ class MiscDRLParserTest {
         ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
         
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("address!.city!.startsWith(\"M\")");
     }
+
+    @Test
+    void nullSafeDereferencingMethodCallBindVariable() {
+        final String text = "package org.drools\n" +
+                "rule R1\n" +
+                "when\n" +
+                "    $p : Person( $containsL : address!.city.contains(\"L\") 
)\n" +
+                "then\n" +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+        PatternDescr patternDescr = (PatternDescr) 
ruleDescr.getLhs().getDescrs().get(0);
+        ExprConstraintDescr constraintDescr = (ExprConstraintDescr) 
patternDescr.getConstraint().getDescrs().get(0);
+        
assertThat(constraintDescr.toString()).isEqualToIgnoringWhitespace("$containsL 
: address!.city.contains(\"L\")");
+    }
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
index 51ea965a0f..c8a34b5076 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
@@ -162,6 +162,76 @@ typeArgument
     |  QUESTION ((extends_key | super_key) type)?
     ;
 
+// matches any drl keywords
+drlKeywords returns [Token token]
+    : DRL_UNIT
+    | DRL_FUNCTION
+    | DRL_GLOBAL
+    | DRL_DECLARE
+    | DRL_RULE
+    | DRL_QUERY
+    | DRL_WHEN
+    | DRL_THEN
+    | DRL_END
+    | DRL_AND
+    | DRL_OR
+    | DRL_EXISTS
+    | DRL_NOT
+    | DRL_IN
+    | DRL_FROM
+    | DRL_MATCHES
+    | DRL_MEMBEROF
+    | DRL_CONTAINS
+    | DRL_EXCLUDES
+    | DRL_SOUNDSLIKE
+    | DRL_STR
+    | DRL_ACCUMULATE
+    | DRL_ACC
+    | DRL_INIT
+    | DRL_ACTION
+    | DRL_REVERSE
+    | DRL_RESULT
+    | DRL_ENTRY_POINT
+    | DRL_EVAL
+    | DRL_SALIENCE
+    | DRL_ENABLED
+    | DRL_NO_LOOP
+    | DRL_AUTO_FOCUS
+    | DRL_LOCK_ON_ACTIVE
+    | DRL_REFRACT
+    | DRL_DIRECT
+    | DRL_AGENDA_GROUP
+    | DRL_ACTIVATION_GROUP
+    | DRL_RULEFLOW_GROUP
+    | DRL_DATE_EFFECTIVE
+    | DRL_DATE_EXPIRES
+    | DRL_DIALECT
+    | DRL_CALENDARS
+    | DRL_TIMER
+    | DRL_DURATION
+    ;
+
+// matches any identifiers including acceptable java keywords (defined in 
JavaParser.g4) and drl keywords
+drlIdentifier returns [Token token]
+    : drlKeywords
+    | IDENTIFIER
+    | MODULE
+    | OPEN
+    | REQUIRES
+    | EXPORTS
+    | OPENS
+    | TO
+    | USES
+    | PROVIDES
+    | WITH
+    | TRANSITIVE
+    | YIELD
+    | SEALED
+    | PERMITS
+    | RECORD
+    | VAR
+    ;
+
 // --------------------------------------------------------
 //                      EXPRESSIONS
 // --------------------------------------------------------
@@ -608,18 +678,18 @@ primary returns [BaseDescr result]
     //|   void_key DOT class_key
     |   inlineMapExpression
     |   inlineListExpression
-    |   i1=IDENTIFIER { helper.emit($i1, DroolsEditorType.IDENTIFIER); }
+    |   i1=drlIdentifier { helper.emit($i1.token, 
DroolsEditorType.IDENTIFIER); }
         (
-            ( d=DOT i2=IDENTIFIER { helper.emit($d, DroolsEditorType.SYMBOL); 
helper.emit($i2, DroolsEditorType.IDENTIFIER); } )
+            ( d=DOT i2=drlIdentifier { helper.emit($d, 
DroolsEditorType.SYMBOL); helper.emit($i2.token, DroolsEditorType.IDENTIFIER); 
} )
             |
             ( d=(DOT|NULL_SAFE_DOT) LPAREN { helper.emit($d, 
DroolsEditorType.SYMBOL); helper.emit($LPAREN, DroolsEditorType.SYMBOL); }
                                     expression (COMMA { helper.emit($COMMA, 
DroolsEditorType.SYMBOL); } expression)*
                                     RPAREN { helper.emit($RPAREN, 
DroolsEditorType.SYMBOL); }
             )
             |
-            ( h=HASH i2=IDENTIFIER { helper.emit($h, DroolsEditorType.SYMBOL); 
helper.emit($i2, DroolsEditorType.IDENTIFIER); } )
+            ( h=HASH i2=drlIdentifier { helper.emit($h, 
DroolsEditorType.SYMBOL); helper.emit($i2.token, DroolsEditorType.IDENTIFIER); 
} )
             |
-            ( n=NULL_SAFE_DOT i2=IDENTIFIER { helper.emit($n, 
DroolsEditorType.SYMBOL); helper.emit($i2, DroolsEditorType.IDENTIFIER); } )
+            ( n=NULL_SAFE_DOT i2=drlIdentifier { helper.emit($n, 
DroolsEditorType.SYMBOL); helper.emit($i2.token, DroolsEditorType.IDENTIFIER); 
} )
         )* (identifierSuffix)?
     ;
 
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
index 6a98fab11e..c358c66309 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
@@ -247,16 +247,16 @@ drlExpression
     | drlExpression bop=DOT
       (
          drlIdentifier
-       | methodCall
+       | drlMethodCall
        | THIS
        | NEW nonWildcardTypeArguments? innerCreator
        | SUPER superSuffix
        | explicitGenericInvocation
       )
-    | drlExpression NULL_SAFE_DOT ( drlIdentifier | methodCall )
+    | drlExpression NULL_SAFE_DOT ( drlIdentifier | drlMethodCall )
     | drlExpression LBRACK drlExpression RBRACK
     | DRL_EVAL LPAREN conditionalOrExpression RPAREN
-    | methodCall
+    | drlMethodCall
     | NEW drlCreator
     | LPAREN annotation* typeType (BITAND typeType)* RPAREN drlExpression
     | drlExpression postfix=(INC | DEC)
@@ -286,6 +286,13 @@ drlExpression
     | classType COLONCOLON typeArguments? NEW
     ;
 
+/* extending JavaParser methodCall in order to accept drl keywords as method 
name */
+drlMethodCall
+    : drlIdentifier LPAREN expressionList? RPAREN
+    | THIS LPAREN expressionList? RPAREN
+    | SUPER LPAREN expressionList? RPAREN
+    ;
+
 temporalOperator : DRL_NOT? bop=(DRL_AFTER | DRL_BEFORE | DRL_COINCIDES | 
DRL_DURING | DRL_INCLUDES | DRL_FINISHES | DRL_FINISHED_BY | DRL_MEETS | 
DRL_MET_BY | DRL_OVERLAPS | DRL_OVERLAPPED_BY | DRL_STARTS | DRL_STARTED_BY) 
timeAmount? ;
 
 timeAmount : LBRACK (TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL) (COMMA 
(TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL))* RBRACK ;


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

Reply via email to