规则引擎 | 青训营笔记

103 阅读2分钟

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

词法分析

产生token流 有限状态机

语法分析

识别表达式语法结构,识别操作数与操作符,形成抽象语法树

与抽象语法树相关的概念:
上下文无关语法:语言句子不需要上下文,可以判断其正确性,可以通过巴克斯范式来表达 乘法表达式(mul)的优先级高于加法表达式image.png

如何构建语法树:递归下降算法 表达式一层层下推,直到推到可以被定义
比如price:先看是不是log -> 到cmp -> …… 往下直到id 比如 > :再回溯到cmpimage.png

语法树的形成:完成了规则引擎的理解

执行

类型检查
编译时期:构造语法树会检查,左子树与右子树是否合法
运行时期:表达式传入的参数,在运行时检查参数类型对不对

image.png

实现

词法分析 -> 语法分析 -> 构造语法树 -> 语法树执行 -> 类型检查
语法树用二叉树即可满足,语法树执行:二叉树的后续遍历
怎样做到编译时检查?image.png

image.png

实践

kind.go:词法分析,token类型定义为一系列类型常量(Kind作为一个枚举类型)

token.go:定义token
定义一个函数参数是 interface{} 类型,这个函数应该可以接受任何类型作为它的参数

scanner.go:词法扫描
rune:字符串转化成unicode码点 通过scanner逐个读取字符(跳过空格),同时基于状态机进行状态转换
scanner.peek()预读一位,scanner.read()

parser.go:语法分析器
先检查合法性:

  1. 成对的token符是不是balanced的
  2. 每个token后面可以接的token类型
  3. token能不能作为结尾

builder.go 递归下降算法:从token构建语法树
只要当前优先级不是最低,就下降,递归到下一优先级
-作为负号需要调整image.png