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]