#include "sem/SymbolTable.h" #include void SymbolTable::EnterScope() { scopes_.emplace_back(); } void SymbolTable::ExitScope() { if (scopes_.empty()) { throw std::runtime_error("作用域栈为空,无法退出"); } scopes_.pop_back(); } bool SymbolTable::Declare(const std::string& name, const SymbolInfo* symbol) { if (scopes_.empty()) { EnterScope(); } auto& scope = scopes_.back(); return scope.emplace(name, symbol).second; } const SymbolInfo* SymbolTable::Lookup(const std::string& name) const { for (auto it = scopes_.rbegin(); it != scopes_.rend(); ++it) { auto found = it->find(name); if (found != it->end()) { return found->second; } } return nullptr; } const SymbolInfo* SymbolTable::LookupCurrent(const std::string& name) const { if (scopes_.empty()) { return nullptr; } auto found = scopes_.back().find(name); return found == scopes_.back().end() ? nullptr : found->second; }