Skip to content

nanakura/young_engine

This branch is up to date with qimengxingyuan/young_engine:main.

Folders and files

NameName
Last commit message
Last commit date
Jan 16, 2023
Jan 13, 2023
Jan 5, 2023
Jan 13, 2023
Jan 16, 2023
Dec 17, 2022
Jan 5, 2023
Jan 13, 2023
Jan 13, 2023
Jan 16, 2023
Jan 13, 2023
Jan 13, 2023
Jan 13, 2023
Jan 16, 2023
Jan 31, 2023

Repository files navigation

YoungEngine

本项目实现了一个简单的规则引擎。

  • 引擎自定义了一套词法、语法。
  • 在自定义词法语法的基础上实现了一个典型的编译器前端,能够生成表达式对应的抽象语法树。
  • 基于编译构建的抽象语法树实现了go版本的虚拟机。通过注入参数可以获得执行结果。

词法

引擎支持指定的运算符和数据类型

运算符

  • 一元计算符 : ! - +
  • 二元计算符 : + - / * %
  • 二元比较符 : > >= < <= == !=
  • 逻辑操作符 : || &&
  • 括号 : ( )

数据类型

  • 字符串 "abc" 'def'
  • 十进制int 123
  • 十进制float 123.4
  • bool true
  • 变量 id

表达式词法

  • 表达式以换行结束、不支持多行表达式。形如a + 7 > 100
  • 支持字面量 (上述数据类型的常量)、变量和运算符(上述运算符)
  • 变量:由字母数字下划线构成且必须以字母开头,形如:_idfoo
  • 关键字:系统内置部分关键字
    • 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定义

项目运行

启动DB

docker-compose up

运行项目

go run ./main.go

About

简单的规则引擎

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 94.3%
  • Shell 3.2%
  • ANTLR 2.5%