-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreadme
More file actions
53 lines (42 loc) · 2.22 KB
/
readme
File metadata and controls
53 lines (42 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
输入输出样例
输入样例
注:大作业采用文件读入,输入文件为 SysY 语言源代码,文件名以.sy结尾。
input.sy
int main() {
int a = 1;
return a;
}
输出样例
注:大作业中,你需要将生成的 IR 输出到一个文件中,例如在./compiler input.sy output.ll命令中,你需要输出到一个名为output.ll的文件中。
output.ll
; ModuleID = 'moudle'
source_filename = "moudle"
define i32 @main() {
mainEntry:
%a = alloca i32, align 4
store i32 1, i32* %a, align 4
%a1 = load i32, i32* %a, align 4
ret i32 %a1
}
注意:我们不要求你输出的 IR 与样例中的完全一致,只要能正确执行并返回正确的结果即可。我们会捕获运行你生成的 IR 时的标准输出以及main函数的返回值,并与标准答案进行比对。具体评测方法可以看框架代码中的run-test.py脚本。
运行与测试
大作业采用 CMake 构建项目,在项目根目录中执行下面的命令构建compiler:
mkdir build
cd build
cmake ..
make -j8
此时,可以看到build/目录下生成了可执行文件compiler。
接下来,你可以用你自己实现的compiler来编译SysY代码:
# 在 build 目录下
./compiler ../test/resources/functional/00_main.sy 00_main.ll
生成的00_main.ll就是你编译出来的 LLVM IR 文件。你可以使用clang将其进一步编译成二进制文件。
clang 00_main.ll -w -o 00_main
./00_main
# 查看程序返回值
echo $?
当你的 SysY 需要链接 sylib 库时,可以使用下面的命令:
clang 00_main.ll ../test/resources/sylib.c -w -o 00_main
好消息是,在大作业中,你可以在test/目录下找到所有的测试用例。但为了避免同学们采用识别文件名/识别输入特征的方式来生成 LLVM IR,我们在 OJ 上设置了一个特殊的隐藏用例,这个用例极其简单(只包含 main 函数和一个返回语句),只有通过这个测试用例才能获得分数。
我们也为你准备了本地的评分脚本run-test.py,本地脚本评测速度远远快于 GradeScope 在线评测,希望大家在提交作业前先进行本地测试。实验保证所有的测试用例均没有语法错误。
# 当前在项目根目录中
python run-test.py # 或直接 make test