diff --git a/src/language/utils/AffectationRegisterForR1.cpp b/src/language/utils/AffectationRegisterForR1.cpp
deleted file mode 100644
index 20873d6fda648ee254ae5cca965026a30033c92a..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR1.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#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
deleted file mode 100644
index 27f263f744dd1ae54aee2c16f3e530407e79fd77..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR1.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef AFFECTATION_REGISTER_FOR_R1_HPP
-#define AFFECTATION_REGISTER_FOR_R1_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
deleted file mode 100644
index 0fca199a929d2f35698cc6857f80a0b127352607..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR2.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#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
deleted file mode 100644
index cc1fcc9ef0abd3457f2904a6ef259728f8e129d6..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR2.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef AFFECTATION_REGISTER_FOR_R2_HPP
-#define AFFECTATION_REGISTER_FOR_R2_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
deleted file mode 100644
index d5925d7bcb828bc013cefbb130626dce9af9ddec..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR3.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#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
deleted file mode 100644
index 7eb551cdd5d170501b58fc05472954a5276f6588..0000000000000000000000000000000000000000
--- a/src/language/utils/AffectationRegisterForR3.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef AFFECTATION_REGISTER_FOR_R3_HPP
-#define AFFECTATION_REGISTER_FOR_R3_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/AffectationRegisterForRn.cpp b/src/language/utils/AffectationRegisterForRn.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7d38dc64c1d245d4d6c530e891ffd6eaecd63372
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForRn.cpp
@@ -0,0 +1,143 @@
+#include <language/utils/AffectationRegisterForRn.hpp>
+
+#include <language/utils/AffectationProcessorBuilder.hpp>
+#include <language/utils/BasicAffectationRegistrerFor.hpp>
+#include <language/utils/OperatorRepository.hpp>
+
+template <size_t Dimension>
+void
+AffectationRegisterForRn<Dimension>::_register_eq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository.addAffectation<
+    language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationFromZeroProcessorBuilder<language::eq_op, TinyVector<Dimension>>>());
+
+  repository.addAffectation<language::eq_op>(Rn,
+                                             ASTNodeDataType::build<ASTNodeDataType::list_t>(
+                                               std::vector<std::shared_ptr<const ASTNodeDataType>>{}),
+                                             std::make_shared<AffectationToTinyVectorFromListProcessorBuilder<
+                                               language::eq_op, TinyVector<Dimension>>>());
+
+  repository
+    .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn),
+                                     ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                     std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>());
+}
+
+template <>
+void
+AffectationRegisterForRn<1>::_register_eq_op()
+{
+  constexpr size_t Dimension = 1;
+
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository.addAffectation<
+    language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, bool>>());
+
+  repository.addAffectation<
+    language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, uint64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, int64_t>>());
+
+  repository.addAffectation<
+    language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                     std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, double>>());
+
+  repository
+    .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn),
+                                     ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                     std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>());
+
+  repository
+    .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn),
+                                     ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                     std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>());
+
+  repository
+    .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn),
+                                     ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                     std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>());
+
+  repository
+    .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn),
+                                     ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                     std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>());
+}
+
+template <size_t Dimension>
+void
+AffectationRegisterForRn<Dimension>::_register_pluseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository
+    .addAffectation<language::pluseq_op>(Rn, Rn,
+                                         std::make_shared<AffectationProcessorBuilder<
+                                           language::pluseq_op, TinyVector<Dimension>, TinyVector<Dimension>>>());
+}
+
+template <size_t Dimension>
+void
+AffectationRegisterForRn<Dimension>::_register_minuseq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository
+    .addAffectation<language::minuseq_op>(Rn, Rn,
+                                          std::make_shared<AffectationProcessorBuilder<
+                                            language::minuseq_op, TinyVector<Dimension>, TinyVector<Dimension>>>());
+}
+
+template <size_t Dimension>
+void
+AffectationRegisterForRn<Dimension>::_register_multiplyeq_op()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<Dimension>, bool>>());
+
+  repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<Dimension>, uint64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<Dimension>, int64_t>>());
+
+  repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::double_t>(),
+                                                     std::make_shared<AffectationProcessorBuilder<
+                                                       language::multiplyeq_op, TinyVector<Dimension>, double>>());
+}
+
+template <size_t Dimension>
+AffectationRegisterForRn<Dimension>::AffectationRegisterForRn()
+{
+  BasicAffectationRegisterFor<TinyVector<Dimension>>{};
+  this->_register_eq_op();
+  this->_register_pluseq_op();
+  this->_register_minuseq_op();
+  this->_register_multiplyeq_op();
+}
+
+template class AffectationRegisterForRn<1>;
+template class AffectationRegisterForRn<2>;
+template class AffectationRegisterForRn<3>;
diff --git a/src/language/utils/AffectationRegisterForRn.hpp b/src/language/utils/AffectationRegisterForRn.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..337a340b81b7a59d35ee11dd5946d2313560ebe8
--- /dev/null
+++ b/src/language/utils/AffectationRegisterForRn.hpp
@@ -0,0 +1,19 @@
+#ifndef AFFECTATION_REGISTER_FOR_RN_HPP
+#define AFFECTATION_REGISTER_FOR_RN_HPP
+
+#include <cstdlib>
+
+template <size_t Dimension>
+class AffectationRegisterForRn
+{
+ private:
+  void _register_eq_op();
+  void _register_pluseq_op();
+  void _register_minuseq_op();
+  void _register_multiplyeq_op();
+
+ public:
+  AffectationRegisterForRn();
+};
+
+#endif   // AFFECTATION_REGISTER_FOR_RN_HPP
diff --git a/src/language/utils/CMakeLists.txt b/src/language/utils/CMakeLists.txt
index 0e456e4d142ed8db2e772e1f00d6d64328510e22..ed105ca479f5b17c3366d44320505dba5d2eacad 100644
--- a/src/language/utils/CMakeLists.txt
+++ b/src/language/utils/CMakeLists.txt
@@ -4,9 +4,7 @@ add_library(PugsLanguageUtils
   AffectationRegisterForB.cpp
   AffectationRegisterForN.cpp
   AffectationRegisterForR.cpp
-  AffectationRegisterForR1.cpp
-  AffectationRegisterForR2.cpp
-  AffectationRegisterForR3.cpp
+  AffectationRegisterForRn.cpp
   AffectationRegisterForString.cpp
   AffectationRegisterForZ.cpp
   ASTDotPrinter.cpp
@@ -28,9 +26,7 @@ add_library(PugsLanguageUtils
   UnaryOperatorRegisterForB.cpp
   UnaryOperatorRegisterForN.cpp
   UnaryOperatorRegisterForR.cpp
-  UnaryOperatorRegisterForR1.cpp
-  UnaryOperatorRegisterForR2.cpp
-  UnaryOperatorRegisterForR3.cpp
+  UnaryOperatorRegisterForRn.cpp
   UnaryOperatorRegisterForZ.cpp
   )
 
diff --git a/src/language/utils/OperatorRepository.cpp b/src/language/utils/OperatorRepository.cpp
index 77aa5578b396c280d14372b5fbb13f696b83c0f3..93856da8c33793cad9189a25285b612b550f8d61 100644
--- a/src/language/utils/OperatorRepository.cpp
+++ b/src/language/utils/OperatorRepository.cpp
@@ -4,9 +4,7 @@
 #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/AffectationRegisterForRn.hpp>
 #include <language/utils/AffectationRegisterForString.hpp>
 #include <language/utils/AffectationRegisterForZ.hpp>
 
@@ -24,9 +22,7 @@
 #include <language/utils/UnaryOperatorRegisterForB.hpp>
 #include <language/utils/UnaryOperatorRegisterForN.hpp>
 #include <language/utils/UnaryOperatorRegisterForR.hpp>
-#include <language/utils/UnaryOperatorRegisterForR1.hpp>
-#include <language/utils/UnaryOperatorRegisterForR2.hpp>
-#include <language/utils/UnaryOperatorRegisterForR3.hpp>
+#include <language/utils/UnaryOperatorRegisterForRn.hpp>
 #include <language/utils/UnaryOperatorRegisterForZ.hpp>
 
 #include <utils/PugsAssert.hpp>
@@ -66,9 +62,9 @@ OperatorRepository::_initialize()
   AffectationRegisterForN{};
   AffectationRegisterForZ{};
   AffectationRegisterForR{};
-  AffectationRegisterForR1{};
-  AffectationRegisterForR2{};
-  AffectationRegisterForR3{};
+  AffectationRegisterForRn<1>{};
+  AffectationRegisterForRn<2>{};
+  AffectationRegisterForRn<3>{};
   AffectationRegisterForString{};
 
   BinaryOperatorRegisterForB{};
@@ -88,7 +84,7 @@ OperatorRepository::_initialize()
   UnaryOperatorRegisterForN{};
   UnaryOperatorRegisterForZ{};
   UnaryOperatorRegisterForR{};
-  UnaryOperatorRegisterForR1{};
-  UnaryOperatorRegisterForR2{};
-  UnaryOperatorRegisterForR3{};
+  UnaryOperatorRegisterForRn<1>{};
+  UnaryOperatorRegisterForRn<2>{};
+  UnaryOperatorRegisterForRn<3>{};
 }
diff --git a/src/language/utils/UnaryOperatorRegisterForR1.cpp b/src/language/utils/UnaryOperatorRegisterForR1.cpp
deleted file mode 100644
index b225d2eea03727010df1c9d924e18eeeb7e9cf66..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR1.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <language/utils/UnaryOperatorRegisterForR1.hpp>
-
-#include <language/utils/OperatorRepository.hpp>
-#include <language/utils/UnaryOperatorProcessorBuilder.hpp>
-
-void
-UnaryOperatorRegisterForR1::_register_unary_minus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1);
-
-  repository.addUnaryOperator<language::unary_minus>(R1, std::make_shared<UnaryOperatorProcessorBuilder<
-                                                           language::unary_minus, TinyVector<1>, TinyVector<1>>>());
-}
-
-UnaryOperatorRegisterForR1::UnaryOperatorRegisterForR1()
-{
-  this->_register_unary_minus();
-}
diff --git a/src/language/utils/UnaryOperatorRegisterForR1.hpp b/src/language/utils/UnaryOperatorRegisterForR1.hpp
deleted file mode 100644
index 2e9d37781218ee820a7731b70fe52c78e6a3addb..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR1.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef UNARY_OPERATOR_REGISTER_FOR_R1_HPP
-#define UNARY_OPERATOR_REGISTER_FOR_R1_HPP
-
-class UnaryOperatorRegisterForR1
-{
- private:
-  void _register_unary_minus();
-
- public:
-  UnaryOperatorRegisterForR1();
-};
-
-#endif   // UNARY_OPERATOR_REGISTER_FOR_R1_HPP
diff --git a/src/language/utils/UnaryOperatorRegisterForR2.cpp b/src/language/utils/UnaryOperatorRegisterForR2.cpp
deleted file mode 100644
index 14b61630fe487a8658e49adde23ecc1046aff50a..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR2.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <language/utils/UnaryOperatorRegisterForR2.hpp>
-
-#include <language/utils/OperatorRepository.hpp>
-#include <language/utils/UnaryOperatorProcessorBuilder.hpp>
-
-void
-UnaryOperatorRegisterForR2::_register_unary_minus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2);
-
-  repository.addUnaryOperator<language::unary_minus>(R2, std::make_shared<UnaryOperatorProcessorBuilder<
-                                                           language::unary_minus, TinyVector<2>, TinyVector<2>>>());
-}
-
-UnaryOperatorRegisterForR2::UnaryOperatorRegisterForR2()
-{
-  this->_register_unary_minus();
-}
diff --git a/src/language/utils/UnaryOperatorRegisterForR2.hpp b/src/language/utils/UnaryOperatorRegisterForR2.hpp
deleted file mode 100644
index bcc78a9d50528360e1905afbbb6b0664c5bf2299..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR2.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef UNARY_OPERATOR_REGISTER_FOR_R2_HPP
-#define UNARY_OPERATOR_REGISTER_FOR_R2_HPP
-
-class UnaryOperatorRegisterForR2
-{
- private:
-  void _register_unary_minus();
-
- public:
-  UnaryOperatorRegisterForR2();
-};
-
-#endif   // UNARY_OPERATOR_REGISTER_FOR_R2_HPP
diff --git a/src/language/utils/UnaryOperatorRegisterForR3.cpp b/src/language/utils/UnaryOperatorRegisterForR3.cpp
deleted file mode 100644
index d288e5eef86701c2d87a28819727bf6e0db65258..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR3.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <language/utils/UnaryOperatorRegisterForR3.hpp>
-
-#include <language/utils/OperatorRepository.hpp>
-#include <language/utils/UnaryOperatorProcessorBuilder.hpp>
-
-void
-UnaryOperatorRegisterForR3::_register_unary_minus()
-{
-  OperatorRepository& repository = OperatorRepository::instance();
-
-  auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3);
-
-  repository.addUnaryOperator<language::unary_minus>(R3, std::make_shared<UnaryOperatorProcessorBuilder<
-                                                           language::unary_minus, TinyVector<3>, TinyVector<3>>>());
-}
-
-UnaryOperatorRegisterForR3::UnaryOperatorRegisterForR3()
-{
-  this->_register_unary_minus();
-}
diff --git a/src/language/utils/UnaryOperatorRegisterForR3.hpp b/src/language/utils/UnaryOperatorRegisterForR3.hpp
deleted file mode 100644
index 1f9710c0a688f242abc249843a3ea4d03062dadc..0000000000000000000000000000000000000000
--- a/src/language/utils/UnaryOperatorRegisterForR3.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef UNARY_OPERATOR_REGISTER_FOR_R3_HPP
-#define UNARY_OPERATOR_REGISTER_FOR_R3_HPP
-
-class UnaryOperatorRegisterForR3
-{
- private:
-  void _register_unary_minus();
-
- public:
-  UnaryOperatorRegisterForR3();
-};
-
-#endif   // UNARY_OPERATOR_REGISTER_FOR_R3_HPP
diff --git a/src/language/utils/UnaryOperatorRegisterForRn.cpp b/src/language/utils/UnaryOperatorRegisterForRn.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..85cc03fa476a34a6bec65f2c7f88f1d76fbad809
--- /dev/null
+++ b/src/language/utils/UnaryOperatorRegisterForRn.cpp
@@ -0,0 +1,28 @@
+#include <language/utils/UnaryOperatorRegisterForRn.hpp>
+
+#include <language/utils/OperatorRepository.hpp>
+#include <language/utils/UnaryOperatorProcessorBuilder.hpp>
+
+template <size_t Dimension>
+void
+UnaryOperatorRegisterForRn<Dimension>::_register_unary_minus()
+{
+  OperatorRepository& repository = OperatorRepository::instance();
+
+  auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension);
+
+  repository
+    .addUnaryOperator<language::unary_minus>(Rn,
+                                             std::make_shared<UnaryOperatorProcessorBuilder<
+                                               language::unary_minus, TinyVector<Dimension>, TinyVector<Dimension>>>());
+}
+
+template <size_t Dimension>
+UnaryOperatorRegisterForRn<Dimension>::UnaryOperatorRegisterForRn()
+{
+  this->_register_unary_minus();
+}
+
+template class UnaryOperatorRegisterForRn<1>;
+template class UnaryOperatorRegisterForRn<2>;
+template class UnaryOperatorRegisterForRn<3>;
diff --git a/src/language/utils/UnaryOperatorRegisterForRn.hpp b/src/language/utils/UnaryOperatorRegisterForRn.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..a0000f2f588bdc84ccc77e3c03515a92126aac14
--- /dev/null
+++ b/src/language/utils/UnaryOperatorRegisterForRn.hpp
@@ -0,0 +1,16 @@
+#ifndef UNARY_OPERATOR_REGISTER_FOR_RN_HPP
+#define UNARY_OPERATOR_REGISTER_FOR_RN_HPP
+
+#include <cstdlib>
+
+template <size_t Dimension>
+class UnaryOperatorRegisterForRn
+{
+ private:
+  void _register_unary_minus();
+
+ public:
+  UnaryOperatorRegisterForRn();
+};
+
+#endif   // UNARY_OPERATOR_REGISTER_FOR_RN_HPP