这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
零、 前言
本文记录了规则引擎设计的伴学笔记,笔者之前没有接触过规则引擎,这次课相当于拓宽知识面了。本次课以直播的形式进行,由于直播视频只在规定时间播放,后续不能再回放了,为了今后能够查缺补漏,特此撰写这篇笔记。
一、内容目录
- 认识规则引擎
- 什么是规则引擎
- 规则引擎的组成
- 规则引擎的使用场景
- 编译原理基本概念
- 词法分析
- 语法分析
- 抽象语法树
- 类型检查
二、内容详解
2.1 认识规则引擎
考虑以下场景:
在不借助规则引擎的情况下,比如实现抖音商城积分赚取规则的业务逻辑,程序员可能会不断添加if-else去满足复杂的业务逻辑,这样的方式显而易见是开发缓慢的,当业务规则随时间变化,我们可能需要挨个修改if-else或是添加if-else,我们需要改变这个现状,规则引擎即为最优解。
什么是规则引擎
那么什么是规则引擎呢,首先看看规则引擎的定义:
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,接受数据输入,解释业务规则,并使用预定义的语义模块编写业务决策。
以前我们的开发是这样的:
有了规则引擎之后:
规则引擎的组成部分
应用场景
下面是规则引擎的主要应用场景:
2.2 编译原理基本概念
没想到会在这里再遇编译原理,我真的是太高兴了(bushi),各位同学一定要好好学编译原理。
词法分析
词法分析就是将源代码字符串,按照源程序的词法规则识别出各类词法单元(Token)的过程:
使用有限状态自动机识别Token,这里是一个识别无符号的右线性文法的状态转移图:
也就是说,任何一串字符流由状态0,通过有限状态自动机的检查能够到达状态7,就可以认为这串字符属于无符号数。
语法分析
语法分析的输入是词法分析输出的Token流,语法分析需要在词法分析的基础上,识别表达式的语法结构的过程:
抽象语法树
表达式的语法结构可以抽象成语法树,每个节点都是一个语法单元,语法树的结构代表了语法规则:
类型检查
2.3 设计一个规则引擎
设计目标
设计一个具有特定的词法、运算符、数据类型和优先级,并且支持一定预定义规则表达式的编译和运行的规则引擎:
- 设计词法分析的状态机(状态转移图):
- 语法分析:
- 优先级表达:
- 语法树结构
单运算符:左子树为空,右子树为其操作符 双运算符:左子树为左操作符,右子树为其右操作符 括号:左子树为空,右子树为括号内表达式的语法树
- 语法树执行和类型检查: