diff --git a/src/RISCv64Backend.cpp b/src/RISCv64Backend.cpp index 5d02946..0935f68 100644 --- a/src/RISCv64Backend.cpp +++ b/src/RISCv64Backend.cpp @@ -6,7 +6,7 @@ #include #include // For std::function -#define DEBUG 0 +#define DEBUG 1 #define DEEPDEBUG 0 namespace sysy { diff --git a/test_script/runit.sh b/test_script/runit.sh index 1627882..b8dc458 100644 --- a/test_script/runit.sh +++ b/test_script/runit.sh @@ -1,14 +1,15 @@ #!/bin/bash # runit.sh - 用于编译和测试 SysY 程序的脚本 -# 此脚本位于 mysysy/test_script/ +# 此脚本应该位于 mysysy/test_script/ # 定义相对于脚本位置的目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" TESTDATA_DIR="${SCRIPT_DIR}/../testdata" BUILD_BIN_DIR="${SCRIPT_DIR}/../build/bin" LIB_DIR="${SCRIPT_DIR}/../lib" -TMP_DIR="/home/ladev987/paraComp/debug/share_folder" +# TMP_DIR="${SCRIPT_DIR}/tmp" +TMP_DIR="/home/ladev987/paraComp/debug/share_folder/tmp" # 定义编译器和模拟器 SYSYC="${BUILD_BIN_DIR}/sysyc" @@ -27,6 +28,7 @@ show_help() { echo " -e, --executable 编译为可执行文件,运行可执行文件,并比较输出(如果存在 .in/.out 文件)。" echo " 如果 .out 文件的最后一行是整数,则将其视为期望的返回值进行比较,其余内容视为期望的标准输出。" echo " 如果 .out 文件的最后一行不是整数,则将整个 .out 文件视为期望的标准输出进行比较。" + echo " 输出比较时会忽略行尾多余的换行符。" echo " 如果不存在 .in/.out 文件,则打印返回码。" echo " -c, --clean 清理 'tmp' 目录下的所有生成文件。" echo " -h, --help 显示此帮助信息并退出。" @@ -120,7 +122,7 @@ find "${TESTDATA_DIR}" -name "*.sy" | while read sy_file; do echo " 生成的可执行文件: ${executable_file}" # 步骤 3, 4, 5: 执行编译后的文件并比较/报告结果 - echo " 正在执行: ${QEMU_RISCV64} \"${executable_file}\"" + echo " 正在执行: ${QEMU_RISCV664} \"${executable_file}\"" # 检查是否存在 .out 文件 if [ -f "${output_reference_file}" ]; then @@ -162,17 +164,14 @@ find "${TESTDATA_DIR}" -name "*.sy" | while read sy_file; do echo -e "\e[31m 返回码测试失败: ${sy_file} 的返回码不匹配。期望: ${EXPECTED_RETURN_CODE}, 实际: ${ACTUAL_RETURN_CODE}\e[0m" fi - # 比较实际标准输出与期望标准输出 - # 注意:实际输出文件可能包含一个额外的换行符,如果程序没有putch(10) - # 确保比较时,如果期望输出为空,且实际输出也为空或仅包含空白字符,则视为匹配 - # 这里我们假设 output_actual_file 已经包含程序的所有标准输出 - diff -q "${output_actual_file}" "${EXPECTED_STDOUT_FILE}" >/dev/null 2>&1 - if [ $? -eq 0 ]; then - echo -e "\e[32m 标准输出测试成功: 输出与 ${sy_file} 的参考输出匹配\e[0m" + # 比较实际标准输出与期望标准输出,忽略文件末尾的换行符差异 + # 使用 sed 命令去除文件末尾的所有换行符,再通过 diff 进行比较 + if diff -q <(sed ':a;N;$!ba;s/\n*$//' "${output_actual_file}") <(sed ':a;N;$!ba;s/\n*$//' "${EXPECTED_STDOUT_FILE}") >/dev/null 2>&1; then + echo -e "\e[32m 标准输出测试成功: 输出与 ${sy_file} 的参考输出匹配 (忽略行尾换行符差异)\e[0m" else echo -e "\e[31m 标准输出测试失败: ${sy_file} 的输出不匹配\e[0m" - echo " 差异:" - diff "${output_actual_file}" "${EXPECTED_STDOUT_FILE}" + echo " 差异 (可能包含行尾换行符差异):" + diff "${output_actual_file}" "${EXPECTED_STDOUT_FILE}" # 显示原始差异以便调试 fi else @@ -192,14 +191,13 @@ find "${TESTDATA_DIR}" -name "*.sy" | while read sy_file; do echo -e "\e[33m警告: 可执行文件 ${sy_file} 以非零状态 ${EXEC_STATUS} 退出 (纯输出比较模式)。请检查程序逻辑或其是否应返回此状态。\e[0m" fi - # 比较实际输出与参考输出 - diff -q "${output_actual_file}" "${output_reference_file}" >/dev/null 2>&1 - if [ $? -eq 0 ]; then - echo -e "\e[32m 成功: 输出与 ${sy_file} 的参考输出匹配\e[0m" + # 比较实际输出与参考输出,忽略文件末尾的换行符差异 + if diff -q <(sed ':a;N;$!ba;s/\n*$//' "${output_actual_file}") <(sed ':a;N;$!ba;s/\n*$//' "${output_reference_file}") >/dev/null 2>&1; then + echo -e "\e[32m 成功: 输出与 ${sy_file} 的参考输出匹配 (忽略行尾换行符差异)\e[0m" else echo -e "\e[31m 失败: ${sy_file} 的输出不匹配\e[0m" - echo " 差异:" - diff "${output_actual_file}" "${output_reference_file}" + echo " 差异 (可能包含行尾换行符差异):" + diff "${output_actual_file}" "${output_reference_file}" # 显示原始差异以便调试 fi fi elif [ -f "${input_file}" ]; then