|
|
||
|---|---|---|
| antlr | ||
| assest | ||
| doc | ||
| grammar | ||
| include | ||
| src | ||
| test | ||
| .gitignore | ||
| CMakeLists.txt | ||
| README.md | ||
| main.cpp | ||
| test_all.sh | ||
README.md
环境
x86Debian GNU/Linux 12- Python 3.11.2
- gcc version 12.2.2
- openJDK version "17.0.12"
- NASM version 2.16.01
- antlr complete & runtime Version: 4.9.3
- glog
请使用C++17以上标准
构建
mkdir build && cd build
cmake ..
make -j4
批量执行
bash test_all.sh
详细说明
- 可执行文件
LiteGoCompiler - 用法
./LiteGoCompiler /path/to/gofile
- 所需库
print.o负责向标准输出打印结果 - 源文件同级文件夹下生成中间产物
- out.asm 三地址中间代码
- out.o 二进制编译产物
- 目标可执行文件 out.bin
文件结构
.
├── antlr -------------------------- 存放 antlr jar 包和 runtime
│ └── antlr4-runtime
│
├── grammar ------------------------ 存放 Go 语言语法文件和 antlr 针对 Cpp 的解析结果
│ └── cpp
├── include ------------------------ 代码头文件
│ ├── ICG
│ ├── Public
│ └── TCG
├── src ----------------------------- 源代码
│ ├── ICG ------------------------- 中间代码生成相关,对接 antlr
│ ├── Public ---------------------- 定义了一些公共宏,三地址操作,符号解析和管理
│ └── TCG ------------------------- 目标代码生成相关
│
└── test ---------------------------- 测试文件
代码架构
原理概述
-
ANTLR的工作流程大致如下:
-
定义语法规则:使用ANTLR的语法描述语言来定义语言的语法规则。
-
生成解析器和词法分析器:ANTLR根据这些语法规则自动生成源代码,这些源代码可以构建出解析器和词法分析器。
-
词法分析:词法分析器(lexer)将输入的源代码文本分解成一系列的标记(tokens),这些标记是语法分析的基本单位。
-
语法分析:解析器(parser)使用这些标记和定义的语法规则来构建解析树,这个树结构表示了源代码的语法结构。
-
树的遍历:ANTLR还支持遍历解析树,这可以通过定义访问者(visitors)和监听器(listeners)来实现,它们可以在遍历过程中执行特定的操作,如语义分析、代码转换等。(在这里实现三地址代码生成)
-
-
三地址转汇编
-
指令选择(Instruction Selection):根据三地址代码的指令和操作数,选择相应的汇编指令。例如,如果三地址代码是ADD R1, R2, R3,那么对应的汇编指令可能是add R1, R2, R3。
-
寄存器分配(Register Allocation):将三地址代码中的虚拟寄存器映射到实际的物理寄存器或内存位置。这通常涉及到寄存器分配算法,如贪心算法、图着色算法等。
-
指令调度(Instruction Scheduling):调整指令的顺序以提高执行效率,这可能包括延迟分支、指令重排等。
-
