这是我参与「第五届青训营 」笔记创作活动的第7天。
规则引擎:嵌入在应用程序中,作用为将应用决策从业务代码中分离,便于进行业务决策。如下图所示:
规则引擎在风控对抗,活动策略运营,数据分析与清洗过程中都有很重要的作用。
规则引擎的编译原理如下:规则引擎将源代码字符串通过词法,语法分析转换为有意义的token,之后构建抽象语法树,再进行规则执行(I/O)同时注入参数检验正确性。
词法分析:源代码字符串转化为token的过程 (用有限自动机识别token)--》基于确定的字符可以进行一个状态转换
判断正确性时,采用上下文无关语法,用BNF式判别正确性。 重要概念:产生式:一个表达式可由另外已知的表达式或符号推导产生。 如:
mul->mul "*" pri
mul->pri
基于此,可以对原始token进行不断的语法展开与下降,最终得到树状结构。
类型检查:根据子表达式的类型构造出父表达式的类型,可发生在编译阶段或者执行阶段。
设计规则引擎的一些内容:
定义一组数据:词法,数据类型,运算符,优先级。
根据语法规则与转移状态定义有限自动机进行词法分析。
语法分析:定义优先级:
typedef precedence struct{
validSymbols []Symbols //运算符类型
nextPrecedence *precedence //更高优先级
planner planner //当前优先级处理函数
}
和语法树结构:
- 一元运算符,左子树为空,右子树为右操作数
- 二元运算符,左右子树分别为左右操作数
- (),左子树为空,右子树为内部表达式的AST
执行语法树时,对语法树进行后序遍历,并进行类型检查。
总而言之,这部分内容与本人学习的NLP课程中部分文法处理的内容比较接近,也是有共通之处。本人认为,用形式语言进行规则的设计与语法语义的分析,在很多领域都有着重要的作用。