|
|
|
|
@ -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 ]]
|