diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp
index 462a7004e3db9ec407a7d6b8905b4aa48d491017..6bacf4c077f84d2496e545e364b7547cffc5af3f 100644
--- a/src/language/ASTBuilder.cpp
+++ b/src/language/ASTBuilder.cpp
@@ -223,6 +223,7 @@ using selector = parse_tree::selector<
                                 N_set,
                                 Z_set,
                                 R_set,
+                                vector_type,
                                 string_type,
                                 cout_kw,
                                 cerr_kw,
diff --git a/src/language/ASTNodeDataType.cpp b/src/language/ASTNodeDataType.cpp
index b1e9a64d738ee819cd476f4a45cad2238cafa742..f510344bf33de6b0c0d543d97e722d92207e5692 100644
--- a/src/language/ASTNodeDataType.cpp
+++ b/src/language/ASTNodeDataType.cpp
@@ -20,6 +20,9 @@ dataTypeName(const ASTNodeDataType& data_type)
   case ASTNodeDataType::double_t:
     name = "R";
     break;
+  case ASTNodeDataType::vector_t:
+    name = "vector";
+    break;
   case ASTNodeDataType::string_t:
     name = "string";
     break;
@@ -47,7 +50,7 @@ dataTypePromotion(const ASTNodeDataType& data_type_1, const ASTNodeDataType& dat
   } else if ((std::max(data_type_1, data_type_2) <= ASTNodeDataType::double_t) and
              (std::min(data_type_1, data_type_2) >= ASTNodeDataType::bool_t)) {
     return std::max(data_type_1, data_type_2);
-  } else if ((data_type_1 == ASTNodeDataType::string_t) and (data_type_2 <= ASTNodeDataType::double_t) and
+  } else if ((data_type_1 == ASTNodeDataType::string_t) and (data_type_2 < ASTNodeDataType::string_t) and
              (data_type_2 >= ASTNodeDataType::bool_t)) {
     return data_type_1;
   } else {
@@ -70,8 +73,7 @@ isNaturalConversion(const ASTNodeDataType& data_type, const ASTNodeDataType& tar
     return ((data_type == ASTNodeDataType::unsigned_int_t) or (data_type == ASTNodeDataType::int_t) or
             (data_type == ASTNodeDataType::bool_t));
   } else if (target_data_type == ASTNodeDataType::string_t) {
-    return ((data_type == ASTNodeDataType::double_t) or (data_type == ASTNodeDataType::unsigned_int_t) or
-            (data_type == ASTNodeDataType::int_t) or (data_type == ASTNodeDataType::bool_t));
+    return ((data_type >= ASTNodeDataType::bool_t) and (data_type < ASTNodeDataType::string_t));
   }
   return false;
 }
diff --git a/src/language/ASTNodeDataType.hpp b/src/language/ASTNodeDataType.hpp
index 5b0b87071e6517320f459cd83ee8910276a84301..214ce45df228c770ed1684e27eb28df4ed7eebab 100644
--- a/src/language/ASTNodeDataType.hpp
+++ b/src/language/ASTNodeDataType.hpp
@@ -13,6 +13,7 @@ enum class ASTNodeDataType : int32_t
   int_t          = 1,
   unsigned_int_t = 2,
   double_t       = 3,
+  vector_t       = 4,
   string_t       = 5,
   typename_t     = 10,
   function_t     = 11,
diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index 2a0eba2db745e46999e829984d655548b452d8bf..ad39a0183ffa73ec4cdbf10921c3ebb41f9620ca 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -37,6 +37,8 @@ ASTNodeDataTypeBuilder::_buildDeclarationNodeDataTypes(ASTNode& type_node, ASTNo
       data_type = ASTNodeDataType::unsigned_int_t;
     } else if (type_node.is_type<language::R_set>()) {
       data_type = ASTNodeDataType::double_t;
+    } else if (type_node.is_type<language::vector_type>()) {
+      data_type = ASTNodeDataType::vector_t;
     } else if (type_node.is_type<language::string_type>()) {
       data_type = ASTNodeDataType::string_t;
     }
@@ -90,6 +92,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
         n.m_data_type = ASTNodeDataType::double_t;
       } else if (n.is_type<language::integer>()) {
         n.m_data_type = ASTNodeDataType::int_t;
+      } else if (n.is_type<language::vector_type>()) {
+        n.m_data_type = ASTNodeDataType::vector_t;
       } else if (n.is_type<language::literal>()) {
         n.m_data_type = ASTNodeDataType::string_t;
       } else if (n.is_type<language::cout_kw>() or n.is_type<language::cerr_kw>() or n.is_type<language::clog_kw>()) {
@@ -149,6 +153,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
             data_type = ASTNodeDataType::unsigned_int_t;
           } else if (type_node.is_type<language::R_set>()) {
             data_type = ASTNodeDataType::double_t;
+          } else if (type_node.is_type<language::vector_type>()) {
+            data_type = ASTNodeDataType::vector_t;
           } else if (type_node.is_type<language::string_type>()) {
             data_type = ASTNodeDataType::string_t;
           }
