From 96dda8642a63cfcfceacdfb32bbedb7f1cde9242 Mon Sep 17 00:00:00 2001 From: tangttangtang <206374282@qq.com> Date: Mon, 23 Mar 2026 18:55:06 +0800 Subject: [PATCH] =?UTF-8?q?Lab1=E6=B5=8B=E8=AF=95=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=88=E6=B7=BB=E5=8A=A0=E8=AF=AD=E6=B3=95?= =?UTF-8?q?=E6=A0=91=E7=94=9F=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/lab1_build_test.sh | 90 ++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 23 deletions(-) diff --git a/scripts/lab1_build_test.sh b/scripts/lab1_build_test.sh index a18944e..70ef27c 100644 --- a/scripts/lab1_build_test.sh +++ b/scripts/lab1_build_test.sh @@ -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 2:CMake 构建(禁用后端)──────────────────────────────────────────── -echo "==> [2/3] CMake 构建(UNABLE_BACKEND=ON)..." +# ─── Step 2:CMake 构建(使用 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 ]] \ No newline at end of file