|
|
#!/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" |