diff --git a/src/language/ASTNode.hpp b/src/language/ASTNode.hpp
index 53d20e687ca5da7ffa77db39afd2581e9a404ba9..e8ef09b3af830bbf78f5f218ab0cfa020392f13b 100644
--- a/src/language/ASTNode.hpp
+++ b/src/language/ASTNode.hpp
@@ -7,64 +7,13 @@
 #include <ASTNodeDataType.hpp>
 #include <ASTNodeDataVariant.hpp>
 
+#include <ExecUntilBreakOrContinue.hpp>
+#include <INodeProcessor.hpp>
+
 #include <pegtl/contrib/parse_tree.hpp>
 
 using namespace TAO_PEGTL_NAMESPACE;
 
-struct ExecUntilBreakOrContinue
-{
-  enum class JumpType
-  {
-    no_jump,
-    break_jump,
-    continue_jump
-  };
-
- private:
-  JumpType m_jump_type{JumpType::no_jump};
-  bool m_exec{true};
-
- public:
-  PUGS_INLINE
-  bool
-  exec() const
-  {
-    return m_exec;
-  }
-
-  PUGS_INLINE
-  JumpType
-  jumpType() const
-  {
-    return m_jump_type;
-  }
-
-  ExecUntilBreakOrContinue& operator=(const ExecUntilBreakOrContinue&) = delete;
-  ExecUntilBreakOrContinue& operator=(ExecUntilBreakOrContinue&&) = default;
-
-  ExecUntilBreakOrContinue() = default;
-
-  constexpr ExecUntilBreakOrContinue(const JumpType& jump_type)
-    : m_jump_type(jump_type), m_exec((jump_type == JumpType::no_jump))
-  {
-    ;
-  }
-};
-
-class INodeProcessor
-{
- public:
-  virtual void execute(ExecUntilBreakOrContinue& exec_policy) = 0;
-
-  virtual std::string describe() const = 0;
-
-  INodeProcessor(const INodeProcessor&) = delete;
-
-  INodeProcessor() = default;
-
-  virtual ~INodeProcessor() = default;
-};
-
 class SymbolTable;
 
 struct ASTNode : public parse_tree::basic_node<ASTNode>
@@ -72,6 +21,9 @@ struct ASTNode : public parse_tree::basic_node<ASTNode>
   std::shared_ptr<SymbolTable> m_symbol_table;
   std::unique_ptr<INodeProcessor> m_node_processor;
 
+  ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t};
+  ASTNodeDataVariant m_value;
+
   PUGS_INLINE
   void
   execute(ExecUntilBreakOrContinue& exec_policy)
@@ -81,9 +33,6 @@ struct ASTNode : public parse_tree::basic_node<ASTNode>
       m_node_processor->execute(exec_policy);
     }
   }
-
-  ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t};
-  ASTNodeDataVariant m_value;
 };
 
 #endif   // AST_NODE_HPP
diff --git a/src/language/ExecUntilBreakOrContinue.hpp b/src/language/ExecUntilBreakOrContinue.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2f2d44313bc6767476c6926dee07cbe33b6866f5
--- /dev/null
+++ b/src/language/ExecUntilBreakOrContinue.hpp
@@ -0,0 +1,44 @@
+#ifndef EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
+#define EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
+
+struct ExecUntilBreakOrContinue
+{
+  enum class JumpType
+  {
+    no_jump,
+    break_jump,
+    continue_jump
+  };
+
+ private:
+  JumpType m_jump_type{JumpType::no_jump};
+  bool m_exec{true};
+
+ public:
+  PUGS_INLINE
+  bool
+  exec() const
+  {
+    return m_exec;
+  }
+
+  PUGS_INLINE
+  JumpType
+  jumpType() const
+  {
+    return m_jump_type;
+  }
+
+  ExecUntilBreakOrContinue& operator=(const ExecUntilBreakOrContinue&) = delete;
+  ExecUntilBreakOrContinue& operator=(ExecUntilBreakOrContinue&&) = default;
+
+  ExecUntilBreakOrContinue() = default;
+
+  constexpr ExecUntilBreakOrContinue(const JumpType& jump_type)
+    : m_jump_type(jump_type), m_exec((jump_type == JumpType::no_jump))
+  {
+    ;
+  }
+};
+
+#endif   // EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
diff --git a/src/language/INodeProcessor.hpp b/src/language/INodeProcessor.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..0ae3083f63d30548f553bb9cd5dd71359c47d67a
--- /dev/null
+++ b/src/language/INodeProcessor.hpp
@@ -0,0 +1,19 @@
+#ifndef I_NODE_PROCESSOR_HPP
+#define I_NODE_PROCESSOR_HPP
+
+class ExecUntilBreakOrContinue;
+
+struct INodeProcessor
+{
+  virtual void execute(ExecUntilBreakOrContinue& exec_policy) = 0;
+
+  virtual std::string describe() const = 0;
+
+  INodeProcessor(const INodeProcessor&) = delete;
+
+  INodeProcessor() = default;
+
+  virtual ~INodeProcessor() = default;
+};
+
+#endif   // I_NODE_PROCESSOR_HPP