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

65 阅读2分钟

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

1. 认识规则引擎

规则引擎定义:将业务决策和程序本身解耦

**优点:**业务人员可以直接修改规则决策,缩短开发路径、提高效率;业务决策与服务本身解耦,提高服务可维护性

**组成部分:**数据输入(预定义的语义编写规则)、规则理解(正确理解业务规则的语义)、规则执行(根据输入进行解释和执行、检查数据类型、确保执行结果正确)

应用场景:

  1. 风控对抗:不断调整和优化对抗策略,打击黑灰产
  2. 活动策略运营:提高运营策略的迭代效率
  3. 数据分析和清洗:自定义数据处理的规则

2. 编译原理基本概念(如何实现)——词法分析、语法分析、抽象语法树、类型检查

规则引擎组成

理解:词法分析(源代码字符串转为词法单元)、语法分析(识别表达式的语法结构)
执行:抽象语法树(对于一个表达式,抽象语法树唯一确定)
输入输出:参数注入(使用输入参数计算语法树中的标识符节点值)、类型检查(数据类型是否合法)

  1. 词法分析——源代码字符串转为词法单元(token)
    实现方式——有限自动机:状态机,状态数量有限,基于输入的字符做一个确定的状态转换

  2. 语法分析——词法分析基础上,识别表达式的语法结构的过程
    抽象语法树:词法分析的token转为树;每个节点是一个语法单元,单元的构成规则叫做”语法“,节点可以有下级节点

  3. 抽象语法树
    上下文无关语法:语言句子无需考虑上下文,即可判断正确性;使用巴科斯范式BNF表达
    递归下降算法:自顶向下构造语法树;

  4. 类型检查
    类型综合:根据子表达式类型构造出父表达式类型
    编译时检查 & 运行时检查:构造语法树的阶段、执行时的阶段

3. 设计一个规则引擎

**设计目标:**支持特定的词法、运算符、数据类型、优先级;支持基于预定义语法的规则表达式的编译和运行
**词法:**参数、布尔值、字符串、十进制int float、预定义运算符
**运算符:**一元、二元、逻辑操作符、括号
**数据类型:**字符串、布尔值、十进制int float
优先级:

1. 设计词法分析的状态机

2. 语法分析

优先级表达

语法树结构——二叉树实现:一元运算符、二元运算符、括号

3. **语法树执行与类型检查:**二叉树后续遍历执行;执行时检查