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 6e38e568d7 [incubator-kie-drools-5784] Review DRLParser.g4 and 
DRL6Expressions.g… (#5875)
6e38e568d7 is described below

commit 6e38e568d7482a152d64c879274842eb855529cb
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue Apr 30 18:23:32 2024 +0900

    [incubator-kie-drools-5784] Review DRLParser.g4 and DRL6Expressions.g… 
(#5875)
    
    * [incubator-kie-drools-5784] Review DRLParser.g4 and DRL6Expressions.g4 to 
replace IDENTIFIER with drlIdentifier
    
    * - Removed unused methods
---
 .../drl/parser/antlr4/DRLParserIdentifierTest.java | 325 +++++++++++++++++++++
 .../drools/drl/parser/antlr4/DRLParserTest.java    |  18 ++
 .../drl/parser/antlr4/MiscDRLParserTest.java       |  18 ++
 .../drools/drl/parser/antlr4/ParserTestUtils.java  |   7 +
 .../drools/drl/parser/antlr4/DRL6Expressions.g4    |  27 +-
 .../org/drools/drl/parser/antlr4/DRLParser.g4      |  17 +-
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   |  10 +-
 7 files changed, 395 insertions(+), 27 deletions(-)

diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserIdentifierTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserIdentifierTest.java
new file mode 100644
index 0000000000..5e0b60545b
--- /dev/null
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserIdentifierTest.java
@@ -0,0 +1,325 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.drools.drl.parser.antlr4;
+
+import org.drools.drl.ast.descr.AccumulateDescr;
+import org.drools.drl.ast.descr.AccumulateImportDescr;
+import org.drools.drl.ast.descr.AnnotationDescr;
+import org.drools.drl.ast.descr.BehaviorDescr;
+import org.drools.drl.ast.descr.ExprConstraintDescr;
+import org.drools.drl.ast.descr.FunctionDescr;
+import org.drools.drl.ast.descr.GlobalDescr;
+import org.drools.drl.ast.descr.PackageDescr;
+import org.drools.drl.ast.descr.PatternDescr;
+import org.drools.drl.ast.descr.RuleDescr;
+import org.drools.drl.ast.descr.WindowDeclarationDescr;
+import org.drools.drl.ast.descr.WindowReferenceDescr;
+import org.drools.drl.parser.DrlParser;
+import org.drools.drl.parser.DroolsParserException;
+import org.drools.drl.parser.impl.Operator;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/*
+ * This test class is to test parse rules to accept drlIdentifier insteadof 
IDENTIFIER. (e.g. drl keyword like "contains")
+ */
+class DRLParserIdentifierTest {
+
+    private DrlParser parser;
+
+    @BeforeEach
+    public void setUp() {
+        parser = ParserTestUtils.getParser();
+    }
+
+    private PackageDescr parseAndGetPackageDescr(String drl) {
+        try {
+            PackageDescr pkg = parser.parse(null, drl);
+            
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
+            return pkg;
+        } catch (DroolsParserException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private RuleDescr parseAndGetFirstRuleDescr(String drl) {
+        PackageDescr pkg = parseAndGetPackageDescr(drl);
+        assertThat(pkg.getRules()).isNotEmpty();
+        return pkg.getRules().get(0);
+    }
+
+    @Test
+    void importAccumulate() {
+        final String source = "import accumulate org.example.MyFunction 
contains;";
+        final PackageDescr pkg = parseAndGetPackageDescr(source);
+        AccumulateImportDescr accumulateImportDescr = 
pkg.getAccumulateImports().get(0);
+        
assertThat(accumulateImportDescr.getTarget()).isEqualTo("org.example.MyFunction");
+        
assertThat(accumulateImportDescr.getFunctionName()).isEqualTo("contains");
+    }
+
+    @Test
+    void windowDeclaration() {
+        final String text =
+                "declare window contains\n" +
+                        "    $s : StockTick( source == \"NYSE\" )\n" +
+                        "        over window:length( 10 )\n" +
+                        "end";
+        PackageDescr pkg = parseAndGetPackageDescr(text);
+        WindowDeclarationDescr windowDeclarationDescr = 
pkg.getWindowDeclarations().iterator().next();
+        assertThat(windowDeclarationDescr.getName()).isEqualTo("contains");
+    }
+
+    @Test
+    void nestedConstraint() {
+        final String text =
+                "rule R\n" +
+                        "when\n" +
+                        " Person( contains.matches.( city == \"london\", 
country == \"uk\"))\n" +
+                        "then\n" +
+                        "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        
assertThat(rule.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
 patternDescr -> {
+            
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
 exprConstraintDescr -> {
+                
assertThat(exprConstraintDescr.getExpression()).isEqualTo("contains.matches.city
 == \"london\"");
+            });
+            
assertThat(patternDescr.getConstraint().getDescrs().get(1)).isInstanceOfSatisfying(ExprConstraintDescr.class,
 exprConstraintDescr -> {
+                
assertThat(exprConstraintDescr.getExpression()).isEqualTo("contains.matches.country
 == \"uk\"");
+            });
+        });
+    }
+
+    @Test
+    public void function() {
+        final String text = "function boolean contains(String s) { return 
true; }";
+        PackageDescr packageDescr = parseAndGetPackageDescr(text);
+        FunctionDescr function = packageDescr.getFunctions().get(0);
+        assertThat(function.getName()).isEqualTo("contains");
+    }
+
+    @Test
+    public void patternFilter() {
+        final String text = "rule X when StockTick( symbol==\"ACME\") over 
window:contains(10) then end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get(0);
+        BehaviorDescr behavior = pattern.getBehaviors().get(0);
+        assertThat(behavior.getType()).isEqualTo("window");
+        assertThat(behavior.getSubType()).isEqualTo("contains");
+        assertThat(behavior.getParameters().get(0)).isEqualTo("10");
+    }
+
+    @Test
+    public void accumulateFunction() {
+        final String text = "rule R1\n" +
+                "when\n" +
+                "     accumulate( Person( $age : age > 21 ), $ave : contains( 
$age ) );\n" +
+                "then\n" +
+                "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        final PatternDescr out = (PatternDescr) 
rule.getLhs().getDescrs().get(0);
+        final AccumulateDescr accumulate = (AccumulateDescr) out.getSource();
+        
assertThat(accumulate.getFunctions().get(0).getFunction()).isEqualToIgnoringWhitespace("contains");
+    }
+
+    @Test
+    public void fromWindow() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "    StockTick() from window contains\n" +
+                        "then\n" +
+                        "end\n";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get(0);
+        
assertThat(pattern.getSource()).isInstanceOfSatisfying(WindowReferenceDescr.class,
 windowReferenceDescr -> {
+            assertThat(windowReferenceDescr.getName()).isEqualTo("contains");
+        });
+    }
+
+    @Test
+    public void type() {
+        final String text = "global contains.matches bbb";
+        PackageDescr pkg = parseAndGetPackageDescr(text);
+        GlobalDescr global = pkg.getGlobals().get(0);
+        assertThat(global.getType()).isEqualTo("contains.matches");
+        assertThat(global.getIdentifier()).isEqualTo("bbb");
+    }
+
+    @Test
+    public void unification() throws Exception {
+        final String text = "rule X\n" +
+                "when\n" +
+                "  contains := Person()\n" +
+                "then\n" +
+                "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        assertThat(pattern.getIdentifier()).isEqualTo("contains");
+        assertThat(pattern.isUnification()).isTrue();
+    }
+
+    @Test
+    public void annotation() {
+        final String text = "rule R\n" +
+                "@contains.matches(soundslike=\"abc\")\n" +
+                "when\n" +
+                "then\n" +
+                "end";
+        RuleDescr rule = parseAndGetFirstRuleDescr(text);
+        AnnotationDescr annotation = rule.getAnnotation("contains.matches");
+        assertThat(annotation.getValue("soundslike")).isEqualTo("\"abc\"");
+    }
+
+    @Test
+    public void constraintBoundVariable() {
+        final String text = "rule X\n" +
+                "when\n" +
+                "  Person( contains : age > 20)\n" +
+                "then\n" +
+                "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("contains : 
age > 20");
+    }
+
+    @Test
+    public void constraintBoundVariableUnify() {
+        final String text = "rule X\n" +
+                "when\n" +
+                "  Person( contains := age > 20)\n" +
+                "then\n" +
+                "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("contains := 
age > 20");
+    }
+
+    @Test
+    void xpathChunk() {
+        final String text =
+                "rule R when\n" +
+                        " $man: Man( /contains.matches#soundslike[memberOf > 
10] )\n" +
+                        "then\n" +
+                        "end\n";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        
assertThat(exprConstraintDescr.getExpression()).isEqualTo("/contains.matches#soundslike[memberOf
 > 10]");
