This repository has been archived on 2023-09-10. You can view files and clone it, but cannot push or open issues/pull-requests.
joko/lib/SymTable.cpp

65 lines
1.3 KiB
C++
Raw Normal View History

2023-09-09 22:03:28 +00:00
#include "SymTable.hpp"
namespace jk
{
/*explicit*/ SymTable::SymTable(Logger& logger)
: m_logger { logger }
{
}
/*virtual*/ SymTable::~SymTable()
{
}
size_t
SymTable::declare(std::string const& name,
std::shared_ptr<Type> type,
Loc const& loc)
{
if (find(name))
{
m_logger.log<symbolic_error>(LOG_ERROR,
loc,
std::string()
+ "'"
+ name
+ "' is already defined");
}
size_t id = m_syms.size();
m_syms.push_back(Sym {
name,
type,
loc,
false,
id
});
return id;
}
size_t
SymTable::declare_global(std::string const& name,
std::shared_ptr<Type> type,
Loc const& loc)
{
size_t addr = declare(name, type, loc);
m_syms[addr].is_global = true;
return addr;
}
std::optional<Sym> SymTable::find(std::string const& name) const
{
for (auto const& sym: m_syms)
{
if (sym.name == name)
{
return sym;
}
}
return std::nullopt;
}
}