我们写代码从第一天起就和编译器打交道,而编译原理就是一门探究编译器背后奥秘的课程。编译原理这门课程不仅理论性很强,同时也需要大量的实际编码才能理解学习到的知识和实践之间的关联,因此编译实验是课程非常重要的一部分。
以往的实验内容是一脉传承——第一次词法分析,第二次 OPG,第三次语法分析,第四次最终检查,基础是做 PL0,选做 C0,以及有 GUI 等加分项。我们两位助教都对编译实验有着极高的热情,在完成实验的过程中我们自然也觉察到了大量的不合理和潜在的问题,因此第二年我们申请了助教想着手改善实验整体的体验。
之前的实验最大的问题在于 OPG 和其他的实验毫无关系而且之后写一个完整编译器门槛太高,很多学生即使是选择 PL0 因为没有参考等原因也难以完成最基本的实验,所以我们本着让绝大多数同学能愉快完成编译实验的目标出发,模仿 6 系编译实验,设计了一个名为 miniplc0 的入门级编译器来帮助学生理解一个最小编译器的实现进而能平滑过渡到自己编译器的实现。
当然,我们要承认的是,由于精力所限这个实验仍然有很多的不足,但是我们也在着手让整个实验文档化,希望参加实验的你和之后的助教能帮助我们一起来改善这个实验,让更多的学生能更加愉快的完成编译原理课程!
有关实验设计的任何问题可以联系(尤其欢迎之后的助教)
目前实验所有源代码全部托管在 GitHub 上,欢迎参与实验的同学提 issue/pr 帮助我们一起改进,勘误或者建议会有一定加分,希望大家喜欢新实验。
编译原理,真的,特别,好。——孔子乔
好时代,到来吧。——李明
实验的目标是补全 miniplc0 编译器的词法分析器和语法分析器,理论上直接阅读指导书就可以。
补全 miniplc0 编译器的词法分析器和语法分析器
结果上应该写一个完整的 miniplc0 编译系统的编译器。
docker 可以统一编译环境,我们统一使用的是上面提到的标准环境。
不需要,container 只是最终评测环境,你可以先用 IDE 写完再自行测试,也可以一开始配好远程调试环境。
提交后我们会自动化评测你的实现(填空),分数由通过样例数决定,类似没有即时结果的 OJ。
手动实现一个完整的 C0 编译器
并且能够输出在标准虚拟机或其他目标机上可运行的代码。
最后检查时运行的环境还是同一个 docker ,为了你的成绩可靠性着想,无论你使用何种方式在何种环境开发,都建议你最后在 docker 上测试一下。
课堂检查用你的虚拟机跑用例,和期望结果一致就得到该组用例的分。
如果你自己提供虚拟机,那么就以你的虚拟机运行结果为准;否则都以标准虚拟机的结果为准。
由于 Github Page Build 有一定延迟加上浏览器会默认缓存静态页面,因此引用课程任何相关的文档或者代码时候请引用 Permanent Links。
Markdown 文件可以点击 blame 后按 y 得到 Permanent Links,一个例子是这样,为什么是按 y 见这里
代码文件直接在行号上选择即可,一个例子是这样
以上对要求勘误也是一样,尤其是用邮件的方式提交勘误的时候。