78 lines
3.4 KiB
C++
78 lines
3.4 KiB
C++
#pragma once
|
|
#include "SysYBaseVisitor.h"
|
|
#include "SysYParser.h"
|
|
#include "IR.h"
|
|
#include "IRBuilder.h"
|
|
#include <sstream>
|
|
#include <map>
|
|
#include <vector>
|
|
#include <stack>
|
|
|
|
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<sysy::Module> irModule; // IR数据结构
|
|
std::stringstream irStream; // 文本输出流
|
|
sysy::IRBuilder irBuilder; // IR构建器
|
|
int tempCounter = 0;
|
|
std::string currentVarType;
|
|
// std::map<std::string, sysy::Value*> symbolTable;
|
|
std::map<std::string, std::pair<std::string, std::string>> symbolTable;
|
|
std::map<std::string, std::string> tmpTable;
|
|
std::vector<std::string> globalVars;
|
|
std::string currentFunction;
|
|
std::string currentReturnType;
|
|
std::vector<std::string> breakStack;
|
|
std::vector<std::string> continueStack;
|
|
bool hasReturn = false;
|
|
|
|
struct LoopLabels {
|
|
std::string breakLabel; // break跳转的目标标签
|
|
std::string continueLabel; // continue跳转的目标标签
|
|
};
|
|
std::stack<LoopLabels> 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);
|
|
}; |