diff --git a/test_parse.sh b/test_parse.sh new file mode 100644 index 0000000..750d9bf --- /dev/null +++ b/test_parse.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# ================================================ +# SysY 编译器 Lab1 批量解析测试脚本 +# 文件名:scripts/test_parse.sh +# 适用环境:Arch Linux(bash 原生支持,无需额外安装) +# 功能: +# - 遍历 test/test_case 下所有 .sy 文件(functional + performance) +# - 执行 --emit-parse-tree 检查是否能成功解析 +# - 输出简洁的 PASS/FAIL 结果 + 统计 +# - 错误文件会自动打印最后 10 行报错信息(方便调试) +# - 所有结果保存到 test/test_result/parse_test.log +# ================================================ + +set -u # 遇到未定义变量直接报错 + +# ================== 配置 ================== +COMPILER="./build/bin/compiler" +TEST_DIR="test/test_case" +LOG_FILE="test/test_result/parse_test.log" +MAX_ERROR_LINES=10 + +# 检查编译器是否存在 +if [[ ! -x "$COMPILER" ]]; then + echo "❌ 错误:找不到编译器 $COMPILER" + echo " 请先执行 Lab1 构建命令:" + echo " cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON" + echo " cmake --build build -j \"\$(nproc)\"" + exit 1 +fi + +# 创建日志目录(如果不存在) +mkdir -p "$(dirname "$LOG_FILE")" +> "$LOG_FILE" # 清空日志 + +echo "开始 Lab1 批量语法树测试..." | tee -a "$LOG_FILE" +echo "测试目录:$TEST_DIR" | tee -a "$LOG_FILE" +echo "编译器:$COMPILER" | tee -a "$LOG_FILE" +echo "========================================" | tee -a "$LOG_FILE" + +pass=0 +fail=0 +total=0 + +# 遍历所有 .sy 文件(支持子目录) +while IFS= read -r -d '' sy_file; do + ((total++)) + echo -n "[$total] 测试: $sy_file ... " | tee -a "$LOG_FILE" + + # 执行解析(把输出丢到 /dev/null,防止刷屏) + if "$COMPILER" --emit-parse-tree "$sy_file" > /dev/null 2>&1; then + echo "✅PASS" | tee -a "$LOG_FILE" + ((pass++)) + else + echo "FAIL" | tee -a "$LOG_FILE" + ((fail++)) + + # 打印错误信息到日志(最后几行) + echo " └── 错误详情(最后 $MAX_ERROR_LINES 行):" >> "$LOG_FILE" + "$COMPILER" --emit-parse-tree "$sy_file" 2>&1 | tail -n "$MAX_ERROR_LINES" >> "$LOG_FILE" + echo "" >> "$LOG_FILE" + fi +done < <(find "$TEST_DIR" -name "*.sy" -print0 | sort -z) + +# ================== 总结 ================== +echo "========================================" | tee -a "$LOG_FILE" +echo "测试完成!" | tee -a "$LOG_FILE" +echo "总文件数 : $total" | tee -a "$LOG_FILE" +echo "通过 : $pass" | tee -a "$LOG_FILE" +echo "失败 : $fail" | tee -a "$LOG_FILE" + +if [[ $fail -eq 0 ]]; then + echo "恭喜!Lab1 语法树构建全部通过!可以进入 Lab2 啦~" | tee -a "$LOG_FILE" +else + echo "有 $fail 个文件解析失败,请检查 SysY.g4 或报错日志" | tee -a "$LOG_FILE" + echo " 日志文件:$LOG_FILE" | tee -a "$LOG_FILE" +fi + +echo "========================================" | tee -a "$LOG_FILE"