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

98 阅读2分钟

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

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

1. 设计一个规则引擎

1. 设计目标

设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行

  • 词法(合法Token)

    参数:由字母数字下划线组成

    布尔值

    字符串

    十进制int float

    预定义运算符

  • 运算符

    一元运算符

    二元运算符

    逻辑操作符

    括号

  • 数据类型

    字符串

    布尔值

    十进制int

    十进制float

  • 优先级

    常规运算符优先级

2. 词法分析

把元到吗字符串转换为词法单元(Token)的过程

设计词法分析的状态机,确定的有限自动机,一个状态机,它的状态数量是有限的。该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。

3. 语法分析

Token -> AST

上下文无关语法 Context-Free Grammar

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

  • 优先级的表达

    • 当前优先级支持的运算符类型
    • 更高优先级的
    • 当前优先级的处理函数
  • 语法树结构

    • 一元运算符:左子树为空,右子树为操作数
    • 二元运算符:左子树为左操作数,右子树为右操作数
    • 括号:左子树为空,右子树为内部表达式的AST

4. 语法树执行与类型检查

  • 语法树执行

    • 预先定义好每种操作符的 执行逻辑

    • 对抽象语法树进行后序遍历执行

      • 先执行左子树,得到左节点的值
      • 再执行右子树,得到右节点的值
      • 最后根据根节点的操作符执行得到根节点的值
  • 类型检查

    • 检查时机:执行时检查

    • 检查方法:在一个节点的左右子节点执行完成后,分别校验左右子节点的类型是否符合对应操作符的类型检查预设规则

      • '>'符号要求左右子节点的值都存在且为int或float
      • '!'符号要求左节点为空且右节点的值为bool