编译实践Lv1.main函数
目的 实现一个能处理 main 函数和 return 语句的编译器.编译器可以将如下的 SysY 程序: int main() { // 注释也应该被删掉哦 return 0; } 编译为对应的 Koopa IR: fun @main(): i32 { %entry: ret 0 } 实现 Lv1.2. 词法/语法分析初见 我使用项目提供的c++模板,直接执行: make build/compiler -koopa hello.c -o hello.koopa 输出: int main() { return 0; } 这是因为默认的模板使用string存放ast,所以输出的ast也是string形式: CompUnit : FuncDef { ast = unique_ptr<string>($1); } ; Lv1.3. 解析 main 函数 这里设计一个ast用于输出程序的语法结构,教程写的已经很详细了:写一个头文件来定义AST,对于头文件重复声明的问题,加上#pragma once就可以解决。 我是这样定义基类和子类进行构造的: // 所有 AST 的基类 class BaseAST { public: virtual ~BaseAST() = default; virtual void Dump() const = 0; }; // CompUnit 是 BaseAST class CompUnitAST : public BaseAST { public: // 用智能指针管理对象 std::unique_ptr<BaseAST> func_def; void Dump() const override { std::cout << "CompUnitAST { "; func_def->Dump(); std::cout << " }"; } }; …… 同时,修改参数类型的相关声明:比如%parse-param { std::unique_ptr<string> &ast } 改为%parse-param { std::unique_ptr<BaseAST> &ast } ...