Skip to content

Commit

Permalink
add constraints parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco authored and tkobayas committed Feb 15, 2024
1 parent 4839190 commit 5436cb7
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.drools.parser;

import java.util.List;

import org.drools.drl.ast.descr.*;
import org.junit.Test;

Expand All @@ -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" +
Expand Down Expand Up @@ -53,6 +55,11 @@ public void testParse() {
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());
}

Expand All @@ -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
}

}

0 comments on commit 5436cb7

Please sign in to comment.