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]