分享好友 最新动态首页 最新动态分类 切换频道
govaluate规则引擎原理解析
2024-12-26 22:42

首先明确引入规则引擎的目的是, 从 中解放出来。规则引擎可依据不同项目进行选型,本次主要分享bsp中使用到的govaluate规则引擎。

其输入为规则表达式和k-v键值对条件对象,通过规则引擎执行表达式,得到表达式的结果。

Abstract Syntax Tree简称AST,中文叫做抽象语法树。

 

govaluate首先将表达式构建出一颗ast。举个例子:比如规则表达式为 1+foo+4*boo>0

 

构建树时的流程图如下:

parserToken后,我们可以得到一堆token:

 

 

 

检查小括号是否成对出现

 

 

  

check token之间是否符合预设规则,核心是函数getLexerStateForToken

 

 

  

check当前的token是否是上一个token的合法值,合法值是预设的,比如NUMERIC的合法值是后面这些:

 

 

 

优化token,主要是编译一下正则

 

构建ast、优化ast为avl tree、预计算。

planStages这个大步骤内部大概分成了planTokens、reorderStages、elideLiterals这三个小步骤

 

 

 

给定一个规划器,创建一个函数来评估运算符的特定优先级,并将其链接到其他递归解析更高优先级的函数。

它用func做不同运算符的优先级计算,原理是func接收struct作为参数,而参数中的next为这个函数连接的下一个优先级的func。

 

 

其中核心函数为planPrecedenceLevel

 

 

这个func优先级打印出来是这样的:

 

有了运算符优先级之后,对于具体的节点,会继续看节点类型,比如是func,accesser还是valueType,valueType的节点对于不同的详细类型也有不同策略,比如数字节点会构建一个Node,而小括号节点会直接parser下一个token来构建优先级更高的树。

如valueType构建Node在planValue里具体体现为:

 

 

对于不同的运算符,在这个函数链上会下沉构建出优先级比较高的节点,保证符合数学计算的规律。

planToken执行完后,会变成这样一颗树:

 

 

例子体现为

 

 

 

这里主要把ast重排序,让ast由普通tree变成avl tree(Adelson-Velsky Landis Tree 自平衡二叉查找树)

 

重排序的过程是把相同优先级的节点进行旋转,第一步是交换左右节点:

 

 

 

第二步是LL左旋:

 

 

这样就平衡了

这个步骤是看叶子节点是否为LITERAL(本例可以暂且理解为数字类型的值),遍历整个树中的所有运算符,省略两边都是LITERAL的运算符。比如这棵树:

 

 

在这个阶段,各个子节点会进行dfs(Depth First Search 深度优先搜索)预计算。

 

各符号对应的算子如下:

 

 

至此第一阶段的逻辑梳理完毕,即ast构建完成。

 

Evaluate的主要功能即把k-v键值对条件对象填入ast,进行计算,得到一个interface类型的结果。

 

 

 

 

govaluate所有数字类型都是被解析为float64进行计算的,这么玩写代码爽了,但是当你用1+2+9做表达式时,可能会得到一个类型为fload64的interface{}结果。

比如这段代码:

 

 

理论上结果应该含有转义符,实际上结果是:

最新文章
如何通过趣夜传媒提升品牌营销效果
趣夜传媒是一家专业从事互联网营销的公司,致力于为企业提供创新、高效的广告推广和品牌营销服务。通过深入研究目标客户群体和市场动态,趣夜传媒帮助企业在竞争激烈的市场中脱颖而出,提供定制化的解决方案,确保每一项营销活动都能够精准
新年第一个大会 省委书记车俊对改革说了啥
  高举改革大旗 扛起改革担当  当好新时代全面深化改革的排头兵  ——车俊在全省全面深化改革大会上的讲话  (2018年1月2日)  同志们:  习近平总书记在2018年新年贺词中强调,改革开放是当代中国发展进步的必由之路,是实现
默认情况下,WordPress按时间倒序(从最新到最旧)对文章进行排序,或者更确切地说是按发布日期排序。这适用于大多数发布商,但在某些情况下您可能需要对它们重新排序。
默认情况下,WordPress按时间倒序(从最新到最旧)对文章进行排序,或者更确切地说是按发布日期排序。这适用于大多数发布商,但在某些情况下您可能需要对它们重新排序。也许您有需要重新排列的自定义文章类型或希望出现在购物页面顶部的Woo
通达信最神奇计算系统买卖点指标公式
N:=11;RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;LC:=REF(C,1);CCI背:=IF(LLV(CCI,2)LLV(CCI,7) AND LLV(L,2)=LLV(L,7) AND HHV(H,10)MA(CLOSE,60),1,0),COLORWHITE;A1:=BARSLAST(REF(CROSS(MACD.DIF(12,26,9),MACD.DEA(12,26
这个展会不可错过!1月22日,日本汽车工业技术展……扫码报名免费
2025.1.22-24NEPCON JAPANAUTOMOTIVEWORLD-日本电子汽车工业技术展会-展会信息展名: NEPCON JAPAN [1月東京展]AUTOMOTIVE WORLD [1月東京展]会期: 2025年1月22日(三)-24日(五)会场: 日本东京有明国际展览中心主办方: RX Japan Ltd.扫码申请
亚马逊的云产品和云服务 亚马逊云服务是什么意思
1、亚马逊服务有哪些2、为什么亚马逊云(aws)云服务器在国内仍有很多人在用?3、亚马逊云科技是干什么的?详细介绍4、亚马逊云科技是做什么的公司,可以具体说说吗?亚马逊提供的服务主要包括:在线零售服务。这是亚马逊最为人所知的服务之一。
良心评测说说vivo Y91和Redmi Note 9 4G哪款好一些?有区别吗?详细剖析测评
vivo Y91和Redmi Note 9 4G哪个值得入手?区别不同点大不?两款vivo Y91和Redmi Note 9 4G区别不是很大的哈,我订的是Redmi Note 9 4G,商品收到了外形外观漂亮手感顺滑屏幕音效好拍照效果佳有很多拍照功能而且动态捕捉效果非常好拍照出来很
直通车的计费方式
直通车的计费方式与钻石展位、淘宝客都不同,它是经过竞价排名、按照点击计费的推行工具。
用AI绘画生成超逼真美女写真,轻松创建你的虚拟美颜
限时免费,点击体验最近超火的AI生图神器,坐拥3000美女的大男主就是你! https://ai.sohu.com/pc/generate/textToImg?_trans_=030001_yljdaimn 在这个数字化飞速发展的时代,越来越多的年轻人希望通过技术手段来实现自己的创意。而AI生成
相关文章
推荐文章
发表评论
0评