Skip to content

如何添加新的测例

吴坎 edited this page Nov 27, 2024 · 6 revisions

如何添加新的测例

本页面记录添加新测例的过程,方便持续维护。

地址

测例的结构

  • 每个测例包含*.sy*.sysu.c源文件。
  • 如果测例包含输入,则还包含*.in.gz文件。
  • 注意测例不包含*.out文件,评测时会使用 clang 编译的结果对拍,大量的 *.out 文件会大大增加学生 git clone 的时间。
  • function_test2020/60_while_fibonacci测例包含了
    • 60_while_fibonacci.sy
    • 60_while_fibonacci.sysu.c
    • 60_while_fibonacci.in.gz

测例的生成

  • 测例的主要来源是全国大学生计算机系统能力大赛-编译系统设计赛的官方测例。
  • 部分 *.sysu.c 文件需要 #include <sysy/sylib.h>,不然不能被 clang 编译,可以通过 sysu-compiler --convert-sysy处理。
  • *.in 文本文件需要用python3 -m gzip --best压缩成 *.in.gz (压缩时使用最高质量的 --best 压缩)。
  • 特别地,需要检查每个新增算例的语法树需要占用多少内存。clang 直接输出的语法树有太多空格,直接运行可能会占用大于 8GB 的内存空间,此时需要提前导出对应的 json,去除其中多余的空格,并压缩成 .json.gz 格式的文件,可参照这个,总之需要特别关注长代码。

踩过的坑

  • 注意文件压缩要使用python3 -m gzip --best,而不是zip

参考脚本

#!/usr/bin/sh
for file in `ls . | grep '\.sy$'` # .in .out
    do
        echo $file
        # python3 -m gzip --best ${file} # 压缩*.in
        # rm $file # 删除*.out *.in
        sysu-compiler --convert-sysy $file ${file}su.c # 生成*.sysu.c
    done

Clone this wiki locally