规则引擎的设计与实现| 青训营笔记

128 阅读4分钟

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

规则引擎是什么

官方版:

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

俺的拙见:

规则引擎可以根据输入的规则和用户标签,商品价格,商品属性等具体数据自动生成代码并输出结果。并且可以通过修改规则直接实现代码。

规则引擎的组成部分

数据输入

支持接收使用预定义的语义编写的规则作为策略集;

接受业务的数据作为执行过程中的参数。

规则理解

能够按照预定义的词法,语法,优先级,运算符等正确理解业务规则所表达的语义。

规则执行

根据执行时输入的参数对策略集中的规则进行正确的解释和执行,同时对规则执行过程中的数据类型进行检查,确保执行结果正确。

规则引擎应用场景

应用很广,略。

编译原理基本原理

理解:

词法分析:将源代码字符串转换成词法单元(Token)的这个过程

语法分析:在词法分析的基础上识别出表达式的语法结构

执行:

抽象语法树:表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树唯一确定。

输入&输出:

类型检查:验证执行的结果是否为合适的数据类型,在抽象语法树中,通常会验证某节点的数据类型是否合法。

参数注入:规则执行过程中,使用输入的参数值来计算语法树中的标识符节点值的过程。

词法分析

词法分析就是把源代码字符串转换成词法单元(Token)的过程。(分词

如何识别Token?

有限自动机:

有限自动机是一个状态机,其状态数量是有限的,处于任何一个状态,基于输入的字符,都可以做一个确定的状态转换。

也就是说会检测输入的源代码字符串,将其分为变量名参数,常量值,运算符号,逻辑符号等类别,并根据这些类别执行与源代码语义相同的操作。

也就是说完成了状态机,就基本完成了词法分析。

image.png

词法分析的阶段就是遍历表达式通过状态机输出相应的Token,方便下一阶段使用。

语法分析

语法分析就是在词法分析的基础上,识别表达式的语法结构的过程。

啥是语法结构?

语法结构是一个树状结构,这棵树叫做抽象语法树。树的每个节点(子树)是一个语法单元,这个单元的构成规则叫做语法。每个节点还可以有下级节点。

抽象语法树

**语法树**:

父节点是运算符,子节点是运算参数(变量或者常量)或者语法树。

如何构建抽象语法树?

上下文无关语法

语言句子无需考虑上下文,即可判断正确性。例如:

r := a > b

巴科斯范式(BNF):

exp : add ;
add : add '+' mul | mul;    //加法表达式 a + b + c    a + b * c 
mul : mul '*' pri | pri;    //乘法表达式 a * b * c
pri : string | bool | number | identifer //基础表达式 weight | 20 | "abcde"

产生式:一个表达式可以由另外已知类型的表达式或者符号推到产生。

内置符号:字面量(string、bool、number)标识符、运算符

一个基础表达式可以由 常量(string、bool、number)或者标识符(identifer)

一个乘法表达式可以由 基础表达式 或者 乘法表达式 * 基础表达式组成

巴科斯范式即是递归的表达。

运算符优先级可以在巴科斯中得到表述。

递归下降算法(Recursive Descent Parsing):

递归下降算法就是自顶向下构造语法树。

不断地对Token进行语法展开(下降),展开过程中可能会遇到递归的情况。

类型检查