@@ -188,7 +194,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
         ASTNode& image_domain_node     = *function_descriptor.domainMappingNode().children[1];
         ASTNode& image_expression_node = *function_descriptor.definitionNode().children[1];
 
-        const size_t nb_image_domains = (image_domain_node.children.size() > 0) ? image_domain_node.children.size() : 1;
+        const size_t nb_image_domains =
+          (image_domain_node.is_type<language::type_expression>()) ? image_domain_node.children.size() : 1;
         const size_t nb_image_expressions =
           (image_expression_node.is_type<language::expression_list>()) ? image_expression_node.children.size() : 1;
 
@@ -216,6 +223,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
             value_type = ASTNodeDataType::unsigned_int_t;
           } else if (image_node.is_type<language::R_set>()) {
             value_type = ASTNodeDataType::double_t;
+          } else if (image_node.is_type<language::vector_type>()) {
+            value_type = ASTNodeDataType::vector_t;
           } else if (image_node.is_type<language::string_type>()) {
             value_type = ASTNodeDataType::string_t;
           }
@@ -227,13 +236,13 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
           // LCOV_EXCL_STOP
         };
 
-        if (image_domain_node.children.size() == 0) {
-          check_image_type(image_domain_node);
-        } else {
+        if (image_domain_node.is_type<language::type_expression>()) {
           for (size_t i = 0; i < image_domain_node.children.size(); ++i) {
             check_image_type(*image_domain_node.children[i]);
           }
           image_domain_node.m_data_type = ASTNodeDataType::typename_t;
+        } else {
+          check_image_type(image_domain_node);
         }
 
         n.m_data_type = ASTNodeDataType::void_t;
diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp
index b53882a3567ef057f5fe4e20fc6cbfee49094078..0f216d9aa95e588c8e7b6648630d6ce88dcfd116 100644
--- a/src/language/PEGGrammar.hpp
+++ b/src/language/PEGGrammar.hpp
@@ -65,22 +65,30 @@ struct R_set : TAO_PEGTL_KEYWORD("R"){};
 
 struct string_type : TAO_PEGTL_KEYWORD("string") {};
 
-struct basic_type : sor < B_set, R_set, Z_set, N_set, string_type > {};
+struct scalar_type : sor< B_set, R_set, Z_set, N_set >{};
 
-struct TYPESPECIFIER : seq< basic_type, ignored> {};
+struct vector_type : seq< R_set, ignored, one< '^' >, ignored, integer >{};
 
-struct type_expression : list_must< TYPESPECIFIER, one< '*' > >{};
+struct basic_type : sor< scalar_type, string_type >{};
 
-struct and_kw :  TAO_PEGTL_KEYWORD("and") {};
-struct or_kw :  TAO_PEGTL_KEYWORD("or") {};
+struct type_specifier : sor< vector_type, basic_type >{};
 
-struct xor_kw :  TAO_PEGTL_KEYWORD("xor") {};
+struct TYPE_SPECIFIER : seq< type_specifier, ignored >{};
 
-struct not_kw :  TAO_PEGTL_KEYWORD("not") {};
-struct true_kw :  TAO_PEGTL_KEYWORD("true") {};
-struct false_kw :  TAO_PEGTL_KEYWORD("false") {};
+struct type_expression : list_must< TYPE_SPECIFIER, seq< one< '*' > > >{};
 
-struct BOOL : seq< sor<true_kw, false_kw>, ignored > {};
+struct TYPE_EXPRESSION : seq< type_expression, ignored >{};
+
+struct and_kw : TAO_PEGTL_KEYWORD("and") {};
+struct or_kw : TAO_PEGTL_KEYWORD("or") {};
+
+struct xor_kw : TAO_PEGTL_KEYWORD("xor") {};
+
+struct not_kw : TAO_PEGTL_KEYWORD("not") {};
+struct true_kw : TAO_PEGTL_KEYWORD("true") {};
+struct false_kw : TAO_PEGTL_KEYWORD("false") {};
+
+struct BOOL : seq< sor< true_kw, false_kw >, ignored > {};
 
 struct let_kw : TAO_PEGTL_KEYWORD("let") {};
 struct LET : seq < let_kw, ignored > {};
@@ -213,9 +221,9 @@ struct name_list;
 
 struct affectation : seq< sor< NAME, name_list >, if_must< affect_op,  sor< expression_list, expression > > >{};
 
-struct declaration : if_must< type_expression, sor< NAME, name_list>, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{};
+struct declaration : if_must< TYPE_EXPRESSION, sor< NAME, name_list>, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{};
 
-struct type_mapping : seq< type_expression, RIGHT_ARROW, type_expression >{};
+struct type_mapping : seq< TYPE_EXPRESSION, RIGHT_ARROW, TYPE_EXPRESSION >{};
 
 struct name_list : seq< open_parent, list_must< NAME, COMMA >, close_parent >{};