#pragma once #include #include #include "SysYParser.h" class SemanticContext { public: void BindLValue(SysYParser::LValueContext* use, antlr4::ParserRuleContext* def) { lvalue_defs_[use] = def; } void BindFuncCall(SysYParser::FuncCallExpContext* use, SysYParser::FuncDefContext* def) { funccall_defs_[use] = def; } antlr4::ParserRuleContext* ResolveLValue( const SysYParser::LValueContext* use) const { auto it = lvalue_defs_.find(const_cast(use)); return it == lvalue_defs_.end() ? nullptr : it->second; } SysYParser::FuncDefContext* ResolveFuncCall( const SysYParser::FuncCallExpContext* use) const { auto it = funccall_defs_.find(const_cast(use)); return it == funccall_defs_.end() ? nullptr : it->second; } private: std::unordered_map lvalue_defs_; std::unordered_map funccall_defs_; }; SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit);