// 维护对象符号的注册与按作用域查找。 #include "sem/SymbolTable.h" #include SymbolTable::SymbolTable() : scopes_(1) {} void SymbolTable::EnterScope() { scopes_.emplace_back(); } void SymbolTable::ExitScope() { if (scopes_.size() <= 1) { throw std::runtime_error("symbol table scope underflow"); } scopes_.pop_back(); } bool SymbolTable::Add(const ObjectBinding& symbol) { auto& scope = scopes_.back(); return scope.emplace(symbol.name, symbol).second; } bool SymbolTable::ContainsInCurrentScope(std::string_view name) const { const auto& scope = scopes_.back(); return scope.find(std::string(name)) != scope.end(); } const ObjectBinding* SymbolTable::Lookup(std::string_view name) const { const std::string key(name); for (auto it = scopes_.rbegin(); it != scopes_.rend(); ++it) { auto found = it->find(key); if (found != it->end()) { return &found->second; } } return nullptr; } size_t SymbolTable::Depth() const { return scopes_.size(); }