diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index f710ebe9ef9235c5e801a4a2c070a5414e163fc0..77bcd91f571ce75b9dcc3d8c672ad2a91f15d664 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -39,6 +39,15 @@
 #include <unordered_map>
 #include <variant>
 
+void
+clear_symbol_tables(std::unique_ptr<ASTNode>& node)
+{
+  for (auto& child : node->children) {
+    clear_symbol_tables(child);
+  }
+  node->m_symbol_table->clearValues();
+}
+
 void
 parser(const std::string& filename)
 {
@@ -96,6 +105,7 @@ parser(const std::string& filename)
     }
     catch (language::Exit& e) {
       ExecutionStatManager::getInstance().setExitCode(e.code());
+      clear_symbol_tables(root_node);
     }
     root_node->m_symbol_table->clearValues();