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 55e478fbc4 [new-parser] Support pluggable evaluators and class literal 
(#5834)
55e478fbc4 is described below

commit 55e478fbc474c7e13d8758e4ff2dd546cc897880
Author: Jiří Locker <[email protected]>
AuthorDate: Mon Apr 15 07:33:16 2024 +0200

    [new-parser] Support pluggable evaluators and class literal (#5834)
    
    * Support isA operator and pluggable evaluators in general
    
    * Support class literals
    
    * Clean up drlPrimary rule
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 16 ++++++++++++
 .../drools/drl/parser/antlr4/DRL6Expressions.g4    |  2 +-
 .../org/drools/drl/parser/antlr4/DRLParser.g4      | 29 +++++++++++++++++++---
 3 files changed, 43 insertions(+), 4 deletions(-)

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 5e3cf7c6af..2f98ddea42 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
@@ -4000,6 +4000,22 @@ class MiscDRLParserTest {
                 .containsExactlyInAnyOrder("com.sample.ParentTrait", 
"UncleTrait", "org.test.GrandParentTrait");
     }
 
+    @Test
+    public void pluggableEvaluator() throws Exception {
+        final String source = "package org.drools\n" +
+                "rule R\n" +
+                "when\n" +
+                "   $t : Thing( $c : core, this not isA t.x.E.class, this isA 
t.x.D.class )\n" +
+                "then\n" +
+                "   list.add( \"E\" ); \n" +
+                "   don( $t, E.class ); \n" +
+                "end\n";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(source).getLhs().getDescrs().get(0);
+        assertThat(pattern.getConstraint().getDescrs())
+                .extracting(Object::toString)
+                .containsExactly("$c : core", "this not isA t.x.E.class", 
"this isA t.x.D.class");
+    }
+
     @Test
     void namedConsequenceDo() {
         final String text =
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 47e01001a6..348e8907a1 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
@@ -747,7 +747,7 @@ identifierSuffix
                           expression
                           RBRACK { helper.emit($RBRACK, 
DroolsEditorType.SYMBOL); } )+ // can also be matched by selector, but do here
     |   arguments
-//    |   DOT class_key
+    |   DOT class_key
 //    |   DOT explicitGenericInvocation
 //    |   DOT this_key
 //    |   DOT super_key arguments
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 e5cfc957cc..6afee1260e 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
@@ -188,7 +188,8 @@ relationalOperator
     | temporalOperator
     ;
 
-drlRelationalOperator : DRL_NOT? builtInOperator ;
+// IDENTIFIER is required to accept custom operators.
+drlRelationalOperator : DRL_NOT? (IDENTIFIER | builtInOperator) ;
 
 /* function := FUNCTION type? ID parameters(typed) chunk_{_} */
 functiondef : DRL_FUNCTION typeTypeOrVoid? IDENTIFIER formalParameters 
drlBlock ;
@@ -350,13 +351,24 @@ temporalOperator : DRL_NOT? bop=(DRL_AFTER | DRL_BEFORE | 
DRL_COINCIDES | DRL_DU
 
 timeAmount : LBRACK (TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL) (COMMA 
(TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL))* RBRACK ;
 
+unaryExpressionNotPlusMinus : (left2=xpathPrimary | left1=drlPrimary) 
(selector)* ;
+
+selector
+    : DOT SUPER superSuffix
+    | DOT NEW (nonWildcardTypeArguments)? innerCreator
+    | (DOT | NULL_SAFE_DOT) drlIdentifier (drlArguments)?
+    | (DOT | NULL_SAFE_DOT) drlMethodCall
+    | LBRACK drlExpression RBRACK
+    ;
+
 /* extending JavaParser primary */
 drlPrimary
     : LPAREN drlExpression RPAREN
     | THIS
     | SUPER
+    | NEW drlCreator
     | drlLiteral
-    | drlIdentifier
+    | drlIdentifier drlIdentifierMiddle* identifierSuffix?
     | typeTypeOrVoid DOT CLASS
     | nonWildcardTypeArguments (explicitGenericInvocationSuffix | THIS 
arguments)
     | inlineListExpression
@@ -364,6 +376,17 @@ drlPrimary
     | inlineCast
     ;
 
+drlIdentifierMiddle
+    : (DOT | NULL_SAFE_DOT | HASH) drlIdentifier
+    | (DOT | NULL_SAFE_DOT) LPAREN drlExpression (COMMA drlExpression)* RPAREN
+    ;
+
+identifierSuffix
+    : (LBRACK RBRACK)+ DOT CLASS
+    | (LBRACK drlExpression RBRACK)+
+    | arguments
+    ;
+
 inlineCast : drlIdentifier HASH drlIdentifier ;
 
 /* extending JavaParser literal */
@@ -423,7 +446,7 @@ patternSource : fromAccumulate
               | fromExpression
               ;
 
-fromExpression : conditionalOrExpression ;
+fromExpression : unaryExpressionNotPlusMinus ;
 
 
 /*


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

Reply via email to