Go第六天上课

116 阅读4分钟

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

本次课讲关于规则引擎内容。 首先视频举例当促销折扣时满减可以根据简单的if-else语句进行编写,但是当需求较大,规则较为复杂时需要一个更为通用的方式进行规则设计。

image.png

image.png 规则设计由原来的业务提出者通过制定复杂规则,然后交给开发人员实现,到现在制定一套更为完善的设计思路,业务人员可以直接进行规则制定。开发人员不用重新开发,只需要对规则进行维护即可达到相应目的。

随后老师讲解了关于编译原理的一些基本知识,与接下来的规则设计吻合。从词法分析开始,分别讲解了语法分析以及对应语法树知识。并讲解了关于有限自动机的相关概念,指在不同的词法分析下针对于不同的类型词汇进行状态分析,找出对应类别进行归类。

有限自动机:有限自动机就是一个状态机,它的状态数量是有限的。该状态机在任何一个状态,基于输入的 字符,都能做一个确定的状态转换。

image.png 上图利用状态机转化将所有GO基础语法进行语义分割,下图表示状态图,节点内数字代表不同状态,如&&符号,当扫面字符串到第一个&符号时进入9状态,接着会查看是否会有第二个&符号,监测到&&后会进入10状态,该状态下代表&&为一个整体,存入对应状态结构体空间中。以此类推字母数字,运算符都为不同的状态,当指针依次扫描后可根据不同状态下进行取词达到分割的目的。

image.png

词法分析结束后进行语法分析,建立抽象语法树。抽象语法树中每个节点单元称为语法单元。这个单元的构成规则称为语法。当一个语句不受上下文影响就可以判断正确性时即可使用巴科斯范式(BNF)进行表达。 如加法、乘法、基础表达式等。 image.png 根据巴科斯范式结合递归下降算法进行语法树的构造。 从优先级最高的表达式开始分析扫描的词汇属于的类型,如price为词汇,属于pri类别,所以层层向下递归找到对应位置。然后继续扫描〉符号,此时递归回退,从pri->mul->add->cmp,找到〉对应位置后继续扫描发现500,此时由于递归下降算法继续向下扫描找到对应位置。以此找到扫描到的所有符号位,其中括号优先级最高,每次扫描到括号时,括号内部都可以作为一个全新的表达式执行。当需要执行该语法树时只需要后序遍历。 image.png 省略分析后可以直接得到语法树 image.png

词法分析与语法分析得到对应语法树后需要对类型进行检查。检查方式有编译时检查和运行时检查。可以发生在构造语法树时,也可发生在执行语法树时。当乘法或加法表达式的语法单元左右子节点类型不同时不可进行操作,所以需要对类型进行检查。

最后老师总结设计引擎规则的流程:首先进行词法分析,找出符合规则的字面量(Token),设计词法分析的状态机。其次进行语法分析,对表达式进行设计并设置优先级,随后构造语法树结构。最后执行语法树,对类型进行检查。

词法分析 image.png 语法分析 image.png 类型检查 image.png

最后老师讲解了规则设计引擎的实例代码,代码难度还需要消化,理论清楚,需要根据理论详细流程后再进行程序编写。引擎规则设计与数据结构中的后缀表达式类似,为整合字面量设计一种合法的存取规则以及执行规则,先将表达式分割取词,再根据巴科斯范式对表达式分析,构建优先级以及语法树,最后执行语法树来检测语法类型,以此构建整个规则。老师讲课思路清晰,对于代码还需要细看理解。暂时属于只了解了规则设计的概述,后期需要补上编译原理等相关知识。最后附上课程代码 github.com/qimengxingy…