编译实践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 } ...

June 10, 2026 · 2 min · farmer3-c

编译实践Lv0. 环境配置

目的 配置实验环境的 Docker 容器, 并学习 Docker 的基本使用方法. 认识编译实践中用到的编译器中间表示: Koopa IR. 认识编译实践中开发的编译器的目标架构: RISC-V. 配置实验环境的 Docker 容器, 并学习 Docker 的基本使用方法. 安装Docker Desktop 使用docker 一、镜像相关常用命令 镜像是容器的 “模板”,所有容器都基于镜像创建,这部分是基础操作。 1. 拉取镜像(下载到本地) 如果本地没有该镜像,先从 Docker 仓库拉取(如果是私有仓库,需先docker login): powershell 1 2 3 4 5 # 拉取指定镜像(格式:docker pull 镜像名:标签,latest是默认标签可省略) docker pull maxxing/compiler-dev:latest # 简写(省略latest,效果同上) docker pull maxxing/compiler-dev 作用:把远程仓库的maxxing/compiler-dev镜像下载到本地,后续创建容器无需重复下载; 场景:首次使用该镜像、需要更新镜像版本时。 2. 查看本地镜像 powershell 1 2 3 4 5 # 查看所有本地镜像(重点看REPOSITORY、TAG、IMAGE ID) docker images # 过滤查看指定镜像(只显示maxxing/compiler-dev) docker images maxxing/compiler-dev 输出示例: 1 2 REPOSITORY TAG IMAGE ID CREATED SIZE maxxing/compiler-dev latest 5bcecbbe34b6 3 months ago 4.14GB 场景:确认镜像是否已下载、查看镜像 ID / 大小等信息。 ...

February 14, 2026 · 6 min · farmer3-c