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

programmatical use of DSL in to change rule in 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 语法中的行混合。我现在的问题是,流口水抱怨无法扩展那些正常的 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}

但由于我是这部分的新手,所以我肯定完全误解了文档,而且该行可能根本没有意义。

如果有人告诉我 DSL 在 DRL 之上的方法是否是正确的方法,并且是否可以按照我正在尝试的方式完成,那就太好了。最好的答案当然是,如果可以的话,请告诉我我的匹配项的正确行是什么......或者如何做到这一点。

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

对于 DSLR,保留规则 when-then-end 的口头禅,但 "flesh" 的 LHS 和 RHS 必须来自扩展 - 或标有“>”的 DRL 行。

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

如果它足够重要,您可以编写一个特定的解析器来处理您想到的 DSL,即使它嵌入到 DRL 中也是如此,但您必须做出修正 - 您的 DSL 必须有一些 "tags" 用于识别它。