An error occurred while loading the file. Please try again.
-
Jopqior authored9a820089
#ifndef AST2IRP_HPP
#define AST2IRP_HPP
#include "../utils/dsa/ast.hpp"
#include "../utils/dsa/env.hpp"
#include "../utils/dsa/irp.hpp"
#include "../utils/dsa/table.hpp"
#include "../utils/dsa/temp.hpp"
#include <stack>
namespace irpgen {
class TrExp;
class TrExpList;
class ExpTy;
class LoopInfo;
class ConstInitValInfo;
class InitValInfo;
class LocalVarInfo {
public:
temp::Temp *temp;
};
class FuncInfo {
public:
irp::FuncDef *funcDef;
temp::Label *label;
};
class AST2IRP {
public:
AST2IRP(ast::Prog *root) : root(root) {}
irp::Prog *result;
void translate();
private:
ast::Prog *root;
table::SymbolTable<env::GlobalVar *> globalTable;
table::SymbolTable<env::LocalVar *> localTable;
table::SymbolTable<env::Func *> funcTable;
std::stack<LoopInfo *> loopStack;
std::string *curFuncName;
int curFuncStackOffset;
TrExp *curFuncAllocas;
std::vector<irp::FormatDef *> *curFuncFormatsPtr;
std::unordered_map<std::string, irp::FormatDef *> formatTable;
TrExp *beforeMainDefs;
TrExp *mainAllocas;
irp::FuncDefList *transCompUnitList(ast::CompUnitList *compUnitList);
irp::FuncDef *transFuncDef(ast::FuncDef *funcDef);
std::pair<std::vector<env::TyKind> *, temp::TempList *> transFuncFParamList(ast::FuncFParamList *paramList);
std::pair<env::TyKind, temp::Temp *> transFuncFParam(ast::FuncFParam *param);
std::vector<int> *getArrayDimList(irp::ExpList *dimList);
void transGlobalDecl(ast::Decl *decl);
void transGlobalConstDecl(ast::ConstDecl *constDecl);
void transGlobalConstDef(ast::ConstDef *constDef, ast::BaseType baseType);
TrExp *transGlobalVarDecl(ast::VarDecl *varDecl);
TrExp *transGlobalVarDef(ast::VarDef *varDef, ast::BaseType baseType);
irp::GlobalDef *transGlobalArrConstInitVal(ast::InitVal *initVal, ast::BaseType baseType, temp::Label *label,
std::vector<int> *dims);
ConstInitValInfo *transConstInitValRecur(ast::InitVal *initVal, ast::BaseType baseType, std::vector<int> *dims,
int curDim, int step, int align, int &offset);
std::pair<irp::GlobalDef *, TrExp *> transGlobalVarInitVal(ast::InitVal *initVal, ast::BaseType baseType,
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
temp::Label *label);
std::pair<irp::GlobalDef *, TrExp *> transGlobalArrInitVal(ast::InitVal *initVal, ast::BaseType baseType,
temp::Label *label, std::vector<int> *dims);
InitValInfo *transGlobalInitValRecur(ast::InitVal *initVal, ast::BaseType baseType, temp::Label *label,
std::vector<int> *dims, int curDim, int step, int align, int &offset);
TrExp *transBlock(ast::Block *block);
TrExp *transBlockItemList(ast::BlockItemList *blockItemList);
TrExp *transBlockItem(ast::BlockItem *blockItem);
TrExp *transDecl(ast::Decl *decl);
void transConstDecl(ast::ConstDecl *constDecl);
void transConstDef(ast::ConstDef *constDef, ast::BaseType baseType);
irp::LocalConstArrayDef *transLocalArrConstInitVal(ast::InitVal *initVal, ast::BaseType baseType,
temp::Label *label, std::vector<int> *dims);
TrExp *transVarDecl(ast::VarDecl *varDecl);
TrExp *transVarDef(ast::VarDef *varDef, ast::BaseType baseType);
TrExp *transInitVal(ast::InitVal *initVal, ast::BaseType baseType, temp::Temp *temp, std::vector<int> *dims);
TrExp *transInitValRecur(ast::InitVal *initVal, ast::BaseType baseType, temp::Temp *temp, std::vector<int> *dims,
int curDim, int step, int align, int &offset);
TrExp *transStmt(ast::Stmt *stmt);
TrExp *transAssignStmt(ast::Stmt *stmt);
TrExp *transExpStmt(ast::Stmt *stmt);
TrExp *transBlockStmt(ast::Stmt *stmt);
TrExp *transIfStmt(ast::Stmt *stmt);
TrExp *transWhileStmt(ast::Stmt *stmt);
TrExp *transBreakStmt(ast::Stmt *stmt);
TrExp *transContinueStmt(ast::Stmt *stmt);
TrExp *transReturnStmt(ast::Stmt *stmt);
TrExp *transPutintStmt(ast::Stmt *stmt);
TrExp *transPutchStmt(ast::Stmt *stmt);
TrExp *transPutfloatStmt(ast::Stmt *stmt);
TrExp *transPutarrayStmt(ast::Stmt *stmt);
TrExp *transPutfarrayStmt(ast::Stmt *stmt);
TrExp *transPutfStmt(ast::Stmt *stmt);
TrExp *transStarttimeStmt();
TrExp *transStoptimeStmt();
ExpTy *transExp(ast::Exp *exp);
ExpTy *transBinOpExp(ast::Exp *exp);
ExpTy *transCondExp(ast::Exp *exp);
ExpTy *transIdExp(ast::Exp *exp);
ExpTy *transIntConstExp(ast::Exp *exp);
ExpTy *transFloatConstExp(ast::Exp *exp);
ExpTy *transNotExp(ast::Exp *exp);
ExpTy *transMinusExp(ast::Exp *exp);
ExpTy *transCallExp(ast::Exp *exp);
ExpTy *transArrayExp(ast::Exp *exp);
ExpTy *transGetintExp();
ExpTy *transGetchExp();
ExpTy *transGetfloatExp();
ExpTy *transGetarrayExp(ast::Exp *exp);
ExpTy *transGetfarrayExp(ast::Exp *exp);
TrExpList *transExpList(ast::ExpList *expList);
TrExpList *transArgs(ast::ExpList *args, std::vector<env::TyKind> *paramTypes);
};
} // namespace irpgen
#endif // AST2IRP_HPP