本项目实现了一个简单的规则引擎。
- 引擎自定义了一套词法、语法。
- 在自定义词法语法的基础上实现了一个典型的编译器前端,能够生成表达式对应的抽象语法树。
- 基于编译构建的抽象语法树实现了go版本的虚拟机。通过注入参数可以获得执行结果。
引擎支持指定的运算符和数据类型
运算符
- 一元计算符 :
!-+ - 二元计算符 :
+-/*% - 二元比较符 :
>>=<<===!= - 逻辑操作符 :
||&& - 括号 :
()
数据类型
- 字符串
"abc"'def' - 十进制int
123 - 十进制float
123.4 - bool
true - 变量
id
表达式词法
- 表达式以换行结束、不支持多行表达式。形如
a + 7 > 100 - 支持字面量 (上述数据类型的常量)、变量和运算符(上述运算符)
- 变量:由字母数字下划线构成且必须以字母开头,形如:
_id、foo - 关键字:系统内置部分关键字
true: bool类型常量false: bool类型常量
支持简单的表达式语法
- 一元运算:
!true - 二元运算:
a + b > c - 逻辑运算:
a || b == 100 - 括号:
(a + b) * c
运算符的优先级
| 优先级 | 运算符 |
|---|---|
| 0 | or |
| 1 | && |
| 2 | ! - + |
| 3 | > >= < <= == != |
| 4 | + - |
| 5 | * / |
.
├── README.md
├── compiler.go
├── compiler_test.go
├── compiler
│ ├── lexical.go
│ ├── parser.go # 语法分析
│ ├── parser_test.go
│ ├── planner.go # 构建语法树
│ ├── scanner.go # 词法分析
│ └── scanner_test.go
├── executor
│ ├── ast.go # 抽象语法树定义
│ ├── operator.go # 语法树执行
│ ├── svg.go # 可视化打印语法树 - 辅助工具
│ ├── symbol.go # 符号定义
│ ├── type.go # 类型定义
│ └── type_checker.go # 类型检查
└── token
├── kind.go # token类型
├── kind_test.go
├── lexer.go # 词法定义
└── token.go # token定义docker-compose upgo run ./main.go