ast2irp.hpp 5.13 KiB
#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