drools 7.x 領域語言dsl詳細語法
阿新 • • 發佈:2018-12-13
1 領域特定語言(DSL)
我們將要討論的第一個關於DRL的抽象是領域特定的語言,或者僅僅是DSL。
DSL是為特定上下文定製DRL的一種很好的方法。
Drools DSL背後的概念很簡單。建立一個包含面向業務的概念的字典檔案
,並將其翻譯成DRL
。領域專家僅需要在編寫規則時,要了解面向業務的概念,而不必擔心DRL的技術方面。
定義業務概念和DRL之間的轉換的字典檔案簡單地稱為Drools中的DSL。包含使用業務概念定義的規則的檔案稱為DSLR。當技術團隊負責建立和維護dictionary檔案(DSL)時,SME負責業務規則的建立和維護(DSLR)。 DSL是由Drools支援的;沒有特殊的依賴項,在我們開始使用它之前,不需要任何配置。
2. 字典檔案(即DSL)
字典檔案(或DSL)是一個包含DSL條目的文字檔案(帶有一個.dsl拓展名)。
- 該檔案以開括號“
[
”開始的行被認為是一個DSL條目,都被認為是DSL條目。 - 以井號“
#
”開頭的行被認為是註釋。 - 從一個
既不是括號“[”也不是“#”號
開始的行,被認為是前一個DSL條目的一部分
。
DSL條目的格式如下:
[<scope>][<type definition>]<dsl expression>=<replacement text>
<scope>
部分目前支援四種類型:
[when]
或者[condition]
[then]
或者[consequence]
:這個DSL條目僅對於規則的RHS有用,就是規則的動作和結果。[*]
:這個DSL條目在規則的條件和操作部分都是有效的[keyword]
:這個DSL條目在DSLR檔案的任何部分都是有效的,甚至在規則定義之外也是有效的。<type definition >
部分不是強制的(我們可以省略它,或者使用空的括號[]
),被用於作為編輯器的提示,比方說KIE-Workbench。在<type definition>
之後就是<dsl expression>
,這是將在DSLR檔案中匹配和替換的文字。- 一個
<dsl expression>
包括一個java正則表示式
和任意數量的嵌入式變數定義
。變數定義包含在括號中("{
“和”}
"),它包含一個變數名和兩個可選部分,由冒號“:
”分隔開。如果只存在一個可選部分,則將其作為正則表示式來匹配將分配給該變數的文字
;如果有兩個可選部分,第一個是作為一個編輯器的提示(比如說是KIE-Workbench),第二個是正則表示式。一個<dsl expression>
通常以等號結尾(=
)在等號之後. <replacement text>
將會被用於替換DSLR中的任何與<dsl expression>
相匹配的部分。在<dsl expression>
部分定義的變數可以在這部分中使用,就像命名正則表示式匹配組一樣,通過使用帶括號內的變數的名稱。可選地,變數名後面可能會有一個感嘆號“!”以及一個變換函式。支援的轉換函式在下面的表中詳細說明。
Name | Description |
---|---|
ul | 把所有字母轉換成大寫字母。 |
lc | 把所有字母轉換成小寫字母。 |
ucfirst | 把第一個字母轉換成大寫字母,所有其他字母都轉換成小寫字母 |
num | 從字串中提取所有的數字。如果字串的最後兩個數字在(.)或者(,)之前,那麼就會插入一個十進位制的標識 |
a?b/c | (其實就是三元運算子)將字串與字串a進行比較,如果它們是相等的,則將其替換為b,否則用c代替。但是c可以是另一個三元組a、b、c,這樣整個結構實際上是一個轉換表。 |
一個典型的(非常簡單的)DSL條目可能看起來像下面這樣:
[when]There is a Customer=Customer()
上面的這個DSL條目講的是我們會加DSLR中的所有的“There is a Customer
”文字都替換為Customer()
表示式。