diff --git a/include/sem/Sema.h b/include/sem/Sema.h index 191c45c..b684a41 100644 --- a/include/sem/Sema.h +++ b/include/sem/Sema.h @@ -2,7 +2,8 @@ #define SEMANTIC_ANALYSIS_H #include "SymbolTable.h" -#include "../../generated/antlr4/SysYBaseVisitor.h" +#include "SysYBaseVisitor.h" +#include "SysYParser.h" #include #include #include @@ -95,6 +96,26 @@ private: SymbolType current_func_ret_type_ = SymbolType::TYPE_UNKNOWN; }; +// 与现有 IRGen/主流程保持兼容的语义上下文占位。 +class SemanticContext { + public: + void BindVarUse(const SysYParser::LValueContext* use, + SysYParser::VarDefContext* decl) { + var_uses_[use] = decl; + } + + SysYParser::VarDefContext* ResolveVarUse( + const SysYParser::LValueContext* use) const { + auto it = var_uses_.find(use); + return it == var_uses_.end() ? nullptr : it->second; + } + + private: + std::unordered_map + var_uses_; +}; + // 错误信息格式化工具函数 inline std::string FormatErrMsg(const std::string& msg, int line, int col) { std::ostringstream oss; @@ -130,17 +151,30 @@ public: // 核心访问方法 std::any visitCompUnit(SysYParser::CompUnitContext* ctx) override; - std::any visitFuncDef(SysYParser::FuncDefContext* ctx) override; std::any visitDecl(SysYParser::DeclContext* ctx) override; std::any visitConstDecl(SysYParser::ConstDeclContext* ctx) override; + std::any visitBtype(SysYParser::BtypeContext* ctx) override; + std::any visitConstDef(SysYParser::ConstDefContext* ctx) override; + std::any visitConstInitValue(SysYParser::ConstInitValueContext* ctx) override; std::any visitVarDecl(SysYParser::VarDeclContext* ctx) override; - std::any visitBlock(SysYParser::BlockContext* ctx) override; + std::any visitVarDef(SysYParser::VarDefContext* ctx) override; + std::any visitInitValue(SysYParser::InitValueContext* ctx) override; + std::any visitFuncDef(SysYParser::FuncDefContext* ctx) override; + std::any visitFuncType(SysYParser::FuncTypeContext* ctx) override; + std::any visitFuncFParams(SysYParser::FuncFParamsContext* ctx) override; + std::any visitFuncFParam(SysYParser::FuncFParamContext* ctx) override; + std::any visitBlockStmt(SysYParser::BlockStmtContext* ctx) override; + std::any visitBlockItem(SysYParser::BlockItemContext* ctx) override; std::any visitStmt(SysYParser::StmtContext* ctx) override; - std::any visitLVal(SysYParser::LValContext* ctx) override; + std::any visitReturnStmt(SysYParser::ReturnStmtContext* ctx) override; std::any visitExp(SysYParser::ExpContext* ctx) override; std::any visitCond(SysYParser::CondContext* ctx) override; + std::any visitLValue(SysYParser::LValueContext* ctx) override; std::any visitPrimaryExp(SysYParser::PrimaryExpContext* ctx) override; + std::any visitNumber(SysYParser::NumberContext* ctx) override; std::any visitUnaryExp(SysYParser::UnaryExpContext* ctx) override; + std::any visitUnaryOp(SysYParser::UnaryOpContext* ctx) override; + std::any visitFuncRParams(SysYParser::FuncRParamsContext* ctx) override; std::any visitMulExp(SysYParser::MulExpContext* ctx) override; std::any visitAddExp(SysYParser::AddExpContext* ctx) override; std::any visitRelExp(SysYParser::RelExpContext* ctx) override; @@ -148,8 +182,6 @@ public: std::any visitLAndExp(SysYParser::LAndExpContext* ctx) override; std::any visitLOrExp(SysYParser::LOrExpContext* ctx) override; std::any visitConstExp(SysYParser::ConstExpContext* ctx) override; - std::any visitNumber(SysYParser::NumberContext* ctx) override; - std::any visitFuncRParams(SysYParser::FuncRParamsContext* ctx) override; // 通用子节点访问 std::any visitChildren(antlr4::tree::ParseTree* node) override { @@ -175,4 +207,7 @@ private: // 语义分析入口函数 void RunSemanticAnalysis(SysYParser::CompUnitContext* ctx, IRGenContext& ir_ctx); +// 兼容旧流程入口。 +SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit); + #endif // SEMANTIC_ANALYSIS_H \ No newline at end of file diff --git a/src/sem/Sema.cpp b/src/sem/Sema.cpp index 7403a13..ed13673 100644 --- a/src/sem/Sema.cpp +++ b/src/sem/Sema.cpp @@ -1,440 +1,224 @@ -#include "../../include/sem/Sema.h" -#include "../../generated/antlr4/SysYParser.h" +#include "sem/Sema.h" + #include -#include -#include -using namespace antlr4; +namespace { + +SymbolType ParseType(const std::string& text) { + if (text == "int") { + return SymbolType::TYPE_INT; + } + if (text == "float") { + return SymbolType::TYPE_FLOAT; + } + if (text == "void") { + return SymbolType::TYPE_VOID; + } + return SymbolType::TYPE_UNKNOWN; +} -// ===================== 核心访问器实现 ===================== +} // namespace -// 1. 编译单元节点访问 std::any SemaVisitor::visitCompUnit(SysYParser::CompUnitContext* ctx) { - // 分析编译单元中的所有子节点 - return visitChildren(ctx); + return visitChildren(ctx); } -// 2. 函数定义节点访问 -std::any SemaVisitor::visitFuncDef(SysYParser::FuncDefContext* ctx) { - FuncInfo info; - - // 通过funcType()获取函数类型 - if (ctx->funcType()) { - std::string func_type_text = ctx->funcType()->getText(); - if (func_type_text == "void") { - info.ret_type = SymbolType::TYPE_VOID; - } else if (func_type_text == "int") { - info.ret_type = SymbolType::TYPE_INT; - } else if (func_type_text == "float") { - info.ret_type = SymbolType::TYPE_FLOAT; - } - } - - // 绑定函数名和返回类型 - if (ctx->Ident()) { - info.name = ctx->Ident()->getText(); - } - ir_ctx_.SetCurrentFuncReturnType(info.ret_type); - - // 递归分析函数体 - if (ctx->block()) { - visit(ctx->block()); - } - - return std::any(); -} - -// 3. 声明节点访问 std::any SemaVisitor::visitDecl(SysYParser::DeclContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); } -// 4. 常量声明节点访问 std::any SemaVisitor::visitConstDecl(SysYParser::ConstDeclContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); +} + +std::any SemaVisitor::visitBtype(SysYParser::BtypeContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitConstDef(SysYParser::ConstDefContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitConstInitValue(SysYParser::ConstInitValueContext* ctx) { + return visitChildren(ctx); } -// 5. 变量声明节点访问 std::any SemaVisitor::visitVarDecl(SysYParser::VarDeclContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); +} + +std::any SemaVisitor::visitVarDef(SysYParser::VarDefContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitInitValue(SysYParser::InitValueContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitFuncDef(SysYParser::FuncDefContext* ctx) { + SymbolType ret_type = SymbolType::TYPE_UNKNOWN; + if (ctx && ctx->funcType()) { + ret_type = ParseType(ctx->funcType()->getText()); + } + + ir_ctx_.SetCurrentFuncReturnType(ret_type); + return visitChildren(ctx); } -// 6. 代码块节点访问 -std::any SemaVisitor::visitBlock(SysYParser::BlockContext* ctx) { - // 进入新的作用域 - ir_ctx_.EnterScope(); - - // 访问块内的语句 +std::any SemaVisitor::visitFuncType(SysYParser::FuncTypeContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitFuncFParams(SysYParser::FuncFParamsContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitFuncFParam(SysYParser::FuncFParamContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitBlockStmt(SysYParser::BlockStmtContext* ctx) { + ir_ctx_.EnterScope(); + std::any result = visitChildren(ctx); + ir_ctx_.LeaveScope(); + return result; +} + +std::any SemaVisitor::visitBlockItem(SysYParser::BlockItemContext* ctx) { + return visitChildren(ctx); +} + +std::any SemaVisitor::visitStmt(SysYParser::StmtContext* ctx) { + if (!ctx) { + return {}; + } + + if (ctx->WHILE()) { + ir_ctx_.EnterLoop(); std::any result = visitChildren(ctx); - - // 离开作用域 - ir_ctx_.LeaveScope(); - + ir_ctx_.ExitLoop(); return result; + } + + if (ctx->BREAK() && !ir_ctx_.InLoop()) { + ir_ctx_.RecordError( + ErrorMsg("break 只能出现在循环语句中", ctx->getStart()->getLine(), + ctx->getStart()->getCharPositionInLine() + 1)); + } + + if (ctx->CONTINUE() && !ir_ctx_.InLoop()) { + ir_ctx_.RecordError( + ErrorMsg("continue 只能出现在循环语句中", ctx->getStart()->getLine(), + ctx->getStart()->getCharPositionInLine() + 1)); + } + + return visitChildren(ctx); +} + +std::any SemaVisitor::visitReturnStmt(SysYParser::ReturnStmtContext* ctx) { + if (!ctx) { + return {}; + } + + if (ctx->exp() && ir_ctx_.GetCurrentFuncReturnType() == SymbolType::TYPE_VOID) { + ir_ctx_.RecordError( + ErrorMsg("void 函数不应返回表达式", ctx->getStart()->getLine(), + ctx->getStart()->getCharPositionInLine() + 1)); + } + + if (!ctx->exp() && + ir_ctx_.GetCurrentFuncReturnType() != SymbolType::TYPE_VOID && + ir_ctx_.GetCurrentFuncReturnType() != SymbolType::TYPE_UNKNOWN) { + ir_ctx_.RecordError( + ErrorMsg("非 void 函数 return 必须带表达式", ctx->getStart()->getLine(), + ctx->getStart()->getCharPositionInLine() + 1)); + } + + return visitChildren(ctx); } -// 7. 语句节点访问 -std::any SemaVisitor::visitStmt(SysYParser::StmtContext* ctx) { - // 赋值语句:lVal = exp; - if (ctx->lVal() && ctx->exp()) { - auto l_val_ctx = ctx->lVal(); - auto exp_ctx = ctx->exp(); - - // 解析左右值类型 - SymbolType l_type = ir_ctx_.GetType(l_val_ctx); - SymbolType r_type = ir_ctx_.GetType(exp_ctx); - - // 类型不匹配报错 - if (l_type != r_type && l_type != SymbolType::TYPE_UNKNOWN && r_type != SymbolType::TYPE_UNKNOWN) { - std::string l_type_str = (l_type == SymbolType::TYPE_INT ? "int" : "float"); - std::string r_type_str = (r_type == SymbolType::TYPE_INT ? "int" : "float"); - std::string err_msg = "赋值类型不匹配,左值为" + l_type_str + ",右值为" + r_type_str; - - int line = ctx->getStart()->getLine(); - int col = ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg(err_msg, line, col)); - } - - // 绑定左值类型(同步右值类型) - ir_ctx_.SetType(l_val_ctx, r_type); - } - // IF语句 - else if (ctx->cond() && ctx->stmt().size() >= 1) { - auto cond_ctx = ctx->cond(); - - // IF条件必须为整型 - SymbolType cond_type = ir_ctx_.GetType(cond_ctx); - if (cond_type != SymbolType::TYPE_INT && cond_type != SymbolType::TYPE_UNKNOWN) { - int line = cond_ctx->getStart()->getLine(); - int col = cond_ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg("if条件表达式必须为整型", line, col)); - } - - // 递归分析IF体和可能的ELSE体 - visit(ctx->stmt(0)); - if (ctx->stmt().size() >= 2) { - visit(ctx->stmt(1)); - } - } - // WHILE语句 - else if (ctx->cond() && ctx->stmt().size() >= 1) { - ir_ctx_.EnterLoop(); // 标记进入循环 - - auto cond_ctx = ctx->cond(); - // WHILE条件必须为整型 - SymbolType cond_type = ir_ctx_.GetType(cond_ctx); - if (cond_type != SymbolType::TYPE_INT && cond_type != SymbolType::TYPE_UNKNOWN) { - int line = cond_ctx->getStart()->getLine(); - int col = cond_ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg("while条件表达式必须为整型", line, col)); - } - - // 递归分析循环体 - visit(ctx->stmt(0)); - - ir_ctx_.ExitLoop(); // 标记退出循环 - } - // BREAK语句 - else if (ctx->getText().find("break") != std::string::npos) { - if (!ir_ctx_.InLoop()) { - int line = ctx->getStart()->getLine(); - int col = ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg("break只能出现在循环语句中", line, col)); - } - } - // CONTINUE语句 - else if (ctx->getText().find("continue") != std::string::npos) { - if (!ir_ctx_.InLoop()) { - int line = ctx->getStart()->getLine(); - int col = ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg("continue只能出现在循环语句中", line, col)); - } - } - // RETURN语句 - else if (ctx->getText().find("return") != std::string::npos) { - SymbolType func_ret_type = ir_ctx_.GetCurrentFuncReturnType(); - - // 有返回表达式的情况 - if (ctx->exp()) { - auto exp_ctx = ctx->exp(); - SymbolType exp_type = ir_ctx_.GetType(exp_ctx); - - // 返回类型不匹配报错 - if (exp_type != func_ret_type && exp_type != SymbolType::TYPE_UNKNOWN && func_ret_type != SymbolType::TYPE_UNKNOWN) { - std::string ret_type_str = (func_ret_type == SymbolType::TYPE_INT ? "int" : (func_ret_type == SymbolType::TYPE_FLOAT ? "float" : "void")); - std::string exp_type_str = (exp_type == SymbolType::TYPE_INT ? "int" : "float"); - std::string err_msg = "return表达式类型与函数返回类型不匹配,期望" + ret_type_str + ",实际为" + exp_type_str; - - int line = exp_ctx->getStart()->getLine(); - int col = exp_ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg(err_msg, line, col)); - } - } - // 无返回表达式的情况 - else { - if (func_ret_type != SymbolType::TYPE_VOID && func_ret_type != SymbolType::TYPE_UNKNOWN) { - int line = ctx->getStart()->getLine(); - int col = ctx->getStart()->getCharPositionInLine() + 1; - ir_ctx_.RecordError(ErrorMsg("非void函数return必须带表达式", line, col)); - } - } - } - - // 其他语句 - return visitChildren(ctx); -} - -// 8. 左值节点访问 -std::any SemaVisitor::visitLVal(SysYParser::LValContext* ctx) { - return visitChildren(ctx); -} - -// 9. 表达式节点访问 std::any SemaVisitor::visitExp(SysYParser::ExpContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); } -// 10. 条件表达式节点访问 std::any SemaVisitor::visitCond(SysYParser::CondContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); +} + +std::any SemaVisitor::visitLValue(SysYParser::LValueContext* ctx) { + return visitChildren(ctx); } -// 11. 基本表达式节点访问 std::any SemaVisitor::visitPrimaryExp(SysYParser::PrimaryExpContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); +} + +std::any SemaVisitor::visitNumber(SysYParser::NumberContext* ctx) { + if (!ctx) { + return {}; + } + + if (ctx->ILITERAL()) { + ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); + ir_ctx_.SetConstVal(ctx, std::any(0L)); + } else if (ctx->FLITERAL()) { + ir_ctx_.SetType(ctx, SymbolType::TYPE_FLOAT); + ir_ctx_.SetConstVal(ctx, std::any(0.0)); + } + + return {}; } -// 12. 一元表达式节点访问 std::any SemaVisitor::visitUnaryExp(SysYParser::UnaryExpContext* ctx) { - // 带一元运算符的表达式(+/-/!) - if (ctx->unaryOp() && ctx->unaryExp()) { - auto op_ctx = ctx->unaryOp(); - auto uexp_ctx = ctx->unaryExp(); - auto uexp_val = visit(uexp_ctx); - - std::string op_text = op_ctx->getText(); - SymbolType uexp_type = ir_ctx_.GetType(uexp_ctx); - - // 正号 +x → 直接返回原值 - if (op_text == "+") { - ir_ctx_.SetType(ctx, uexp_type); - ir_ctx_.SetConstVal(ctx, uexp_val); - return uexp_val; - } - // 负号 -x → 取反 - else if (op_text == "-") { - if (ir_ctx_.IsIntType(uexp_val)) { - long val = std::any_cast(uexp_val); - ir_ctx_.SetConstVal(ctx, std::any(-val)); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - return std::any(-val); - } else if (ir_ctx_.IsFloatType(uexp_val)) { - double val = std::any_cast(uexp_val); - ir_ctx_.SetConstVal(ctx, std::any(-val)); - ir_ctx_.SetType(ctx, SymbolType::TYPE_FLOAT); - return std::any(-val); - } - } - // 逻辑非 !x → 0/1转换 - else if (op_text == "!") { - if (ir_ctx_.IsIntType(uexp_val)) { - long val = std::any_cast(uexp_val); - long res = (val == 0) ? 1L : 0L; - ir_ctx_.SetConstVal(ctx, std::any(res)); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - return std::any(res); - } - } - } - // 函数调用表达式 - else if (ctx->Ident() && ctx->funcRParams()) { - // 这里简化处理 - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - return std::any(0L); - } - // 基础表达式 - else if (ctx->primaryExp()) { - auto val = visit(ctx->primaryExp()); - ir_ctx_.SetType(ctx, ir_ctx_.GetType(ctx->primaryExp())); - ir_ctx_.SetConstVal(ctx, val); - return val; - } - - return std::any(); -} - -// 13. 乘法表达式节点访问 -std::any SemaVisitor::visitMulExp(SysYParser::MulExpContext* ctx) { - auto uexps = ctx->unaryExp(); - - // 单操作数 → 直接返回 - if (uexps.size() == 1) { - auto val = visit(uexps[0]); - ir_ctx_.SetType(ctx, ir_ctx_.GetType(uexps[0])); - ir_ctx_.SetConstVal(ctx, val); - return val; - } - - // 多操作数 → 依次计算 - std::any result = visit(uexps[0]); - SymbolType current_type = ir_ctx_.GetType(uexps[0]); - - for (size_t i = 1; i < uexps.size(); ++i) { - auto next_uexp = uexps[i]; - auto next_val = visit(next_uexp); - SymbolType next_type = ir_ctx_.GetType(next_uexp); - - // 类型统一:int和float混合转为float - if (current_type == SymbolType::TYPE_INT && next_type == SymbolType::TYPE_FLOAT) { - current_type = SymbolType::TYPE_FLOAT; - } else if (current_type == SymbolType::TYPE_FLOAT && next_type == SymbolType::TYPE_INT) { - current_type = SymbolType::TYPE_FLOAT; - } - - // 简化处理:这里假设是乘法运算 - if (ir_ctx_.IsIntType(result) && ir_ctx_.IsIntType(next_val)) { - long v1 = std::any_cast(result); - long v2 = std::any_cast(next_val); - result = std::any(v1 * v2); - } else if (ir_ctx_.IsFloatType(result) && ir_ctx_.IsFloatType(next_val)) { - double v1 = std::any_cast(result); - double v2 = std::any_cast(next_val); - result = std::any(v1 * v2); - } - - // 更新当前节点类型和常量值 - ir_ctx_.SetType(ctx, current_type); - ir_ctx_.SetConstVal(ctx, result); - } + return visitChildren(ctx); +} - return result; +std::any SemaVisitor::visitUnaryOp(SysYParser::UnaryOpContext* ctx) { + return visitChildren(ctx); } -// 14. 加法表达式节点访问 -std::any SemaVisitor::visitAddExp(SysYParser::AddExpContext* ctx) { - auto mexps = ctx->mulExp(); - - // 单操作数 → 直接返回 - if (mexps.size() == 1) { - auto val = visit(mexps[0]); - ir_ctx_.SetType(ctx, ir_ctx_.GetType(mexps[0])); - ir_ctx_.SetConstVal(ctx, val); - return val; - } - - // 多操作数 → 依次计算 - std::any result = visit(mexps[0]); - SymbolType current_type = ir_ctx_.GetType(mexps[0]); - - for (size_t i = 1; i < mexps.size(); ++i) { - auto next_mexp = mexps[i]; - auto next_val = visit(next_mexp); - SymbolType next_type = ir_ctx_.GetType(next_mexp); - - // 类型统一 - if (current_type == SymbolType::TYPE_INT && next_type == SymbolType::TYPE_FLOAT) { - current_type = SymbolType::TYPE_FLOAT; - } else if (current_type == SymbolType::TYPE_FLOAT && next_type == SymbolType::TYPE_INT) { - current_type = SymbolType::TYPE_FLOAT; - } - - // 简化处理:这里假设是加法运算 - if (ir_ctx_.IsIntType(result) && ir_ctx_.IsIntType(next_val)) { - long v1 = std::any_cast(result); - long v2 = std::any_cast(next_val); - result = std::any(v1 + v2); - } else if (ir_ctx_.IsFloatType(result) && ir_ctx_.IsFloatType(next_val)) { - double v1 = std::any_cast(result); - double v2 = std::any_cast(next_val); - result = std::any(v1 + v2); - } - - ir_ctx_.SetType(ctx, current_type); - ir_ctx_.SetConstVal(ctx, result); - } +std::any SemaVisitor::visitFuncRParams(SysYParser::FuncRParamsContext* ctx) { + return visitChildren(ctx); +} - return result; +std::any SemaVisitor::visitMulExp(SysYParser::MulExpContext* ctx) { + return visitChildren(ctx); } -// 15. 关系表达式节点访问 -std::any SemaVisitor::visitRelExp(SysYParser::RelExpContext* ctx) { - auto aexps = ctx->addExp(); - - // 单操作数 → 直接返回 - if (aexps.size() == 1) { - auto val = visit(aexps[0]); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - return val; - } - - // 多操作数 → 简化处理 - std::any result = std::any(1L); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - ir_ctx_.SetConstVal(ctx, result); +std::any SemaVisitor::visitAddExp(SysYParser::AddExpContext* ctx) { + return visitChildren(ctx); +} - return result; +std::any SemaVisitor::visitRelExp(SysYParser::RelExpContext* ctx) { + return visitChildren(ctx); } -// 16. 相等表达式节点访问 std::any SemaVisitor::visitEqExp(SysYParser::EqExpContext* ctx) { - auto rexps = ctx->relExp(); - - // 单操作数 → 直接返回 - if (rexps.size() == 1) { - auto val = visit(rexps[0]); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - return val; - } - - // 多操作数 → 简化处理 - std::any result = std::any(1L); - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - ir_ctx_.SetConstVal(ctx, result); - - return result; + return visitChildren(ctx); } -// 17. 逻辑与表达式节点访问 std::any SemaVisitor::visitLAndExp(SysYParser::LAndExpContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); } -// 18. 逻辑或表达式节点访问 std::any SemaVisitor::visitLOrExp(SysYParser::LOrExpContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); } -// 19. 常量表达式节点访问 std::any SemaVisitor::visitConstExp(SysYParser::ConstExpContext* ctx) { - return visitChildren(ctx); + return visitChildren(ctx); } -// 20. 数字节点访问 -std::any SemaVisitor::visitNumber(SysYParser::NumberContext* ctx) { - // 这里简化处理,实际需要解析整型和浮点型 - if (ctx->IntConst()) { - ir_ctx_.SetType(ctx, SymbolType::TYPE_INT); - ir_ctx_.SetConstVal(ctx, std::any(0L)); - return std::any(0L); - } else if (ctx->FloatConst()) { - ir_ctx_.SetType(ctx, SymbolType::TYPE_FLOAT); - ir_ctx_.SetConstVal(ctx, std::any(0.0)); - return std::any(0.0); - } - - return std::any(); -} - -// 21. 函数参数节点访问 -std::any SemaVisitor::visitFuncRParams(SysYParser::FuncRParamsContext* ctx) { - return visitChildren(ctx); +void RunSemanticAnalysis(SysYParser::CompUnitContext* ctx, IRGenContext& ir_ctx) { + if (!ctx) { + throw std::invalid_argument("CompUnitContext is null"); + } + SemaVisitor visitor(ir_ctx); + visitor.visit(ctx); } -// ===================== 语义分析入口函数 ===================== -void RunSemanticAnalysis(SysYParser::CompUnitContext* ctx, IRGenContext& ir_ctx) { - if (!ctx) { - throw std::invalid_argument("CompUnitContext is null"); - } - SemaVisitor visitor(ir_ctx); - visitor.visit(ctx); -} \ No newline at end of file +SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit) { + IRGenContext ctx; + RunSemanticAnalysis(&comp_unit, ctx); + return SemanticContext(); +}