6 规则引擎| 青训营笔记

63 阅读3分钟

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

1 认识规则引擎 由来优点应用场景 组成实现原理

2编译原理基本概念

3设计一个规则引擎

4规则引擎的实现

1 认识规则引擎

定义 嵌入应用程序中组件 业务决策从程序代码分离 使用预定义语义模块编写业务决策 接受数据输入 解释业务规则 做出业务决策

解决开发人员重复编码问题 解耦 提高服务可维护性 缩短开发路径 提高效率

组成部分

数据输入 规则理解 预定义词法 语法 优先级 运算符等正确理解 规则执行 解释 执行

应用场景

1 风控对抗 2活动策略运营 3数据分析和清洗

2 编译原理基本概念

词法分析 语法分析 抽象语法树 类型检查

理解 词法分析 源码字符串转换为词法单元 语法分析 识别表达式语法结构 执行 抽象语法树 树状表示 一个表达式 抽象语法树一定时唯一确定 输入输出 参数注入 类型检查

词法分析 如何识别token?有限自动机 状态机 数量有限 任意状态基于输入字符 能做一个确定的状态转换

语法分析 抽像语法树 每个结点是一个语法单元 单元构成规则叫语法 每个节点有下级节点 上下文无关语法 句子无需考虑上下文 就可判断正确性 可用巴科斯范式BNF来表达 产生式 一个表达式可以由另外已知类型表达式或符号推导产生 内置符号 字面量 标识符 运算符 递归下降算法 自顶向下构造语法树 展开过程中可能会遇到递归的情况 类型检查 类型综合 根据子表达式类型构造出夫表达式的类型 编译时检查&运行时检查

3 设计一个规则引擎

设计目标 支持特定词法 运算符 数据类型和优先级

词法 参数字母数字下划线 布尔值 字符串 十进制int 十进制float 预定义运算符

运算符 一元 二元 逻辑操作 括号

数据类型 字符串 布尔 十进制int 十进制float

优先级 设计词法分析状态机 语法分析 优先级的表达 语法树结构 一元运算符 左子树空 二元 左子树左操作数 右子树右操作数 括号 左子树空

语法树执行 后序遍历 左子树 左节点值 右子树 右节点值 根节点操作符得根节点值

类型检查 时机 执行时检查 方法 分别校验左右子节点类型是否符合对应操作符的类型检查预设规则

4 实现规则引擎

匹配一个数据类型(types)
匹配一个标识符(Id),作为变量名称
匹配初始化部分(varInitializer),而这会导致下降一层,使用一个新的语法规则:
   匹配一个等号
   匹配一个表达式(在这个步骤会导致多层下降:exp->add->mul->pri->IntLiteral)
   创建一个varInitializer对应的AST节点并返回
如果没有成功地匹配初始化部分,则回溯,匹配ε,也就是没有初始化部分。
匹配一个分号   
创建一个varDecl对应的AST节点并返回