从规则引擎到编译原理 | 青训营笔记

132 阅读6分钟

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

一、 规则引擎

什么是规则引擎?

规则引擎(Rule Engine)是一种专门用于实现业务规则软件系统

它可以通过对业务规则的描述、存储、执行和维护来实现自动化的业务决策和处理。

规则引擎通常采用规则语言、事实语言和推理引擎等技术来实现。

规则引擎可以帮助企业和组织将业务知识和经验转化为易于理解和维护的规则,从而提高业务流程的效率和灵活性。

如何学习规则引擎?

  1. 了解规则引擎的基本原理和概念,如规则库、规则引擎、事实库等。
  2. 掌握规则引擎的基本操作,如规则的创建、维护、测试等。
  3. 学习相关的编程语言和框架,如Drools、Jess、Clips等。
  4. 实践,通过编写简单的规则引擎程序来熟悉规则引擎的使用方法。
  5. 阅读相关书籍和资料,如“规则引擎实战”、“规则引擎权威指南”等。
  6. 结合实际应用场景进行学习,如金融、保险、医疗、电商等领域。

课前预习与明确概念:

课程目标:

  • 了解规则引擎的组成部分和应用场景。
  • 学习并掌握规则引擎的设计与实现原理。
  • 明确一个规则引擎的设计目标,并完成各部分的设计与实现步骤拆解。
  • 动手实现规则引擎项目,完成预定目标。
  • [课外扩展] 结合其他课程,完成一个在线 规则引擎 服务。

编译:

编译的过程是将源代码转换为机器可以执行的代码的过程,是把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序(目标语言程序)。

一般分为以下几个步骤:

  1. 词法分析(Lexical Analysis),将源代码分解成词法单元(token)。
  2. 语法分析(Syntax Analysis),将词法单元组成语法结构。
  3. 抽象语法树(Abstract Syntax Tree, AST),从语法结构中构造出AST。
  4. 类型检查(Type Checking),对程序进行类型检查。
  5. 代码生成(Code Generation),将AST转换为机器可执行的代码。

avatar

词法分析:

词法分析是把源代码字符串转换为词法单元(Token)的这个过程。

  • 词法如何表示? 正则文法
  • 词法分析阶段的输出是什么? 一般是词法单元(token)
  • 词法分析阶段是怎么做的? 通常使用正则表达式将源代码分解成词法单元
  • 词法分析可能会产生什么问题? 左递归问题
  • 如何解决词法分析过程中产生的问题? 左递归问题可以通过转换成右递归或使用预测分析来解决。

avatar

如上是一个确定的有限自动机 DFA | Deterministic Finite Automaton

语法分析:

  • 语法可以用上下文无关语法或巴克斯范式表示。
  • 输出是语法结构,一般用抽象语法树(AST)表示。
  • 语法分析有多种方式,如递归下降算法、LL和LR分析等。递归下降算法是一种从上至下语法分析方法。

抽象语法树:

  • 抽象语法树是语法分析的输出,用树的形式表示语法结构。
  • 抽象语法树可以用来进行语义分析和代码生成。

类型检查:

  • 类型检查可以用静态类型检查和动态类型检查。
  • 类型检查可以在语法分析阶段完成,也可以在代码执行过程中进行。静态类型检查在编译时进行,动态类型检查在运行时进行。

名词解释:

正则文法:正则文法是一种描述字符串模式的语言,用于匹配捕获文本中的特定模式。它通常用于文本处理、数据验证和搜索等应用中。

词法单元是文本中的最小语法单位,通常是标识符、关键字、符号等。词法分析器将文本分解为词法单元,以便进行语法分析。

左递归是指一个文法中存在一个非终结符号向自己递归的情况。这种情况会导致语法分析器陷入无限循环,因此需要解决左递归问题。

上下文无关语法是指一种语法,它只依赖于词法单元,而不依赖于语境。这种语法可以在不同语境中使用,因此称为上下文无关语法。

上下文无关语法G:终结符集合T + 非终结符集合N + 产生式集合P + 起始符号S

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 ')' ;            //基础表达式 
复制代码

巴斯克范式是一种形式化的文法,用于描述上下文无关语法。它由 Noam Chomsky 提出,在理解上下文无关语法和语言理论研究中很重要。巴斯克范式主要包括三种形式:正则范式、上下文无关范式、上下文有关范式。

<expr> ::= <expr> + <term>
         | <expr> - <term>
         | <term><term> ::= <term> * <factor>
         | <term> / <factor>
         | <factor><factor> ::= ( <expr> )
           | Num

三、实践:

大致思路:

实现在线版本的规则引擎,需要使用 Hertz 框架开发一个 HTTP 服务,并使用 MySQL 存储表达式和参数。在该服务中,需要实现以下接口:

  1. 直接表达式执行接口,可以实时编译并执行一个表达式,并返回编译结果。

  2. 新增表达式接口,可以新增一条表达式到数据库中,并返回表达式在数据库中的 ID。在新增表达式之前需要检测该表达式是否已经存在,如果已经存在,则直接返回该表达式的 ID。同时需要检测表达式是否合法,如果编译失败,则返回错误码和编译错误。

  3. 查询表达式接口,可以查询数据库中所有的表达式。

  4. 删除表达式接口,可以根据 ID 删除表达式。如果表达式不存在,则返回错误码和错误信息。如果删除成功,则返回被删除的表达式信息。