跳转至

FAQ

为什么我的 lexer/parser 卡住了

flex/bison 默认从 stdin 读入输入, 由于 \n 也会视为输入的一部分, 你需要手动输入 EOF 结束, 这在 bash 上是 Ctrl+D.

如果你想从文件里输入的话 (比如 ./compiler test.in), 这里提供一个供参考的解决方法:

extern int yyparse();

extern FILE* yyin;

int main(int argc, char **argv) {
    yyin = fopen(argv[1], "r");
    yyparse();
    return 0;
}

为什么在 Debug 模式下 ASAN 提示我 yylex 存在内存泄漏

请调用 yylex_destroy 销毁 buffer.

为什么 Accipit IR 有 alloca 指令但是没有 free

Accipit IR 的定位是平台无关的中间代码,在显式地表达前端语义的同时,在一些形式又接近底层的汇编(例如控制流跳转,指令的操作码等).

alloca 指令的语义是分配栈上的空间,用于存放局部变量. alloca 指令告诉了编译器后端局部变量需要的空间,并在汇编中由函数的 prologue 部分完成,即 sub sp, sp, #size. 在函数体中,使用 sp + #offset 的形式访问局部变量的地址. 因此在退出函数时,epilogue 部分复原栈指针即完成了释放局部变量空间的动作.