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());