跳转至

Lab2 中间代码生成

本次实验需要同学们在 Lab1 实现的 Cminusf 解析器基础上,完成从语法树向中间代码的自动化翻译过程。

实验要求

根据 Lab1 的要求,学生有两个远程仓库:

  • upstream:课程发布实验代码的公开仓库
  • origin:学生 fork 得到的私有仓库

两个仓库各有 3 条分支(红色字体):main、lab0 和 lab1,如下图。最上边的 lab1 和 main 代表本地的分支,分别追踪远程的 origin/lab1origin/main,main 前边的星号 * 和绿色字体代表当前处于 main 分支下:

Info

以上两条命令分别是:git remote -vgit branch --all -vv,如果第二条命令的输出中缺少 upstream 的分支,你可以通过 git fetch --all 来获取。

在实验一中,我们通过 lab1 分支发布实验,与 lab0 作为区分,因此学生也是处于 lab1 分支下完成实验。为了更优雅地发布实验,从 lab2 开始,我们将使用 main 分支发布实验。在开始撰写本次实验代码之前,学生需要抓取最新的 main 分支到本地,然后将 lab1 分支合并到 main 分支,并处理可能的冲突。以下是详细的指导。

拉取最新代码

首先切换到 main 分支下:

  • git checkout main:如果 git branch 的输出存在 main;
  • git checkout -b main --track origin/main:如果 git branch 的输出不存在 main。

然后使用 git pull upstream main 获取最新内容。此时你应该可以在项目下找到 tests/2-ir-gen/**src/lightir/** 等内容。

合并 lab1 分支

检查当前关于 lab1 的实验内容:src/parser/lexical_analyzer.lsrc/parser/syntax_analyzer.ysrc/common/ast.cpp,你会发现曾经完成的代码不见了,这三个文件处于 lab1 开始前的版本。现在使用 git merge lab1,将你在 lab1 完成的内容合并到主分支(main)下。

如果你遇到了冲突

在执行 merge 时,git 会尝试自动合并经过修改的文件内容,如果一处内容同时被两方(current 和 incoming)修改,就会产生冲突,需要手动决定保留哪一方的更改(或者都保留)。

回顾 Lab0 中关于 git 冲突处理的讲解

下图就是在合并时出现了冲突的例子,表示在 src/common/ast.cpp 文件出现了冲突。

我们检查这个文件,看到一处冲突,截图如下:

在这里,我们(上游仓库)最新的代码将 ASTVisitor::visit 接口的返回值更新成了 Value *,这种接口变动要以上游为准。现在是将 lab1 合并进 main 分支,所以进行 merge 的双方,current 是上游内容,incoming 是 lab1 的内容,在这里保留 current 内容。

在完成文件的更改后,保存文件,你仍然在 merge 的阶段,你可以使用 git status 查看,并使用 git merge --continue 完成你的合并操作,如下图所示。

事实上,在处理本次合并可能的冲突时,只需要保留你在 lab1 编写的代码即可,其余基本上都保留上游仓库的最新内容。

此时进入 build 文件夹,执行 cmake ..make -j 编译最新的程序,然后进入 lab1 的测试目录 tests/1-parser,执行 lab1 的两个脚本。在正确合并分支的情况下,你应该能够正常编译项目并通过 lab1 的两个脚本,这时你可以开始本次实验的撰写了。

ZLIB 相关报错

如果你在 cmake .. 一步遇到如下报错Target "IR_lib" links to target "ZLIB::ZLIB" but the target was not found.,请使用 sudo apt install zlib1g-dev 安装 zlib 库,然后重新 cmake .. && make

实验内容

本次实验需要分阶段完成及验收。

阶段一

阶段一需要 回答 Light IR 预热访问者模式文档中的思考题,回答内容保存为 answer.pdf。并完成 tests/2-ir-gen/warmup/stu_lltests/2-ir-gen/warmup/stu_cpp 目录下代码的编写。

Deadline

2024 年 10 月 18 日 23:59

阶段二

阅读 IR 自动化生成Cminusf 语义,补充 include/cminusfc/cminusf_builder.hppsrc/cminusfc/cminusf_builder.cpp 文件,并通过 tests/2-ir-gen/autogen/testcases/目录下 lv0_1, lv0_2, lv1 级别的测试样例。

Deadline

2024 年 10 月 27 日 23:59

阶段三

在阶段二的基础上,继续补充 include/cminusfc/cminusf_builder.hppsrc/cminusfc/cminusf_builder.cpp 文件,并通过 tests/2-ir-gen/autogen/testcases/ 目录下所有提供的测试样例。

Deadline

2024 年 11 月 2 日 23:59

提交内容

  • 阶段一:在希冀平台提交你的 answer.pdf 文件,在希冀平台提交你实验仓库的 url(如 https://cscourse.ustc.edu.cn/vdir/Gitlab/xxx/2024ustc-jianmu-compiler.git)。
  • 阶段二、三:在希冀平台提交你实验仓库的 url(如 https://cscourse.ustc.edu.cn/vdir/Gitlab/xxx/2024ustc-jianmu-compiler.git)。