From a44a409d16aa01c3a251c8311d57038161345792 Mon Sep 17 00:00:00 2001 From: jing <3030349106@qq.com> Date: Wed, 11 Mar 2026 01:15:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(irgen):=20=E8=A7=84=E8=8C=83irgen=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/antlr4/SysY.g4 | 4 ++ src/ir/IRPrinter.cpp | 82 ++++++++++++++++++++--------------------- src/ir/Value.cpp | 4 +- src/irgen/IRGen.h | 1 + src/irgen/IRGenDecl.cpp | 1 + src/irgen/IRGenExp.cpp | 1 + src/irgen/IRGenFunc.cpp | 2 + 7 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index c29754d..75fa2bb 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -78,3 +78,7 @@ WS COMMENT : '//' ~[\r\n]* -> skip ; + +BLOCK_COMMENT + : '/*' .*? '*/' -> skip + ; diff --git a/src/ir/IRPrinter.cpp b/src/ir/IRPrinter.cpp index 4e7642d..1d6b7eb 100644 --- a/src/ir/IRPrinter.cpp +++ b/src/ir/IRPrinter.cpp @@ -53,47 +53,47 @@ void IRPrinter::Print(const Module& module) { for (const auto& func : module.functions()) { std::cout << "define " << TypeToString(*func->type()) << " @" << func->name() << "() {\n"; - const auto* bb = func->entry(); - if (!bb) { - std::cout << "}\n"; - continue; - } - std::cout << "entry:\n"; - for (const auto& instPtr : bb->instructions()) { - const auto* inst = instPtr.get(); - switch (inst->opcode()) { - case Opcode::Add: - case Opcode::Sub: - case Opcode::Mul: { - auto* bin = static_cast(inst); - std::cout << " " << bin->name() << " = " << OpcodeToString(bin->opcode()) - << " " << TypeToString(*bin->lhs()->type()) << " " - << ValueToString(bin->lhs()) << ", " - << ValueToString(bin->rhs()) << "\n"; - break; - } - case Opcode::Alloca: { - auto* alloca = static_cast(inst); - std::cout << " " << alloca->name() << " = alloca i32\n"; - break; - } - case Opcode::Load: { - auto* load = static_cast(inst); - std::cout << " " << load->name() << " = load i32, i32* " - << ValueToString(load->ptr()) << "\n"; - break; - } - case Opcode::Store: { - auto* store = static_cast(inst); - std::cout << " store i32 " << ValueToString(store->value()) << ", i32* " - << ValueToString(store->ptr()) << "\n"; - break; - } - case Opcode::Ret: { - auto* ret = static_cast(inst); - std::cout << " ret " << TypeToString(*ret->value()->type()) << " " - << ValueToString(ret->value()) << "\n"; - break; + for (const auto& bb : func->blocks()) { + if (!bb) { + continue; + } + std::cout << bb->name() << ":\n"; + for (const auto& instPtr : bb->instructions()) { + const auto* inst = instPtr.get(); + switch (inst->opcode()) { + case Opcode::Add: + case Opcode::Sub: + case Opcode::Mul: { + auto* bin = static_cast(inst); + std::cout << " " << bin->name() << " = " << OpcodeToString(bin->opcode()) + << " " << TypeToString(*bin->lhs()->type()) << " " + << ValueToString(bin->lhs()) << ", " + << ValueToString(bin->rhs()) << "\n"; + break; + } + case Opcode::Alloca: { + auto* alloca = static_cast(inst); + std::cout << " " << alloca->name() << " = alloca i32\n"; + break; + } + case Opcode::Load: { + auto* load = static_cast(inst); + std::cout << " " << load->name() << " = load i32, i32* " + << ValueToString(load->ptr()) << "\n"; + break; + } + case Opcode::Store: { + auto* store = static_cast(inst); + std::cout << " store i32 " << ValueToString(store->value()) << ", i32* " + << ValueToString(store->ptr()) << "\n"; + break; + } + case Opcode::Ret: { + auto* ret = static_cast(inst); + std::cout << " ret " << TypeToString(*ret->value()->type()) << " " + << ValueToString(ret->value()) << "\n"; + break; + } } } } diff --git a/src/ir/Value.cpp b/src/ir/Value.cpp index a4510b8..e544895 100644 --- a/src/ir/Value.cpp +++ b/src/ir/Value.cpp @@ -5,8 +5,6 @@ namespace ir { -ConstantInt::ConstantInt(int v) : Value(Type::Int32(), ""), value_(v) { - set_name(std::to_string(v)); -} +ConstantInt::ConstantInt(int v) : Value(Type::Int32(), ""), value_(v) {} } // namespace ir diff --git a/src/irgen/IRGen.h b/src/irgen/IRGen.h index 62ed290..d3c9d28 100644 --- a/src/irgen/IRGen.h +++ b/src/irgen/IRGen.h @@ -45,6 +45,7 @@ class IRGenImpl { ir::Module& module_; ir::Function* func_; ir::IRBuilder builder_; + // 当前只维护函数级局部变量表;若后续引入嵌套块作用域,需要改成作用域栈。 std::unordered_map locals_; }; diff --git a/src/irgen/IRGenDecl.cpp b/src/irgen/IRGenDecl.cpp index 7995743..948c72f 100644 --- a/src/irgen/IRGenDecl.cpp +++ b/src/irgen/IRGenDecl.cpp @@ -9,6 +9,7 @@ void IRGenImpl::GenBlock(SysYParser::BlockContext& block) { for (auto* item : block.blockItem()) { if (item) { if (GenBlockItem(*item)) { + // 当前语法要求 return 为块内最后一条语句;命中后可停止生成。 break; } } diff --git a/src/irgen/IRGenExp.cpp b/src/irgen/IRGenExp.cpp index 3b7c7d4..e62ca91 100644 --- a/src/irgen/IRGenExp.cpp +++ b/src/irgen/IRGenExp.cpp @@ -13,6 +13,7 @@ ir::Value* IRGenImpl::GenExpr(SysYParser::ExpContext& expr) { } ir::Value* IRGenImpl::GenAddExpr(SysYParser::AddExpContext& add) { + // 当前表达式层次仍是最小实现,直接贴合 addExp -> primary 的语法形状。 const auto& terms = add.primary(); if (terms.empty()) { throw std::runtime_error("[irgen] 空加法表达式"); diff --git a/src/irgen/IRGenFunc.cpp b/src/irgen/IRGenFunc.cpp index 4ad30b5..4c0500a 100644 --- a/src/irgen/IRGenFunc.cpp +++ b/src/irgen/IRGenFunc.cpp @@ -8,6 +8,7 @@ namespace { void VerifyFunctionStructure(const ir::Function& func) { + // 当前 IRGen 仍是单入口、顺序生成;这里在生成结束后补一层块终结校验。 for (const auto& bb : func.blocks()) { if (!bb || !bb->HasTerminator()) { throw std::runtime_error("[irgen] 基本块未正确终结: " + @@ -41,5 +42,6 @@ void IRGenImpl::GenFuncDef(SysYParser::FuncDefContext& func) { locals_.clear(); GenBlock(*func.block()); + // 语义正确性主要由 sema 保证,这里只兜底检查 IR 结构是否合法。 VerifyFunctionStructure(*func_); }