这是我参与「第五届青训营 」笔记创作活动的第6天
规则引擎
什么是规则引擎
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
全称为 业务规则管理系统 ,英文名为 BRMS(即 Business Rule Management System)。
为什么需要规则引擎
- 解决开发人员重复编码问题
- 业务决策与服务本身解耦,提高服务可维护性
- 缩短开发路劲,提高效率
规则引擎的组成
- 数据输入:使用预定义的语句编写的规则作为策略集,接受业务中的数据作为执行参数
- 规则理解:能按预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
- 规则执行:根据执行时输入的参数对策略集中的规则进行正确的解释和执行,同时对规则的执行过程中的数据类型进行检查,保证执行结果正确
应用场景
- 风控对抗
- 活动策略运营
- 数据分析与清洗
编译原理
- 理解:词法分析、语法分析
- 执行:抽象语法树
- 输入输出:参数注入、类型检查
词法分析
就是把源代码字符串转化为词法单元(Token)的过程
可以用有限自动机识别Token
有限自动机是一个状态机,它的状态数量是有限的,它在任何一个状态,基于输入的字符都能做一个确定的状态转换
语法分析
语法分析就是在词法分析的基础上,识别表达式的语法构建过程
抽象语法树
表达式的语法可以用树来表示
上下文无关语法
句子语句无需考虑上下文,就可以判断正确性
产生式:一个表达式可以由另外已知类型的表达式或符号推导产生
内置符号:字面量(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"
递归下降算法
自顶向下构造语法树
不断对Token进行语法展开(下降),展开过程可能会遇到递归情况
以
price为例:
- 首先分析
price,发现不是逻辑表达式,下降- 发现不是 cmp 下降
- 不是 mul 下降
- 发现是一个标识符,认识price
- 移步到下一个Token
类型检查
根据子表达式的类型构造出父表达式的类型
比如
A+B的类型是根据A和B的类型定义的
类型检查可以在编译时,也可以在运行时