From 5436cb78e551354e623a58bb22f4c6260c744807 Mon Sep 17 00:00:00 2001 From: mariofusco Date: Fri, 22 Apr 2022 16:45:42 +0200 Subject: [PATCH] add constraints parsing --- .../org/drools/parser/DRLVisitorImpl.java | 67 ++++++++++++++++--- .../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 459fcf291dc..4c816406889 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 { 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 Object visitImportdef(DRLParser.ImportdefContext ctx) { @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 Object visitAttribute(DRLParser.AttributeContext ctx) { 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 f51710e1b87..4e8abc50b0c 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 void testParse() { assertEquals("$p", patternDescr.getIdentifier()); assertEquals("Person", patternDescr.getObjectType()); + List 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 void testComputeTokenIndex() { 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 } }