diff --git a/src/language/ASTNodeDataTypeFlattener.cpp b/src/language/ASTNodeDataTypeFlattener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b499c6f3802b243ad4ece3970c937e1b6ff75a51
--- /dev/null
+++ b/src/language/ASTNodeDataTypeFlattener.cpp
@@ -0,0 +1,61 @@
+#include <ASTNodeDataTypeFlattener.hpp>
+
+#include <FunctionTable.hpp>
+#include <SymbolTable.hpp>
+
+#include <PEGGrammar.hpp>
+
+ASTNodeDataTypeFlattener::ASTNodeDataTypeFlattener(ASTNode& node, FlattenedDataType& flattened_datatype)
+{
+  if (node.is_type<language::expression_list>()) {
+    for (auto& child_node : node.children) {
+      ASTNodeDataTypeFlattener{*child_node, flattened_datatype};
+    }
+  } else if (node.is_type<language::function_evaluation>()) {
+    if (node.m_data_type != ASTNodeDataType::typename_t) {
+      flattened_datatype.push_back(node.m_data_type);
+    } else {
+      ASTNode& function_name_node = *node.children[0];
+
+      auto [i_function_symbol, found] = node.m_symbol_table->find(function_name_node.string(), node.begin());
+      Assert(found);
+
+      switch (i_function_symbol->attributes().dataType()) {
+      case ASTNodeDataType::function_t: {
+        uint64_t function_id = std::get<uint64_t>(i_function_symbol->attributes().value());
+
+        FunctionDescriptor& function_descriptor = node.m_symbol_table->functionTable()[function_id];
+
+        ASTNode& function_image_domain = *function_descriptor.domainMappingNode().children[1];
+
+        for (auto& image_sub_domain : function_image_domain.children) {
+          ASTNodeDataType data_type = ASTNodeDataType::undefined_t;
+
+          if (image_sub_domain->is_type<language::B_set>()) {
+            data_type = ASTNodeDataType::bool_t;
+          } else if (image_sub_domain->is_type<language::Z_set>()) {
+            data_type = ASTNodeDataType::int_t;
+          } else if (image_sub_domain->is_type<language::N_set>()) {
+            data_type = ASTNodeDataType::unsigned_int_t;
+          } else if (image_sub_domain->is_type<language::R_set>()) {
+            data_type = ASTNodeDataType::double_t;
+          } else if (image_sub_domain->is_type<language::string_type>()) {
+            data_type = ASTNodeDataType::string_t;
+          }
+
+          Assert(data_type != ASTNodeDataType::undefined_t);
+          flattened_datatype.push_back(data_type);
+        }
+        break;
+      }
+        //    LCOV_EXCL_START
+      default: {
+        throw parse_error("unexpected function type", node.begin());
+      }
+        //    LCOV_EXCL_STOP
+      }
+    }
+  } else {
+    flattened_datatype.push_back(node.m_data_type);
+  }
+}
diff --git a/src/language/ASTNodeDataTypeFlattener.hpp b/src/language/ASTNodeDataTypeFlattener.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..28327c69b406811287c4fa5f14b06a606d5dcb61
--- /dev/null
+++ b/src/language/ASTNodeDataTypeFlattener.hpp
@@ -0,0 +1,14 @@
+#ifndef AST_NODE_DATA_TYPE_FLATTENER_HPP
+#define AST_NODE_DATA_TYPE_FLATTENER_HPP
+
+#include <ASTNode.hpp>
+#include <vector>
+
+struct ASTNodeDataTypeFlattener
+{
+  using FlattenedDataType = std::vector<ASTNodeDataType>;
+
+  ASTNodeDataTypeFlattener(ASTNode& node, FlattenedDataType& flattened_datatype);
+};
+
+#endif   // AST_NODE_DATA_TYPE_FLATTENER_HPP
diff --git a/src/language/ASTNodeListAffectationExpressionBuilder.cpp b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
index 91e7c2e87f51f45ae8a660fd61306a18f774e90f..571d4cd44b8be13395f2f4c0b9a71b434ffc2f04 100644
--- a/src/language/ASTNodeListAffectationExpressionBuilder.cpp
+++ b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
@@ -3,7 +3,7 @@
 
 #include <node_processor/AffectationProcessor.hpp>
 
-#include <functional>
+#include <ASTNodeDataTypeFlattener.hpp>
 
 template <typename OperatorT>
 void
@@ -111,65 +111,8 @@ ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessor()
   Assert(m_node.children[1]->is_type<language::expression_list>() or
          m_node.children[1]->is_type<language::function_evaluation>());
 
-  using FlattenedRHSDataType = std::vector<ASTNodeDataType>;
-
-  std::function<void(ASTNode & rhs_node, FlattenedRHSDataType & flattened_rhs)> flatten_rhs =
-    [&](ASTNode& rhs_node, FlattenedRHSDataType& flattened_rhs) -> void {
-    if (rhs_node.is_type<language::expression_list>()) {
-      for (auto& rhs_child_node : rhs_node.children) {
-        flatten_rhs(*rhs_child_node, flattened_rhs);
-      }
-    } else if (rhs_node.is_type<language::function_evaluation>()) {
-      if (rhs_node.m_data_type != ASTNodeDataType::typename_t) {
-        flattened_rhs.push_back(rhs_node.m_data_type);
-      } else {
-        ASTNode& function_name_node = *rhs_node.children[0];
-
-        auto [i_function_symbol, found] = m_node.m_symbol_table->find(function_name_node.string(), m_node.begin());
-        Assert(found);
-
-        switch (i_function_symbol->attributes().dataType()) {
-        case ASTNodeDataType::function_t: {
-          uint64_t function_id = std::get<uint64_t>(i_function_symbol->attributes().value());
-
-          FunctionDescriptor& function_descriptor = m_node.m_symbol_table->functionTable()[function_id];
-
-          ASTNode& function_image_domain = *function_descriptor.domainMappingNode().children[1];
-
-          for (auto& image_sub_domain : function_image_domain.children) {
-            ASTNodeDataType data_type = ASTNodeDataType::undefined_t;
-
-            if (image_sub_domain->is_type<language::B_set>()) {
-              data_type = ASTNodeDataType::bool_t;
-            } else if (image_sub_domain->is_type<language::Z_set>()) {
-              data_type = ASTNodeDataType::int_t;
-            } else if (image_sub_domain->is_type<language::N_set>()) {
-              data_type = ASTNodeDataType::unsigned_int_t;
-            } else if (image_sub_domain->is_type<language::R_set>()) {
-              data_type = ASTNodeDataType::double_t;
-            } else if (image_sub_domain->is_type<language::string_type>()) {
-              data_type = ASTNodeDataType::string_t;
-            }
-
-            Assert(data_type != ASTNodeDataType::undefined_t);
-            flattened_rhs.push_back(data_type);
-          }
-          break;
-        }
-          //    LCOV_EXCL_START
-        default: {
-          throw parse_error("unexpected function type", m_node.begin());
-        }
-          //    LCOV_EXCL_STOP
-        }
-      }
-    } else {
-      flattened_rhs.push_back(rhs_node.m_data_type);
-    }
-  };
-
-  FlattenedRHSDataType flattened_rhs_data_type;
-  flatten_rhs(*m_node.children[1], flattened_rhs_data_type);
+  ASTNodeDataTypeFlattener::FlattenedDataType flattened_rhs_data_type;
+  ASTNodeDataTypeFlattener{*m_node.children[1], flattened_rhs_data_type};
 
   ASTNode& name_list_node = *m_node.children[0];
 
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index d3783566626d14fca9b49c5a58e35e2e4c8798b5..ee0333d3c48ecfe7233d7eb810959277ba3daaf1 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -14,6 +14,7 @@ add_library(
   ASTNodeBinaryOperatorExpressionBuilder.cpp
   ASTNodeCFunctionExpressionBuilder.cpp
   ASTNodeDataType.cpp
+  ASTNodeDataTypeFlattener.cpp
   ASTNodeDataTypeBuilder.cpp
   ASTNodeDataTypeChecker.cpp
   ASTNodeDeclarationToAffectationConverter.cpp