这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1. 认识规则引擎
规则引擎定义:将业务决策和程序本身解耦
**优点:**业务人员可以直接修改规则决策,缩短开发路径、提高效率;业务决策与服务本身解耦,提高服务可维护性
**组成部分:**数据输入(预定义的语义编写规则)、规则理解(正确理解业务规则的语义)、规则执行(根据输入进行解释和执行、检查数据类型、确保执行结果正确)
应用场景:
- 风控对抗:不断调整和优化对抗策略,打击黑灰产
- 活动策略运营:提高运营策略的迭代效率
- 数据分析和清洗:自定义数据处理的规则
2. 编译原理基本概念(如何实现)——词法分析、语法分析、抽象语法树、类型检查
规则引擎组成
理解:词法分析(源代码字符串转为词法单元)、语法分析(识别表达式的语法结构)
执行:抽象语法树(对于一个表达式,抽象语法树唯一确定)
输入输出:参数注入(使用输入参数计算语法树中的标识符节点值)、类型检查(数据类型是否合法)
-
词法分析——源代码字符串转为词法单元(token)
实现方式——有限自动机:状态机,状态数量有限,基于输入的字符做一个确定的状态转换 -
语法分析——词法分析基础上,识别表达式的语法结构的过程
抽象语法树:词法分析的token转为树;每个节点是一个语法单元,单元的构成规则叫做”语法“,节点可以有下级节点 -
抽象语法树
上下文无关语法:语言句子无需考虑上下文,即可判断正确性;使用巴科斯范式BNF表达
递归下降算法:自顶向下构造语法树; -
类型检查
类型综合:根据子表达式类型构造出父表达式类型
编译时检查 & 运行时检查:构造语法树的阶段、执行时的阶段
3. 设计一个规则引擎
**设计目标:**支持特定的词法、运算符、数据类型、优先级;支持基于预定义语法的规则表达式的编译和运行
**词法:**参数、布尔值、字符串、十进制int float、预定义运算符
**运算符:**一元、二元、逻辑操作符、括号
**数据类型:**字符串、布尔值、十进制int float
优先级:
1. 设计词法分析的状态机
2. 语法分析
优先级表达
语法树结构——二叉树实现:一元运算符、二元运算符、括号
3. **语法树执行与类型检查:**二叉树后续遍历执行;执行时检查