#ifndef jk_SYMTABLE_HPP #define jk_SYMTABLE_HPP #include "commons.hpp" #include "Type.hpp" #include "Logger.hpp" namespace jk { struct Sym { std::string name; std::shared_ptr type; Loc loc; bool is_global = false; size_t addr; }; JK_ERROR(symbolic_error); class SymTable { public: explicit SymTable(Logger& logger, std::shared_ptr parent=nullptr); virtual ~SymTable(); size_t declare(std::string const& name, std::shared_ptr type, Loc const& loc); size_t declare_global(std::string const& name, std::shared_ptr type, Loc const& loc); std::optional find(std::string const& name) const; std::optional find_local(std::string const& name) const; private: Logger& m_logger; std::shared_ptr m_parent; std::vector m_syms; size_t m_addr = 0; }; } #endif