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
The following commit(s) were added to refs/heads/dev-new-parser by this push:
new 899795609c [incubator-kie-drools-5818] [new-parser] Parsing fails if a
Java keyw… (#5958)
899795609c is described below
commit 899795609c10d5c8e182449fc1b4684ec93bca01
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue May 21 15:51:56 2024 +0900
[incubator-kie-drools-5818] [new-parser] Parsing fails if a Java keyw…
(#5958)
* [incubator-kie-drools-5818] [new-parser] Parsing fails if a Java keyword
appears in a qualified name
* - Exclude 'new' from 'drlIdentifier' because of 'primary' ambiguity
- Add tests
---
.../drl/parser/antlr4/DRLExprParserTest.java | 22 ++++++--
.../drl/parser/antlr4/MiscDRLParserTest.java | 19 +++++++
.../drools/drl/parser/antlr4/ParserTestUtils.java | 19 +++++++
.../drools/drl/parser/antlr4/DRL6Expressions.g4 | 59 ++++++++++++++++++++--
4 files changed, 112 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 2a6d4e96a6..6489f3fdf8 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
@@ -442,12 +442,13 @@ public class DRLExprParserTest {
@Test
public void testNoViableAlt() {
- String source = "x.int";
+ String source = "a~a";
parser.parse(source);
// Backward Compatibility Notes:
- // Old expr parser (DRL6Expressions) allows this expression because
it's too tolerant (fail at runtime anyway).
- // Backward compatibility doesn't seem to be required in this case.
(But we may align with the old tolerant behavior.)
+ // Old expr parser (DRL6Expressions) allows this expression and only
takes "a" ignoring the invalid part "~a" without emitting an error.
+ // This is rather a bug in the old parser, and the new parser
(ANTLR4) correctly emits an error for this case.
+ // Backward compatibility doesn't seem to be required in this case.
if (DrlParser.ANTLR4_PARSER_ENABLED) {
assertThat(parser.hasErrors()).isTrue();
assertThat(parser.getErrors()).hasSize(1);
@@ -457,7 +458,7 @@ public class DRLExprParserTest {
assertThat(exception.getColumn()).isEqualTo(2);
assertThat(exception.getOffset()).isEqualTo(2);
assertThat(exception.getMessage())
- .isEqualToIgnoringCase("[ERR 101] Line 1:2 no viable
alternative at input '.int'");
+ .isEqualToIgnoringCase("[ERR 101] Line 1:2 no viable
alternative at input 'a'");
} else {
assertThat(parser.hasErrors()).isFalse();
}
@@ -564,4 +565,17 @@ public class DRLExprParserTest {
assertThat(left.getExpression()).isEqualTo("someMethod(value)");
assertThat(right.getExpression()).isEqualTo("4");
}
+
+ @Test
+ void newBigDecimal() {
+ String source = "$bd : new BigDecimal(30)";
+ ConstraintConnectiveDescr result = parser.parse(source);
+
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+
+ assertThat(result.getDescrs().size()).isEqualTo(1);
+
+ BindingDescr bind = (BindingDescr) result.getDescrs().get(0);
+ assertThat(bind.getVariable()).isEqualTo("$bd");
+ assertThat(bind.getExpression()).isEqualTo("new BigDecimal(30)");
+ }
}
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 bf553765e2..85c8423ba8 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
@@ -5103,4 +5103,23 @@ class MiscDRLParserTest {
assertThat(parser.hasErrors()).isTrue();
assertThat(parser.getErrors()).extracting(DroolsError::getMessage).doesNotContain("");
}
+
+ @ParameterizedTest
+ @MethodSource("org.drools.drl.parser.antlr4.ParserTestUtils#javaKeywords")
+ void javaKeywordsInPackage(String keyword) {
+ String pkgName = "org.drools." + keyword;
+ String text = "package " + pkgName + "\n" +
+ "rule R\n" +
+ "when\n" +
+ " $p : Person()\n" +
+ "then\n" +
+ "end\n";
+
+ PackageDescr pkg = parseAndGetPackageDescr(text);
+
+ assertThat(pkg.getName()).isEqualTo(pkgName);
+ assertThat(pkg.getRules()).hasSize(1);
+
+ assertThat(pkg.getRules().get(0).getName()).isEqualTo("R");
+ }
}
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/ParserTestUtils.java
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/ParserTestUtils.java
index 270b8f8c37..3419eab65e 100644
---
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/ParserTestUtils.java
+++
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/ParserTestUtils.java
@@ -18,10 +18,25 @@
*/
package org.drools.drl.parser.antlr4;
+import java.util.Arrays;
+import java.util.List;
+
import org.drools.drl.parser.DrlParser;
public class ParserTestUtils {
+ // 'new' is not included because it cannot be included in drlIdentifier.
+ // See https://github.com/apache/incubator-kie-drools/pull/5958
+ public static List<String> javaKeywords =
+ Arrays.asList(
+ "abstract", "assert", "boolean", "break", "byte", "case",
"catch", "char", "class", "const",
+ "continue", "default", "do", "double", "else", "enum",
"extends", "final", "finally", "float",
+ "for", "goto", "if", "implements", "import", "instanceof",
"int", "interface", "long", "native",
+ "package", "private", "protected", "public", "return",
"short", "static", "strictfp",
+ "super", "switch", "synchronized", "this", "throw",
"throws", "transient", "try", "void", "volatile",
+ "while"
+ );
+
private ParserTestUtils() {
// It is a utility class, so it should not be instantiated.
}
@@ -39,4 +54,8 @@ public class ParserTestUtils {
public static void enableOldParser() {
DrlParser.ANTLR4_PARSER_ENABLED = false;
}
+
+ public static List<String> javaKeywords() {
+ return javaKeywords;
+ }
}
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 27734251f1..f2a5a79f19 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,58 @@ typeArgument
drlIdentifier returns [Token token]
: drlKeywords
| IDENTIFIER
+ // java keywords
+ | ABSTRACT
+ | ASSERT
+ | BOOLEAN
+ | BREAK
+ | BYTE
+ | CASE
+ | CATCH
+ | CHAR
+ | CLASS
+ | CONST
+ | CONTINUE
+ | DEFAULT
+ | DO
+ | DOUBLE
+ | ELSE
+ | ENUM
+ | EXTENDS
+ | FINAL
+ | FINALLY
+ | FLOAT
+ | FOR
+ | IF
+ | GOTO
+ | IMPLEMENTS
+ | IMPORT
+ | INSTANCEOF
+ | INT
+ | INTERFACE
+ | LONG
+ | NATIVE
+// | NEW // avoid ambiguity with 'new_key creator' and 'drlIdentifier'
in 'primary'
+ | PACKAGE
+ | PRIVATE
+ | PROTECTED
+ | PUBLIC
+ | RETURN
+ | SHORT
+ | STATIC
+ | STRICTFP
+ | SUPER
+ | SWITCH
+ | SYNCHRONIZED
+ | THIS
+ | THROW
+ | THROWS
+ | TRANSIENT
+ | TRY
+ | VOID
+ | VOLATILE
+ | WHILE
+ // Module related keywords
| MODULE
| OPEN
| REQUIRES
@@ -172,12 +224,13 @@ drlIdentifier returns [Token token]
| PROVIDES
| WITH
| TRANSITIVE
+ // other java keywords
+ | VAR
| YIELD
+ | RECORD
| SEALED
| PERMITS
- | RECORD
- | VAR
- | THIS
+ | NON_SEALED
;
// matches any drl keywords
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]