这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
一、何为规则引擎:
规则引擎是一种嵌入在应用程序中的组件,能够实现将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接收数据输入,解释业务规则,并根据业务规则做出业务决策。
组成部分:数据输入、规则理解、规则执行。
二、规则引擎的编译原理:
词法分析:把源代码字符串转换成词法单元的过程。
语法分析:在词法分析的基础上识别出表达式的语法结构。
抽象语法树:表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树一定是唯一的。
参数注入:在规则执行过程中,使用输入的参数值来计算抽象语法树中的标识符节点值的过程。
类型检查:验证执行的结果是否为合适的数据类型。在抽象语法树中,通常会验证某节点的子节点的数据类型是否合法。
三、设计规则引擎:
设计目标:
设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行。
词法分析:
参数:由字母数字下划线组成。
布尔值:true、false
字符串:"abcd"、'abcd'
十进制整数:123
十进制浮点数:123.4
一元运算符:+ -
二元运算符:+ - * / % > < >= <= == !=
逻辑操作符:&& || !
括号:()
语法树结构:
一元运算符:左子树为空,右子树为右操作数
二元运算符:左子树为左操作数,右子树为右操作数
括号:左子树为空,右子树为内部表达式的抽象语法树
语法树执行:
进行后续遍历,即先执行左子树得到左节点的值,再执行右子树得到右节点的值,最后根据根节点的操作符执行得到根节点的值。
类型检查:
执行时检查。在一个节点的左右子节点执行完成后,分别检验左右子节点的类型是否符合对应操作符的类型检查预设规则。