diff options
| author | Cori Barker <coribarker2@gmail.com> | 2026-02-22 22:24:27 +0000 |
|---|---|---|
| committer | Cori Barker <coribarker2@gmail.com> | 2026-02-22 22:24:27 +0000 |
| commit | 5c1f937a7eb7a9cc9cd86cb69b3263f41f24408f (patch) | |
| tree | 46154166a56f9a074c5b75dbb1a1b9560908b8f1 /src/symbol_table.cpp | |
| parent | 2cfc45ff22cd9b6166de3cf963aceede21b358aa (diff) | |
Partially completed lots of changes, refactoring most of the files
Diffstat (limited to 'src/symbol_table.cpp')
| -rw-r--r-- | src/symbol_table.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/symbol_table.cpp b/src/symbol_table.cpp new file mode 100644 index 0000000..81ff474 --- /dev/null +++ b/src/symbol_table.cpp @@ -0,0 +1,89 @@ +#include "symbol_table.hpp" + +#include <iostream> + +SymbolTable::SymbolTable() : scopes(std::vector<Scope>), current_scope(nullptr), scope_level(0), global_scope(nullptr) {} + +SymbolTable::~SymbolTable() {} + +void SymbolTable::enterScope(std::string scope_name) { + Scope scope = Scope(scope_name, scope_level, current_scope); + scopes.push_back(scope*); + + this->current_scope = scope*; + this->scope_level ++; +} + +void SymbolTable::exitScope() { + parent_scope = getParentScope(); + this->current_scope = parent_scope + + this->scope_level --; +} + +Scope* SymbolTable::getCurrentScope() { + return this->current_scope; +} + +Scope* SymbolTable::getGlobalScope() { + return this->global_scope; +} + +int SymbolTable::getScopeLevel() { + return this->scope_level; +} + +void SymbolTable::insert(Symbol symbol) { + if (this->current_scope == nullptr) { + // error + } + + this->current_scope->define(symbol); +} + +Symbol* SymbolTable::lookup(std::string name) { + current_scope = getCurrentScope(); + symbol = current_scope->lookup(name); + + while (symbol == nullptr) { + current_scope = current_scope->getParentScope(); + if (current_scope == nullptr) { + return nullptr; + } + + symbol = current_scope->lookup(name); + } + + return symbol; +} + +Symbol* SymbolTable::lookupCurrentScope(std::string name) { + current_scope = getCurrentScope(); + return current_scope->lookup(name); +} + +bool SymbolTable::isDeclared(std::string name) { + symbol == this->lookup(name); + return (symbol != nullptr); +} + +bool SymbolTable::isDeclaredInCurrentScope(std::string name) { + symbol == this->lookupCurrentSceop(name); + return (symbol != nullptr); +} + +void display() { + std::cout << this->toString(); +} + +std::string toString() { + std::string indent; + std::string result; + + for (const Scope& i : this->scopes) { + indent += (" " * i->getScopeLevel()); + result += (indent + '\n' + i->toString()); + } + + return result; +} |
