From 8297700496bcd894f8454637e909ba98cb867e63 Mon Sep 17 00:00:00 2001 From: lc <18783417278@163.com> Date: Mon, 30 Mar 2026 20:36:21 +0800 Subject: [PATCH] =?UTF-8?q?IRGen=E9=83=A8=E5=88=86=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=9A=E6=94=AF=E6=8C=81=E8=B5=8B=E5=80=BC=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/irgen/IRGenStmt.cpp | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/irgen/IRGenStmt.cpp b/src/irgen/IRGenStmt.cpp index 8f7a2a5..de6a857 100644 --- a/src/irgen/IRGenStmt.cpp +++ b/src/irgen/IRGenStmt.cpp @@ -9,9 +9,9 @@ // 语句生成当前只实现了最小子集。 // 目前支持: // - return ; +// - 赋值语句:lVal = exp; // // 还未支持: -// - 赋值语句 // - if / while 等控制流 // - 空语句、块语句嵌套分发之外的更多语句形态 @@ -19,6 +19,42 @@ std::any IRGenImpl::visitStmt(SysYParser::StmtContext* ctx) { if (!ctx) { throw std::runtime_error(FormatError("irgen", "缺少语句")); } + + // 检查是否是赋值语句:lVal ASSIGN exp SEMICOLON + if (ctx->lVal() && ctx->ASSIGN()) { + if (!ctx->exp()) { + throw std::runtime_error(FormatError("irgen", "赋值语句缺少表达式")); + } + + // 1. 计算右值表达式的值 + ir::Value* rhs = EvalExpr(*ctx->exp()); + + // 2. 找到左值变量对应的存储槽位 + auto* lval_ctx = ctx->lVal(); + if (!lval_ctx || !lval_ctx->ID()) { + throw std::runtime_error(FormatError("irgen", "当前仅支持普通整型变量赋值")); + } + + const auto* decl = sema_.ResolveObjectUse(lval_ctx); + if (!decl) { + throw std::runtime_error( + FormatError("irgen", + "变量使用缺少语义绑定:" + lval_ctx->ID()->getText())); + } + + std::string var_name = lval_ctx->ID()->getText(); + auto it = storage_map_.find(var_name); + if (it == storage_map_.end()) { + throw std::runtime_error( + FormatError("irgen", + "变量声明缺少存储槽位:" + var_name)); + } + + // 3. 生成 store 指令 + builder_.CreateStore(rhs, it->second); + return BlockFlow::Continue; + } + // 检查是否是 return 语句:RETURN exp? SEMICOLON if (ctx->RETURN()) { if (!ctx->exp()) { @@ -28,5 +64,6 @@ std::any IRGenImpl::visitStmt(SysYParser::StmtContext* ctx) { builder_.CreateRet(v); return BlockFlow::Terminated; } + throw std::runtime_error(FormatError("irgen", "暂不支持的语句类型")); }