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

65 阅读2分钟

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

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

规则引擎某种程度上和编译原理有很大的相似之处。规则引擎的本质呢就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是编译和执行的过程。编译原理本质就是把人类的语言转化成机器二进制语言。同样是编译和执行的过程。

我们可以转化为语法树来执行。 语法分析器的任务主要是确定是否可以以及如何从语法的起始符号推导出输入符号串(输入文本),主要可以通过两种方式完成:

  • 自顶向下分析:根据形式语法规则,在语法分析树的自顶向下展开中搜索输入符号串可能的最左推导。单词按从左到右的顺序依次使用。
  • 自底向上分析:语法分析器从现有的输入符号串开始,尝试将其根据给定的形式语法规则进行改写,最终改写为语法的起始符号。

例如以下就是个简单的表达式

start:blockStmts ; //起始 block : '{' blockStmts '}' ; //语句块 blockStmts : stmt* ; //语句块中的语句 stmt = varDecl | expStmt | returnStmt | block; //语句 varDecl : type Id varInitializer? ';' ; //变量声明 type : Int | Long ; //类型 varInitializer : '=' exp ; //变量初始化 expStmt : exp ';' ; //表达式语句 returnStmt : Return exp ';' ; //return语句 exp : add ; //表达式 add : add '+' mul | mul; //加法表达式 mul : mul '*' pri | pri; //乘法表达式 pri : IntLiteral | Id | '(' exp ')' ; //基础表达式