规则引擎设计 | 青训营笔记

160 阅读3分钟

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

零、 前言

本文记录了规则引擎设计的伴学笔记,笔者之前没有接触过规则引擎,这次课相当于拓宽知识面了。本次课以直播的形式进行,由于直播视频只在规定时间播放,后续不能再回放了,为了今后能够查缺补漏,特此撰写这篇笔记。

一、内容目录

  • 认识规则引擎
    • 什么是规则引擎
    • 规则引擎的组成
    • 规则引擎的使用场景
  • 编译原理基本概念
    • 词法分析
    • 语法分析
    • 抽象语法树
    • 类型检查

二、内容详解

2.1 认识规则引擎

考虑以下场景:

image.png

在不借助规则引擎的情况下,比如实现抖音商城积分赚取规则的业务逻辑,程序员可能会不断添加if-else去满足复杂的业务逻辑,这样的方式显而易见是开发缓慢的,当业务规则随时间变化,我们可能需要挨个修改if-else或是添加if-else,我们需要改变这个现状,规则引擎即为最优解。

什么是规则引擎

那么什么是规则引擎呢,首先看看规则引擎的定义:

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,接受数据输入,解释业务规则,并使用预定义的语义模块编写业务决策。

以前我们的开发是这样的:

image.png

有了规则引擎之后:

image.png

规则引擎的组成部分

image.png

应用场景

下面是规则引擎的主要应用场景:

image.png

2.2 编译原理基本概念

没想到会在这里再遇编译原理,我真的是太高兴了(bushi),各位同学一定要好好学编译原理。

词法分析

词法分析就是将源代码字符串,按照源程序的词法规则识别出各类词法单元(Token)的过程:

image.png

使用有限状态自动机识别Token,这里是一个识别无符号的右线性文法的状态转移图:

image.png

也就是说,任何一串字符流由状态0,通过有限状态自动机的检查能够到达状态7,就可以认为这串字符属于无符号数。

语法分析

语法分析的输入是词法分析输出的Token流,语法分析需要在词法分析的基础上,识别表达式的语法结构的过程:

image.png

抽象语法树

表达式的语法结构可以抽象成语法树,每个节点都是一个语法单元,语法树的结构代表了语法规则:

image.png

类型检查

image.png

2.3 设计一个规则引擎

设计目标

设计一个具有特定的词法、运算符、数据类型和优先级,并且支持一定预定义规则表达式的编译和运行的规则引擎:

image.png

  • 设计词法分析的状态机(状态转移图):

image.png

  • 语法分析:

image.png

  • 优先级表达:

image.png

  • 语法树结构

单运算符:左子树为空,右子树为其操作符 双运算符:左子树为左操作符,右子树为其右操作符 括号:左子树为空,右子树为括号内表达式的语法树

  • 语法树执行和类型检查:

image.png