gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:58:17 24 4
gpt4 key购买 nike

我正在构建一个应用程序,它具有在配置 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com