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

69 阅读2分钟

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

规则引擎:嵌入在应用程序中,作用为将应用决策从业务代码中分离,便于进行业务决策。如下图所示:

image.png

由三个部分组成: 1. 数据输入 2. 规则理解 3. 规则执行

规则引擎在风控对抗,活动策略运营,数据分析与清洗过程中都有很重要的作用。

规则引擎的编译原理如下:规则引擎将源代码字符串通过词法,语法分析转换为有意义的token,之后构建抽象语法树,再进行规则执行(I/O)同时注入参数检验正确性。

词法分析:源代码字符串转化为token的过程 (用有限自动机识别token)--》基于确定的字符可以进行一个状态转换

image.png

语法分析:在词法分析的基础上,识别表达式的语法结构。这种语法结构可以用树结构来表示,即每个结点(子树)为1个语法单元,这个单元的构成规则就叫语法。每个结点还可以有下层结点。

判断正确性时,采用上下文无关语法,用BNF式判别正确性。 重要概念:产生式:一个表达式可由另外已知的表达式或符号推导产生。 如:

    mul->mul "*" pri
    mul->pri

基于此,可以对原始token进行不断的语法展开与下降,最终得到树状结构。

类型检查:根据子表达式的类型构造出父表达式的类型,可发生在编译阶段或者执行阶段。

设计规则引擎的一些内容:

定义一组数据:词法,数据类型,运算符,优先级。

根据语法规则与转移状态定义有限自动机进行词法分析。

语法分析:定义优先级:

    typedef precedence struct{
        validSymbols []Symbols //运算符类型
        nextPrecedence *precedence //更高优先级
        planner planner //当前优先级处理函数
    }

和语法树结构:

  • 一元运算符,左子树为空,右子树为右操作数
  • 二元运算符,左右子树分别为左右操作数
  • (),左子树为空,右子树为内部表达式的AST

image.png

执行语法树时,对语法树进行后序遍历,并进行类型检查。

总而言之,这部分内容与本人学习的NLP课程中部分文法处理的内容比较接近,也是有共通之处。本人认为,用形式语言进行规则的设计与语法语义的分析,在很多领域都有着重要的作用。