后段基础_05 | 青训营笔记

73 阅读2分钟

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

课程获取

  1. 理解规则引擎的组成部分以及原理
  2. 理解规则引擎的核心原理
  3. 设计并实现一个规则引擎

认识规则引擎

定义:

规则引擎是一种嵌入在应用程序中的组件,将业务决策从程序代码中抽取出来。接受数据输入,分析输入的语句逻辑,做出决策。

组成部分:

数据输入:接受业务的数据作为执行过程中的参数

规则理解:按照预先定义的语法、优先级、运算符等分析输入的数据

规则执行:根据输入的参数对策略集中的规则进行正确的解释和执行,同事对规则执行过程中的数据类型进行检查

编译原理基本概念

规则引擎编译原理:

理解 -> 执行 -> 输入输出

理解:将输入的字符串转化为此法单元(Token)

执行:将表达式抽象为树形数据结构

输入输出:类型检查、参数注入

词法分析

词法分析就是把源代码字符串转化为词法单元(Toekn)的过程

如何识别Token?

有限自动机:就是一个状态机,进行规定,什么样的数据属于什么状态

语法分析

在词法分析后,识别表达式的语法结构的过程 -> 抽象语法树

抽象语法树

每个节点是一个语法单元。通过后续遍历访问树

上下文无关语法

语言无需考虑上下文,就可以判断正确性。如巴克斯范式(BNF)

根据规定好的每个字符的优先级进行判定,应该存在于哪个位置

递归下降算法

不断对Token进行语法展开,展开过程中可能会遇到的递归的情况

类型检查

类型综合

根据子表达式的类型构造出父表达式的类型。如果子表达式类型不同,返回error

编译时检查 & 运行时检查

编译时:提前声明参数的类型,在构建语法树过程中进行类型检查

执行时:可以根据执行时的参数输入的类型值,在执行过程中进行类型检查

简单规则引擎设计

设计所需

  • 词法(合法Token)
    1. 参数
    2. 布尔值
    3. 字符串
    4. 十进制int
    5. 十进制float
    6. 预定义运算符
  • 数据类型
    1. 字符串
    2. 布尔值
    3. 十进制int
    4. 十进制float
  • 运算符
    1. 一元运算符+-
    2. 二元运算符+-*/<>
    3. 逻辑运算符&& ||
    4. 括号
  • 优先级
优先级运算符
0
1&&
2!-+
3>>=<<===!=
4+-
5*/
6()

词法分析

语法分析

优先级表达

通过构建一个结构体,包括优先级、更高优先级、当前优先级的处理函数

语法树执行与类型检查

语法树执行

通过后序遍历遍历书

类型检查

检查时机:执行时检查

检查方式:在一个节点的左右子节点执行完成后,分别校验左右子节点的类型是否符合对应操作符的类型检查预设

  • 符号要求左右子节点的值都存在且为int或float

  • !顾浩要求左右子节点为空切由节点为bool