This commit is contained in:
Yaossg 2024-12-07 12:14:10 +08:00
parent dd4ef1edbd
commit 2d7c2371e4
2 changed files with 288 additions and 227 deletions

View file

@ -1,6 +1,6 @@
# RVBTCC
不到 2000 行的轻量级自举编译器。
2000 行的轻量级自举编译器。
- 旨在展示如何迅速编写一个自举编译器。
- 语法类似 C输出 RISC-V 汇编。
@ -96,24 +96,11 @@ $ sh boot.sh
### 关键字
本语言包含的关键字即为支持的标量类型的关键字和流程控制的关键字,还有 `const``extern`
本语言包含的关键字即为支持的标量类型的关键字和流程控制的关键字,还有 `const``extern``enum`
#### `const` 关键字
`const` 关键字可以在类型中使用,在大部分情况下会被直接忽略。支持它是为了更好兼容 C 程序。
但是当在出现
- 全局,标量(即不是数组)。
- 类型为 `const int``const int const`
- 带有初始化。
- 不是 `extern` 的。
的声明时,将会被解析为整数常量。
整数常量在使用的时候会被直接替换为对应的右值,失去作为全局变量左值的性质。
使用 `int const``int` 形式或添加 `extern` 可以避免这样的特殊处理。
`const` 关键字可以在类型中使用,会被直接忽略。支持它是为了更好兼容 C 程序。
#### `extern` 关键字
@ -128,6 +115,12 @@ $ sh boot.sh
- 不可以初始化。
- 不可是数组。
#### `enum` 关键字
用于定义整数常量。enum 的名字必须省略,因此不能用于定义枚举类型。
整数常量可以用于数组大小、全局变量初始化等需要常量的地方。
### 支持以下运算符
| 运算符 | 含义 | 结合性 |
@ -169,13 +162,12 @@ $ sh boot.sh
编译过程中涉及的以下参数:
- 符号表总长度、字符串表总长度
- 符号数、字符串数、全局变量数、局部变量
- 符号数、字符串数、局部变量数、虚拟寄存器
不能超过源代码中指定的常数。如果有必要这些常数可以适度加大。
不能超过源代码中指定的常数。
目前源代码中的常数能够保证自举。
如果愿意,完全可以把程序中的各类表改为 `malloc``free` 动态管理,本语言是完全支持的。
- 目前源代码中的常数能够保证自举成功。如果有必要可以将它们适度加大。
- 该设计保证了没有任何的动态内存分配。如果愿意,可以将它们改为 `malloc``free` 动态管理,本语言是完全支持的。
## 依赖