本次实验需要同学们在 Lab1 实现的 Cminusf 解析器基础上,完成从语法树向中间代码的自动化翻译过程。contact me help-assignment
实验要求¶
根据 Lab1 的要求,学生有两个远程仓库:
- upstream:课程发布实验代码的公开仓库
- origin:学生 fork 得到的私有仓库
两个仓库各有 3 条分支(红色字体):main、lab0 和 lab1,如下图。最上边的 lab1 和 main 代表本地的分支,分别追踪远程的 origin/lab1
和 origin/main
,main 前边的星号 *
和绿色字体代表当前处于 main 分支下:
以上两条命令分别是:git remote -v
和 git 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.l
、src/parser/syntax_analyzer.y
和 src/common/ast.cpp
,你会发现曾经完成的代码不见了,这三个文件处于 lab1 开始前的版本。现在使用 git merge lab1
,将你在 lab1 完成的内容合并到主分支(main)下。
如果你遇到了冲突
此时进入 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 预热并参考 Light IR 手册 和 Light IR C++ 库,掌握手写 Light IR,使用 Light IR C++ 库生成 IR 的方法。
- 内容二: 阅读访问者模式,理解 C++ 访问者模式的工作原理及遍历顺序。
阶段一需要 回答 Light IR 预热与访问者模式文档中的思考题,回答内容保存为 answer.pdf
。并完成 tests/2-ir-gen/warmup/stu_ll
与 tests/2-ir-gen/warmup/stu_cpp
目录下代码的编写。
Deadline
2024 年 10 月 18 日 23:59
阶段二¶
阅读 IR 自动化生成,Cminusf 语义,补充 include/cminusfc/cminusf_builder.hpp
与 src/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.hpp
与 src/cminusfc/cminusf_builder.cpp
文件,并通过 tests/2-ir-gen/autogen/testcases/
目录下所有提供的测试样例。
contact me help-assignment before deadline
标签:解析器,代码生成,git,中间代码,lab1,实验,main,IR,分支 From: https://blog.csdn.net/m0_74315230/article/details/143212251