From 46de87ac96c6137a115d1ec4f488cad8c1ff1241 Mon Sep 17 00:00:00 2001 From: Su Xing Date: Fri, 24 Mar 2023 16:27:12 +0800 Subject: [PATCH] Add IR generator --- src/SysYIRGenerator.cpp | 35 +++++++ src/SysYIRGenerator.h | 196 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 src/SysYIRGenerator.cpp create mode 100644 src/SysYIRGenerator.h diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp new file mode 100644 index 0000000..641e2d9 --- /dev/null +++ b/src/SysYIRGenerator.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +using namespace std; +#include "SysYIRGenerator.h" + +namespace sysy { + +any SysYIRGenerator::visitModule(SysYParser::ModuleContext *ctx) { + auto pModule = new Module(); + assert(pModule); + module.reset(pModule); + // turn on global flag + isLocal = true; + return visitChildren(ctx); +} + +any SysYIRGenerator::visitGlobalDecl(SysYParser::DeclContext *ctx) { + bool isConst = ctx->CONST(); + Type *type = ctx->btype()->INT() ? Type::getIntType() : Type::getFloatType(); + for (auto varDef : ctx->varDef()) { + auto lValue = varDef->lValue(); + auto id = lValue->ID()->getText(); + vector dims; + for (auto exp : lValue->exp()) { + auto res = exp->accept(this); + assert(res.has_value()); + auto dim = any_cast(res); + // dynamic_cast(expression) + // dims.push_back(); + } + } + return visitChildren(ctx); +} +} // namespace sysy \ No newline at end of file diff --git a/src/SysYIRGenerator.h b/src/SysYIRGenerator.h new file mode 100644 index 0000000..65d629f --- /dev/null +++ b/src/SysYIRGenerator.h @@ -0,0 +1,196 @@ +#pragma once + +#include "IR.h" +#include "IRBuilder.h" +#include "SysYBaseVisitor.h" +#include "SysYParser.h" +#include + +namespace sysy { + +class SysYIRGenerator : public SysYBaseVisitor { +private: + struct LocalMode { + bool &mode; + explicit LocalMode(bool &mode) : mode(mode) { mode = true; } + ~LocalMode() { mode = false; } + }; + +private: + std::unique_ptr module; + bool isLocal; + IRBuilder builder; + +public: + SysYIRGenerator() = default; + +private: + std::any visitGlobalDecl(SysYParser::DeclContext *ctx); + std::any visitLocalDecl(SysYParser::DeclContext *ctx); + +public: + virtual std::any visitModule(SysYParser::ModuleContext *ctx) override; + + virtual std::any visitDecl(SysYParser::DeclContext *ctx) override { + return isLocal? visitLocalDecl(ctx) : visitGlobalDecl(ctx); + } + + virtual std::any visitBtype(SysYParser::BtypeContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitVarDef(SysYParser::VarDefContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitScalarInitValue(SysYParser::ScalarInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitArrayInitValue(SysYParser::ArrayInitValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitFunc(SysYParser::FuncContext *ctx) override { + LocalMode guard(isLocal); + return visitChildren(ctx); + } + + virtual std::any visitFuncType(SysYParser::FuncTypeContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitFuncFParam(SysYParser::FuncFParamContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBlockStmt(SysYParser::BlockStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBlockItem(SysYParser::BlockItemContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitStmt(SysYParser::StmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitAssignStmt(SysYParser::AssignStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitExpStmt(SysYParser::ExpStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitIfStmt(SysYParser::IfStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitWhileStmt(SysYParser::WhileStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitBreakStmt(SysYParser::BreakStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitContinueStmt(SysYParser::ContinueStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitReturnStmt(SysYParser::ReturnStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitEmptyStmt(SysYParser::EmptyStmtContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitRelationExp(SysYParser::RelationExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitMultiplicativeExp(SysYParser::MultiplicativeExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitLValueExp(SysYParser::LValueExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitNumberExp(SysYParser::NumberExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitAndExp(SysYParser::AndExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitUnaryExp(SysYParser::UnaryExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitParenExp(SysYParser::ParenExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitStringExp(SysYParser::StringExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitOrExp(SysYParser::OrExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitCallExp(SysYParser::CallExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitAdditiveExp(SysYParser::AdditiveExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitEqualExp(SysYParser::EqualExpContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitCall(SysYParser::CallContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitLValue(SysYParser::LValueContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitNumber(SysYParser::NumberContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitString(SysYParser::StringContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any + visitFuncRParams(SysYParser::FuncRParamsContext *ctx) override { + return visitChildren(ctx); + } + +}; // class SysYIRGenerator + +} // namespace sysy \ No newline at end of file