(💡 点击展开)
四个实验参考这位前辈 PLUS-WAVE 做的,先模了%%%
不过 实验四 的话我目前是没在 公共仓库 找到能完整通过的代码,所以自己写了一下,icoding 是能通过的
以 本仓库 来分享 大二 的 编译原理实验 相关代码
本仓库是 public 的,你可以直接根据下面的 每个实验分支 的描述来提交代码,但最好还是先自己做一做,然后发现什么 corner case 实在过不了的情况下再来参考代码
我就是这样的qwq,因为 icoding 的题目太模糊了,基本都不说清楚,不去看前人代码基本都找不到是哪个样例出了问题
具体的代码解析和原理的话,由于我不想篇幅太长就不说了,想了解原理的话可以适当使用 大模型()
四个代码我都写有 Makefile,想在本地运行的话推荐在 Linux 环境下使用 make 命令(当然 Windows 下也是可以用 Makefile 的,不过要配置一下,具体怎么配置可以自行搜索。不过这样的话可能像 flex,bison 这些工具会找不到而报错,所以我还是推荐在 Linux 下进行)
即可以在对应目录(比如 实验1 就是 lab1 目录)下:
- 编译:
make - 运行:
./xxx
具体的实验会有所不同,下面的 每个实验分支 中会具体说 每个实验 怎么运行和测试
包含 要提交的文件 及 如何进行本地测试
注:如果 icoding 出现类似于
undefined%,说明有可能是 icoding 的问题,目前我只能想到等一段时间再交,才有可能解决问题
📚 lab1
-
提交的文件
lex_main.clex.ltoken.h- 你的文档
-
本地测试:
-
编译:
make生成的
lexer就是 可执行文件 -
运行测试:
-
测试样例是题目的:
-
int main(){ return 3; }
-
-
命令
echo 'int main(){ return 3;}' | ./lexer
-
-
📚 lab2
-
提交的文件
-
rd.c:这个直接复制里面的代码到 代码框,当然我这里除了复制到 代码框,也在提交文件那里交了 -
rdlab2.h -
你的文档
-
-
本地测试:
-
编译:
make生成的
parser就是 可执行文件 -
运行测试:
-
测试样例:
-
{ a = 5; } -
这里的话目前写的
rd.c中不支持int之类的,所以例子其实就是这么简单
-
-
命令
./parser < test.c
-
-
📚 lab3
-
提交的文件
-
ast.c -
ast.h -
lrlex.l -
lrparser.y -
你的文档
-
-
本地测试:
-
编译:
make生成的
ast就是 可执行文件 -
运行测试:
-
测试样例是题目的:
-
int main(){ return 3; }
-
-
命令
./ast < test.c
-
-
📚 lab4
-
提交的文件
-
ast.c -
ast.h -
lrlex.l -
lrparser.y -
genllvm.c -
genllvm.h -
main.c -
你的文档
-
-
本地测试:
-
编译:
make生成的
calc就是 可执行文件 -
运行测试:
- 自动测试
- 实验四 中其实老师有给 测试样例 的(放在
lab4-test_example和lab4-example),所以我写了一个check.py脚本 来测试样例,如果后续要改样例的话可以改lab4-example中answer.ll和test.c的内容,这两个文件是所有样例的整合 - 运行
python check.py
- 实验四 中其实老师有给 测试样例 的(放在
- 手动测试
- 也可以利用
calc来测试:-
./calc < test.c -
其中
test.c就是要测试的代码,可以自己写或用lab4-example和lab4-test_example里的样例来测试,如./calc < lab4-example/00.c
-
- 也可以利用
- 自动测试
-