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

标签 javascript java python 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 使用正确的上下文设置来访问变量和其他可引用的变量。

最佳答案

不知道你有没有用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 {

        }
    }
}
将它与正则表达式结合起来,你就有了很好的(如果不是很好的话,字符串翻译器)。
而对于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
希望能帮助到你。

关于javascript - 创建 DSL 表达式解析器/规则引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62643102/

相关文章:

python - MismatchingStateError:mismatching_state:CSRF警告!国家的请求和回应不平等

javascript - WinJS:是否可以通过编程方式向数据透视项添加预算?

javascript - 尝试在 Laravel 5.4 框架中使用制表符将值传递给数据表

java - 如何通过JSP从方法中获取参数并在HTML中显示矩阵?

java - Azure REST API 使用 java 获取存储 Blob 大小详细信息

python - 包含函数的序列的递归公式

javascript - 更改 window.location.href 会中止 AJAX

javascript - Gauge.js -> 需要将 javascript 修改为 PercentageColors 函数

java - 除以减法 - 将余数除以减法?

python - 使用 Python 访问简单的 API