规则引擎设计与实现 | 青训营笔记

52 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一 认识

image-20230201194118852.png

规则引擎-定义

image-20230201213858569.png

即解耦,效率和稳定性提高

好处:

image-20230201214117155.png

组成

image-20230208001941909.png

应用场景

image-20230201214549506.png

二 编译原理基本概念(规则引擎)

image-20230201214846533.png

词法分析

句子切分,产生token

image-20230201215328270.png

image-20230201215512582.png

语法分析

image-20230201215718358.png

抽象语法树

image-20230201215856454.png

image-20230203005709974.png

内置关键字/内置符号(内置符号、终结符)

add 和 mul 是递归运算的,BNF是一层一层往上定义的(所以优先级pri最高)

image-20230203005740722.png

当前优先级做不了,下降到低优先级语法

完成一个token分析后,向上回溯

贪婪思想

image-20230203010624546.png

类型检查

image-20230203011554085.png

三 设计一个规则引擎

image-20230203013342198.png

有限状态机--实现词法分析

image-20230203014024650.png

语法分析

image-20230203014521682.png

逻辑非的优先级比逻辑或大,拆分出expr

括号放在基数表达式'('expr')'

优先级:低logOr->logAnd->logNot->cmp->add->mul->pri高

image-20230203015326905.png

语法树结构

image-20230203015437935.png

image-20230203015456183.png

语法树执行

后序遍历

类型检查

编译时检查需要处理的参数多

image-20230203015634551.png

四 实现规则引擎

BNF

在 NewNodeWithPrefixFix中(builder.go中planValue函数里,简化程序特殊处理中),根据语法定义构造出来的语法树(同一优先级扫描,贪婪思想)是不符合认知的,需要调整成右图。

image-20230203105458126.png

拓展----govaluate