Drools使用dsl语言

简介: Drools使用dsl语言

Drools 为了对非开发人员更加友好,提供了dsl语言的支持,通过dsl再转换成drl文件来进行执行。


DSL简介

DSL == Domain Specific Language

以贴近业务领域的方式,即以类自然语言的方式来构造软件,使得我们不用花费太多精力就能看懂代码所对应的业务含义 。

它是创建规则语言的一种方式,致力于解决我们的问题域 。

DSL相当于一个转换器,它能将某一领域内的术语转换成规则语言。


Drools DSL背后的概念很简单。创建一个包含面向业务的概念的字典文件,并将其翻译成DRL。


定义DSL文件

基本内容格式如下:


[when] There is a person = $p:Person()
[when] - id greater than {id:\d*} = id > {id}
[then] print = System.out.println("I am fired!")

上面就是一个简单的dsl文件的定义,它遵从如下语法格式:

[<scope>][<type definition>]<dsl expression>=<replacement text>
其中
[when] or [condition] 定义的语法应用于LHS
[then] or [consequence] 定义的语法应用于RHS
[*]  以上两者都适用
[keyword] 关键字,比如no-loop这一类属性

使用DSL文件

新建dslr后缀的文件,里面的语法为:

rule 'test-dsl'
when
    There is a person
    - id greater than 10
then
    print
end

执行dsl文件的转换

public class Demo14 extends BaseDemo {
  public static void main(String[] args) throws IOException, DroolsParserException {
    String dslContent = "[when] There is a person = $p:Person()\n" +
        "[when] - id greater than {id:\\d*} = id > {id}\n" +
        "[then] print = System.out.println(\"I am fired!\")";
    String dslrContent = "rule 'test-dsl'\n" +
        "\n" +
        "when\n" +
        "    There is a person\n" +
        "    - id greater than 10\n" +
        "then\n" +
        "    print\n" +
        "end";
    DefaultExpanderResolver resolver = new DefaultExpanderResolver(new StringReader(dslContent));
    DrlParser parser = new DrlParser();
    String string = parser.getExpandedDRL(dslrContent,resolver);
    System.out.println(string);
  }
}

打印出的结果为:

rule 'test-dsl'
when
    $p:Person(id > 10)
then
    System.out.println("I am fired!")
end

就是正常写的drl文件的内容。

拓展

当然,也可以直接在dsls中通过expander来引入规则到dslr中,比如:

rule 'test-dsl'
expander demo.dsl
when
    There is a person
    - id greater than 10
then
    print
end

然后通过kmodule.xml中像常规drl文件使用一样来使用dslr文件。

目录
相关文章
|
XML 自然语言处理 IDE
一杆到底:DSL 领域特定语言
一、DSL了解1、DSL介绍DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言。 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。说到DSL,大家也会自然的想到通用语言(如Java、C等)。为什么没有一种语言同时 兼具『简洁』和『业务表达』能力呢?从信息论本质上来讨论这个问题,每个语言的程序都可以抽
11573 0
一杆到底:DSL 领域特定语言
|
SQL 程序员 数据库
【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
300 0
|
开发框架 自然语言处理 前端开发
一种新的DSL生成和通用语言框架:pypy
本文关键字:DSL框架和自动化生成工具,pypy as dsl framework and jit framework
878 0
一种新的DSL生成和通用语言框架:pypy
|
数据可视化 程序员 API
《领域特定语言》一2.2为何需要DSL
本节书摘来自华章出版社《领域特定语言》一书中的第2章,第2.2节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1809 0
|
前端开发 JavaScript 测试技术
《领域特定语言》一3.6 测试DSL
本节书摘来自华章出版社《领域特定语言》一书中的第3章,第3.6节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1477 0
|
XML SQL API
《领域特定语言》一第2章 使用DSL 2.1定义DSL
本节书摘来自华章出版社《领域特定语言》一书中的第2章,第2.1节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
2257 0
|
XML 测试技术 数据格式
《领域特定语言》一第3章 实现DSL 3.1DSL处理之架构
本节书摘来自华章出版社《领域特定语言》一书中的第3章,第3.1节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1871 0
|
测试技术 API
《领域特定语言》一2.5 DSL的生命周期
本节书摘来自华章出版社《领域特定语言》一书中的第2章,第2.5节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1085 0
|
Java BI
《Groovy语言规范》-语法(二)
4.6.斜杠字符串 除了通常的带引号字符串,groovy提供斜杠字符串,使用/作为分隔符。斜杠字符串对于定义正则表达式和模式是特别有用的,因为不需要转义反斜杠。 一个斜杠字符串: def fooPattern = /.
1862 0