+    }
+
+    @Test
+    void createdName() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( age > new contains.matches(10))\n" +
+                        "then\n" +
+                        "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("age > new 
contains.matches(10)");
+    }
+
+    @Test
+    void explicitGenericInvocationSuffix() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( name == <String>contains())\n" +
+                        "then\n" +
+                        "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("name == 
<String>contains()");
+    }
+
+    @Disabled("Old parser does not support this syntax")
+    @Test
+    void innerCreator() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( outer.new contains() != null )\n" +
+                        "then\n" +
+                        "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("outer.new 
contains() != null");
+    }
+
+    @Test
+    void superSuffix() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( address.super.contains() == 10 )\n" +
+                        "then\n" +
+                        "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        
assertThat(exprConstraintDescr.getExpression()).isEqualTo("address.super.contains()
 == 10");
+    }
+
+    @Disabled("To be done by 
https://github.com/apache/incubator-kie-drools/issues/5874";)
+    @Test
+    void operator_key() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( age provides 10 )\n" +
+                        "then\n" +
+                        "end";
+        // PROVIDES is not IDENTIFIER, but included in drlIdentifier
+        Operator.addOperatorToRegistry("provides", false);
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("age 
provides 10");
+    }
+
+    @Disabled("To be done by 
https://github.com/apache/incubator-kie-drools/issues/5874";)
+    @Test
+    void neg_operator_key() {
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( age not provides 10 )\n" +
+                        "then\n" +
+                        "end";
+        // PROVIDES is not IDENTIFIER, but included in drlIdentifier
+        Operator.addOperatorToRegistry("provides", true);
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("age not 
provides 10");
+    }
+
+    @Test
+    void operator_key_temporal() {
+        // This test (and MiscDRLParserTest.parse_PluggableOperators) fails 
when adapting drlIdentifier to operator_key and neg_operator_key in 
DRL6Expressions.g4
+        // See https://github.com/apache/incubator-kie-drools/issues/5874
+        final String text =
+                "rule X\n" +
+                        "when\n" +
+                        "  Person( this after[1,10] $a || this not 
after[15,20] $a )\n" +
+                        "then\n" +
+                        "end";
+        PatternDescr pattern = (PatternDescr) 
parseAndGetFirstRuleDescr(text).getLhs().getDescrs().get(0);
+        ExprConstraintDescr exprConstraintDescr = (ExprConstraintDescr) 
pattern.getConstraint().getDescrs().get(0);
+        assertThat(exprConstraintDescr.getExpression()).isEqualTo("this 
after[1,10] $a || this not after[15,20] $a");
+    }
+}
diff --git 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserTest.java
 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserTest.java
index f792effd23..1533aefdc0 100644
--- 
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserTest.java
+++ 
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/DRLParserTest.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.drools.drl.parser.antlr4;
 
 import java.util.List;
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 f44b6b5abd..9f1d67035b 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
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.drools.drl.parser.antlr4;
 
 import java.io.BufferedReader;
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 f0d1f854d2..270b8f8c37 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
@@ -32,4 +32,11 @@ public class ParserTestUtils {
     public static DrlParser getParser() {
         return new DrlParser();
     }
+
+    /**
+     * Enables the old parser. Just for quick testing purposes.
+     */
+    public static void enableOldParser() {
+        DrlParser.ANTLR4_PARSER_ENABLED = false;
+    }
 }
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 190bceee75..02c20088f4 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
@@ -146,7 +146,7 @@ type
 
 typeMatch
     : primitiveType (LBRACK RBRACK)*
-    |  IDENTIFIER (typeArguments)? (DOT IDENTIFIER (typeArguments)? )* (LBRACK 
RBRACK)*
+    |  drlIdentifier (typeArguments)? (DOT drlIdentifier (typeArguments)? )* 
(LBRACK RBRACK)*
     ;
 
 typeArguments
@@ -282,7 +282,7 @@ finally { ternOp--; }
 
 fullAnnotation [AnnotatedDescrBuilder inDescrBuilder] returns [AnnotationDescr 
result]
 @init{ String n = ""; AnnotationDescrBuilder annoBuilder = null; }
-  : AT name=IDENTIFIER { n = $name.text; } ( DOT x=IDENTIFIER { n += "." + 
$x.text; } )*
+  : AT name=drlIdentifier { n = $name.text; } ( DOT x=drlIdentifier { n += "." 
+ $x.text; } )*
         { if( buildDescr ) {
                 if ( inDescrBuilder == null ) {
                     $result = new AnnotationDescr( n );
@@ -310,7 +310,7 @@ annotationElementValuePairs [AnnotationDescr descr, 
AnnotatedDescrBuilder inDesc
   ;
 
 annotationElementValuePair [AnnotationDescr descr, AnnotatedDescrBuilder 
inDescrBuilder]
-  : key=IDENTIFIER ASSIGN val=annotationValue[inDescrBuilder] { if ( 
buildDescr ) { $descr.setKeyValue( $key.text, $val.result ); } }
+  : key=drlIdentifier ASSIGN val=annotationValue[inDescrBuilder] { if ( 
buildDescr ) { $descr.setKeyValue( $key.text, $val.result ); } }
   ;
 
 annotationValue[AnnotatedDescrBuilder inDescrBuilder] returns [Object result]
@@ -615,10 +615,10 @@ unaryExpressionNotPlusMinus returns [BaseDescr result]
     |   castExpression
     |   backReferenceExpression
     |   { isLeft = helper.getLeftMostExpr() == null;}
-        ( ({inMap == 0 && ternOp == 0 && _input.LA(2) == DRLLexer.COLON}? 
(var=IDENTIFIER COLON
-                { hasBindings = true; helper.emit($var, 
DroolsEditorType.IDENTIFIER_VARIABLE); helper.emit($COLON, 
DroolsEditorType.SYMBOL); if( buildDescr ) { bind = new BindingDescr($var.text, 
null, false); helper.setStart( bind, $var ); } } ))
-        | ({inMap == 0 && ternOp == 0 && _input.LA(2) == DRLLexer.DRL_UNIFY}? 
(var=IDENTIFIER DRL_UNIFY
-                { hasBindings = true; helper.emit($var, 
DroolsEditorType.IDENTIFIER_VARIABLE); helper.emit($DRL_UNIFY, 
DroolsEditorType.SYMBOL); if( buildDescr ) { bind = new BindingDescr($var.text, 
null, true); helper.setStart( bind, $var ); } } ))
+        ( ({inMap == 0 && ternOp == 0 && _input.LA(2) == DRLLexer.COLON}? 
(var=drlIdentifier COLON
+                { hasBindings = true; helper.emit($var.token, 
DroolsEditorType.IDENTIFIER_VARIABLE); helper.emit($COLON, 
DroolsEditorType.SYMBOL); if( buildDescr ) { bind = new BindingDescr($var.text, 
null, false); helper.setStart( bind, $var.token ); } } ))
+        | ({inMap == 0 && ternOp == 0 && _input.LA(2) == DRLLexer.DRL_UNIFY}? 
(var=drlIdentifier DRL_UNIFY
+                { hasBindings = true; helper.emit($var.token, 
DroolsEditorType.IDENTIFIER_VARIABLE); helper.emit($DRL_UNIFY, 
DroolsEditorType.SYMBOL); if( buildDescr ) { bind = new BindingDescr($var.text, 
null, true); helper.setStart( bind, $var.token ); } } ))
         )?
 
         ( left2=xpathPrimary { if( buildDescr ) { $result = $left2.result; } }
@@ -677,7 +677,7 @@ xpathPrimary returns [BaseDescr result]
     ;
 
 xpathChunk returns [BaseDescr result]
-    : xpathSeparator IDENTIFIER (DOT IDENTIFIER)* (HASH IDENTIFIER)? (LBRACK 
xpathExpressionList RBRACK)?
+    : xpathSeparator drlIdentifier (DOT drlIdentifier)* (HASH drlIdentifier)? 
(LBRACK xpathExpressionList RBRACK)?
     ;
 
 xpathExpressionList returns [java.util.List<String> exprs]
@@ -761,13 +761,14 @@ creator
     ;
 
 createdName
-    :  IDENTIFIER typeArguments?
-        ( DOT IDENTIFIER typeArguments?)*
+    :  drlIdentifier typeArguments?
+        ( DOT drlIdentifier typeArguments?)*
         |      primitiveType
     ;
 
+// Old parser cannot parse innerCreator with selector expression (outer.new 
InnerClass() != null) TODO: Delete this after investigation
 innerCreator
-    :  {!(helper.validateIdentifierKey(DroolsSoftKeywords.INSTANCEOF))}? 
IDENTIFIER classCreatorRest
+    :  {!(helper.validateIdentifierKey(DroolsSoftKeywords.INSTANCEOF))}? 
drlIdentifier classCreatorRest
     ;
 
 arrayCreatorRest
@@ -800,7 +801,7 @@ nonWildcardTypeArguments
 
 explicitGenericInvocationSuffix
     :  super_key superSuffix
-    |          IDENTIFIER arguments
+    |          drlIdentifier arguments
     ;
 
 selector
@@ -820,7 +821,7 @@ selector
 
 superSuffix
     :  arguments
-    |          DOT IDENTIFIER (arguments)?
+    |          DOT drlIdentifier (arguments)?
     ;
 
 squareArguments returns [java.util.List<String> args]
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 03d6b20ced..a58b38e0b4 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
@@ -31,7 +31,7 @@ packagedef : PACKAGE name=drlQualifiedName SEMI? ;
 unitdef : DRL_UNIT name=drlQualifiedName SEMI? ;
 
 importdef : IMPORT (DRL_FUNCTION|STATIC)? drlQualifiedName (DOT MUL)?          
#importStandardDef
-          | IMPORT (DRL_ACCUMULATE|DRL_ACC) drlQualifiedName IDENTIFIER        
#importAccumulateDef
+          | IMPORT (DRL_ACCUMULATE|DRL_ACC) drlQualifiedName drlIdentifier     
#importAccumulateDef
           ;
 
 globaldef : DRL_GLOBAL type drlIdentifier ;
@@ -69,7 +69,7 @@ entryPointDeclaration : DRL_ENTRY_POINT name=stringId 
drlAnnotation* DRL_END ;
 
 // windowDeclaration := WINDOW ID annotation* lhsPatternBind END
 
-windowDeclaration : DRL_WINDOW name=IDENTIFIER drlAnnotation* lhsPatternBind 
DRL_END ;
+windowDeclaration : DRL_WINDOW name=drlIdentifier drlAnnotation* 
lhsPatternBind DRL_END ;
 
 // (enum)typeDeclaration := [ENUM] qualifiedIdentifier annotation* 
enumerative+ field* END
 
@@ -151,7 +151,7 @@ lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints?
 positionalConstraints : constraint (COMMA constraint)* SEMI ;
 constraints : constraint (COMMA constraint)* ;
 constraint : ( nestedConstraint | conditionalOrExpression ) ;
-nestedConstraint : ( IDENTIFIER ( DOT | NULL_SAFE_DOT | HASH ) )* IDENTIFIER 
(DOT | NULL_SAFE_DOT ) LPAREN constraints RPAREN ;
+nestedConstraint : ( drlIdentifier ( DOT | NULL_SAFE_DOT | HASH ) )* 
drlIdentifier (DOT | NULL_SAFE_DOT ) LPAREN constraints RPAREN ;
 
 // named consequence
 
@@ -309,7 +309,7 @@ mapEntry
  patternFilter :=   OVER filterDef
  filterDef := label ID LEFT_PAREN parameters RIGHT_PAREN
 */
-patternFilter : DRL_WINDOW COLON IDENTIFIER LPAREN expressionList RPAREN ;
+patternFilter : DRL_WINDOW COLON drlIdentifier LPAREN expressionList RPAREN ;
 
 /*
  patternSource := FROM
@@ -348,7 +348,7 @@ blockStatements : drlBlockStatement* ;
 /*
 accumulateFunction := label? ID parameters
 */
-accumulateFunction : label? IDENTIFIER conditionalExpressions ;
+accumulateFunction : label? drlIdentifier conditionalExpressions ;
 
 // parameters := LEFT_PAREN (conditionalExpression (COMMA 
conditionalExpression)* )? RIGHT_PAREN
 conditionalExpressions : LPAREN (conditionalExpression (COMMA 
conditionalExpression)* )? RPAREN ;
@@ -360,7 +360,7 @@ fromCollect : DRL_COLLECT LPAREN lhsPatternBind RPAREN ;
 fromEntryPoint : DRL_ENTRY_POINT stringId ;
 
 // fromWindow := WINDOW ID
-fromWindow : DRL_WINDOW IDENTIFIER ;
+fromWindow : DRL_WINDOW drlIdentifier ;
 
 /*
  lhsExists := EXISTS
@@ -424,8 +424,7 @@ namedConsequence : RHS_NAMED_CONSEQUENCE_THEN 
consequenceBody ;
 
 stringId : ( drlIdentifier | DRL_STRING_LITERAL ) ;
 
-type : (classOrInterfaceType | primitiveType) typeArguments? ( DOT IDENTIFIER 
typeArguments? )* (LBRACK RBRACK)* ;
-
+//type := ID typeArguments? ( DOT ID typeArguments? )* (LEFT_SQUARE 
RIGHT_SQUARE)*
 //typeArguments : LT typeArgument (COMMA typeArgument)* GT ;
 //typeArgument : QUESTION (( EXTENDS | SUPER ) type )? |  type ;
 
@@ -462,7 +461,7 @@ assignmentOperator : ASSIGN
                    |   LT LT ASSIGN ;
 
 label : drlIdentifier COLON ;
-unif : IDENTIFIER DRL_UNIFY ;
+unif : drlIdentifier DRL_UNIFY ;
 
 /* extending JavaParser variableInitializer */
 drlVariableInitializer
diff --git 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
index 5fef172405..db5e0c2dd8 100644
--- 
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
@@ -190,7 +190,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
                 .withParserRuleContext(ctx)
                 .build();
         accumulateImportDescr.setTarget(ctx.drlQualifiedName().getText());
-        accumulateImportDescr.setFunctionName(ctx.IDENTIFIER().getText());
+        accumulateImportDescr.setFunctionName(ctx.drlIdentifier().getText());
         return accumulateImportDescr;
     }
 
@@ -549,7 +549,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         if (ctx.label() != null) {
             patternDescr.setIdentifier(ctx.label().drlIdentifier().getText());
         } else if (ctx.unif() != null) {
-            patternDescr.setIdentifier(ctx.unif().IDENTIFIER().getText());
+            patternDescr.setIdentifier(ctx.unif().drlIdentifier().getText());
             patternDescr.setUnification(true);
         }
         DescrHelper.refreshPatternDescrProperties(patternDescr, ctx);
@@ -733,7 +733,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
                 .withParserRuleContext(ctx)
                 .build();
         behaviorDescr.setType(ctx.DRL_WINDOW().getText());
-        behaviorDescr.setSubType(ctx.IDENTIFIER().getText());
+        behaviorDescr.setSubType(ctx.drlIdentifier().getText());
         List<DRLParser.ExpressionContext> expressionContexts = 
ctx.expressionList().expression();
         List<String> parameters = 
expressionContexts.stream().map(Antlr4ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.toList());
         behaviorDescr.setParameters(parameters);
@@ -781,7 +781,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
 
     @Override
     public AccumulateDescr.AccumulateFunctionCallDescr 
visitAccumulateFunction(DRLParser.AccumulateFunctionContext ctx) {
-        String function = ctx.IDENTIFIER().getText();
+        String function = ctx.drlIdentifier().getText();
         String bind = ctx.label() == null ? null : 
ctx.label().drlIdentifier().getText();
 
         String[] params = 
ctx.conditionalExpressions().conditionalExpression().stream()
@@ -799,7 +799,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
 
     @Override
     public WindowReferenceDescr visitFromWindow(DRLParser.FromWindowContext 
ctx) {
-        return BaseDescrFactory.builder(new 
WindowReferenceDescr(ctx.IDENTIFIER().getText()))
+        return BaseDescrFactory.builder(new 
WindowReferenceDescr(ctx.drlIdentifier().getText()))
                 .withParserRuleContext(ctx)
                 .build();
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to