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]

Reply via email to