# 环境
- `x86` Debian 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以上标准`

# 构建
```shell
mkdir build && cd build
cmake ..
make -j4
```

# 批量执行

```shell
bash test_all.sh
```

# 详细说明
- 可执行文件 `LiteGoCompiler`
- 用法
```shell
./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 ---------------------------- 测试文件

```

# 代码架构
![code](./assest/code.jpg)

# 原理概述
1. ANTLR的工作流程大致如下：

    - 定义语法规则：使用ANTLR的语法描述语言来定义语言的语法规则。

    - 生成解析器和词法分析器：ANTLR根据这些语法规则自动生成源代码，这些源代码可以构建出解析器和词法分析器。

    - 词法分析：词法分析器（lexer）将输入的源代码文本分解成一系列的标记（tokens），这些标记是语法分析的基本单位。

    - 语法分析：解析器（parser）使用这些标记和定义的语法规则来构建解析树，这个树结构表示了源代码的语法结构。

    - 树的遍历：ANTLR还支持遍历解析树，这可以通过定义访问者（visitors）和监听器（listeners）来实现，它们可以在遍历过程中执行特定的操作，如语义分析、代码转换等。(在这里实现三地址代码生成)

2. 三地址转汇编

    - 指令选择（Instruction Selection）：根据三地址代码的指令和操作数，选择相应的汇编指令。例如，如果三地址代码是ADD R1, R2, R3，那么对应的汇编指令可能是add R1, R2, R3。

    - 寄存器分配（Register Allocation）：将三地址代码中的虚拟寄存器映射到实际的物理寄存器或内存位置。这通常涉及到寄存器分配算法，如贪心算法、图着色算法等。

    - 指令调度（Instruction Scheduling）：调整指令的顺序以提高执行效率，这可能包括延迟分支、指令重排等。
