Add IR generator

main
Su Xing 3 years ago
parent f83512e305
commit 46de87ac96

@ -0,0 +1,35 @@
#include <iostream>
#include <memory>
#include <vector>
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<Value *> dims;
for (auto exp : lValue->exp()) {
auto res = exp->accept(this);
assert(res.has_value());
auto dim = any_cast<Value *>(res);
// dynamic_cast<C>(expression)
// dims.push_back();
}
}
return visitChildren(ctx);
}
} // namespace sysy

@ -0,0 +1,196 @@
#pragma once
#include "IR.h"
#include "IRBuilder.h"
#include "SysYBaseVisitor.h"
#include "SysYParser.h"
#include <memory>
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> 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
Loading…
Cancel
Save