diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp index 0d3c082326d037c801e7ea5391816087c11dd695..8bbb6cf6d7002a23b4e74d5c8647f186f6c2ead0 100644 --- a/src/language/ASTSymbolTableBuilder.cpp +++ b/src/language/ASTSymbolTableBuilder.cpp @@ -10,10 +10,25 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> if (!n.children.empty()) { std::shared_ptr block_symbol_table = std::make_shared<SymbolTable>(symbol_table); n.m_symbol_table = block_symbol_table; + for (auto& child : n.children) { this->buildSymbolTable(*child, block_symbol_table); } } + } else if (n.is<language::let_declaration>()) { + std::shared_ptr local_symbol_table = std::make_shared<SymbolTable>(symbol_table); + n.m_symbol_table = local_symbol_table; + const std::string& symbol = n.children[0]->string(); + auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); + if (not success) { + std::ostringstream error_message; + error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << '\'' << " was already defined!"; + throw parse_error(error_message.str(), std::vector{n.begin()}); + } + + for (auto& child : n.children) { + this->buildSymbolTable(*child, local_symbol_table); + } } else { n.m_symbol_table = symbol_table; if (n.has_content()) { @@ -25,14 +40,6 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable> error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << '\'' << " was already defined!"; throw parse_error(error_message.str(), std::vector{n.begin()}); } - } else if (n.is<language::let_declaration>()) { - const std::string& symbol = n.children[0]->string(); - auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin()); - if (not success) { - std::ostringstream error_message; - error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << '\'' << " was already defined!"; - throw parse_error(error_message.str(), std::vector{n.begin()}); - } } else if (n.is<language::function_definition>()) { const std::string& symbol = n.children[0]->string(); auto [i_symbol, success] = symbol_table->add(symbol, n.children[0]->begin());