这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
课程获取
- 理解规则引擎的组成部分以及原理
- 理解规则引擎的核心原理
- 设计并实现一个规则引擎
认识规则引擎
定义:
规则引擎是一种嵌入在应用程序中的组件,将业务决策从程序代码中抽取出来。接受数据输入,分析输入的语句逻辑,做出决策。
组成部分:
数据输入:接受业务的数据作为执行过程中的参数
规则理解:按照预先定义的语法、优先级、运算符等分析输入的数据
规则执行:根据输入的参数对策略集中的规则进行正确的解释和执行,同事对规则执行过程中的数据类型进行检查
编译原理基本概念
规则引擎编译原理:
理解 -> 执行 -> 输入输出
理解:将输入的字符串转化为此法单元(Token)
执行:将表达式抽象为树形数据结构
输入输出:类型检查、参数注入
词法分析
词法分析就是把源代码字符串转化为词法单元(Toekn)的过程
如何识别Token?
有限自动机:就是一个状态机,进行规定,什么样的数据属于什么状态
语法分析
在词法分析后,识别表达式的语法结构的过程 -> 抽象语法树
抽象语法树
每个节点是一个语法单元。通过后续遍历访问树
上下文无关语法
语言无需考虑上下文,就可以判断正确性。如巴克斯范式(BNF)
根据规定好的每个字符的优先级进行判定,应该存在于哪个位置
递归下降算法
不断对Token进行语法展开,展开过程中可能会遇到的递归的情况
类型检查
类型综合
根据子表达式的类型构造出父表达式的类型。如果子表达式类型不同,返回error
编译时检查 & 运行时检查
编译时:提前声明参数的类型,在构建语法树过程中进行类型检查
执行时:可以根据执行时的参数输入的类型值,在执行过程中进行类型检查
简单规则引擎设计
设计所需
- 词法(合法Token)
-
- 参数
- 布尔值
- 字符串
- 十进制int
- 十进制float
- 预定义运算符
- 数据类型
-
- 字符串
- 布尔值
- 十进制int
- 十进制float
- 运算符
-
- 一元运算符+-
- 二元运算符+-*/<>
- 逻辑运算符&& ||
- 括号
- 优先级
| 优先级 | 运算符 | ||
|---|---|---|---|
| 0 | |||
| 1 | && | ||
| 2 | !-+ | ||
| 3 | >>=<<===!= | ||
| 4 | +- | ||
| 5 | */ | ||
| 6 | () |
词法分析
语法分析
优先级表达
通过构建一个结构体,包括优先级、更高优先级、当前优先级的处理函数
语法树执行与类型检查
语法树执行
通过后序遍历遍历书
类型检查
检查时机:执行时检查
检查方式:在一个节点的左右子节点执行完成后,分别校验左右子节点的类型是否符合对应操作符的类型检查预设
-
符号要求左右子节点的值都存在且为int或float
- !顾浩要求左右子节点为空切由节点为bool