refactor(irgen): 规范采用visitor生成
This commit is contained in:
@@ -3,10 +3,12 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <any>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "SysYBaseVisitor.h"
|
||||
#include "SysYParser.h"
|
||||
#include "ir/IR.h"
|
||||
#include "sem/Sema.h"
|
||||
@@ -18,22 +20,31 @@ class IRBuilder;
|
||||
class Value;
|
||||
}
|
||||
|
||||
class IRGenImpl {
|
||||
class IRGenImpl final : public SysYBaseVisitor {
|
||||
public:
|
||||
IRGenImpl(ir::Module& module, const SemanticContext& sema);
|
||||
|
||||
void Gen(SysYParser::CompUnitContext& cu);
|
||||
std::any visitCompUnit(SysYParser::CompUnitContext* ctx) override;
|
||||
std::any visitFuncDef(SysYParser::FuncDefContext* ctx) override;
|
||||
std::any visitBlockStmt(SysYParser::BlockStmtContext* ctx) override;
|
||||
std::any visitBlockItem(SysYParser::BlockItemContext* ctx) override;
|
||||
std::any visitDecl(SysYParser::DeclContext* ctx) override;
|
||||
std::any visitStmt(SysYParser::StmtContext* ctx) override;
|
||||
std::any visitVarDef(SysYParser::VarDefContext* ctx) override;
|
||||
std::any visitReturnStmt(SysYParser::ReturnStmtContext* ctx) override;
|
||||
std::any visitParenExp(SysYParser::ParenExpContext* ctx) override;
|
||||
std::any visitNumberExp(SysYParser::NumberExpContext* ctx) override;
|
||||
std::any visitVarExp(SysYParser::VarExpContext* ctx) override;
|
||||
std::any visitAdditiveExp(SysYParser::AdditiveExpContext* ctx) override;
|
||||
|
||||
private:
|
||||
void GenFuncDef(SysYParser::FuncDefContext& func);
|
||||
void GenBlock(SysYParser::BlockStmtContext& block);
|
||||
bool GenBlockItem(SysYParser::BlockItemContext& item);
|
||||
void GenDecl(SysYParser::DeclContext& decl);
|
||||
bool GenStmt(SysYParser::StmtContext& stmt);
|
||||
void GenVarDef(SysYParser::VarDefContext& decl);
|
||||
void GenReturnStmt(SysYParser::ReturnStmtContext& ret);
|
||||
enum class BlockFlow {
|
||||
Continue,
|
||||
Terminated,
|
||||
};
|
||||
|
||||
ir::Value* GenExpr(SysYParser::ExpContext& expr);
|
||||
BlockFlow VisitBlockItemResult(SysYParser::BlockItemContext& item);
|
||||
ir::Value* EvalExpr(SysYParser::ExpContext& expr);
|
||||
|
||||
ir::Module& module_;
|
||||
const SemanticContext& sema_;
|
||||
|
||||
Reference in New Issue
Block a user