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

75 阅读3分钟

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

规则引擎

认识规则引擎

什么是规则引擎

规则引擎是嵌入在应用程序中的组件,实现将业务决策从应用程序中分离出来,使用预定义的语义模块编写业务决策。接收数据输入,解释业务规则,并根据业务规则做出业务决策。
普通编码: image.png 规则引擎:
image.png
解决开发人员重复编码问题,实现业务决策与服务解耦,提高服务可维护性,缩短开发路径,提高效率

规则引擎的组成

  • 数据输入
    支持使用预定义的语义编写的规则作为策略集,接收业务数据作为参数
  • 规则理解
  • 规则执行

应用场景

  • 风空对抗
  • 活动策略运营
  • 数据分析和清理

编译原理基本概念

词法分析

词法分析就是把源代码字符串转化为词法单元(token)的过程
如何识别token?
有限自动机,基于输入的字符,做一个确定状态的转换。

语法分析

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

分析过程

首先通过词法分析,将字符串分解成多个token,对token进行语法分析,检查顺序以及语法,通过递归向下算法构造抽象语法树。

设计规则引擎

目标

设计一个规则引擎,支持特定语法、运算符、数据类型以及优先级。并且支持以上预定义语法的规则表达式的编译和运行。

  • 词法(合法token)
    参数、布尔值、字符串、int、float、预定义字符串
  • 运算符
  • 数据类型
  • 优先级

有限状态机设计

image.png
其中,递归下降算法基本思路就是按照语法规则去匹配字符串token,比如变量申明如下:

varInitializer : '=' exp ;                       //变量初始化
exp : add ;                                      //表达式       
add : add '+' mul | mul;                         //加法表达式
mul : mul '*' pri | pri;                         //乘法表达式
pri : IntLiteral | Id | '(' exp ')' ;            //基础表达式

写成产生式格式如下:

varInitializer -> '=' exp              
varInitializer -> ε
exp -> add
add -> add + mul
add -> mul
mul -> mul * pri
mul -> pri
pri -> IntLiteral
pri -> Id
pri -> ( exp )

则基于该规则解释算法如下:
匹配一个数据类型(types)
匹配一个标识符(Id),作为变量名称
匹配初始化部分(varInitializer),而这会导致下降一层,使用一个新的语法规则:
匹配一个等号
匹配一个表达式(在这个步骤会导致多层下降:exp->add->mul->pri->IntLiteral)
创建一个varInitializer对应的AST节点并返回
如果没有成功地匹配初始化部分,则回溯,匹配ε,也就是没有初始化部分。
匹配一个分号
创建一个varDecl对应的AST节点并返回

小结

本次课程讲述了规则引擎的设计与实现,实现了将业务逻辑与服务代码解耦,实现灵活、高效的业务策略发布。其中由于没有汇编基础,在算法实现部分难度较大。