golang 规则引擎      2023-02-12

写在前面

目前反作弊项目的核心项目是规则引擎,实现规则引擎在类似 python/php/javascrip 之类的解释型语言中可以直接通过 eval 之类的函数来模拟实现,但是在编译型语言比如 Go 实现就没那么容易了。

原因在于解释型语言本身就是动态解释执行的,可以在运行时把输入的文本作为语言本身去解释执行,但是编译型语言是去运行编译之后的机器码,此时能动态执行的内容非常有限且必须依靠语言特性。比如在 Go 语言内只能通过反射实现一些有限的动态执行,反射是完全依靠 interface 的内部实现。

解释器过程

规则引擎其实可以看作一个简化的单行脚本语言,所以要通过 Go 实现一个规则引擎其实就是使用 Go 实现一个简化版的脚本语言解释器。

我们来看看实现一个解释器的基本流程:

解释器流程

词法分析(Lexical analysis)

词法分析**(**lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。

完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器,核心任务是扫描、识别单词且对识别出的 Token 给出定性、定长的处理。

词法分析器一般从左至右地对源程序进行扫描,按照语言的词法规则识别各类 Token 。

Token

Token 是用于描述与归类从文本中分解出来的最小描述单元的一种结构。

词法分析器通常只识别Token ,但是不会关心 Token 之间的关系。例如:词法分析器能够将括号识别为单词,但并不保证括号是否匹配。

Token 序列本身并没有实际意义,必须通过语法分析将 Token 作为输入进行语法分析来保证 Token 的可用性和有意义的。

语法分析(Syntax analysis)

在计算机科学中,语法分析(syntactic analysis)是根据某种给定的形式文法对由 Token 序列构成的输入文本进行分析并确定其语法结构的一种过程。

语法分析器(parser)通常是作为编辑器或者解释器的组件出现的,它的作用是进行语法检查、并构建由输入的 Token 组成的数据结构,比如抽象语法树(AST)等层次化的数据结构。

实现 INI 解析