#pragma once #include "3rdparty/easylogging++.h" #include "antlrgen/SysyBaseVisitor.h" #include #include #include #include #include #include #include #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> _scope_tab; VisitorState _state = {}; std::map 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