这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
前言
本次课对规则引擎的设计与实现进行了一个学习,本次课的进度我个人认为十分舒服,在本次课中也学到了很多。词法分析和语法分析本身学过概念,但是带有实际例子的讲解这是第一次去学,之前一直停留在理论层面。
一、本堂课重点内容:
认识规则引擎
一个抖音商城的例子,帮助我们去理解了规则引擎的主要一个作用。
输入:计算规则、商品价格、用户标签、商品属性...
输出:积分
要做到规则简单容易配置、可拓展。
规则引擎定义
是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
如果没有规则引擎,那么每次修改规则决策,就要去写、修改很多if...else条件,大大降低了效率。
有了规则引擎,就可以解决开发人员重复编码的问题。使得业务决策与服务本身解耦,提高服务的可维护性,缩短开发路径,提高效率
规则引擎组成部分
- 数据输入(接受使用预定义的语义编写的规则作为策略集)
- 规则理解(能够按照预先定义的词法、语法、优先级】运算符等正确理解业务规则所表达的语义)
- 规则执行(根据输入参数对规则正确解释)
规则引擎应用场景
- 风控对抗
- 活动策略运营
- 数据分析和清洗
常用于业务流程自动化,决策支持,事件驱动系统等。
编译原理基本概念
主要涉及的就是词法分析、语法分析、抽象语法树、类型检查的概念和应用,还未涉及到编译原理的深层知识。
词法分析
词法分析就是把源代码字符串转换为词法单元(Token)的这个过程
Token是指程序中的一种最小语法单位,用于描述代码的语法结构。例如,标识符,关键字,数字和符号都可以作为词法单元token。在编译过程中,词法分析器会将程序代码分解成词法单元token,然后交给语法分析器进行进一步处理。
通过两个例子理解了词法分析
并且引入了有限状态机去识别token
语法分析
语法分析就是在词法分析的基础上,识别表达式的语法结构的过程。
通过之前的两个例子,去理解语法分析的过程,比如说price > 500是个比较表达式左操作数右操作可以是一些常量、参数等等,同时引入了抽象语法树。
抽象语法树
上下文无关语法
上下文无关语法(Context-Free Grammar)是一种形式语言模型,用于描述语言中的语法规则。它通过定义语法产生式(Production Rules)来描述从一种语法元素(Non-terminal)如何推导出另一种语法元素(Terminal)的过程。上下文无关语法不考虑语法元素的具体上下文,因此它是无关上下文的。它是编译原理中常用的语法模型,用于构建语法分析器。
递归下降算法
自顶向下构造语法树
不断的对Token进行语法展开(下降),展开过程中可能会遇到递归情况。
通过上图的例子,为我们展示了Token展开的过程,当中涉及到的递归。
类型检查
编译时检查,通过声明参数类型在构造语法树时发现不对。
执行时检查:通过在执行时检查参数类型
设计规则引擎
设计目标
需要规定词法、数据类型、运算符、和优先级等。
词法分析
通过输入设计出词法分析的状态机,也要注意内部名称不能被名称、变量使用等
语法分析
定义巴科斯范式,再定义优先级的表达,并设计语法树结构。
语法树执行与类型检查
不采用编译时检查因为需要预先定义一些类型定义一些变量,工作量稍大。
三、实践练习例子:
实践例子就是如上设计的规则引擎的实现,讲师通过讲解了一些设计时的重点和细节。
项目地址
qimengxingyuan/young_engine: 简单的规则引擎 (github.com)
四、课后个人总结:
本次课程学到了很多,从不知道规则引擎,到理解规则引擎并且知道应用规则引擎的地方同时掌握了实现规则引擎的基础,设计一个规则引擎需要做什么。但是因为课程的时长等限制,没法带我们手把手去实现这个规则引擎,不过为我们讲解了实现时的一些细节。