这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
规则引擎是什么
官方版:
规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策,接受数据输入,解释业务决策,并根据业务规划做出业务决策。
俺的拙见:
规则引擎可以根据输入的规则和用户标签,商品价格,商品属性等具体数据自动生成代码并输出结果。并且可以通过修改规则直接实现代码。
规则引擎的组成部分
数据输入
支持接收使用预定义的语义编写的规则作为策略集;
接受业务的数据作为执行过程中的参数。
规则理解
能够按照预定义的词法,语法,优先级,运算符等正确理解业务规则所表达的语义。
规则执行
根据执行时输入的参数对策略集中的规则进行正确的解释和执行,同时对规则执行过程中的数据类型进行检查,确保执行结果正确。
规则引擎应用场景
应用很广,略。
编译原理基本原理
理解:
词法分析:将源代码字符串转换成词法单元(Token)的这个过程
语法分析:在词法分析的基础上识别出表达式的语法结构
执行:
抽象语法树:表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树唯一确定。
输入&输出:
类型检查:验证执行的结果是否为合适的数据类型,在抽象语法树中,通常会验证某节点的数据类型是否合法。
参数注入:规则执行过程中,使用输入的参数值来计算语法树中的标识符节点值的过程。
词法分析
词法分析就是把源代码字符串转换成词法单元(Token)的过程。(分词)
如何识别Token?
有限自动机:
有限自动机是一个状态机,其状态数量是有限的,处于任何一个状态,基于输入的字符,都可以做一个确定的状态转换。
也就是说会检测输入的源代码字符串,将其分为变量名参数,常量值,运算符号,逻辑符号等类别,并根据这些类别执行与源代码语义相同的操作。
也就是说完成了状态机,就基本完成了词法分析。
词法分析的阶段就是遍历表达式通过状态机输出相应的Token,方便下一阶段使用。
语法分析
语法分析就是在词法分析的基础上,识别表达式的语法结构的过程。
啥是语法结构?
语法结构是一个树状结构,这棵树叫做抽象语法树。树的每个节点(子树)是一个语法单元,这个单元的构成规则叫做语法。每个节点还可以有下级节点。
抽象语法树
**语法树**:
父节点是运算符,子节点是运算参数(变量或者常量)或者语法树。
如何构建抽象语法树?
上下文无关语法
语言句子无需考虑上下文,即可判断正确性。例如:
r := a > b
巴科斯范式(BNF):
exp : add ;
add : add '+' mul | mul; //加法表达式 a + b + c a + b * c
mul : mul '*' pri | pri; //乘法表达式 a * b * c
pri : string | bool | number | identifer //基础表达式 weight | 20 | "abcde"
产生式:一个表达式可以由另外已知类型的表达式或者符号推到产生。
内置符号:字面量(string、bool、number)标识符、运算符
一个基础表达式可以由 常量(string、bool、number)或者标识符(identifer)
一个乘法表达式可以由 基础表达式 或者 乘法表达式 * 基础表达式组成
巴科斯范式即是递归的表达。
运算符优先级可以在巴科斯中得到表述。
递归下降算法(Recursive Descent Parsing):
递归下降算法就是自顶向下构造语法树。
不断地对Token进行语法展开(下降),展开过程中可能会遇到递归的情况。