#pragma once #include "SysYBaseVisitor.h" #include "SysYParser.h" #include "IR.h" #include "IRBuilder.h" #include #include #include #include class LLVMIRGenerator : public SysYBaseVisitor { public: sysy::Module* getIRModule() const { return irModule.get(); } std::string generateIR(SysYParser::CompUnitContext* unit); std::string getIR() const { return irStream.str(); } private: std::unique_ptr irModule; // IR数据结构 std::stringstream irStream; // 文本输出流 sysy::IRBuilder irBuilder; // IR构建器 int tempCounter = 0; std::string currentVarType; // std::map symbolTable; std::map> symbolTable; std::map tmpTable; std::vector globalVars; std::string currentFunction; std::string currentReturnType; std::vector breakStack; std::vector continueStack; bool hasReturn = false; struct LoopLabels { std::string breakLabel; // break跳转的目标标签 std::string continueLabel; // continue跳转的目标标签 }; std::stack loopStack; // 用于管理循环的break和continue标签 std::string getNextTemp(); std::string getLLVMType(const std::string&); sysy::Type* getSysYType(const std::string&); bool inFunction = false; // 标识当前是否处于函数内部 // 访问方法 std::any visitCompUnit(SysYParser::CompUnitContext* ctx); std::any visitConstDecl(SysYParser::ConstDeclContext* ctx); std::any visitVarDecl(SysYParser::VarDeclContext* ctx); std::any visitVarDef(SysYParser::VarDefContext* ctx); std::any visitFuncDef(SysYParser::FuncDefContext* ctx); std::any visitBlockStmt(SysYParser::BlockStmtContext* ctx); // std::any visitStmt(SysYParser::StmtContext* ctx); std::any visitLValue(SysYParser::LValueContext* ctx); std::any visitPrimaryExp(SysYParser::PrimaryExpContext* ctx); std::any visitPrimExp(SysYParser::PrimExpContext* ctx); std::any visitParenExp(SysYParser::ParenExpContext* ctx); std::any visitNumber(SysYParser::NumberContext* ctx); std::any visitString(SysYParser::StringContext* ctx); std::any visitCall(SysYParser::CallContext *ctx); std::any visitUnExp(SysYParser::UnExpContext* ctx); std::any visitMulExp(SysYParser::MulExpContext* ctx); std::any visitAddExp(SysYParser::AddExpContext* ctx); std::any visitRelExp(SysYParser::RelExpContext* ctx); std::any visitEqExp(SysYParser::EqExpContext* ctx); std::any visitLAndExp(SysYParser::LAndExpContext* ctx); std::any visitLOrExp(SysYParser::LOrExpContext* ctx); std::any visitAssignStmt(SysYParser::AssignStmtContext *ctx) override; std::any visitIfStmt(SysYParser::IfStmtContext *ctx) override; std::any visitWhileStmt(SysYParser::WhileStmtContext *ctx) override; std::any visitBreakStmt(SysYParser::BreakStmtContext *ctx) override; std::any visitContinueStmt(SysYParser::ContinueStmtContext *ctx) override; std::any visitReturnStmt(SysYParser::ReturnStmtContext *ctx) override; // 统一创建二元操作(同时生成数据结构和文本) sysy::Value* createBinaryOp(SysYParser::ExpContext* lhs, SysYParser::ExpContext* rhs, sysy::Instruction::Kind opKind); };