diff --git a/README.md b/README.md index 75c4ba8..2bfcde4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # RVBTCC -- 约 1400 行的轻量级自举编译器。 +- 约 1500 行的轻量级自举编译器。 - 编译器和自举编译器行为一致。 - 语法类似 C,输出 RISC-V 汇编。 - 依赖几个 libc 函数用于输入输出。 @@ -60,8 +60,8 @@ $ sh boot.sh - 注意指针类型不是复合得来的,而是被视作整体。因此也不存在二重指针。 - 函数和数组不是类型系统的一部分。 - - 可以认为数组的名字就是对应的指针类型。 - - 函数名字本身建议仅用于直接调用,其它行为可视为 UB。 + - 可以认为数组的类型就是其元素对应的指针类型。 + - 函数保存了其返回值的类型,建议仅用于直接调用,其它操作可视为 UB。 - 数组只支持一维数组,且数组的元素不能是指针类型。 - 全局变量不能是指针类型。 - 整数和字符字面量的类型是 `int`,字符串字面量的类型是 `char*` @@ -92,16 +92,22 @@ $ sh boot.sh | || | 逻辑或 | 从左到右 | | `=` | 赋值 | 从右到左 | +- 同级表达式的求值顺序与结合性一致。 - 加减号支持整数之间,指针与整数,指针之间的运算。 +- 算术运算的结果总是被提升为 `int` 类型。布尔值用 `int` 类型表示。 +- 由于空指针就是 `0`,因此指针和整数之间的比较运算没有禁止。 - 逻辑与和逻辑或支持短路求值。 +- 表达式没有左值和右值之分。可以认为右值总是存在一个临时的变量中。 +- 赋值不检查类型。强制类型转换可以用赋值给特定类型的变量实现。 +- 函数的参数类型和个数不会检查,返回值会参与类型检查。 ### 其它支持与不支持 - 支持全局变量和局部变量,局部变量遮挡全局变量。 -- 重名的局部变量为同一变量,不支持局部变量之间的遮挡。 -- 函数只支持最多八个参数。支持可变参数。 -- 支持函数声明,不支持变量声明。 -- 类型检查做的较少,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。 +- 不支持局部变量之间的遮挡,重名的局部变量为同一变量。 +- 支持函数声明,可以通过函数声明来调用 C 语言库。不支持变量声明。 +- 函数只支持最多八个参数。函数声明中支持可变参数,仅用于兼容 C 语言库。 +- 类型检查可能有遗漏,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。 ## 限制 diff --git a/boot.c b/boot.c index 025452d..4522e1b 100644 --- a/boot.c +++ b/boot.c @@ -511,7 +511,6 @@ void asm_sd(const char* rs1, int imm, const char* rs2) { printf(" add t0, %s, t0\n", rs2); printf(" sd %s, 0(t0)\n", rs1); } - } void asm_addi(const char* rd, const char* rs, int imm) {