规则引擎学习|青训营笔记

112 阅读4分钟

规则引擎学习|青训营笔记

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

在后面会依次倒叙回顾之前的学习课程,便于复习~

一、课程重点内容

  • 规则引擎的组成部分
  • 规则引擎的实现原理
  • 规则引擎的设计

下面是对课程重点内容的思考与总结,有问题或者错误,可以批评指正呐~

二、规则引擎的组成部分

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

其实,通俗易懂地说,就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是翻译和执行的过程。这里具体的案例可以去查看一下

  • 翻译过程

    一般地,C语言程序在写好之后,需要进行一系列地处理阶段,才能被机器识别并运行。

    • 四个阶段

image-20230203134143060.png

  • 执行过程:

    将翻译出来的机器码执行就行了,这里比较简单,不再赘述~

三、规则引擎的实现原理

  • 词法分析

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

      avatar

    • 概念

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

      • 把词法分析程序作为主程序。即,把词法分析与语法分析明显分开,由词法分析程序将字符串形式的源程序改造成单词符号串形式的中间程序,以这个中间程序作为语法分析程序的输入。在这种处理结构中,词法分析和语法分析实际上是分别实现的。
      • 把词法分析程序作为语法分析程序调用的子程序。在进行语法分析时,每当语法分析程序需要一个单词时,便调用词法分析程序,词法分析程序每一次调用便从字符串源程序中识别出一个单词交给语法分析程序。在这种处理结构中,词法分析和语法分析实际上是交替进行的。
  • 语法分析

    语法分析是编译原理中的核心部分,也是最难的部分。这部分的内容最多,涉及的概念也很多。

    • 二义性消除:由于一种文法可以推导出多个句子,因此语法树是针对一个句子来画的。如果一个句子存在两种不同的最左或最右推导(有两种语法树的画法),那就存在二义性。 如果要消除文法的二义性可以通过:

      • 改变一些运算符的优先性
      • 添加新的非终结符
    • 语法可以用上下文无关语法或巴克斯范式表示。

    • 输出是语法结构,一般用抽象语法树(AST)表示。

    • 语法分析有多种方式,这里主要分析自顶向下和递归下降两种方法:

      • 自顶向下的语法分析 自顶向下的语法分析是从文法的开始符出发并寻找一种推导序列,使得这个推导序列恰为输入的符号串。 JavaCC所使用的分析方法就是自顶向下。

      • 递归下降分析法

        1. 不确定的分析: 不确定的递归下降分析法实际上就是一个不断试探直到分析出输入串的过程,分析失败就会回溯,直到分析成功或无法分析为止。因此这种方法的效率很低,实际很少使用,故不多介绍。

        2. 确定的递归下降分析: 为了提高分析的效率,就要减少回溯,那么就要求文法满足以下的条件:

          • 文法不含左递归,也就是不存在A→A…这样的产生式
          • 当产生式右端有多个候选式时,要求首字符集合两两不相交,也就是走一步就能确定接下来的分析路线,不用回溯。
  • 类型检查

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

四、课程个人总结

第一次接触规则引擎,对新知识还是很感兴趣,再接再厉呀!