Lab1测试脚本修改(添加语法树生成)

tangttangtang 2 weeks ago
parent f83b83c664
commit 96dda8642a

@ -1,7 +1,11 @@
#!/usr/bin/env bash
# Lab1 自动化构建 + 解析测评脚本
# 用法bash scripts/lab1_build_test.sh [测试目录]
# 默认测试目录test/test_case/functional test/test_case/performance
# Lab1 自动化构建 + 解析测评脚本(使用 COMPILER_PARSE_ONLY 构建)
# 用法:
# bash scripts/lab1_build_test.sh [--save-tree] [测试目录...]
#
# 选项:
# --save-tree 保存每个测试用例的语法树到 build/trees/ 目录
# 默认只进行通过/失败统计,不保存语法树
#
# 退出码:
# 0 全部用例解析通过
@ -20,7 +24,33 @@ GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ─── Step 1生成 Lexer/Parser ────────────────────────────────────────────────
# 默认不保存语法树
SAVE_TREE=false
# 解析命令行参数
TEST_DIRS=()
while [[ $# -gt 0 ]]; do
case "$1" in
--save-tree)
SAVE_TREE=true
shift
;;
*)
TEST_DIRS+=("$1")
shift
;;
esac
done
# 如果没有指定测试目录,使用默认
if [[ ${#TEST_DIRS[@]} -eq 0 ]]; then
TEST_DIRS=(
"$REPO_ROOT/test/test_case/functional"
"$REPO_ROOT/test/test_case/performance"
)
fi
# ─── Step 1生成 ANTLR Lexer/Parser ────────────────────────────────────────────────
echo "==> [1/3] 生成 ANTLR Lexer/Parser ..."
mkdir -p "$REPO_ROOT/build/generated/antlr4"
java -jar "$ANTLR_JAR" \
@ -31,27 +61,24 @@ java -jar "$ANTLR_JAR" \
"$REPO_ROOT/src/antlr4/SysY.g4"
echo " Lexer/Parser 生成完毕"
# ─── Step 2CMake 构建(禁用后端)────────────────────────────────────────────
echo "==> [2/3] CMake 构建(UNABLE_BACKEND=ON..."
# ─── Step 2CMake 构建(使用 COMPILER_PARSE_ONLY────────────────────────────────
echo "==> [2/3] CMake 构建(COMPILER_PARSE_ONLY=ON..."
cmake -S "$REPO_ROOT" -B "$REPO_ROOT/build" \
-DCMAKE_BUILD_TYPE=Release \
-DUNABLE_BACKEND=ON \
-DCMAKE_EXPORT_COMPILE_COMMANDS=OFF \
-DCOMPILER_PARSE_ONLY=ON \
> /dev/null
cmake --build "$REPO_ROOT/build" -j "$(nproc)" 2>&1 | grep -E "error:|warning:|Built target|Linking" || true
echo " 构建完毕:$COMPILER"
# ─── Step 3批量解析测试 ─────────────────────────────────────────────────────
echo "==> [3/3] 批量解析测试 ..."
# 收集测试目录
if [[ $# -ge 1 ]]; then
TEST_DIRS=("$@")
else
TEST_DIRS=(
"$REPO_ROOT/test/test_case/functional"
"$REPO_ROOT/test/test_case/performance"
)
# 如果需要保存语法树,创建输出目录
if $SAVE_TREE; then
TREE_OUTPUT_DIR="$REPO_ROOT/build/trees"
mkdir -p "$TREE_OUTPUT_DIR"
echo " 语法树将保存到: $TREE_OUTPUT_DIR"
fi
PASS=0
@ -66,13 +93,30 @@ for TEST_DIR in "${TEST_DIRS[@]}"; do
while IFS= read -r -d '' sy_file; do
rel="$(realpath --relative-to="$REPO_ROOT" "$sy_file")"
if "$COMPILER" --emit-parse-tree "$sy_file" > /dev/null 2>&1; then
echo -e " ${GREEN}PASS${NC} $rel"
((PASS++)) || true
if $SAVE_TREE; then
# 将路径中的 '/' 替换为 '_',避免子目录冲突
safe_name="${rel//\//_}"
tree_file="$TREE_OUTPUT_DIR/${safe_name}.tree"
# 运行编译器并保存输出
if "$COMPILER" --emit-parse-tree "$sy_file" > "$tree_file" 2>&1; then
echo -e " ${GREEN}PASS${NC} $rel (tree saved to $tree_file)"
((PASS++)) || true
else
echo -e " ${RED}FAIL${NC} $rel"
FAIL_LIST+=("$rel")
((FAIL++)) || true
fi
else
echo -e " ${RED}FAIL${NC} $rel"
FAIL_LIST+=("$rel")
((FAIL++)) || true
# 只检查返回码,不输出语法树
if "$COMPILER" --emit-parse-tree "$sy_file" > /dev/null 2>&1; then
echo -e " ${GREEN}PASS${NC} $rel"
((PASS++)) || true
else
echo -e " ${RED}FAIL${NC} $rel"
FAIL_LIST+=("$rel")
((FAIL++)) || true
fi
fi
done < <(find "$TEST_DIR" -name "*.sy" -print0 | sort -z)
done
@ -90,4 +134,4 @@ if [[ ${#FAIL_LIST[@]} -gt 0 ]]; then
fi
echo "──────────────────────────────────────────"
[[ $FAIL -eq 0 ]]
[[ $FAIL -eq 0 ]]
Loading…
Cancel
Save