CompilerSysY/include/visitor.h
2023-05-02 17:20:35 +08:00

80 lines
2.2 KiB
C++

#pragma once
#include "3rdparty/easylogging++.h"
#include "antlrgen/SysyBaseVisitor.h"
#include <any>
#include <cstddef>
#include <map>
#include <optional>
#include <string>
#include <vector>
#include <memory>
#include "antlrgen/SysyLexer.h"
#include "antlrgen/SysyParser.h"
#include "common.h"
#include "llir_value.h"
#include "scopetable.h"
namespace antlrSysY {
class Visitor : public antlrSysY::SysyBaseVisitor {
private:
struct VisitorState {
bool isConstInt = false;
};
private:
ScopeTable<std::shared_ptr<Value>> _scope_tab;
VisitorState _state = {};
std::map<std::string, size_t> token_type_map;
public:
Visitor(SysyLexer &lexer) {
for (auto item : lexer.getTokenTypeMap()) {
token_type_map[std::string(item.first)] = item.second;
}
}
std::any visitProgram(SysyParser::ProgramContext *ctx) override {
// before visiting, we add some lib functions
return this->SysyBaseVisitor::visitProgram(ctx);
}
std::any visitCompUnit(SysyParser::CompUnitContext *ctx) override {
return this->visitChildren(ctx);
}
std::any visitDecl(SysyParser::DeclContext *ctx) override {
return this->visitChildren(ctx);
}
std::any visitConstDecl(SysyParser::ConstDeclContext *ctx) override;
// constDef : IDENT ('[' constExp ']')* '=' constInitVal ';'
std::any visitConstDef(SysyParser::ConstDefContext *ctx) override;
std::any visitConstInitVal(SysyParser::ConstInitValContext *ctx) override;
std::any visitConstExp(SysyParser::ConstExpContext *ctx) override;
// addExp: mulExp | addExp ('+' | '-') mulExp;
std::any visitAddExp(SysyParser::AddExpContext *ctx) override;
std::any visitMulExp(SysyParser::MulExpContext *ctx) override;
// unaryExp: primaryExp | IDENT '(' (funcRParams)? ')' | unaryOp unaryExp;
std::any visitUnaryExp(SysyParser::UnaryExpContext *ctx) override;
// primaryExp: ('(' exp ')') | lVal | number;
std::any visitPrimaryExp(SysyParser::PrimaryExpContext *ctx) override;
// std::any visitExp(SysyParser::ExpContext *ctx) override { }
std::any visitNumber(SysyParser::NumberContext *ctx) override;
std::any visitIntConst(SysyParser::IntConstContext *ctx) override;
std::any visitLVal(SysyParser::LValContext *) override;
};
} // namespace antlrSysY