80 lines
2.2 KiB
C++
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
|