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

commit 5d4942536f848c3623bb1d666701fe39dac8a59f
Author: mariofusco <[email protected]>
AuthorDate: Fri Apr 22 16:45:42 2022 +0200

    add constraints parsing
---
 .../java/org/drools/parser/DRLVisitorImpl.java     | 67 ++++++++++++++++++----
 .../test/java/org/drools/parser/DRLParserTest.java | 19 ++++--
 2 files changed, 69 insertions(+), 17 deletions(-)

diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
index 459fcf291d..4c81640688 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
@@ -1,12 +1,18 @@
 package org.drools.parser;
 
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
 import org.drools.drl.ast.descr.*;
 
 public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> {
 
     private final PackageDescr packageDescr = new PackageDescr();
 
-    private RuleDescr ruleDescr;
+    private RuleDescr currentRule;
+    private PatternDescr currentPattern;
 
     @Override
     public Object visitCompilationUnit(DRLParser.CompilationUnitContext ctx) {
@@ -40,32 +46,71 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
 
     @Override
     public Object visitRuledef(DRLParser.RuledefContext ctx) {
-        ruleDescr = new RuleDescr(ctx.name.getText());
-        ruleDescr.setConsequence(ctx.rhs().getText());
-        packageDescr.addRule(ruleDescr);
+        currentRule = new RuleDescr(ctx.name.getText());
+        currentRule.setConsequence(ctx.rhs().getText());
+        packageDescr.addRule(currentRule);
 
         Object result = super.visitRuledef(ctx);
-        ruleDescr = null;
+        currentRule = null;
         return result;
     }
 
     @Override
     public Object visitLhsPatternBind(DRLParser.LhsPatternBindContext ctx) {
         if (ctx.lhsPattern().size() == 1) {
-            PatternDescr patternDescr = new 
PatternDescr(ctx.lhsPattern(0).objectType.getText());
+            currentPattern = new 
PatternDescr(ctx.lhsPattern(0).objectType.getText());
             if (ctx.label() != null) {
-                patternDescr.setIdentifier(ctx.label().IDENTIFIER().getText());
+                
currentPattern.setIdentifier(ctx.label().IDENTIFIER().getText());
+            }
+            currentRule.getLhs().addDescr(currentPattern);
+        }
+        Object result = super.visitLhsPatternBind(ctx);
+        currentPattern = null;
+        return result;
+    }
+
+    @Override
+    public Object visitConstraint(DRLParser.ConstraintContext ctx) {
+        Object constraint = super.visitConstraint(ctx);
+        ExprConstraintDescr constr = new ExprConstraintDescr( 
constraint.toString() );
+        constr.setType( ExprConstraintDescr.Type.NAMED );
+        currentPattern.addConstraint( constr );
+        return null;
+    }
+
+    @Override
+    public Object visitExpression(DRLParser.ExpressionContext ctx) {
+        return ctx.children.stream()
+                .map(c -> c instanceof TerminalNode ? c : c.accept(this))
+                .filter(Objects::nonNull)
+                .map(Object::toString)
+                .collect(Collectors.joining(" "));
+    }
+
+    @Override
+    public Object visitIdentifier(DRLParser.IdentifierContext ctx) {
+        return ctx.IDENTIFIER().getText();
+    }
+
+    @Override
+    public Object visitLiteral(DRLParser.LiteralContext ctx) {
+        ParseTree node = ctx;
+        while (true) {
+            if (node instanceof TerminalNode) {
+                return node.toString();
+            }
+            if (node.getChildCount() != 1) {
+                return super.visitLiteral(ctx);
             }
-            ruleDescr.getLhs().addDescr(patternDescr);
+            node = node.getChild(0);
         }
-        return super.visitLhsPatternBind(ctx);
     }
 
     @Override
     public Object visitDrlAnnotation(DRLParser.DrlAnnotationContext ctx) {
         AnnotationDescr annotationDescr = new 
AnnotationDescr(ctx.name.getText());
         annotationDescr.setValue(ctx.drlArguments().drlArgument(0).getText());
-        ruleDescr.addAnnotation(annotationDescr);
+        currentRule.addAnnotation(annotationDescr);
         return super.visitDrlAnnotation(ctx);
     }
 
@@ -75,7 +120,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         if (ctx.getChildCount() > 1) {
             attributeDescr.setValue(ctx.getChild(1).getText());
         }
-        ruleDescr.addAttribute(attributeDescr);
+        currentRule.addAttribute(attributeDescr);
         return super.visitAttribute(ctx);
     }
 
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
index f51710e1b8..4e8abc50b0 100644
--- 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/DRLParserTest.java
@@ -1,5 +1,7 @@
 package org.drools.parser;
 
+import java.util.List;
+
 import org.drools.drl.ast.descr.*;
 import org.junit.Test;
 
@@ -14,7 +16,7 @@ public class DRLParserTest {
             "import org.test.model.Person;\n" +
             "global String result;\n" +
             "rule TestRule @Test(true) no-loop salience 15 when \n" +
-            "  $p:Person()\n" +
+            "  $p:Person( age >= 18 )\n" +
             "then\n" +
             "  int a = 4;\n" +
             "  System.out.println($p.getName());\n" +
@@ -53,6 +55,11 @@ public class DRLParserTest {
         assertEquals("$p", patternDescr.getIdentifier());
         assertEquals("Person", patternDescr.getObjectType());
 
+        List<? extends BaseDescr> constraints = 
patternDescr.getConstraint().getDescrs();
+        assertEquals(1, constraints.size());
+        ExprConstraintDescr expr = (ExprConstraintDescr) constraints.get(0);
+        assertEquals("age >= 18", expr.getExpression());
+
         assertEquals("inta=4;System.out.println($p.getName());", 
ruleDescr.getConsequence());
     }
 
@@ -75,11 +82,11 @@ public class DRLParserTest {
         assertEquals(7, (int) computeTokenIndex(parser, 2, 1));
         assertEquals(7, (int) computeTokenIndex(parser, 2, 6));
         assertEquals(8, (int) computeTokenIndex(parser, 2, 7));
-        assertEquals(73, (int) computeTokenIndex(parser, 9, 0));
-        assertEquals(74, (int) computeTokenIndex(parser, 9, 1));
-        assertEquals(75, (int) computeTokenIndex(parser, 9, 4));
-        assertEquals(75, (int) computeTokenIndex(parser, 9, 5));
-        assertEquals(75, (int) computeTokenIndex(parser, 10, 0));  // EOF
+        assertEquals(80, (int) computeTokenIndex(parser, 9, 0));
+        assertEquals(81, (int) computeTokenIndex(parser, 9, 1));
+        assertEquals(82, (int) computeTokenIndex(parser, 9, 4));
+        assertEquals(82, (int) computeTokenIndex(parser, 9, 5));
+        assertEquals(82, (int) computeTokenIndex(parser, 10, 0));  // EOF
     }
 
 }


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

Reply via email to