以编程方式使用DSL来改变Drools中的规则

时间:2017-02-28 17:02:37

标签: drools

我正在尝试在Drools之上定义我自己的DSL,如http://docs.jboss.org/drools/release/6.2.0.Final/drools-docs/html/ch07.html#d0e10052

中所述

我想要实现的是使用具有我定义的扩展名的普通DRL。举一个随机的例子,我希望能够使用DSL定义

[when]Something is {colour}=Something(colour=="{colour}")

与已经使用正常DRL语法的其他行混合使用。我现在的问题是,drools抱怨无法扩展那些正常的DRL线。我知道使用>的可能性作为一个行前缀,但对于我的情况,我不希望用户以后能够告诉什么是正常的DRL以及我的DSL部分是什么。

我的测试基本上是:

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
int count = 0;
for (String rule : ruleBodies) {
    count++;
    kfs.write("src/main/resources/Rule" + count + ".dslr",
        kieServices.getResources().newReaderResource(new StringReader(rule)));
}
String dsl = "[when]Something is {colour}=Something(colour==\"{colour}\")";
kfs.write("src/main/resources/DSL.dsl",
    kieServices.getResources().newReaderResource(new StringReader(dsl)));
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll()

但我得到的是流口水抱怨无法扩展这些DRL线。

有没有办法定义DSL的一部分,基本上是为了匹配所有内容并按原样再次发布?我试过了

[when]{enity:.*}={entity}

但由于我是这部分的新手,我当然完全误解了文档,这条线可能根本就没有意义。

如果有人告诉我,如果在DRL之上使用DSL的方法是正确的,并且是否可以按照我想要的方式完成,那将会很好。最好的答案当然是,如果可以告诉我我的比赛的正确线路是什么......或者如何做到这一点。

1 个答案:

答案 0 :(得分:0)

Drools DSL是一个相当简单的宏处理器,它允许您将宏定义为具有嵌入参数的字符串,用于单行扩展。

对于数码单反相机,保留了当时结束时的咒语,但是"肉体" LHS和RHS必须来自扩展 - 或标有“''”的DRL行。

从(自由格式)DRL中的任何位置解析任意DSL宏调用是不可能的。

如果它足够重要,您可以编写一个特定的解析器来处理您想要的DSL,即使它已嵌入DRL中,但您必须进行修补 - 您的DSL必须要有一些& #34;标记"用于识别它。