From 5fe50b40d3f44aa34feb6be1d4bac3c4c177daf5 Mon Sep 17 00:00:00 2001 From: Toshiya Kobayashi Date: Mon, 20 May 2024 13:57:23 +0900 Subject: [PATCH] - Exclude 'new' from 'drlIdentifier' because of 'primary' ambiguity - Add tests --- .../drl/parser/antlr4/DRLExprParserTest.java | 37 +++++++++++++++++++ .../drl/parser/antlr4/ParserTestUtils.java | 4 +- .../drl/parser/antlr4/DRL6Expressions.g4 | 2 +- 3 files changed, 41 insertions(+), 2 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 3a2aee51167..6489f3fdf80 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 @@ -440,6 +440,30 @@ public void testExtraneousInput() { } } + @Test + public void testNoViableAlt() { + String source = "a~a"; + parser.parse(source); + + // Backward Compatibility Notes: + // 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); + DroolsParserException exception = parser.getErrors().get(0); + assertThat(exception.getErrorCode()).isEqualTo("ERR 101"); + assertThat(exception.getLineNumber()).isEqualTo(1); + assertThat(exception.getColumn()).isEqualTo(2); + assertThat(exception.getOffset()).isEqualTo(2); + assertThat(exception.getMessage()) + .isEqualToIgnoringCase("[ERR 101] Line 1:2 no viable alternative at input 'a'"); + } else { + assertThat(parser.hasErrors()).isFalse(); + } + } + @Test void orWithMethodCall() { String source = "value == 10 || someMethod() == 4"; @@ -541,4 +565,17 @@ void andWithMethodCallWithArg() { 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/ParserTestUtils.java b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/ParserTestUtils.java index 9d59344f376..3419eab65e5 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 @@ -25,12 +25,14 @@ 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 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", - "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", + "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while" ); 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 3daf6ccf653..f2a5a79f195 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 @@ -193,7 +193,7 @@ drlIdentifier returns [Token token] | INTERFACE | LONG | NATIVE - | NEW +// | NEW // avoid ambiguity with 'new_key creator' and 'drlIdentifier' in 'primary' | PACKAGE | PRIVATE | PROTECTED