#include "irgen/IRGen.h" #include #include "SysYParser.h" #include "ir/IR.h" #include "utils/Log.h" // 语句生成当前只实现了最小子集。 // 目前支持: // - return ; // // 还未支持: // - 赋值语句 // - if / while 等控制流 // - 空语句、块语句嵌套分发之外的更多语句形态 std::any IRGenImpl::visitStmt(SysYParser::StmtContext* ctx) { if (!ctx) { throw std::runtime_error(FormatError("irgen", "缺少语句")); } if (ctx->returnStmt()) { return ctx->returnStmt()->accept(this); } throw std::runtime_error(FormatError("irgen", "暂不支持的语句类型")); } std::any IRGenImpl::visitReturnStmt(SysYParser::ReturnStmtContext* ctx) { if (!ctx) { throw std::runtime_error(FormatError("irgen", "缺少 return 语句")); } if (!ctx->exp()) { throw std::runtime_error(FormatError("irgen", "return 缺少表达式")); } ir::Value* v = EvalExpr(*ctx->exp()); builder_.CreateRet(v); return BlockFlow::Terminated; }