From 8e78addf65f2efd8a95642349f69f96aa18476c2 Mon Sep 17 00:00:00 2001 From: helingyu <2844963569@qq.com> Date: Mon, 30 Mar 2026 21:58:05 +0800 Subject: [PATCH] yulab1 --- src/antlr4/SysY.g4 | 28 ++++++++++++++++++++--- test_all_lab1.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) create mode 100755 test_all_lab1.sh diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index cc41169..34f7b45 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -15,6 +15,7 @@ IF: 'if'; ELSE: 'else'; WHILE: 'while'; BREAK: 'break'; +CONTINUE: 'continue'; ASSIGN: '='; ADD: '+'; @@ -44,8 +45,19 @@ SEMICOLON: ';'; COMMA: ','; ID: [a-zA-Z_][a-zA-Z_0-9]*; -ILITERAL: [0-9]+; -FLITERAL: [0-9]+('.'[0-9]+)?([eE][+-]?[0-9]+)?; + +ILITERAL + : [0-9]+ + | '0' [xX] [0-9a-fA-F]+ + ; + +FLITERAL + : [0-9]+ '.' [0-9]* ([eE] [+-]? [0-9]+)? + | [0-9]+ [eE] [+-]? [0-9]+ + | '.' [0-9]+ ([eE] [+-]? [0-9]+)? + | '0' [xX] [0-9a-fA-F]* '.' [0-9a-fA-F]+ [pP] [+-]? [0-9]+ + | '0' [xX] [0-9a-fA-F]+ [pP] [+-]? [0-9]+ + ; WS: [ \t\r\n] -> skip; LINECOMMENT: '//' ~[\r\n]* -> skip; @@ -72,6 +84,15 @@ constDef : lValue ASSIGN initValue ; +constInitVal + : constExp + | LBRACE (constInitVal (COMMA constInitVal)*)? RBRACE + ; + +constExp + : exp + ; + varDecl : btype varDef (COMMA varDef)* SEMICOLON ; @@ -110,6 +131,7 @@ funcFParams funcFParam : btype ID (LBRACK (exp)? RBRACK)* + | btype ID LBRACK RBRACK LBRACK exp RBRACK ; blockStmt @@ -133,7 +155,7 @@ stmt ; continueStmt - : 'continue' SEMICOLON + : CONTINUE SEMICOLON ; returnStmt diff --git a/test_all_lab1.sh b/test_all_lab1.sh new file mode 100755 index 0000000..6cdcef2 --- /dev/null +++ b/test_all_lab1.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +echo "======================================" +echo "Lab1 语法树构建 - 完整批量测试" +echo "时间: $(date)" +echo "======================================" + +PASS=0 +FAIL=0 +FAILED_FILES=() +TOTAL=0 + +# 递归查找所有 .sy 文件 +while IFS= read -r file; do + ((TOTAL++)) + filename=$(basename "$file") + rel_path=${file#test/test_case/} + + echo -n "[$TOTAL] 测试 $rel_path ... " + + # 运行编译器检查解析是否成功 + if ./build/bin/compiler --emit-parse-tree "$file" > /dev/null 2>&1; then + echo "✓ 通过" + ((PASS++)) + else + echo "✗ 失败" + ((FAIL++)) + FAILED_FILES+=("$rel_path") + + # 输出错误信息到临时文件以便调试 + echo " 错误详情:" >&2 + ./build/bin/compiler --emit-parse-tree "$file" 2>&1 | head -5 | sed 's/^/ /' >&2 + fi +done < <(find test/test_case -name "*.sy" -type f | sort) + +echo "======================================" +echo "测试结果统计" +echo "======================================" +echo "总计: $TOTAL" +echo "通过: $PASS" +echo "失败: $FAIL" +echo "成功率: $(awk "BEGIN {printf \"%.2f\", ($PASS/$TOTAL)*100}")%" +echo "======================================" + +if [ $FAIL -gt 0 ]; then + echo "" + echo "失败的测试用例 ($FAIL 个):" + for f in "${FAILED_FILES[@]}"; do + echo " ✗ $f" + done + exit 1 +fi + +echo "" +echo "🎉 所有测试用例通过!" +exit 0