简单表达语言(S-FEEL)Simple Expression Language (S-FEEL)

简介

DMN 1.1定义了足够友好的表达语言(FEEL),目的是为决策模型中的多种表达提供标准的可执行语义。

本部分定义了FEEL的简单子集S-FEEL,目的是为仅使用简单表达式的决策模型提供标准的可执行语义:特别是决策模型(decision models ),在该模型中,决策逻辑(decision logic)主要或仅使用决策表进行建模。

DMN自发布以来的经验表明,使用S-FEEL几乎无法定义完整的决策模型。可以仅使用S-FEEL定义各个决策表,但是在决策模型中,通常至少有一个需要FEEL的决策。因此,鼓励开发人员和用户使用和实现完整的FEEL规范,而不是S-FEEL子集。

1.2 S-FEEL语法

本节中使用的S-FEEL表达式的语法在下面的EBNF中指定:它是第10.3.1.2节中指定的FEEL语法的子集。

语法规则:

1. expression = simple expression ;

2. arithmetic expression =

2.a addition | subtraction |

2.b multiplication | division |

2.c exponentiation |

2.d arithmetic negation ;

3 simple expression = arithmetic expression | simple value | comparison ;

4 simple expressions = simple expression , { "," , simple expression } ;

5 simple positive unary test =

5.a [ "<" | "<=" | ">" | ">=" ] , endpoint |

5.b interval ;

6 interval = ( open interval start | closed interval start ) , endpoint , ".." , endpoint , ( open interval end | closed interval end ) ;

7 open interval start = "(" | "]" ;

8 closed interval start = "[" ;

9 open interval end = ")" | "[" ;

10 closed interval end = "]" ;

11 simple positive unary tests = simple positive unary test , { "," , simple positive unary test } ;

12 simple unary tests =

12.a simple positive unary tests |

12.b "not", "(", simple positive unary tests, ")" |

12.c "-";

13 endpoint = simple value ;

14 simple value = qualified name | simple literal ;

15 qualified name = name , { "." , name } ;

16 addition = expression , "+" , expression ;

17 subtraction = expression , "-" , expression ;

18 multiplication = expression , "*" , expression ;

19 division = expression , "/" , expression ;

20 exponentiation = expression, "**", expression ;

21 arithmetic negation = "-" , expression ;

22 name = name start , { name part | additional name symbols } ;

23 name start = name start char, { name part char } ;

24 name part = name part char , { name part char } ;

25 name start char = "?" | [A-Z] | "_" | [a-z] | [\uC0-\uD6] | [\uD8-\uF6] | [\uF8-\u2FF] | [\u370-\u37D] | [\u37F-\u1FFF]

| [\u200C-\u200D] | [\u2070-\u218F] | [\u2C00-\u2FEF] | [\u3001-\uD7FF] | [\uF900-\uFDCF] | [\uFDF0-\uFFFD] | [\u10000-\uEFFFF] ;

26 name part char = name start char | digit | \uB7 | [\u0300-\u036F] | [\u203F-\u2040] ; 27 additional name symbols = "." | "/" | "-" | "’" | "+" | "*" ;

28 simple literal = numeric literal | string literal | Boolean literal | date time literal ;

