// 基于语法树的语义检查与名称绑定。 #pragma once #include #include #include "SysYParser.h" #include "sem/SymbolTable.h" class SemanticContext { public: SymbolEntry* RegisterSymbol(SymbolEntry symbol) { symbols_.push_back(std::move(symbol)); return &symbols_.back(); } void BindLValUse(SysYParser::LValContext* use, const SymbolEntry* symbol) { lval_uses_[use] = symbol; } const SymbolEntry* ResolveLValUse(const SysYParser::LValContext* use) const { auto it = lval_uses_.find(use); return it == lval_uses_.end() ? nullptr : it->second; } void BindCallUse(SysYParser::UnaryExpContext* call, const SymbolEntry* symbol) { call_uses_[call] = symbol; } const SymbolEntry* ResolveCallUse( const SysYParser::UnaryExpContext* call) const { auto it = call_uses_.find(call); return it == call_uses_.end() ? nullptr : it->second; } const std::list& GetSymbols() const { return symbols_; } private: std::list symbols_; std::unordered_map lval_uses_; std::unordered_map call_uses_; }; // 基于 SysY.g4 规则进行语义分析,构建 IR 导向的符号绑定结果。 SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit);