diff --git a/.gitignore b/.gitignore
index e8ba8747559abdacd563868545e2a6666be82a3c..3bb6d6cbcf2906a99d3302595285d50145395fe5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ CMakeCache.txt
 GPATH
 GRTAGS
 GTAGS
+/.clangd/
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index ed00e3032b5efddcbfbd21124836f737889041e3..faab47780f0736c43285b3245a8ee07cc966f036 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -16,6 +16,7 @@
 #include <language/utils/ASTDotPrinter.hpp>
 #include <language/utils/ASTExecutionInfo.hpp>
 #include <language/utils/ASTPrinter.hpp>
+#include <language/utils/OperatorRepository.hpp>
 #include <language/utils/SymbolTable.hpp>
 #include <utils/PugsAssert.hpp>
 #include <utils/PugsUtils.hpp>
@@ -48,6 +49,8 @@ parser(const std::string& filename)
             << rang::style::reset << " ...\n";
 
   auto parse_and_execute = [](auto& input) {
+    OperatorRepository::create();
+
     std::unique_ptr<ASTNode> root_node = ASTBuilder::build(input);
 
     ASTModulesImporter module_importer{*root_node};
@@ -81,6 +84,8 @@ parser(const std::string& filename)
     root_node->execute(exec_all);
 
     root_node->m_symbol_table->clearValues();
+
+    OperatorRepository::destroy();
   };
 
   if (not SignalManager::pauseOnError()) {
diff --git a/src/language/ast/ASTNode.hpp b/src/language/ast/ASTNode.hpp
index a3b9bd21569d490b1bc7f450eee546279b91a681..d9568c612dd3e3a6223994cff6273b43d900b3c0 100644
--- a/src/language/ast/ASTNode.hpp
+++ b/src/language/ast/ASTNode.hpp
@@ -1,9 +1,9 @@
 #ifndef AST_NODE_HPP
 #define AST_NODE_HPP
 
-#include <language/ast/ASTNodeDataType.hpp>
 #include <language/node_processor/ExecutionPolicy.hpp>
 #include <language/node_processor/INodeProcessor.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/DataVariant.hpp>
 #include <utils/PugsAssert.hpp>
 #include <utils/PugsMacros.hpp>
diff --git a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp
index 66420138cd85f3fcf220ceec883f6c2b1b012759..6e712e3d84c0eb6d52064fdfecabd9dd6f9016db 100644
--- a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp
+++ b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp
@@ -3,437 +3,54 @@
 #include <algebra/TinyVector.hpp>
 #include <language/PEGGrammar.hpp>
 #include <language/ast/ASTNodeNaturalConversionChecker.hpp>
-#include <language/node_processor/AffectationProcessor.hpp>
+#include <language/node_processor/INodeProcessor.hpp>
+#include <language/utils/AffectationMangler.hpp>
+#include <language/utils/OperatorRepository.hpp>
 #include <language/utils/ParseError.hpp>
-
 #include <utils/Exceptions.hpp>
 
 ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode& n)
 {
-  auto set_affectation_processor = [](ASTNode& n, const auto& operator_v) {
-    auto set_affectation_processor_for_data = [&](const auto& value, const ASTNodeDataType& data_type) {
-      using OperatorT = std::decay_t<decltype(operator_v)>;
-      using ValueT    = std::decay_t<decltype(value)>;
-
-      switch (data_type) {
-      case ASTNodeDataType::bool_t: {
-        n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, bool>>(n);
-        break;
-      }
-      case ASTNodeDataType::unsigned_int_t: {
-        n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, uint64_t>>(n);
-        break;
-      }
-      case ASTNodeDataType::int_t: {
-        n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, int64_t>>(n);
-        break;
-      }
-      case ASTNodeDataType::double_t: {
-        n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, double>>(n);
-        break;
-      }
-        // LCOV_EXCL_START
-      default: {
-        throw ParseError("unexpected error: undefined operand type for affectation",
-                         std::vector{n.children[1]->begin()});
-      }
-        // LCOV_EXCL_STOP
-      }
-    };
-
-    auto set_affectation_processor_for_vector_data = [&](const auto& value, const ASTNodeDataType& data_type) {
-      using OperatorT = std::decay_t<decltype(operator_v)>;
-      using ValueT    = std::decay_t<decltype(value)>;
-
-      if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
-        switch (data_type) {
-        case ASTNodeDataType::vector_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, ValueT>>(n);
-          break;
-        }
-        case ASTNodeDataType::list_t: {
-          n.m_node_processor = std::make_unique<AffectationToTinyVectorFromListProcessor<OperatorT, ValueT>>(n);
-          break;
-        }
-        case ASTNodeDataType::bool_t: {
-          if constexpr (std::is_same_v<ValueT, TinyVector<1>>) {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, bool>>(n);
-            break;
-          }
-        }
-        case ASTNodeDataType::unsigned_int_t: {
-          if constexpr (std::is_same_v<ValueT, TinyVector<1>>) {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, uint64_t>>(n);
-            break;
-          }
-        }
-        case ASTNodeDataType::int_t: {
-          if constexpr (std::is_same_v<ValueT, TinyVector<1>>) {
-            if (n.children[1]->is_type<language::integer>()) {
-              if (std::stoi(n.children[1]->string()) == 0) {
-                n.m_node_processor = std::make_unique<AffectationFromZeroProcessor<ValueT>>(n);
-                break;
-              }
-            }
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, int64_t>>(n);
-            break;
-          } else if (n.children[1]->is_type<language::integer>()) {
-            if (std::stoi(n.children[1]->string()) == 0) {
-              n.m_node_processor = std::make_unique<AffectationFromZeroProcessor<ValueT>>(n);
-              break;
-            }
-          }
-          // LCOV_EXCL_START
-          throw ParseError("unexpected error: invalid integral value", std::vector{n.children[1]->begin()});
-          // LCOV_EXCL_STOP
-        }
-        case ASTNodeDataType::double_t: {
-          if constexpr (std::is_same_v<ValueT, TinyVector<1>>) {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, double>>(n);
-            break;
-          }
-        }
-          // LCOV_EXCL_START
-        default: {
-          throw ParseError("unexpected error: invalid operand type", std::vector{n.children[1]->begin()});
-        }
-          // LCOV_EXCL_STOP
-        }
-      } else if constexpr (std::is_same_v<OperatorT, language::pluseq_op> or
-                           std::is_same_v<OperatorT, language::minuseq_op>) {
-        switch (data_type) {
-        case ASTNodeDataType::vector_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, ValueT>>(n);
-          break;
-        }
-          // LCOV_EXCL_START
-        default: {
-          throw ParseError("unexpected error: invalid operand type", std::vector{n.children[1]->begin()});
-        }
-          // LCOV_EXCL_STOP
-        }
-      } else if constexpr (std::is_same_v<OperatorT, language::multiplyeq_op>) {
-        switch (data_type) {
-        case ASTNodeDataType::bool_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, bool>>(n);
-          break;
-        }
-        case ASTNodeDataType::unsigned_int_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, uint64_t>>(n);
-          break;
-        }
-        case ASTNodeDataType::int_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, int64_t>>(n);
-          break;
-        }
-        case ASTNodeDataType::double_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, ValueT, double>>(n);
-          break;
-        }
-        default: {
-          throw ParseError("expecting scalar operand type", std::vector{n.children[1]->begin()});
-        }
-        }
-      } else {
-        throw ParseError("invalid affectation operator for " + dataTypeName(n.m_data_type), std::vector{n.begin()});
-      }
-    };
-
-    auto set_affectation_processor_for_string_data = [&](const ASTNodeDataType& data_type) {
-      using OperatorT = std::decay_t<decltype(operator_v)>;
-
-      if constexpr (std::is_same_v<OperatorT, language::eq_op> or std::is_same_v<OperatorT, language::pluseq_op>) {
-        switch (data_type) {
-        case ASTNodeDataType::bool_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, bool>>(n);
-          break;
-        }
-        case ASTNodeDataType::unsigned_int_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, uint64_t>>(n);
-          break;
-        }
-        case ASTNodeDataType::int_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, int64_t>>(n);
-          break;
-        }
-        case ASTNodeDataType::double_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, double>>(n);
-          break;
-        }
-        case ASTNodeDataType::string_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, std::string>>(n);
-          break;
-        }
-        case ASTNodeDataType::vector_t: {
-          switch (data_type.dimension()) {
-          case 1: {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, TinyVector<1>>>(n);
-            break;
-          }
-          case 2: {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, TinyVector<2>>>(n);
-            break;
-          }
-          case 3: {
-            n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, std::string, TinyVector<3>>>(n);
-            break;
-          }
-            // LCOV_EXCL_START
-          default: {
-            throw ParseError("unexpected error: invalid vector dimension for string affectation",
-                             std::vector{n.children[1]->begin()});
-          }
-            // LCOV_EXCL_STOP
-          }
-          break;
-        }
-          // LCOV_EXCL_START
-        default: {
-          throw ParseError("unexpected error: undefined operand type for string affectation",
-                           std::vector{n.children[1]->begin()});
-        }
-          // LCOV_EXCL_STOP
-        }
-      } else {
-        throw ParseError("invalid affectation operator for string", std::vector{n.begin()});
-      }
-    };
-
-    auto set_affectation_processor_for_embedded_data = [&](const ASTNodeDataType& data_type) {
-      using OperatorT = std::decay_t<decltype(operator_v)>;
-
-      if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
-        switch (data_type) {
-        case ASTNodeDataType::type_id_t: {
-          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, EmbeddedData, EmbeddedData>>(n);
-          break;
-        }
-          // LCOV_EXCL_START
-        default: {
-          throw ParseError("unexpected error: undefined operand type for embedded data affectation",
-                           std::vector{n.children[1]->begin()});
-        }
-          // LCOV_EXCL_STOP
-        }
-      } else {
-        throw ParseError("invalid affectation operator for '" + dataTypeName(n.children[0]->m_data_type) + "'",
-                         std::vector{n.begin()});
-      }
-    };
-
-    auto set_affectation_processor_for_tuple_data = [&](const ASTNodeDataType& content_data_type,
-                                                        const ASTNodeDataType& data_type) {
-      using OperatorT = std::decay_t<decltype(operator_v)>;
-      if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
-        if ((data_type == ASTNodeDataType::list_t) or (data_type == ASTNodeDataType::tuple_t)) {
-          switch (content_data_type) {
-          case ASTNodeDataType::type_id_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, EmbeddedData>>(n);
-            break;
-          }
-          case ASTNodeDataType::bool_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, bool>>(n);
-            break;
-          }
-          case ASTNodeDataType::unsigned_int_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, uint64_t>>(n);
-            break;
-          }
-          case ASTNodeDataType::int_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, int64_t>>(n);
-            break;
-          }
-          case ASTNodeDataType::double_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, double>>(n);
-            break;
-          }
-          case ASTNodeDataType::string_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, std::string>>(n);
-            break;
-          }
-          case ASTNodeDataType::vector_t: {
-            switch (content_data_type.dimension()) {
-            case 1: {
-              n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, TinyVector<1>>>(n);
-              break;
-            }
-            case 2: {
-              n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, TinyVector<2>>>(n);
-              break;
-            }
-            case 3: {
-              n.m_node_processor = std::make_unique<AffectationToTupleFromListProcessor<OperatorT, TinyVector<3>>>(n);
-              break;
-            }
-              // LCOV_EXCL_START
-            default: {
-              throw ParseError("unexpected error: invalid vector dimension for tuple affectation",
-                               std::vector{n.children[1]->begin()});
-            }
-              // LCOV_EXCL_STOP
-            }
-            break;
-          }
-            // LCOV_EXCL_START
-          default: {
-            throw UnexpectedError("invalid tuple content " + dataTypeName(content_data_type));
-          }
-            // LCOV_EXCL_STOP
-          }
-        } else {
-          switch (content_data_type) {
-          case ASTNodeDataType::type_id_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, EmbeddedData>>(n);
-            break;
-          }
-          case ASTNodeDataType::bool_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, bool>>(n);
-            break;
-          }
-          case ASTNodeDataType::unsigned_int_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, uint64_t>>(n);
-            break;
-          }
-          case ASTNodeDataType::int_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, int64_t>>(n);
-            break;
-          }
-          case ASTNodeDataType::double_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, double>>(n);
-            break;
-          }
-          case ASTNodeDataType::string_t: {
-            n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, std::string>>(n);
-            break;
-          }
-          case ASTNodeDataType::vector_t: {
-            switch (content_data_type.dimension()) {
-            case 1: {
-              n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, TinyVector<1>>>(n);
-              break;
-            }
-            case 2: {
-              n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, TinyVector<2>>>(n);
-              break;
-            }
-            case 3: {
-              n.m_node_processor = std::make_unique<AffectationToTupleProcessor<OperatorT, TinyVector<3>>>(n);
-              break;
-            }
-              // LCOV_EXCL_START
-            default: {
-              throw ParseError("unexpected error: invalid vector dimension for tuple affectation",
-                               std::vector{n.children[1]->begin()});
-            }
-              // LCOV_EXCL_STOP
-            }
-            break;
-          }
-          // LCOV_EXCL_START
-          default: {
-            throw ParseError("unexpected error: undefined operand type for tuple affectation",
-                             std::vector{n.children[1]->begin()});
-          }
-            // LCOV_EXCL_STOP
-          }
-        }
-      } else {
-        throw ParseError("invalid affectation operator for '" + dataTypeName(n.children[0]->m_data_type) + "'",
-                         std::vector{n.begin()});
-      }
-    };
-
-    auto set_affectation_processor_for_value = [&](const ASTNodeDataType& value_type) {
-      const ASTNodeDataType data_type = n.children[1]->m_data_type;
-
-      switch (value_type) {
-      case ASTNodeDataType::bool_t: {
-        set_affectation_processor_for_data(bool{}, data_type);
-        break;
-      }
-      case ASTNodeDataType::unsigned_int_t: {
-        set_affectation_processor_for_data(uint64_t{}, data_type);
-        break;
-      }
-      case ASTNodeDataType::int_t: {
-        set_affectation_processor_for_data(int64_t{}, data_type);
-        break;
-      }
-      case ASTNodeDataType::double_t: {
-        set_affectation_processor_for_data(double{}, data_type);
-        break;
-      }
-      case ASTNodeDataType::vector_t: {
-        switch (value_type.dimension()) {
-        case 1: {
-          set_affectation_processor_for_vector_data(TinyVector<1>{}, data_type);
-          break;
-        }
-        case 2: {
-          set_affectation_processor_for_vector_data(TinyVector<2>{}, data_type);
-          break;
-        }
-        case 3: {
-          set_affectation_processor_for_vector_data(TinyVector<3>{}, data_type);
-          break;
-        }
-          // LCOV_EXCL_START
-        default: {
-          throw ParseError("unexpected error: unexpected vector dimension", std::vector{n.begin()});
-        }
-          // LCOV_EXCL_STOP
-        }
-        break;
-      }
-      case ASTNodeDataType::string_t: {
-        set_affectation_processor_for_string_data(data_type);
-        break;
-      }
-      case ASTNodeDataType::type_id_t: {
-        set_affectation_processor_for_embedded_data(data_type);
-        break;
-      }
-      case ASTNodeDataType::tuple_t: {
-        const ASTNodeDataType& content_type = value_type.contentType();
-        set_affectation_processor_for_tuple_data(content_type, data_type);
-        break;
-      }
-      default: {
-        throw ParseError("unexpected error: undefined value type for affectation", std::vector{n.children[0]->begin()});
-      }
-      }
-    };
-
-    using OperatorT = std::decay_t<decltype(operator_v)>;
-
-    const ASTNodeDataType& target_data_type = n.children[0]->m_data_type;
-    const ASTNodeDataType& source_data_type = n.children[1]->m_data_type;
-
-    // Special treatment dedicated to R^1 to be able to initialize them
-    if (((target_data_type != source_data_type) and (target_data_type == ASTNodeDataType::vector_t) and
-         (target_data_type.dimension() == 1)) or
-        // Special treatment for R^d vectors and operator *=
-        ((target_data_type == ASTNodeDataType::vector_t) and (source_data_type != ASTNodeDataType::vector_t) and
-         std::is_same_v<OperatorT, language::multiplyeq_op>)) {
-      ASTNodeNaturalConversionChecker{*n.children[1], ASTNodeDataType::build<ASTNodeDataType::double_t>()};
+  const ASTNodeDataType& target_data_type = n.children[0]->m_data_type;
+  const ASTNodeDataType& source_data_type = n.children[1]->m_data_type;
+
+  const std::string affectation_name = [&] {
+    if (n.is_type<language::eq_op>()) {
+      return affectationMangler<language::eq_op>(target_data_type, source_data_type);
+    } else if (n.is_type<language::multiplyeq_op>()) {
+      return affectationMangler<language::multiplyeq_op>(target_data_type, source_data_type);
+    } else if (n.is_type<language::divideeq_op>()) {
+      return affectationMangler<language::divideeq_op>(target_data_type, source_data_type);
+    } else if (n.is_type<language::pluseq_op>()) {
+      return affectationMangler<language::pluseq_op>(target_data_type, source_data_type);
+    } else if (n.is_type<language::minuseq_op>()) {
+      return affectationMangler<language::minuseq_op>(target_data_type, source_data_type);
     } else {
-      ASTNodeNaturalConversionChecker{*n.children[1], target_data_type};
+      throw ParseError("unexpected error: undefined affectation operator", std::vector{n.begin()});
     }
+  }();
+
+  // Special treatment dedicated to R^1 to be able to initialize them
+  if (((target_data_type != source_data_type) and (target_data_type == ASTNodeDataType::vector_t) and
+       (target_data_type.dimension() == 1)) or
+      // Special treatment for R^d vectors and operator *=
+      ((target_data_type == ASTNodeDataType::vector_t) and (source_data_type != ASTNodeDataType::vector_t) and
+       n.is_type<language::multiplyeq_op>())) {
+    ASTNodeNaturalConversionChecker{*n.children[1], ASTNodeDataType::build<ASTNodeDataType::double_t>()};
+  } else {
+    ASTNodeNaturalConversionChecker{*n.children[1], target_data_type};
+  }
 
-    set_affectation_processor_for_value(target_data_type);
-  };
+  const auto& optional_processor_builder =
+    OperatorRepository::instance().getAffectationProcessorBuilder(affectation_name);
 
-  if (n.is_type<language::eq_op>()) {
-    set_affectation_processor(n, language::eq_op{});
-  } else if (n.is_type<language::multiplyeq_op>()) {
-    set_affectation_processor(n, language::multiplyeq_op{});
-  } else if (n.is_type<language::divideeq_op>()) {
-    set_affectation_processor(n, language::divideeq_op{});
-  } else if (n.is_type<language::pluseq_op>()) {
-    set_affectation_processor(n, language::pluseq_op{});
-  } else if (n.is_type<language::minuseq_op>()) {
-    set_affectation_processor(n, language::minuseq_op{});
+  if (optional_processor_builder.has_value()) {
+    n.m_node_processor = optional_processor_builder.value()->getNodeProcessor(n);
   } else {
-    throw ParseError("unexpected error: undefined affectation operator", std::vector{n.begin()});
+    std::ostringstream error_message;
+    error_message << "undefined affectation type: ";
+    error_message << rang::fgB::red << affectation_name << rang::fg::reset;
+
+    throw ParseError(error_message.str(), std::vector{n.children[0]->begin()});
   }
 }
diff --git a/src/language/ast/ASTNodeNaturalConversionChecker.hpp b/src/language/ast/ASTNodeNaturalConversionChecker.hpp
index ebf83d7ca3d750d33fe6d18a6d0388bdea4c627c..9e96e49b90d5f7931aa4796a10f67dee0cfff6db 100644
--- a/src/language/ast/ASTNodeNaturalConversionChecker.hpp
+++ b/src/language/ast/ASTNodeNaturalConversionChecker.hpp
@@ -2,8 +2,8 @@
 #define AST_NODE_NATURAL_CONVERSION_CHECKER_HPP
 
 #include <language/ast/ASTNode.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
 #include <language/ast/ASTNodeSubDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 
 struct AllowRToR1Conversion
 {
diff --git a/src/language/ast/ASTNodeSubDataType.hpp b/src/language/ast/ASTNodeSubDataType.hpp
index d7844d367ae686fe88e05bc119d198288eca45c6..358aca9a1419309796b9fcb9baf8eb9825e7a4eb 100644
--- a/src/language/ast/ASTNodeSubDataType.hpp
+++ b/src/language/ast/ASTNodeSubDataType.hpp
@@ -2,7 +2,7 @@
 #define AST_NODE_SUB_DATA_TYPE_HPP
 
 #include <language/ast/ASTNode.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 
 struct ASTNodeSubDataType
 {
diff --git a/src/language/ast/CMakeLists.txt b/src/language/ast/CMakeLists.txt
index f4c31774302ccff20b3d24f686fd7e381ff43822..458690fbd4fa341b257fcfe997e489048d1f961c 100644
--- a/src/language/ast/CMakeLists.txt
+++ b/src/language/ast/CMakeLists.txt
@@ -9,7 +9,7 @@ add_library(PugsLanguageAST
   ASTNodeBuiltinFunctionExpressionBuilder.cpp
   ASTNodeDataTypeBuilder.cpp
   ASTNodeDataTypeChecker.cpp
-  ASTNodeDataType.cpp
+#  ASTNodeDataType.cpp
   ASTNodeDataTypeFlattener.cpp
   ASTNodeDeclarationToAffectationConverter.cpp
   ASTNodeEmptyBlockCleaner.cpp
diff --git a/src/language/modules/BuiltinModule.hpp b/src/language/modules/BuiltinModule.hpp
index 6ea3ee56ae6f4b8c3cbfd86ede3370a638d0bff4..2be1d162578fb0d111e6eac7ae93e10dae981bce 100644
--- a/src/language/modules/BuiltinModule.hpp
+++ b/src/language/modules/BuiltinModule.hpp
@@ -1,8 +1,8 @@
 #ifndef BUILTIN_MODULE_HPP
 #define BUILTIN_MODULE_HPP
 
-#include <language/ast/ASTNodeDataType.hpp>
 #include <language/modules/IModule.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 
 class IBuiltinFunctionEmbedder;
 class TypeDescriptor;
diff --git a/src/language/modules/ModuleRepository.cpp b/src/language/modules/ModuleRepository.cpp
index abb5d527d4858f86ff3a25e68f4d666c2da8193b..65bfcafd1f1c85f077a97f6e932fa97da0079537 100644
--- a/src/language/modules/ModuleRepository.cpp
+++ b/src/language/modules/ModuleRepository.cpp
@@ -8,6 +8,7 @@
 #include <language/modules/SchemeModule.hpp>
 #include <language/modules/UtilsModule.hpp>
 #include <language/modules/VTKModule.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
 #include <language/utils/BuiltinFunctionEmbedder.hpp>
 #include <language/utils/ParseError.hpp>
 #include <language/utils/SymbolTable.hpp>
@@ -77,6 +78,11 @@ ModuleRepository::populateSymbolTable(const ASTNode& module_name_node, SymbolTab
     this->_populateEmbedderTableT(module_name_node, module_name, populating_module.getNameTypeMap(),
                                   ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>(), symbol_table,
                                   symbol_table.typeEmbedderTable());
+
+    for (auto [symbol_name, embedded] : populating_module.getNameTypeMap()) {
+      BasicAffectationRegisterFor<EmbeddedData>(ASTNodeDataType::build<ASTNodeDataType::type_id_t>(symbol_name));
+    }
+
   } else {
     throw ParseError(std::string{"could not find module "} + module_name, std::vector{module_name_node.begin()});
   }
diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp
index 6cdb19dfdd36359f6cd798149c7f2908770aadd0..88d4488365427aecbffd48abf9e37a3b08e55707 100644
--- a/src/language/node_processor/AffectationProcessor.hpp
+++ b/src/language/node_processor/AffectationProcessor.hpp
@@ -391,7 +391,7 @@ class AffectationToTinyVectorFromListProcessor final : public INodeProcessor
   }
 };
 
-template <typename OperatorT, typename ValueT>
+template <typename ValueT>
 class AffectationToTupleProcessor final : public INodeProcessor
 {
  private:
@@ -403,7 +403,6 @@ class AffectationToTupleProcessor final : public INodeProcessor
   DataVariant
   execute(ExecutionPolicy& exec_policy)
   {
-    static_assert(std::is_same_v<OperatorT, language::eq_op>, "forbidden affection operator to tuples");
     DataVariant value = m_node.children[1]->execute(exec_policy);
 
     std::visit(
@@ -450,7 +449,7 @@ class AffectationToTupleProcessor final : public INodeProcessor
   }
 };
 
-template <typename OperatorT, typename ValueT>
+template <typename ValueT>
 class AffectationToTupleFromListProcessor final : public INodeProcessor
 {
  private:
@@ -562,8 +561,6 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor
   DataVariant
   execute(ExecutionPolicy& exec_policy)
   {
-    static_assert(std::is_same_v<OperatorT, language::eq_op>, "forbidden affection operator for list to tuple");
-
     std::visit(
       [&](auto&& value_list) {
         using ValueListT = std::decay_t<decltype(value_list)>;
diff --git a/src/language/ast/ASTNodeDataType.cpp b/src/language/utils/ASTNodeDataType.cpp
similarity index 99%
rename from src/language/ast/ASTNodeDataType.cpp
rename to src/language/utils/ASTNodeDataType.cpp
index 1f0847f865a6972e7865f4b50601898ab5930616..02a352ac3d0f7435c89445d4113b037bd0f54c2c 100644
--- a/src/language/ast/ASTNodeDataType.cpp
+++ b/src/language/utils/ASTNodeDataType.cpp
@@ -1,4 +1,4 @@
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 
 #include <language/PEGGrammar.hpp>
 #include <language/ast/ASTNode.hpp>
diff --git a/src/language/ast/ASTNodeDataType.hpp b/src/language/utils/ASTNodeDataType.hpp
similarity index 100%
rename from src/language/ast/ASTNodeDataType.hpp
rename to src/language/utils/ASTNodeDataType.hpp
diff --git a/src/language/utils/ASTNodeDataTypeTraits.hpp b/src/language/utils/ASTNodeDataTypeTraits.hpp
index 946d63483dc8a61c33ade0b223c0619a66880fdd..ed668e5e40e1ff4920602014367f379aa384adb9 100644
--- a/src/language/utils/ASTNodeDataTypeTraits.hpp
+++ b/src/language/utils/ASTNodeDataTypeTraits.hpp
@@ -1,8 +1,8 @@
-#ifndef AST_NODE_DATA_TYPE_TRAITS_H
-#define AST_NODE_DATA_TYPE_TRAITS_H
+#ifndef AST_NODE_DATA_TYPE_TRAITS_HPP
+#define AST_NODE_DATA_TYPE_TRAITS_HPP
 
 #include <algebra/TinyVector.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/FunctionSymbolId.hpp>
 
 #include <vector>
@@ -32,4 +32,4 @@ template <typename T>
 inline ASTNodeDataType ast_node_data_type_from<std::vector<T>> =
   ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type_from<T>);
 
-#endif   // AST_NODE_DATA_TYPE_TRAITS_H
+#endif   // AST_NODE_DATA_TYPE_TRAITS_HPP
diff --git a/src/language/utils/AffectationMangler.hpp b/src/language/utils/AffectationMangler.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b128da936298916241bb7b0bac1be73c53324361
--- /dev/null
+++ b/src/language/utils/AffectationMangler.hpp
@@ -0,0 +1,54 @@
+#ifndef AFFECTATION_MANGLER_HPP
+#define AFFECTATION_MANGLER_HPP
+
+#include <language/utils/ASTNodeDataType.hpp>
+#include <utils/Exceptions.hpp>
+
+#include <string>
+
+namespace language
+{
+struct eq_op;
+struct multiplyeq_op;
+struct divideeq_op;
+struct pluseq_op;
+struct minuseq_op;
+}   // namespace language
+
+template <typename AffectationOperatorT>
+std::string
+affectationMangler(const ASTNodeDataType& lhs, const ASTNodeDataType& rhs)
+{
+  const std::string lhs_name = dataTypeName(lhs);
+
+  const std::string operator_name = [] {
+    if constexpr (std::is_same_v<language::eq_op, AffectationOperatorT>) {
+      return "=";
+    } else if constexpr (std::is_same_v<language::multiplyeq_op, AffectationOperatorT>) {
+      return "*=";
+    } else if constexpr (std::is_same_v<language::divideeq_op, AffectationOperatorT>) {
+      return "/=";
+    } else if constexpr (std::is_same_v<language::pluseq_op, AffectationOperatorT>) {
+      return "+=";
+    } else if constexpr (std::is_same_v<language::minuseq_op, AffectationOperatorT>) {
+      return "-=";
+    } else {
+      // LCOV_EXCL_START
+      throw UnexpectedError("undefined affectation operator");
+      // LCOV_EXCL_STOP
+    }
+  }();
+
+  const std::string rhs_name = [&]() -> std::string {
+    if (rhs == ASTNodeDataType::list_t) {
+      return "list";
+    } else if (rhs == ASTNodeDataType::tuple_t) {
+      return "tuple";
+    } else {
+      return dataTypeName(rhs);
+    }
+  }();
+  return lhs_name + " " + operator_name + " " + rhs_name;
+}
+
+#endif   // AFFECTATION_MANGLER_HPP
diff --git a/src/language/utils/AffectationProcessorBuilder.hpp b/src/language/utils/AffectationProcessorBuilder.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..02042ad8825c7c890727edba6dd5dc41691a7d9e
--- /dev/null
+++ b/src/language/utils/AffectationProcessorBuilder.hpp
@@ -0,0 +1,86 @@
+#ifndef AFFECTATION_PROCESSOR_BUILDER_HPP
+#define AFFECTATION_PROCESSOR_BUILDER_HPP
+
+#include <algebra/TinyVector.hpp>
+#include <language/PEGGrammar.hpp>
+#include <language/node_processor/AffectationProcessor.hpp>
+#include <language/utils/IAffectationProcessorBuilder.hpp>
+
+#include <type_traits>
+
+template <typename OperatorT, typename ValueT, typename DataT>
+class AffectationProcessorBuilder final : public IAffectationProcessorBuilder
+{
+ public:
+  AffectationProcessorBuilder() = default;
+  std::unique_ptr<INodeProcessor>
+  getNodeProcessor(ASTNode& node) const
+  {
+    if constexpr (std::is_same_v<ValueT, TinyVector<1>> and std::is_same_v<DataT, int64_t> and
+                  std::is_same_v<OperatorT, language::eq_op>) {
+      // Special treatment for the case 0 -> R^1
+      if ((node.children[1]->is_type<language::integer>()) and (std::stoi(node.children[1]->string()) == 0)) {
+        return std::make_unique<AffectationFromZeroProcessor<ValueT>>(node);
+      } else {
+        return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(node);
+      }
+    } else {
+      return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(node);
+    }
+  }
+};
+
+template <typename ValueT>
+class AffectationToTupleProcessorBuilder final : public IAffectationProcessorBuilder
+{
+ public:
+  AffectationToTupleProcessorBuilder() = default;
+  std::unique_ptr<INodeProcessor>
+  getNodeProcessor(ASTNode& node) const
+  {
+    return std::make_unique<AffectationToTupleProcessor<ValueT>>(node);
+  }
+};
+
+template <typename ValueT>
+class AffectationToTupleFromListProcessorBuilder final : public IAffectationProcessorBuilder
+{
+ public:
+  AffectationToTupleFromListProcessorBuilder() = default;
+  std::unique_ptr<INodeProcessor>
+  getNodeProcessor(ASTNode& node) const
+  {
+    return std::make_unique<AffectationToTupleFromListProcessor<ValueT>>(node);
+  }
+};
+
+template <typename OperatorT, typename ValueT>
+class AffectationToTinyVectorFromListProcessorBuilder final : public IAffectationProcessorBuilder
+{
+ public:
+  AffectationToTinyVectorFromListProcessorBuilder() = default;
+  std::unique_ptr<INodeProcessor>
+  getNodeProcessor(ASTNode& node) const
+  {
+    return std::make_unique<AffectationToTinyVectorFromListProcessor<OperatorT, ValueT>>(node);
+  }
+};
+
+template <typename OperatorT, typename ValueT>
+class AffectationFromZeroProcessorBuilder final : public IAffectationProcessorBuilder
+{
+ public:
+  AffectationFromZeroProcessorBuilder() = default;
+  std::unique_ptr<INodeProcessor>
+  getNodeProcessor(ASTNode& node) const
+  {
+    if (std::stoi(node.children[1]->string()) == 0) {
+      return std::make_unique<AffectationFromZeroProcessor<ValueT>>(node);
+    }
+    // LCOV_EXCL_START
+    throw ParseError("unexpected error: invalid integral value", std::vector{node.children[1]->begin()});
+    // LCOV_EXCL_STOP
+  }
+};
+
+#endif   // AFFECTATION_PROCESSOR_BUILDER_HPP
diff --git a/src/language/utils/AffectationRegisterForB.cpp b/src/language/utils/AffectationRegisterForB.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..69feaee7066a7d95f17bf539df75e46cf3fe27c5
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForB.cpp
@@ -0,0 +1,10 @@
+#include <language/utils/AffectationRegisterForB.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+AffectationRegisterForB::AffectationRegisterForB()
+{
+  BasicAffectationRegisterFor<bool>{};
+}
diff --git a/src/language/utils/AffectationRegisterForB.hpp b/src/language/utils/AffectationRegisterForB.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4064d498890563e433c325696e447045e00b495d
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForB.hpp
@@ -0,0 +1,12 @@
+#ifndef AFFECTATION_REGISTER_FOR_B_HPP
+#define AFFECTATION_REGISTER_FOR_B_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForB
+{
+ public:
+  AffectationRegisterForB();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_B_HPP
diff --git a/src/language/utils/AffectationRegisterForN.cpp b/src/language/utils/AffectationRegisterForN.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e7d54008f22845f8233b8475091c8cec774c6756
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForN.cpp
@@ -0,0 +1,120 @@
+#include <language/utils/AffectationRegisterForN.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForN::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>();
+
+  repository
+    .addAffectation<language::eq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                     std::make_shared<AffectationProcessorBuilder<language::eq_op, uint64_t, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, uint64_t, int64_t>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N),
+                                             ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<uint64_t>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<uint64_t>>());
+}
+
+void
+AffectationRegisterForN::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>();
+
+  repository.addAffectation<
+    language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, bool>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForN::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>();
+
+  repository.addAffectation<
+    language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, bool>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForN::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>();
+
+  repository.addAffectation<
+    language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                             std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, uint64_t, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, uint64_t, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, uint64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForN::_register_divideeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>();
+
+  repository.addAffectation<
+    language::divideeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, uint64_t, bool>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, uint64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, uint64_t, int64_t>>());
+}
+
+AffectationRegisterForN::AffectationRegisterForN()
+{
+  BasicAffectationRegisterFor<uint64_t>{};
+
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+  this->_register_divideeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForN.hpp b/src/language/utils/AffectationRegisterForN.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..56f7699e8874a93823a90c4a2078c1fac7a7eabd
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForN.hpp
@@ -0,0 +1,19 @@
+#ifndef AFFECTATION_REGISTER_FOR_N_HPP
+#define AFFECTATION_REGISTER_FOR_N_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForN
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+  void _register_divideeq_op();
+
+ public:
+  AffectationRegisterForN();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_N_HPP
diff --git a/src/language/utils/AffectationRegisterForR.cpp b/src/language/utils/AffectationRegisterForR.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ae7c63c4031f39871f64713c39cc7dcba8e0bae4
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR.cpp
@@ -0,0 +1,141 @@
+#include <language/utils/AffectationRegisterForR.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForR::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
+
+  repository
+    .addAffectation<language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                     std::make_shared<AffectationProcessorBuilder<language::eq_op, double, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, double, uint64_t>>());
+
+  repository
+    .addAffectation<language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                     std::make_shared<AffectationProcessorBuilder<language::eq_op, double, int64_t>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R),
+                                             ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<double>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R),
+                                             ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<double>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<double>>());
+}
+
+void
+AffectationRegisterForR::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
+
+  repository.addAffectation<
+    language::pluseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, double, bool>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, double, uint64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, double, int64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(R, R, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, double, double>>());
+}
+
+void
+AffectationRegisterForR::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
+
+  repository.addAffectation<
+    language::minuseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, double, bool>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, double, uint64_t>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, double, int64_t>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(R, R, std::make_shared<AffectationProcessorBuilder<language::minuseq_op, double, double>>());
+}
+
+void
+AffectationRegisterForR::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
+
+  repository.addAffectation<
+    language::multiplyeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                             std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, double, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, double, uint64_t>>());
+
+  repository.addAffectation<
+    language::multiplyeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                             std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, double, int64_t>>());
+
+  repository.addAffectation<
+    language::multiplyeq_op>(R, R,
+                             std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, double, double>>());
+}
+
+void
+AffectationRegisterForR::_register_divideeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>();
+
+  repository.addAffectation<
+    language::divideeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, double, bool>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, double, uint64_t>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, double, int64_t>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(R, R,
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, double, double>>());
+}
+
+AffectationRegisterForR::AffectationRegisterForR()
+{
+  BasicAffectationRegisterFor<double>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+  this->_register_divideeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForR.hpp b/src/language/utils/AffectationRegisterForR.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..141a0d8ae86f6c2e6355cd1ca74e801fc00bc0f0
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR.hpp
@@ -0,0 +1,19 @@
+#ifndef AFFECTATION_REGISTER_FOR_R_HPP
+#define AFFECTATION_REGISTER_FOR_R_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForR
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+  void _register_divideeq_op();
+
+ public:
+  AffectationRegisterForR();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_R_HPP
diff --git a/src/language/utils/AffectationRegisterForR1.cpp b/src/language/utils/AffectationRegisterForR1.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..20873d6fda648ee254ae5cca965026a30033c92a
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR1.cpp
@@ -0,0 +1,102 @@
+#include <language/utils/AffectationRegisterForR1.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForR1::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1);
+
+  repository.addAffectation<
+    language::eq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<1>, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<1>, uint64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<1>, int64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<1>, double>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1),
+                                             ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<1>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1),
+                                             ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<1>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<1>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1),
+                                             ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<1>>>());
+}
+
+void
+AffectationRegisterForR1::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1);
+
+  repository.addAffectation<language::pluseq_op>(R1, R1,
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, TinyVector<1>, TinyVector<1>>>());
+}
+
+void
+AffectationRegisterForR1::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1);
+
+  repository.addAffectation<language::minuseq_op>(R1, R1,
+                                                  std::make_shared<AffectationProcessorBuilder<
+                                                    language::minuseq_op, TinyVector<1>, TinyVector<1>>>());
+}
+
+void
+AffectationRegisterForR1::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1);
+
+  repository.addAffectation<language::multiplyeq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<1>, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<1>, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<1>, int64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R1, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<1>, double>>());
+}
+
+AffectationRegisterForR1::AffectationRegisterForR1()
+{
+  BasicAffectationRegisterFor<TinyVector<1>>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForR1.hpp b/src/language/utils/AffectationRegisterForR1.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..04016bd6742c9635f2a3599d0852186364a81350
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR1.hpp
@@ -0,0 +1,18 @@
+#ifndef AFFECTATION_REGISTER_FOR_R1_HPP
+#define AFFECTATION_REGISTER_FOR_R1_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForR1
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+
+ public:
+  AffectationRegisterForR1();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_R1_HPP
diff --git a/src/language/utils/AffectationRegisterForR2.cpp b/src/language/utils/AffectationRegisterForR2.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0fca199a929d2f35698cc6857f80a0b127352607
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR2.cpp
@@ -0,0 +1,84 @@
+#include <language/utils/AffectationRegisterForR2.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForR2::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2);
+
+  repository.addAffectation<
+    language::eq_op>(R2, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationFromZeroProcessorBuilder<language::eq_op, TinyVector<2>>>());
+
+  repository.addAffectation<language::eq_op>(R2,
+                                             ASTNodeDataType::build<ASTNodeDataType::list_t>(
+                                               std::vector<std::shared_ptr<const ASTNodeDataType>>{}),
+                                             std::make_shared<AffectationToTinyVectorFromListProcessorBuilder<
+                                               language::eq_op, TinyVector<2>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R2),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<2>>>());
+}
+
+void
+AffectationRegisterForR2::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2);
+
+  repository.addAffectation<language::pluseq_op>(R2, R2,
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, TinyVector<2>, TinyVector<2>>>());
+}
+
+void
+AffectationRegisterForR2::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2);
+
+  repository.addAffectation<language::minuseq_op>(R2, R2,
+                                                  std::make_shared<AffectationProcessorBuilder<
+                                                    language::minuseq_op, TinyVector<2>, TinyVector<2>>>());
+}
+
+void
+AffectationRegisterForR2::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2);
+
+  repository.addAffectation<language::multiplyeq_op>(R2, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<2>, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R2, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<2>, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R2, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<2>, int64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R2, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<2>, double>>());
+}
+
+AffectationRegisterForR2::AffectationRegisterForR2()
+{
+  BasicAffectationRegisterFor<TinyVector<2>>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForR2.hpp b/src/language/utils/AffectationRegisterForR2.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..0c1c5c1fa51f0282cfb4a63de15b4f0c015d8fd4
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR2.hpp
@@ -0,0 +1,18 @@
+#ifndef AFFECTATION_REGISTER_FOR_R2_HPP
+#define AFFECTATION_REGISTER_FOR_R2_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForR2
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+
+ public:
+  AffectationRegisterForR2();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_R2_HPP
diff --git a/src/language/utils/AffectationRegisterForR3.cpp b/src/language/utils/AffectationRegisterForR3.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d5925d7bcb828bc013cefbb130626dce9af9ddec
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR3.cpp
@@ -0,0 +1,84 @@
+#include <language/utils/AffectationRegisterForR3.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForR3::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3);
+
+  repository.addAffectation<
+    language::eq_op>(R3, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationFromZeroProcessorBuilder<language::eq_op, TinyVector<3>>>());
+
+  repository.addAffectation<language::eq_op>(R3,
+                                             ASTNodeDataType::build<ASTNodeDataType::list_t>(
+                                               std::vector<std::shared_ptr<const ASTNodeDataType>>{}),
+                                             std::make_shared<AffectationToTinyVectorFromListProcessorBuilder<
+                                               language::eq_op, TinyVector<3>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R3),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<3>>>());
+}
+
+void
+AffectationRegisterForR3::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3);
+
+  repository.addAffectation<language::pluseq_op>(R3, R3,
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, TinyVector<3>, TinyVector<3>>>());
+}
+
+void
+AffectationRegisterForR3::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3);
+
+  repository.addAffectation<language::minuseq_op>(R3, R3,
+                                                  std::make_shared<AffectationProcessorBuilder<
+                                                    language::minuseq_op, TinyVector<3>, TinyVector<3>>>());
+}
+
+void
+AffectationRegisterForR3::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3);
+
+  repository.addAffectation<language::multiplyeq_op>(R3, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<3>, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R3, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<3>, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R3, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<3>, int64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(R3, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<3>, double>>());
+}
+
+AffectationRegisterForR3::AffectationRegisterForR3()
+{
+  BasicAffectationRegisterFor<TinyVector<3>>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForR3.hpp b/src/language/utils/AffectationRegisterForR3.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..09ae3f3e85062e9f3e33bf02dac1693558ae49f1
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForR3.hpp
@@ -0,0 +1,18 @@
+#ifndef AFFECTATION_REGISTER_FOR_R3_HPP
+#define AFFECTATION_REGISTER_FOR_R3_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForR3
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+
+ public:
+  AffectationRegisterForR3();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_R3_HPP
diff --git a/src/language/utils/AffectationRegisterForString.cpp b/src/language/utils/AffectationRegisterForString.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..37446e243d6fcb14fcd6c3e97a845d17b831c2e6
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForString.cpp
@@ -0,0 +1,140 @@
+#include <language/utils/AffectationRegisterForString.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForString::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto string_t = ASTNodeDataType::build<ASTNodeDataType::string_t>();
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, uint64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, int64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, double_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<1>>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<2>>>());
+
+  repository.addAffectation<
+    language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<3>>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::vector_t>(1),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t),
+                                             ASTNodeDataType::build<ASTNodeDataType::vector_t>(3),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<std::string>>());
+}
+
+void
+AffectationRegisterForString::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto string_t = ASTNodeDataType::build<ASTNodeDataType::string_t>();
+
+  repository.addAffectation<language::pluseq_op>(string_t, string_t,
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, std::string, std::string>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, bool>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, uint64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, int64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, double>>());
+
+  repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1),
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, std::string, TinyVector<1>>>());
+
+  repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, std::string, TinyVector<2>>>());
+
+  repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3),
+                                                 std::make_shared<AffectationProcessorBuilder<
+                                                   language::pluseq_op, std::string, TinyVector<3>>>());
+
+  // this->_addAffectation("string += string",
+  //                       std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string,
+  //                       std::string>>());
+  // this->_addAffectation("string += B",
+  //                       std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, bool>>());
+  // this->_addAffectation("string += N",
+  //                       std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, uint64_t>>());
+  // this->_addAffectation("string += Z",
+  //                       std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, int64_t>>());
+  // this->_addAffectation("string += R",
+  //                       std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, double>>());
+  // this
+  //   ->_addAffectation("string += R^1",
+  //                     std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string,
+  //                     TinyVector<1>>>());
+  // this
+  //   ->_addAffectation("string += R^2",
+  //                     std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string,
+  //                     TinyVector<2>>>());
+  // this
+  //   ->_addAffectation("string += R^3",
+  //                     std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string,
+  //                     TinyVector<3>>>());
+}
+
+AffectationRegisterForString::AffectationRegisterForString()
+{
+  BasicAffectationRegisterFor<std::string>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForString.hpp b/src/language/utils/AffectationRegisterForString.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2aa4b319ba1029ebffdc3dcd919f250dd963113e
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForString.hpp
@@ -0,0 +1,16 @@
+#ifndef AFFECTATION_REGISTER_FOR_STRING_HPP
+#define AFFECTATION_REGISTER_FOR_STRING_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForString
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+
+ public:
+  AffectationRegisterForString();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_STRING_HPP
diff --git a/src/language/utils/AffectationRegisterForZ.cpp b/src/language/utils/AffectationRegisterForZ.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9937a0edbaedce2ae054d02fc13d7c4e1168c698
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForZ.cpp
@@ -0,0 +1,119 @@
+#include <language/utils/AffectationRegisterForZ.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+void
+AffectationRegisterForZ::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>();
+
+  repository
+    .addAffectation<language::eq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                     std::make_shared<AffectationProcessorBuilder<language::eq_op, int64_t, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, int64_t, uint64_t>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z),
+                                             ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<int64_t>>());
+
+  repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z),
+                                             ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                             std::make_shared<AffectationToTupleProcessorBuilder<int64_t>>());
+}
+
+void
+AffectationRegisterForZ::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>();
+
+  repository.addAffectation<
+    language::pluseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, int64_t, bool>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, int64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::pluseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                         std::make_shared<AffectationProcessorBuilder<language::pluseq_op, int64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForZ::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>();
+
+  repository.addAffectation<
+    language::minuseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, int64_t, bool>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, int64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::minuseq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                          std::make_shared<AffectationProcessorBuilder<language::minuseq_op, int64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForZ::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>();
+
+  repository.addAffectation<
+    language::multiplyeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                             std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, int64_t, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, int64_t, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, int64_t, int64_t>>());
+}
+
+void
+AffectationRegisterForZ::_register_divideeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>();
+
+  repository.addAffectation<
+    language::divideeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, int64_t, bool>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, int64_t, uint64_t>>());
+
+  repository.addAffectation<
+    language::divideeq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                           std::make_shared<AffectationProcessorBuilder<language::divideeq_op, int64_t, int64_t>>());
+}
+
+AffectationRegisterForZ::AffectationRegisterForZ()
+{
+  BasicAffectationRegisterFor<int64_t>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+  this->_register_divideeq_op();
+}
diff --git a/src/language/utils/AffectationRegisterForZ.hpp b/src/language/utils/AffectationRegisterForZ.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..2f13e10f67bd02e7d616a16d271a7ffb14a2351f
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForZ.hpp
@@ -0,0 +1,19 @@
+#ifndef AFFECTATION_REGISTER_FOR_Z_HPP
+#define AFFECTATION_REGISTER_FOR_Z_HPP
+
+#include <language/utils/OperatorRepository.hpp>
+
+class AffectationRegisterForZ
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+  void _register_divideeq_op();
+
+ public:
+  AffectationRegisterForZ();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_Z_HPP
diff --git a/src/language/utils/BasicAffectationRegistrerFor.hpp b/src/language/utils/BasicAffectationRegistrerFor.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ccae4c32b596b39ce7b663da38e31e70c8dfbebc
--- /dev/null
+++ b/src/language/utils/BasicAffectationRegistrerFor.hpp
@@ -0,0 +1,36 @@
+#ifndef BASIC_AFFECTATION_REGISTRER_FOR_HPP
+#define BASIC_AFFECTATION_REGISTRER_FOR_HPP
+
+#include <language/utils/ASTNodeDataTypeTraits.hpp>
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+template <typename T>
+class BasicAffectationRegisterFor
+{
+ public:
+  BasicAffectationRegisterFor() : BasicAffectationRegisterFor(ast_node_data_type_from<T>) {}
+
+  BasicAffectationRegisterFor(const ASTNodeDataType& ast_node_data_type)
+  {
+    OperatorRepository& repository = OperatorRepository::instance();
+
+    repository.addAffectation<language::eq_op>(ast_node_data_type, ast_node_data_type,
+                                               std::make_shared<AffectationProcessorBuilder<language::eq_op, T, T>>());
+
+    repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type),
+                                               ast_node_data_type,
+                                               std::make_shared<AffectationToTupleProcessorBuilder<T>>());
+
+    repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type),
+                                               ASTNodeDataType::build<ASTNodeDataType::list_t>(
+                                                 std::vector<std::shared_ptr<const ASTNodeDataType>>{}),
+                                               std::make_shared<AffectationToTupleFromListProcessorBuilder<T>>());
+
+    repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type),
+                                               ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type),
+                                               std::make_shared<AffectationToTupleFromListProcessorBuilder<T>>());
+  }
+};
+
+#endif   // BASIC_AFFECTATION_REGISTRER_FOR_HPP
diff --git a/src/language/utils/BuiltinFunctionEmbedder.hpp b/src/language/utils/BuiltinFunctionEmbedder.hpp
index d394aa20f9721a1dc12821960890d0c1f0b6db1c..afb991acadcb36236bcd55a34c7840ca399ab6f0 100644
--- a/src/language/utils/BuiltinFunctionEmbedder.hpp
+++ b/src/language/utils/BuiltinFunctionEmbedder.hpp
@@ -1,7 +1,7 @@
 #ifndef BUILTIN_FUNCTION_EMBEDDER_HPP
 #define BUILTIN_FUNCTION_EMBEDDER_HPP
 
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/ASTNodeDataTypeTraits.hpp>
 #include <language/utils/DataHandler.hpp>
 #include <language/utils/DataVariant.hpp>
diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt
index 1cb991d6c6d19a18579d3c0802a6ea032891d5c2..aee593608a269217f3a7c05791bd642ccfa79b72 100644
--- a/src/language/utils/CMakeLists.txt
+++ b/src/language/utils/CMakeLists.txt
@@ -1,11 +1,21 @@
 # ------------------- Source files --------------------
 
 add_library(PugsLanguageUtils
+  AffectationRegisterForB
+  AffectationRegisterForN
+  AffectationRegisterForR
+  AffectationRegisterForR1
+  AffectationRegisterForR2
+  AffectationRegisterForR3
+  AffectationRegisterForString
+  AffectationRegisterForZ
   ASTDotPrinter.cpp
   ASTExecutionInfo.cpp
+  ASTNodeDataType.cpp
   ASTPrinter.cpp
   DataVariant.cpp
   EmbeddedData.cpp
+  OperatorRepository.cpp
   )
 
 
diff --git a/src/language/utils/FunctionTable.hpp b/src/language/utils/FunctionTable.hpp
index 43232fd60e4482a73dca1a4b257c7a6c0b6ef28a..6c6450c22ff8ff845ddd0c90dbcead1eec52203c 100644
--- a/src/language/utils/FunctionTable.hpp
+++ b/src/language/utils/FunctionTable.hpp
@@ -2,7 +2,7 @@
 #define FUNCTION_TABLE_HPP
 
 #include <language/ast/ASTNode.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/DataVariant.hpp>
 #include <utils/PugsAssert.hpp>
 
@@ -63,14 +63,16 @@ class FunctionTable
   }
 
   PUGS_INLINE
-  FunctionDescriptor& operator[](size_t function_id)
+  FunctionDescriptor&
+  operator[](size_t function_id)
   {
     Assert(function_id < m_function_descriptor_list.size());
     return m_function_descriptor_list[function_id];
   }
 
   PUGS_INLINE
-  const FunctionDescriptor& operator[](size_t function_id) const
+  const FunctionDescriptor&
+  operator[](size_t function_id) const
   {
     Assert(function_id < m_function_descriptor_list.size());
     return m_function_descriptor_list[function_id];
diff --git a/src/language/utils/IAffectationProcessorBuilder.hpp b/src/language/utils/IAffectationProcessorBuilder.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..6d5f8540df9435bba4b86e6bee22f980b5727d7b
--- /dev/null
+++ b/src/language/utils/IAffectationProcessorBuilder.hpp
@@ -0,0 +1,17 @@
+#ifndef I_AFFECTATION_PROCESSOR_BUILDER_HPP
+#define I_AFFECTATION_PROCESSOR_BUILDER_HPP
+
+class ASTNode;
+class INodeProcessor;
+
+#include <memory>
+
+class IAffectationProcessorBuilder
+{
+ public:
+  virtual std::unique_ptr<INodeProcessor> getNodeProcessor(ASTNode& node) const = 0;
+
+  virtual ~IAffectationProcessorBuilder() = default;
+};
+
+#endif   // I_AFFECTATION_PROCESSOR_BUILDER_HPP
diff --git a/src/language/utils/OperatorRepository.cpp b/src/language/utils/OperatorRepository.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cbd520dd402990188cb44685088eecdfab015907
--- /dev/null
+++ b/src/language/utils/OperatorRepository.cpp
@@ -0,0 +1,51 @@
+#include <language/utils/OperatorRepository.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/AffectationRegisterForB.hpp>
+#include <language/utils/AffectationRegisterForN.hpp>
+#include <language/utils/AffectationRegisterForR.hpp>
+#include <language/utils/AffectationRegisterForR1.hpp>
+#include <language/utils/AffectationRegisterForR2.hpp>
+#include <language/utils/AffectationRegisterForR3.hpp>
+#include <language/utils/AffectationRegisterForString.hpp>
+#include <language/utils/AffectationRegisterForZ.hpp>
+
+#include <utils/PugsAssert.hpp>
+
+OperatorRepository* OperatorRepository::m_instance = nullptr;
+
+void
+OperatorRepository::reset()
+{
+  m_affectation_builder_list.clear();
+  this->_initialize();
+}
+
+void
+OperatorRepository::create()
+{
+  Assert(m_instance == nullptr, "AffectationRepository was already created");
+  m_instance = new OperatorRepository;
+  m_instance->_initialize();
+}
+
+void
+OperatorRepository::destroy()
+{
+  Assert(m_instance != nullptr, "AffectationRepository was not created");
+  delete m_instance;
+  m_instance = nullptr;
+}
+
+void
+OperatorRepository::_initialize()
+{
+  AffectationRegisterForB{};
+  AffectationRegisterForN{};
+  AffectationRegisterForZ{};
+  AffectationRegisterForR{};
+  AffectationRegisterForR1{};
+  AffectationRegisterForR2{};
+  AffectationRegisterForR3{};
+  AffectationRegisterForString{};
+}
diff --git a/src/language/utils/OperatorRepository.hpp b/src/language/utils/OperatorRepository.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..509410d98930e0c4805e1dd62955842e120165da
--- /dev/null
+++ b/src/language/utils/OperatorRepository.hpp
@@ -0,0 +1,65 @@
+#ifndef OPERATOR_REPOSITORY_HPP
+#define OPERATOR_REPOSITORY_HPP
+
+#include <language/node_processor/INodeProcessor.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
+#include <language/utils/AffectationMangler.hpp>
+#include <language/utils/IAffectationProcessorBuilder.hpp>
+
+#include <utils/Exceptions.hpp>
+
+#include <optional>
+
+class OperatorRepository
+{
+ private:
+  std::unordered_map<std::string, std::shared_ptr<const IAffectationProcessorBuilder>> m_affectation_builder_list;
+
+  void _initialize();
+
+ public:
+  void reset();
+
+  template <typename OperatorTypeT, typename AffectationProcessorBuilderT>
+  void
+  addAffectation(const ASTNodeDataType& lhs,
+                 const ASTNodeDataType& rhs,
+                 const std::shared_ptr<AffectationProcessorBuilderT>& processor_builder)
+  {
+    const std::string affectation_type_name = affectationMangler<OperatorTypeT>(lhs, rhs);
+    if (not m_affectation_builder_list.try_emplace(affectation_type_name, processor_builder).second) {
+      throw UnexpectedError(affectation_type_name + " has already an entry");
+    }
+  }
+
+  std::optional<std::shared_ptr<const IAffectationProcessorBuilder>>
+  getAffectationProcessorBuilder(const std::string& affectation_name) const
+  {
+    auto&& processor_builder = m_affectation_builder_list.find(affectation_name);
+    if (processor_builder != m_affectation_builder_list.end()) {
+      return processor_builder->second;
+    }
+    return {};
+  }
+
+  static void create();
+
+  PUGS_INLINE
+  static OperatorRepository&
+  instance()
+  {
+    Assert(m_instance != nullptr);
+    return *m_instance;
+  }
+
+  static void destroy();
+
+ private:
+  static OperatorRepository* m_instance;
+
+  OperatorRepository() = default;
+
+  ~OperatorRepository() = default;
+};
+
+#endif   // OPERATOR_REPOSITORY_HPP
diff --git a/src/language/utils/PugsFunctionAdapter.hpp b/src/language/utils/PugsFunctionAdapter.hpp
index 17d97f509c2466b97d3a8ee46cc34ca8ee6b06fe..278c7274ff702cfc5e97f7b6075b5487e440580b 100644
--- a/src/language/utils/PugsFunctionAdapter.hpp
+++ b/src/language/utils/PugsFunctionAdapter.hpp
@@ -2,8 +2,8 @@
 #define PUGS_FUNCTION_ADAPTER_HPP
 
 #include <language/ast/ASTNode.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
 #include <language/node_processor/ExecutionPolicy.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/ASTNodeDataTypeTraits.hpp>
 #include <language/utils/SymbolTable.hpp>
 #include <utils/Array.hpp>
diff --git a/src/language/utils/SymbolTable.hpp b/src/language/utils/SymbolTable.hpp
index 39d414b1e120255e9d51c17266512458fcc5f1b8..6aa089bd8de7aa5a3a6a6cf2a8115e77de25dbe8 100644
--- a/src/language/utils/SymbolTable.hpp
+++ b/src/language/utils/SymbolTable.hpp
@@ -1,7 +1,7 @@
 #ifndef SYMBOL_TABLE_HPP
 #define SYMBOL_TABLE_HPP
 
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 #include <language/utils/DataVariant.hpp>
 #include <language/utils/EmbedderTable.hpp>
 #include <language/utils/FunctionTable.hpp>
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index edaa8069ad867aeaa139f68f646519a6219097d0..5ae8aeef954932a6051be1f6f916d20dbad2b9f3 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -125,7 +125,16 @@ target_link_libraries (unit_tests
 
 target_link_libraries (mpi_unit_tests
   test_Pugs_MeshDataBase
+  PugsAlgebra
+  PugsUtils
+  PugsLanguage
+  PugsLanguageAST
+  PugsLanguageModules
+  PugsLanguageAlgorithms
+  PugsMesh
+  PugsAlgebra
   PugsUtils
+  PugsLanguageUtils  PugsUtils
   PugsAlgebra
   PugsMesh
   kokkos
diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp
index 87953af0c1d98a6b099b8d99606d8f4eaa686a40..44162aba3edce0e992b7f37e6df6cca1040b3291 100644
--- a/tests/mpi_test_main.cpp
+++ b/tests/mpi_test_main.cpp
@@ -4,6 +4,7 @@
 #include <Kokkos_Core.hpp>
 
 #include <algebra/PETScWrapper.hpp>
+#include <language/utils/OperatorRepository.hpp>
 #include <mesh/DiamondDualConnectivityManager.hpp>
 #include <mesh/DiamondDualMeshManager.hpp>
 #include <mesh/MeshDataManager.hpp>
@@ -78,8 +79,12 @@ main(int argc, char* argv[])
         }
       }
 
+      OperatorRepository::create();
+
       result = session.run();
 
+      OperatorRepository::destroy();
+
       MeshDataBaseForTests::destroy();
 
       DiamondDualMeshManager::destroy();
diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
index 64d60d9bfbed21703850f2d945092a9d5ae49fe0..ecd72b1f04b52b47431e10d07b83d3dab441066e 100644
--- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
@@ -10,33 +10,40 @@
 #include <language/ast/ASTSymbolTableBuilder.hpp>
 #include <language/utils/ASTNodeDataTypeTraits.hpp>
 #include <language/utils/ASTPrinter.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/EmbeddedData.hpp>
 #include <language/utils/TypeDescriptor.hpp>
 #include <utils/Demangle.hpp>
 #include <utils/Exceptions.hpp>
 
 #include <pegtl/string_input.hpp>
 
-#define CHECK_AST(data, expected_output)                                                            \
-  {                                                                                                 \
-    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                  \
-    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view> or      \
-                  std::is_same_v<std::decay_t<decltype(expected_output)>, std::string>);            \
-                                                                                                    \
-    string_input input{data, "test.pgs"};                                                           \
-    auto ast = ASTBuilder::build(input);                                                            \
-                                                                                                    \
-    ASTSymbolTableBuilder{*ast};                                                                    \
-    ASTNodeDataTypeBuilder{*ast};                                                                   \
-                                                                                                    \
-    ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                            \
-                                                                                                    \
-    ASTNodeExpressionBuilder{*ast};                                                                 \
-                                                                                                    \
-    std::stringstream ast_output;                                                                   \
-    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::exec_type}}; \
-                                                                                                    \
-    REQUIRE(ast_output.str() == expected_output);                                                   \
+#define CHECK_AST(data, expected_output)                                                                        \
+  {                                                                                                             \
+    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                              \
+    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view> or                  \
+                  std::is_same_v<std::decay_t<decltype(expected_output)>, std::string>);                        \
+                                                                                                                \
+    string_input input{data, "test.pgs"};                                                                       \
+                                                                                                                \
+    BasicAffectationRegisterFor<EmbeddedData>{ASTNodeDataType::build<ASTNodeDataType::type_id_t>("builtin_t")}; \
+                                                                                                                \
+    auto ast = ASTBuilder::build(input);                                                                        \
+                                                                                                                \
+    ASTSymbolTableBuilder{*ast};                                                                                \
+    ASTNodeDataTypeBuilder{*ast};                                                                               \
+                                                                                                                \
+    ASTNodeDeclarationToAffectationConverter{*ast};                                                             \
+    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                                        \
+                                                                                                                \
+    ASTNodeExpressionBuilder{*ast};                                                                             \
+                                                                                                                \
+    std::stringstream ast_output;                                                                               \
+    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::exec_type}};             \
+                                                                                                                \
+    REQUIRE(ast_output.str() == expected_output);                                                               \
+                                                                                                                \
+    OperatorRepository::instance().reset();                                                                     \
   }
 
 template <>
@@ -44,51 +51,55 @@ inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const double>> =
   ASTNodeDataType::build<ASTNodeDataType::type_id_t>("builtin_t");
 const auto builtin_data_type = ast_node_data_type_from<std::shared_ptr<const double>>;
 
-#define CHECK_AST_WITH_BUILTIN(data, expected_output)                                                         \
-  {                                                                                                           \
-    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                            \
-    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view> or                \
-                  std::is_same_v<std::decay_t<decltype(expected_output)>, std::string>);                      \
-                                                                                                              \
-    string_input input{data, "test.pgs"};                                                                     \
-    auto ast = ASTBuilder::build(input);                                                                      \
-                                                                                                              \
-    SymbolTable& symbol_table = *ast->m_symbol_table;                                                         \
-    auto [i_symbol, success]  = symbol_table.add(builtin_data_type.nameOfTypeId(), ast->begin());             \
-    if (not success) {                                                                                        \
-      throw UnexpectedError("cannot add '" + builtin_data_type.nameOfTypeId() + "' type for testing");        \
-    }                                                                                                         \
-                                                                                                              \
-    i_symbol->attributes().setDataType(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>());            \
-    i_symbol->attributes().setIsInitialized();                                                                \
-    i_symbol->attributes().value() = symbol_table.typeEmbedderTable().size();                                 \
-    symbol_table.typeEmbedderTable().add(std::make_shared<TypeDescriptor>(builtin_data_type.nameOfTypeId())); \
-                                                                                                              \
-    auto [i_symbol_a, success_a] = symbol_table.add("a", ast->begin());                                       \
-    if (not success_a) {                                                                                      \
-      throw UnexpectedError("cannot add 'a' of type builtin_t for testing");                                  \
-    }                                                                                                         \
-    i_symbol_a->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);             \
-    i_symbol_a->attributes().setIsInitialized();                                                              \
-    auto [i_symbol_b, success_b] = symbol_table.add("b", ast->begin());                                       \
-    if (not success_b) {                                                                                      \
-      throw UnexpectedError("cannot add 'b' of type builtin_t for testing");                                  \
-    }                                                                                                         \
-    i_symbol_b->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);             \
-    i_symbol_b->attributes().setIsInitialized();                                                              \
-                                                                                                              \
-    ASTSymbolTableBuilder{*ast};                                                                              \
-    ASTNodeDataTypeBuilder{*ast};                                                                             \
-                                                                                                              \
-    ASTNodeDeclarationToAffectationConverter{*ast};                                                           \
-    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                                      \
-                                                                                                              \
-    ASTNodeExpressionBuilder{*ast};                                                                           \
-                                                                                                              \
-    std::stringstream ast_output;                                                                             \
-    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::exec_type}};           \
-                                                                                                              \
-    REQUIRE(ast_output.str() == expected_output);                                                             \
+#define CHECK_AST_WITH_BUILTIN(data, expected_output)                                                           \
+  {                                                                                                             \
+    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                              \
+    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view> or                  \
+                  std::is_same_v<std::decay_t<decltype(expected_output)>, std::string>);                        \
+                                                                                                                \
+    BasicAffectationRegisterFor<EmbeddedData>{ASTNodeDataType::build<ASTNodeDataType::type_id_t>("builtin_t")}; \
+                                                                                                                \
+    string_input input{data, "test.pgs"};                                                                       \
+    auto ast = ASTBuilder::build(input);                                                                        \
+                                                                                                                \
+    SymbolTable& symbol_table = *ast->m_symbol_table;                                                           \
+    auto [i_symbol, success]  = symbol_table.add(builtin_data_type.nameOfTypeId(), ast->begin());               \
+    if (not success) {                                                                                          \
+      throw UnexpectedError("cannot add '" + builtin_data_type.nameOfTypeId() + "' type for testing");          \
+    }                                                                                                           \
+                                                                                                                \
+    i_symbol->attributes().setDataType(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>());              \
+    i_symbol->attributes().setIsInitialized();                                                                  \
+    i_symbol->attributes().value() = symbol_table.typeEmbedderTable().size();                                   \
+    symbol_table.typeEmbedderTable().add(std::make_shared<TypeDescriptor>(builtin_data_type.nameOfTypeId()));   \
+                                                                                                                \
+    auto [i_symbol_a, success_a] = symbol_table.add("a", ast->begin());                                         \
+    if (not success_a) {                                                                                        \
+      throw UnexpectedError("cannot add 'a' of type builtin_t for testing");                                    \
+    }                                                                                                           \
+    i_symbol_a->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);               \
+    i_symbol_a->attributes().setIsInitialized();                                                                \
+    auto [i_symbol_b, success_b] = symbol_table.add("b", ast->begin());                                         \
+    if (not success_b) {                                                                                        \
+      throw UnexpectedError("cannot add 'b' of type builtin_t for testing");                                    \
+    }                                                                                                           \
+    i_symbol_b->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);               \
+    i_symbol_b->attributes().setIsInitialized();                                                                \
+                                                                                                                \
+    ASTSymbolTableBuilder{*ast};                                                                                \
+    ASTNodeDataTypeBuilder{*ast};                                                                               \
+                                                                                                                \
+    ASTNodeDeclarationToAffectationConverter{*ast};                                                             \
+    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                                        \
+                                                                                                                \
+    ASTNodeExpressionBuilder{*ast};                                                                             \
+                                                                                                                \
+    std::stringstream ast_output;                                                                               \
+    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::exec_type}};             \
+                                                                                                                \
+    REQUIRE(ast_output.str() == expected_output);                                                               \
+                                                                                                                \
+    OperatorRepository::instance().reset();                                                                     \
   }
 
 #define CHECK_AST_THROWS_WITH(data, expected_error)                                           \
@@ -109,46 +120,50 @@ const auto builtin_data_type = ast_node_data_type_from<std::shared_ptr<const dou
     REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, expected_error);                      \
   }
 
-#define CHECK_AST_WITH_BUILTIN_THROWS_WITH(data, expected_error)                                              \
-  {                                                                                                           \
-    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                            \
-    static_assert(std::is_same_v<std::decay_t<decltype(expected_error)>, std::string_view> or                 \
-                  std::is_same_v<std::decay_t<decltype(expected_error)>, std::string>);                       \
-                                                                                                              \
-    string_input input{data, "test.pgs"};                                                                     \
-    auto ast = ASTBuilder::build(input);                                                                      \
-                                                                                                              \
-    SymbolTable& symbol_table = *ast->m_symbol_table;                                                         \
-    auto [i_symbol, success]  = symbol_table.add(builtin_data_type.nameOfTypeId(), ast->begin());             \
-    if (not success) {                                                                                        \
-      throw UnexpectedError("cannot add '" + builtin_data_type.nameOfTypeId() + "' type for testing");        \
-    }                                                                                                         \
-                                                                                                              \
-    i_symbol->attributes().setDataType(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>());            \
-    i_symbol->attributes().setIsInitialized();                                                                \
-    i_symbol->attributes().value() = symbol_table.typeEmbedderTable().size();                                 \
-    symbol_table.typeEmbedderTable().add(std::make_shared<TypeDescriptor>(builtin_data_type.nameOfTypeId())); \
-                                                                                                              \
-    auto [i_symbol_a, success_a] = symbol_table.add("a", ast->begin());                                       \
-    if (not success_a) {                                                                                      \
-      throw UnexpectedError("cannot add 'a' of type builtin_t for testing");                                  \
-    }                                                                                                         \
-    i_symbol_a->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);             \
-    i_symbol_a->attributes().setIsInitialized();                                                              \
-    auto [i_symbol_b, success_b] = symbol_table.add("b", ast->begin());                                       \
-    if (not success_b) {                                                                                      \
-      throw UnexpectedError("cannot add 'b' of type builtin_t for testing");                                  \
-    }                                                                                                         \
-    i_symbol_b->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);             \
-    i_symbol_b->attributes().setIsInitialized();                                                              \
-                                                                                                              \
-    ASTSymbolTableBuilder{*ast};                                                                              \
-    ASTNodeDataTypeBuilder{*ast};                                                                             \
-                                                                                                              \
-    ASTNodeDeclarationToAffectationConverter{*ast};                                                           \
-    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                                      \
-                                                                                                              \
-    REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, expected_error);                                      \
+#define CHECK_AST_WITH_BUILTIN_THROWS_WITH(data, expected_error)                                                \
+  {                                                                                                             \
+    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                              \
+    static_assert(std::is_same_v<std::decay_t<decltype(expected_error)>, std::string_view> or                   \
+                  std::is_same_v<std::decay_t<decltype(expected_error)>, std::string>);                         \
+                                                                                                                \
+    BasicAffectationRegisterFor<EmbeddedData>{ASTNodeDataType::build<ASTNodeDataType::type_id_t>("builtin_t")}; \
+                                                                                                                \
+    string_input input{data, "test.pgs"};                                                                       \
+    auto ast = ASTBuilder::build(input);                                                                        \
+                                                                                                                \
+    SymbolTable& symbol_table = *ast->m_symbol_table;                                                           \
+    auto [i_symbol, success]  = symbol_table.add(builtin_data_type.nameOfTypeId(), ast->begin());               \
+    if (not success) {                                                                                          \
+      throw UnexpectedError("cannot add '" + builtin_data_type.nameOfTypeId() + "' type for testing");          \
+    }                                                                                                           \
+                                                                                                                \
+    i_symbol->attributes().setDataType(ASTNodeDataType::build<ASTNodeDataType::type_name_id_t>());              \
+    i_symbol->attributes().setIsInitialized();                                                                  \
+    i_symbol->attributes().value() = symbol_table.typeEmbedderTable().size();                                   \
+    symbol_table.typeEmbedderTable().add(std::make_shared<TypeDescriptor>(builtin_data_type.nameOfTypeId()));   \
+                                                                                                                \
+    auto [i_symbol_a, success_a] = symbol_table.add("a", ast->begin());                                         \
+    if (not success_a) {                                                                                        \
+      throw UnexpectedError("cannot add 'a' of type builtin_t for testing");                                    \
+    }                                                                                                           \
+    i_symbol_a->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);               \
+    i_symbol_a->attributes().setIsInitialized();                                                                \
+    auto [i_symbol_b, success_b] = symbol_table.add("b", ast->begin());                                         \
+    if (not success_b) {                                                                                        \
+      throw UnexpectedError("cannot add 'b' of type builtin_t for testing");                                    \
+    }                                                                                                           \
+    i_symbol_b->attributes().setDataType(ast_node_data_type_from<std::shared_ptr<const double>>);               \
+    i_symbol_b->attributes().setIsInitialized();                                                                \
+                                                                                                                \
+    ASTSymbolTableBuilder{*ast};                                                                                \
+    ASTNodeDataTypeBuilder{*ast};                                                                               \
+                                                                                                                \
+    ASTNodeDeclarationToAffectationConverter{*ast};                                                             \
+    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                                        \
+                                                                                                                \
+    REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, expected_error);                                        \
+                                                                                                                \
+    OperatorRepository::instance().reset();                                                                     \
   }
 
 // clazy:excludeall=non-pod-global-static
@@ -672,7 +687,7 @@ let t : (B), t = (true, false);
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, bool>)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<bool>)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::true_kw:ValueProcessor)
@@ -690,7 +705,7 @@ let t : (N), t = (1, 2, 3, 5);
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, unsigned long>)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<unsigned long>)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::integer:1:ValueProcessor)
@@ -714,7 +729,7 @@ let t : (Z), t = (2, n, true);
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:n:NameProcessor)
  |   `-(language::integer:3:ValueProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, long>)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<long>)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::integer:2:ValueProcessor)
@@ -733,7 +748,7 @@ let t : (R), t = (2, 3.1, 5);
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, double>)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<double>)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::integer:2:ValueProcessor)
@@ -760,7 +775,7 @@ let t3 : (R^1), t3 = (1, 2.3, 0);
  |   `-(language::expression_list:ASTNodeExpressionListProcessor)
  |       +-(language::integer:2:ValueProcessor)
  |       `-(language::real:3.1:ValueProcessor)
- +-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, TinyVector<2ul, double> >)
+ +-(language::eq_op:AffectationToTupleFromListProcessor<TinyVector<2ul, double> >)
  |   +-(language::name:t1:NameProcessor)
  |   `-(language::expression_list:ASTNodeExpressionListProcessor)
  |       +-(language::name:a:NameProcessor)
@@ -768,12 +783,12 @@ let t3 : (R^1), t3 = (1, 2.3, 0);
  |       |   +-(language::integer:1:ValueProcessor)
  |       |   `-(language::integer:2:ValueProcessor)
  |       `-(language::integer:0:ValueProcessor)
- +-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, TinyVector<3ul, double> >)
+ +-(language::eq_op:AffectationToTupleFromListProcessor<TinyVector<3ul, double> >)
  |   +-(language::name:t2:NameProcessor)
  |   `-(language::expression_list:ASTNodeExpressionListProcessor)
  |       +-(language::integer:0:ValueProcessor)
  |       `-(language::integer:0:ValueProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, TinyVector<1ul, double> >)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<TinyVector<1ul, double> >)
      +-(language::name:t3:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::integer:1:ValueProcessor)
@@ -792,7 +807,7 @@ let t : (string), t = ("foo", "bar");
 
         std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, )" +
+ `-(language::eq_op:AffectationToTupleFromListProcessor<)" +
                              demangled_stdstring + R"( >)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
@@ -811,7 +826,7 @@ let t : (builtin_t), t= (a,b,a);
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleFromListProcessor<language::eq_op, EmbeddedData>)
+ `-(language::eq_op:AffectationToTupleFromListProcessor<EmbeddedData>)
      +-(language::name:t:NameProcessor)
      `-(language::expression_list:ASTNodeExpressionListProcessor)
          +-(language::name:a:NameProcessor)
@@ -833,7 +848,7 @@ let t : (B), t = true;
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, bool>)
+ `-(language::eq_op:AffectationToTupleProcessor<bool>)
      +-(language::name:t:NameProcessor)
      `-(language::true_kw:ValueProcessor)
 )";
@@ -849,7 +864,7 @@ let t : (N), t = 1;
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, unsigned long>)
+ `-(language::eq_op:AffectationToTupleProcessor<unsigned long>)
      +-(language::name:t:NameProcessor)
      `-(language::integer:1:ValueProcessor)
 )";
@@ -869,7 +884,7 @@ let t : (Z), t = n;
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:n:NameProcessor)
  |   `-(language::integer:3:ValueProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, long>)
+ `-(language::eq_op:AffectationToTupleProcessor<long>)
      +-(language::name:t:NameProcessor)
      `-(language::name:n:NameProcessor)
 )";
@@ -885,7 +900,7 @@ let t : (R), t = 3.1;
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, double>)
+ `-(language::eq_op:AffectationToTupleProcessor<double>)
      +-(language::name:t:NameProcessor)
      `-(language::real:3.1:ValueProcessor)
 )";
@@ -909,13 +924,13 @@ let t3 : (R^1), t3 = 2.3;
  |   `-(language::expression_list:ASTNodeExpressionListProcessor)
  |       +-(language::integer:2:ValueProcessor)
  |       `-(language::real:3.1:ValueProcessor)
- +-(language::eq_op:AffectationToTupleProcessor<language::eq_op, TinyVector<2ul, double> >)
+ +-(language::eq_op:AffectationToTupleProcessor<TinyVector<2ul, double> >)
  |   +-(language::name:t1:NameProcessor)
  |   `-(language::name:a:NameProcessor)
- +-(language::eq_op:AffectationToTupleProcessor<language::eq_op, TinyVector<3ul, double> >)
+ +-(language::eq_op:AffectationToTupleProcessor<TinyVector<3ul, double> >)
  |   +-(language::name:t2:NameProcessor)
  |   `-(language::integer:0:ValueProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, TinyVector<1ul, double> >)
+ `-(language::eq_op:AffectationToTupleProcessor<TinyVector<1ul, double> >)
      +-(language::name:t3:NameProcessor)
      `-(language::real:2.3:ValueProcessor)
 )";
@@ -931,7 +946,7 @@ let t : (string), t = "foo";
 
         std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, )" +
+ `-(language::eq_op:AffectationToTupleProcessor<)" +
                              demangled_stdstring + R"( >)
      +-(language::name:t:NameProcessor)
      `-(language::literal:"foo":ValueProcessor)
@@ -948,7 +963,7 @@ let t : (builtin_t), t = a;
 
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
- `-(language::eq_op:AffectationToTupleProcessor<language::eq_op, EmbeddedData>)
+ `-(language::eq_op:AffectationToTupleProcessor<EmbeddedData>)
      +-(language::name:t:NameProcessor)
      `-(language::name:a:NameProcessor)
 )";
@@ -1511,33 +1526,20 @@ let x : R, x=1; x/=2.3;
   {
     SECTION("Invalid affectation operator")
     {
-      auto ast = std::make_unique<ASTNode>();
+      auto ast         = std::make_unique<ASTNode>();
+      ast->m_data_type = ASTNodeDataType::build<ASTNodeDataType::void_t>();
+      {
+        auto child_0         = std::make_unique<ASTNode>();
+        child_0->m_data_type = ASTNodeDataType::build<ASTNodeDataType::bool_t>();
+        auto child_1         = std::make_unique<ASTNode>();
+        child_1->m_data_type = ASTNodeDataType::build<ASTNodeDataType::bool_t>();
+        ast->children.emplace_back(std::move(child_0));
+        ast->children.emplace_back(std::move(child_1));
+      }
       REQUIRE_THROWS_WITH(ASTNodeAffectationExpressionBuilder{*ast},
                           "unexpected error: undefined affectation operator");
     }
 
-    SECTION("Invalid lhs")
-    {
-      auto ast = std::make_unique<ASTNode>();
-      ast->set_type<language::eq_op>();
-      ast->children.emplace_back(std::make_unique<ASTNode>());
-      ast->children.emplace_back(std::make_unique<ASTNode>());
-      REQUIRE_THROWS_WITH(ASTNodeAffectationExpressionBuilder{*ast},
-                          "unexpected error: undefined value type for affectation");
-    }
-
-    SECTION("Invalid rhs")
-    {
-      auto ast = std::make_unique<ASTNode>();
-      ast->set_type<language::eq_op>();
-
-      ast->children.emplace_back(std::make_unique<ASTNode>());
-      ast->children[0]->m_data_type = ASTNodeDataType::build<ASTNodeDataType::int_t>();
-      ast->children.emplace_back(std::make_unique<ASTNode>());
-      REQUIRE_THROWS_WITH(ASTNodeAffectationExpressionBuilder{*ast},
-                          "unexpected error: invalid implicit conversion: undefined -> Z");
-    }
-
     SECTION("Invalid string rhs")
     {
       auto ast = std::make_unique<ASTNode>();
@@ -1558,7 +1560,7 @@ let x : R, x=1; x/=2.3;
 let s : string, s="foo"; s-="bar";
 )";
 
-        std::string error_message = "invalid affectation operator for string";
+        std::string error_message = "undefined affectation type: string -= string";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1569,7 +1571,7 @@ let s : string, s="foo"; s-="bar";
 let s : string, s="foo"; s*=2;
 )";
 
-        std::string error_message = "invalid affectation operator for string";
+        std::string error_message = "undefined affectation type: string *= Z";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1580,7 +1582,7 @@ let s : string, s="foo"; s*=2;
  let s : string, s="foo"; s/="bar";
 )";
 
-        std::string error_message = "invalid affectation operator for string";
+        std::string error_message = "undefined affectation type: string /= string";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1592,7 +1594,7 @@ let s : string, s="foo"; s*=2;
  let s :builtin_t, s = a; s *= b;
 )";
 
-      std::string error_message = "invalid affectation operator for 'builtin_t'";
+      std::string error_message = "undefined affectation type: builtin_t *= builtin_t";
 
       CHECK_AST_WITH_BUILTIN_THROWS_WITH(data, error_message);
     }
@@ -1603,7 +1605,7 @@ let s : string, s="foo"; s*=2;
  let s :(R), s=(1,2,3); s *= 4;
 )";
 
-      std::string error_message = "invalid affectation operator for 'tuple(R)'";
+      std::string error_message = "undefined affectation type: tuple(R) *= Z";
 
       CHECK_AST_THROWS_WITH(data, error_message);
     }
@@ -1614,7 +1616,7 @@ let s : string, s="foo"; s*=2;
  let s : (builtin_t), s =(a,b); s *= b;
 )";
 
-      std::string error_message = "invalid affectation operator for 'tuple(builtin_t)'";
+      std::string error_message = "undefined affectation type: tuple(builtin_t) *= builtin_t";
 
       CHECK_AST_WITH_BUILTIN_THROWS_WITH(data, error_message);
     }
@@ -1721,7 +1723,7 @@ let x : R^2, x = 2;
 let x : R^3; let y : R^3; x /= y;
 )";
 
-        std::string error_message = "invalid affectation operator for R^3";
+        std::string error_message = "undefined affectation type: R^3 /= R^3";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1732,7 +1734,7 @@ let x : R^3; let y : R^3; x /= y;
 let x : R^2; let y : R^2; x /= y;
 )";
 
-        std::string error_message = "invalid affectation operator for R^2";
+        std::string error_message = "undefined affectation type: R^2 /= R^2";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1743,7 +1745,7 @@ let x : R^2; let y : R^2; x /= y;
 let x : R^1; let y : R^1; x /= y;
 )";
 
-        std::string error_message = "invalid affectation operator for R^1";
+        std::string error_message = "undefined affectation type: R^1 /= R^1";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1757,7 +1759,7 @@ let x : R^1; let y : R^1; x /= y;
 let x : R^3; let y : R^3; x *= y;
 )";
 
-        std::string error_message = "expecting scalar operand type";
+        std::string error_message = "undefined affectation type: R^3 *= R^3";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1768,7 +1770,7 @@ let x : R^3; let y : R^3; x *= y;
 let x : R^2; let y : R^2; x *= y;
 )";
 
-        std::string error_message = "expecting scalar operand type";
+        std::string error_message = "undefined affectation type: R^2 *= R^2";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
@@ -1779,7 +1781,7 @@ let x : R^2; let y : R^2; x *= y;
 let x : R^1; let y : R^1; x *= y;
 )";
 
-        std::string error_message = "expecting scalar operand type";
+        std::string error_message = "undefined affectation type: R^1 *= R^1";
 
         CHECK_AST_THROWS_WITH(data, error_message);
       }
diff --git a/tests/test_ASTNodeDataType.cpp b/tests/test_ASTNodeDataType.cpp
index 3d4ea9b6954363cdd9007679e425d5f4f4c74c36..2e6e9afb4715b86c67fa2511e7472418e912f8e8 100644
--- a/tests/test_ASTNodeDataType.cpp
+++ b/tests/test_ASTNodeDataType.cpp
@@ -2,7 +2,7 @@
 
 #include <language/PEGGrammar.hpp>
 #include <language/ast/ASTNode.hpp>
-#include <language/ast/ASTNodeDataType.hpp>
+#include <language/utils/ASTNodeDataType.hpp>
 
 namespace language
 {
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index 74f695682992ad951c3b2c33e3c8c0f6b53b657a..b2703a5950eeabe8eea33ba61cab4fc2e2f9157a 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -4,6 +4,7 @@
 #include <Kokkos_Core.hpp>
 
 #include <algebra/PETScWrapper.hpp>
+#include <language/utils/OperatorRepository.hpp>
 #include <mesh/DiamondDualConnectivityManager.hpp>
 #include <mesh/DiamondDualMeshManager.hpp>
 #include <mesh/MeshDataManager.hpp>
@@ -38,8 +39,12 @@ main(int argc, char* argv[])
 
       MeshDataBaseForTests::create();
 
+      OperatorRepository::create();
+
       result = session.run();
 
+      OperatorRepository::destroy();
+
       MeshDataBaseForTests::destroy();
 
       DiamondDualMeshManager::destroy();