规则引擎|青训营笔记

69 阅读3分钟

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

规则引擎

什么是规则引擎

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。

全称为 业务规则管理系统 ,英文名为 BRMS(即 Business Rule Management System)。

为什么需要规则引擎

  • 解决开发人员重复编码问题
  • 业务决策与服务本身解耦,提高服务可维护性
  • 缩短开发路劲,提高效率

规则引擎的组成

  • 数据输入:使用预定义的语句编写的规则作为策略集,接受业务中的数据作为执行参数
  • 规则理解:能按预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
  • 规则执行:根据执行时输入的参数对策略集中的规则进行正确的解释和执行,同时对规则的执行过程中的数据类型进行检查,保证执行结果正确

应用场景

  • 风控对抗
  • 活动策略运营
  • 数据分析与清洗

编译原理

  1. 理解:词法分析、语法分析
  2. 执行:抽象语法树
  3. 输入输出:参数注入、类型检查

词法分析

就是把源代码字符串转化为词法单元(Token)的过程

uTools_1675218534066

可以用有限自动机识别Token

有限自动机是一个状态机,它的状态数量是有限的,它在任何一个状态,基于输入的字符都能做一个确定的状态转换

语法分析

语法分析就是在词法分析的基础上,识别表达式的语法构建过程

uTools_1675218779369

抽象语法树

表达式的语法可以用树来表示

uTools_1675218881808

上下文无关语法

句子语句无需考虑上下文,就可以判断正确性

产生式:一个表达式可以由另外已知类型的表达式或符号推导产生

内置符号:字面量(string、bool、number)标识符、运算符

一个基础表达式可以由 常量 (string、bool、number)或标识符(identifier) 组成

一个乘法表达式可以由 基础表达式 或者 乘法表达式* 基础表达式

表达式按优先级往下推导,越往下优先级越高

exp : add;
add : add '+' mul | mul;                        //加法表达式 a+b+c a+b*c
mul : mul '*' pri |pri;                         //乘法表达式 a*b*c
pri : string | bool | number | identifiler;     //基础表达式 weight | 20 | "abc"

uTools_1675219235757

递归下降算法

自顶向下构造语法树

不断对Token进行语法展开(下降),展开过程可能会遇到递归情况

price为例:

  1. 首先分析 price,发现不是逻辑表达式,下降
  2. 发现不是 cmp 下降
  3. 不是 mul 下降
  4. 发现是一个标识符,认识price
  5. 移步到下一个Token

uTools_1675219424727

类型检查

根据子表达式的类型构造出父表达式的类型

比如A+B的类型是根据AB的类型定义的

类型检查可以在编译时,也可以在运行时