创建 DSL 表达式解析器/规则引擎

ed1*_*d1t 7 javascript python java dsl rule-engine

我正在构建一个应用程序,它具有在配置 yaml 文件中嵌入表达式/规则的功能。因此,例如用户可以引用在 yaml 文件中定义的变量,如${variables.name == 'John'}${is_equal(variables.name, 'John')}。我可能可以使用简单的表达式,但我想支持复杂的规则/表达式,例如${variables.name == 'John'} and (${variables.age > 18} OR ${variables.adult == true})

我正在寻找一个解析/dsl/rules-engine 库,它可以支持这些类型的表达式并对其进行规范化。如果有人知道该语言的库,我会使用 ruby​​、javascript、java 或 python 打开。

我想到的一种选择是只支持 javascript 作为条件/规则,并基本上通过 eval 使用正确的上下文设置来访问变量和其他可引用的变量。

Fah*_*gar 3

我不知道你是否使用 Golang,但如果你使用它,我推荐这个https://github.com/antonmedv/expr

我用它来解析机器人策略(股票期权机器人)。这是来自我的测试单元:

func TestPattern(t *testing.T) {
    a := "pattern('asdas asd 12dasd') && lastdigit(23asd) < sma(50) && sma(14) > sma(12) && ( macd(5,20) > macd_signal(12,26,9) || macd(5,20) <= macd_histogram(12,26,9) )"

    r, _ := regexp.Compile(`(\w+)(\s+)?[(]['\d.,\s\w]+[)]`)
    indicator := r.FindAllString(a, -1)
    t.Logf("%v\n", indicator)
    t.Logf("%v\n", len(indicator))

    for _, i := range indicator {
        t.Logf("%v\n", i)
        if strings.HasPrefix(i, "pattern") {
            r, _ = regexp.Compile(`pattern(\s+)?\('(.+)'\)`)
            check1 := r.ReplaceAllString(i, "$2")
            t.Logf("%v\n", check1)
            r, _ = regexp.Compile(`[^du]`)
            check2 := r.FindAllString(check1, -1)
            t.Logf("%v\n", len(check2))
        } else if strings.HasPrefix(i, "lastdigit") {
            r, _ = regexp.Compile(`lastdigit(\s+)?\((.+)\)`)
            args := r.ReplaceAllString(i, "$2")
            r, _ = regexp.Compile(`[^\d]`)
            parameter := r.FindAllString(args, -1)
            t.Logf("%v\n", parameter)
        } else {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将它与正则表达式结合起来,你就拥有了良好的(如果不是很好的话,字符串翻译器)。

对于 Java,我个人使用https://github.com/ridencww/expression-evaluator,但不用于生产。它与上面的链接具有类似的功能。

它支持许多条件,您不必担心括号和方括号。

Assignment  =
Operators   + - * / DIV MOD % ^ 
Logical     < <= == != >= > AND OR NOT
Ternary     ? :  
Shift       << >>
Property    ${<id>}
DataSource  @<id>
Constants   NULL PI
Functions   CLEARGLOBAL, CLEARGLOBALS, DIM, GETGLOBAL, SETGLOBAL
            NOW PRECISION
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。