29 string literal = """, { character – (""" | vertical space) | string escape sequence}, """ ;

30 Boolean literal = "true" | "false" ;

31 numeric literal = [ "-" ] , ( digits , [ ".", digits ] | "." , digits ) ; 32 digit = [0-9] ;

33 digits = digit , {digit} ;

34 date time literal = ("date" | "time" | "duration" ) , "(" , string literal , ")" ;

35 comparison = expression , ( "=" | "!=" | "<" | "<=" | ">" | ">=" ) , expression ;

36 white space = vertical space | \u0009 | \u0020 | \u0085 | \u00A0 | \u1680 | \u180E | [\u2000-\u200B] | \u2028 | \u2029

| \u202F | \u205F | \u3000 | \uFEFF ;

37 vertical space = [\u000A-\u000D];

38 string escape sequence = "\'" | "\"" | "\\" | "\n" | "\r" | "\t" | "\u", hex digit, hex digit, hex digit, hex digit;

1.3 S-FEEL数据类型(data types)

S-FEEL支持所有FEEL数据类型:数字,字符串,布尔值,日期和持续时间,年份和月份持续时间,时间和日期,尽管其中一些具有简化的定义。

S-FEEL号与XML Schema十进制数据类型具有相同的文字和值空间。 允许将精度限制为34个十进制数字,并通过有利于偶数邻居的关系舍入到最近的邻居。 请注意,“精度不会反映在此值空间中:数字2.0与数字2.00并没有区别” [XML架构]。 还要注意,该值空间是完全有序的。 S-FEEL编号的定义是对FEEL编号的定义的简化。

S-FEEL支持FEEL字符串和FEEL布尔值:FEEL字符串具有与Java String和XML Schema字符串数据类型相同的文字和值空间。 FEEL布尔值与Java布尔值和XML模式布尔值数据类型具有相同的文字和值空间。

S-FEEL支持FEEL时间数据类型。 FEEL时间的词汇空间和值空间是XML Schema时间数据类型的文字空间和值空间。请注意,“由于词法表示允许使用可选的时区指示符,因此时间值会部分排序,因为它可能无法确定两个值的顺序,其中一个具有时区,而另一个则没有时区。带有或不带有时区指示符的时间值对都是完全有序的” [XSD]。

S-FEEL不支持FEEL日期和时间。但是,它支持日期类型,例如FEEL日期和时间(必须缺少小时,分钟和秒)。 FEEL日期的词汇和值空间是XML Schema日期数据类型的文字和值空间。

S-FEEL支持FEEL天数和时间持续时间以及年月数持续时间数据类型。 FEEL天和时间持续时间以及年和月持续时间分别具有与XPath数据模型dayTimeDuration和yearMonthDuration数据类型相同的文字和值空间。也就是说,通过限制其词法表示以仅包含天,小时,分钟和秒组成部分,从XML Schema持续时间数据类型派生FEEL天和持续时间,通过限制从XML Schema持续时间数据类型派生FEEL年和月持续时间。其词法表示仅包含年和月部分。

1.4 S-FEEL语义

S-FEEL仅包含大多数表达式和编程语言共有的有限基本功能集,并且大多数表达式和编程语言都同意这些语义的语义。

在本节中,根据XML Schema数据类型和XQuery 1.0和XPath 2.0数据模型数据类型的语义,以及根据XQuery 1.0和XPath 2.0定义的相应函数和运算符,定义了S-FEEL表达式的语义。 函数和运算符(在下面加“ op:”前缀)。 作为语义的完整独立规范,可以在第10.3.2节中找到,作为FEEL定义的一部分。 在S-FEEL的范围内,这两个定义是等效的,并且具有等同的规范性。

算术加法和减法(语法规则4a)具有以下相同的语义:

1、op:numeric-add和op:numeric-subtract,当两个操作数为数字时;

2、op:add-yearMonthDurations和op:subtract-yearMonthDurations,当两个操作数分别是年和月的持续时间时;

3、当两个操作数分别是天和持续时间时,op:add-dayTimeDuration和subtract:dayTimeDurations;

4、op:add-yearMonthDuration-to-date和op:subtract-yearMonthDuration-from-date,当第一个操作数是年月数的持续时间,第二个操作数是日期时;

5、op:add-dayTimeDuration-to-date和op:subtract-dayTimeDuration-from-date,当第一个操作数是天数和持续时间,第二个操作数是日期时;

6、op:add-dayTimeDuration-to-time和op:subtract-dayTimeDuration-from-time,当第一个操作数是天数和持续时间,第二个操作数是时间。

另外,当两个操作数分别是日期或时间时,算术减法具有op:subtract-dates或op:subtract-times的语义。

在其他情况下,未定义算术加法和减法。

当两个操作数为数字时,算术乘法和除法(语法规则4b)分别具有与op:numeric-multiply和op:numeric-divide相同的语义。没有其他定义。算术求幂(语法规则4c)定义为当两个操作数为数字时将第一个操作数提升为第二个操作数的幂的结果。在其他情况下未定义。

仅当其运算数为数字时,才定义算术取反(语法规则4d):在这种情况下,其语义符合op:numeric-unary-minus的规范。

数字之间的比较运算符(语法规则7.a)是根据op:numeric- equal,op-numeric-less-than和op:numeric-greater-than的规范定义的,日期之间的比较是根据op:numeric-equal,op-numeric-greater-than的规范定义的。 op:date-等于,op:date-小于和op:date-大于;时间之间的比较是根据op:time-equal,op:time-less-than和op:time-greater-than的规范定义的;根据op:duration-equal,op:yearMonthDuration-小于-和op:year-MonthDuration-大于-的规范定义年和月持续时间之间的比较;根据op:duration-equal,op:dayTimeDuration-less-than和op:dayTimeDuration-greater-than的规范定义天和持续时间之间的比较。

只能比较字符串和布尔值的相等性:字符串和布尔值相等的语义分别如fn:codepoint-equal和op:Boolean-equal的规范中所定义。

仅当两个操作数具有相同类型时才定义比较运算符,但年份和月份持续时间以及天和持续时间除外,可以对它们进行相等性比较。 但是请注意,“除了零长度的持续时间,xs:dayTimeDuration的任何实例都不能等于xs:yearMonthDuration的实例。” [XFO]。

给定要测试的表达式o和两个端点e1和e2:

1、在间隔(e1..e2)中,也记为] e1..e2 [,且仅当o> e1并且o <e1

2、当且仅当o> e1且o≤e2时,才在(e1..e2],也记为[e1..e2]中)

3、当且仅当o≥e1并且o≤e2时,才在[e1..e2]区间内

4、在[e1..e2]区间内,也记为[e1..e2 [,当且仅当o≥e1并且o <e2

当且仅当该表达式是一个列表并且该表达式满足列表中至少一个简单的统一测试,或者简单的统一测试为“-”时,待测试的表达式才能满足简单一元测试的实例(语法规则12)。

1.5使用S-FEEL表达式

本节总结了当表达式语言为S-FEEL时允许哪种S-FEEL表达式以哪种角色使用。

1.5.1项目定义(Item definitions)

定义允许值的表达式应该是简单一元测试的实例(语法规则14),其中仅满足测试的已定义或引用类型中的值才是允许值。

1.5.2调用(Invocations)

在调用的绑定中,绑定公式应为简单表达式(语法规则5)。

1.5.3决策表

Each output entry SHALL be a simple expression (grammar rule 5).

每个输入表达式都应该是一个简单表达式(语法规则5)。

每个输入值列表都应是简单一元测试的一个实例(语法规则14)。

每个输出值列表都应是简单一元测试的实例(语法规则14)。

每个输入条目都应该是简单一元测试的一个实例(语法规则14)。

每个输出条目都应该是一个简单的表达式(语法规则5)。

 技术支持:盘古BPM工作流平台

相关教程