diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index f01f50d82ed58e4ef534a31e6579f07ae90315d3..07e32c1f26cbbfcbca2a11fa2353f744085d0460 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -110,8 +110,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
       } else if (n.is_type<language::cout_kw>() or n.is_type<language::cerr_kw>() or n.is_type<language::clog_kw>()) {
         n.m_data_type = ASTNodeDataType::void_t;
       } else if (n.is_type<language::var_declaration>()) {
-        auto& type_node = *(n.children[0]);
-        auto& name_node = *(n.children[1]);
+        auto& name_node = *(n.children[0]);
+        auto& type_node = *(n.children[1]);
 
         type_node.m_data_type = _buildDeclarationNodeDataTypes(type_node, name_node);
         n.m_data_type         = type_node.m_data_type;
diff --git a/src/language/ASTNodeDeclarationToAffectationConverter.cpp b/src/language/ASTNodeDeclarationToAffectationConverter.cpp
index aa790cb91fda1c7c5bad0edffd4997462a4b213e..de5afaf5bdcdfb72d58b74713f5417b53deaf56a 100644
--- a/src/language/ASTNodeDeclarationToAffectationConverter.cpp
+++ b/src/language/ASTNodeDeclarationToAffectationConverter.cpp
@@ -7,9 +7,9 @@ void
 ASTNodeDeclarationToAffectationConverter::_convertNodeDeclaration(ASTNode& n)
 {
   if (n.is_type<language::var_declaration>()) {
-    if (n.children.size() == 3) {
-      n.children[0] = std::move(n.children[1]);
-      n.children[1] = std::move(n.children[2]);
+    if (n.children.size() == 4) {
+      n.children[0] = std::move(n.children[2]);
+      n.children[1] = std::move(n.children[3]);
       n.children.resize(2);
       n.set_type<language::eq_op>();
     }
diff --git a/src/language/ASTSymbolInitializationChecker.cpp b/src/language/ASTSymbolInitializationChecker.cpp
index dcd8ca5e53cbb138c1d1a9a67d519bec42748691..7f0e417e0fd789a4f67f3a627ddc7040a09722fe 100644
--- a/src/language/ASTSymbolInitializationChecker.cpp
+++ b/src/language/ASTSymbolInitializationChecker.cpp
@@ -8,22 +8,53 @@ void
 ASTSymbolInitializationChecker::_checkSymbolInitialization(ASTNode& node)
 {
   if (node.is_type<language::var_declaration>()) {
-    auto check_if_initialized = [&](ASTNode& name_node) {
+    auto set_is_initialized = [&](ASTNode& name_node) {
       const std::string& symbol = name_node.string();
       auto [i_symbol, found]    = node.m_symbol_table->find(symbol, name_node.begin());
       Assert(found, "unexpected error, should have been detected through declaration checking");
-      if (node.children.size() == 3) {
-        this->_checkSymbolInitialization(*node.children[2]);
-        i_symbol->attributes().setIsInitialized();
+      i_symbol->attributes().setIsInitialized();
+    };
+
+    auto check_correct_name_in_definition = [](ASTNode& decl_name_node, ASTNode& def_name_node) {
+      if (decl_name_node.string() != def_name_node.string()) {
+        std::ostringstream os;
+        os << "invalid identifier, expecting '" << decl_name_node.string() << "'" << std::ends;
+        throw parse_error(os.str(), std::vector{def_name_node.begin()});
       }
     };
 
-    if (node.children[1]->is_type<language::name>()) {
-      check_if_initialized(*node.children[1]);
-    } else if (node.children[1]->is_type<language::name_list>()) {
-      ASTNode& name_list_node = *node.children[1];
-      for (auto& child_node : name_list_node.children) {
-        check_if_initialized(*child_node);
+    if (node.children[0]->is_type<language::name>()) {
+      if (node.children.size() == 4) {
+        this->_checkSymbolInitialization(*node.children[3]);
+        check_correct_name_in_definition(*node.children[0], *node.children[2]);
+        set_is_initialized(*node.children[0]);
+      }
+    } else if (node.children[0]->is_type<language::name_list>()) {
+      if (node.children.size() == 4) {
+        ASTNode& decl_name_list_node = *node.children[0];
+        ASTNode& def_name_list_node  = *node.children[2];
+        Assert(def_name_list_node.is_type<language::name_list>());
+        ASTNode& expression_list_node = *node.children[3];
+        Assert(expression_list_node.is_type<language::expression_list>());
+
+        if (decl_name_list_node.children.size() != def_name_list_node.children.size()) {
+          std::ostringstream os;
+          os << "invalid number of definition identifiers, expecting " << decl_name_list_node.children.size()
+             << " found " << def_name_list_node.children.size() << std::ends;
+          throw parse_error(os.str(), std::vector{def_name_list_node.begin()});
+        }
+        if (def_name_list_node.children.size() != expression_list_node.children.size()) {
+          std::ostringstream os;
+          os << "invalid number of definition expressions, expecting " << decl_name_list_node.children.size()
+             << " found " << expression_list_node.children.size() << std::ends;
+          throw parse_error(os.str(), std::vector{expression_list_node.begin()});
+        }
+
+        this->_checkSymbolInitialization(expression_list_node);
+        for (size_t i = 0; i < decl_name_list_node.children.size(); ++i) {
+          check_correct_name_in_definition(*decl_name_list_node.children[i], *def_name_list_node.children[i]);
+          set_is_initialized(*decl_name_list_node.children[i]);
+        }
       }
     }
   } else if (node.is_type<language::fct_declaration>()) {
diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index 3a326b53995ed9c37c2ed3fedf7007a07239d646..136efd2f38c5b838eb222371b088fa3420fba21b 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -50,11 +50,11 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
           }
         };
 
-        if (n.children[1]->is_type<language::name>()) {
-          register_symbol(*n.children[1]);
+        if (n.children[0]->is_type<language::name>()) {
+          register_symbol(*n.children[0]);
         } else {   // treats the case of list of parameters
-          Assert(n.children[1]->is_type<language::name_list>());
-          for (auto& child : n.children[1]->children) {
+          Assert(n.children[0]->is_type<language::name_list>());
+          for (auto& child : n.children[0]->children) {
             register_symbol(*child);
           }
         }
diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp
index deed6014f01c6909d7104904df86324d6d912f77..e65f96f1007ac4c2a0945595f5fa42cc1c24e5c8 100644
--- a/src/language/PEGGrammar.hpp
+++ b/src/language/PEGGrammar.hpp
@@ -76,7 +76,8 @@ struct type_specifier : sor< vector_type, basic_type >{};
 
 struct TYPE_SPECIFIER : seq< type_specifier, ignored >{};
 
-struct type_expression : list< TYPE_SPECIFIER, seq< one< '*' >, ignored > >{};
+struct type_expression : list_must< type_specifier, seq< ignored, one< '*' >, ignored > >{};
+struct TYPE_EXPRESSION : seq< type_expression, ignored >{};
 
 struct and_kw : TAO_PEGTL_KEYWORD("and") {};
 struct or_kw : TAO_PEGTL_KEYWORD("or") {};
@@ -236,15 +237,17 @@ struct affectation : seq< sor< lvalue_expression, lvalue_list >, if_must< affect
 
 struct name_list;
 
-struct var_declaration : seq< type_expression, sor< NAME, name_list>, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{};
+struct var_definition : seq< sor< NAME, name_list>,  one< '=' >, ignored, sor< expression_list, expression > >{};
 
-struct type_mapping : seq< type_expression, RIGHT_ARROW, type_expression >{};
+struct var_declaration : seq< LET, sor< NAME, name_list>, COLUMN, TYPE_EXPRESSION, opt< if_must< COMMA, var_definition > > >{};
+
+struct type_mapping : seq< TYPE_EXPRESSION, RIGHT_ARROW, TYPE_EXPRESSION >{};
 
 struct name_list : seq< open_parent, list_must< NAME, COMMA >, close_parent >{};
 
 struct function_definition : seq< sor< name_list, NAME >, RIGHT_ARROW, sor< expression_list, expression > >{};
 
-struct fct_declaration : if_must< LET, NAME, COLUMN, type_mapping, COMMA, function_definition >{};
+struct fct_declaration : seq< LET, NAME, COLUMN, type_mapping, COMMA, function_definition >{};
 
 struct open_brace : seq< one< '{' >, ignored >{};
 struct close_brace : seq< one< '}' >, ignored >{};
@@ -286,8 +289,8 @@ struct instruction
           if_must< BREAK, semicol >,
           if_must< CONTINUE, semicol >,
           block,
-          if_must< var_declaration, semicol >,
           if_must< fct_declaration, semicol >,
+          if_must< var_declaration, semicol >,
           if_must< affectation, semicol >,
           if_must< expression, semicol >,
           semicol>
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index 84726760b13616b9e181e4a7af4d44ac1dcc0b69..8226db8316b2f45f20fff9850077f3728ad6f6df 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -63,14 +63,6 @@ parser(const std::string& filename)
 
     ASTNodeDataTypeBuilder{*root_node};
 
-    {
-      std::string dot_filename{"parse_tree.dot"};
-      std::ofstream fout(dot_filename);
-      ASTDotPrinter dot_printer{*root_node};
-      fout << dot_printer;
-      std::cout << "   AST dot file: " << dot_filename << '\n';
-    }
-
     ASTNodeDataTypeChecker{*root_node};
 
     ASTNodeJumpPlacementChecker{*root_node};
@@ -81,6 +73,14 @@ parser(const std::string& filename)
     ASTNodeTypeCleaner<language::var_declaration>{*root_node};
     ASTNodeTypeCleaner<language::fct_declaration>{*root_node};
 
+    {
+      std::string dot_filename{"parse_tree.dot"};
+      std::ofstream fout(dot_filename);
+      ASTDotPrinter dot_printer{*root_node};
+      fout << dot_printer;
+      std::cout << "   AST dot file: " << dot_filename << '\n';
+    }
+
     ASTNodeEmptyBlockCleaner{*root_node};
 
     ASTNodeExpressionBuilder{*root_node};
diff --git a/tests/test_ASTBuilder.cpp b/tests/test_ASTBuilder.cpp
index bf64540f3dd0edf0fbcebc957e427f983c690045..b21455bffc79c54a24ae9099eadfc74da48dfb42 100644
--- a/tests/test_ASTBuilder.cpp
+++ b/tests/test_ASTBuilder.cpp
@@ -26,32 +26,37 @@ TEST_CASE("ASTBuilder", "[language]")
     SECTION("declarations with init")
     {
       std::string_view data = R"(
-N n = 2;
-Z z = 3;
-R r = 2.3e-5;
-B b = false;
-string s = "foo";
+let n:N, n = 2;
+let z:Z, z = 3;
+let r :R,r= 2.3e-5;
+let b: B ,b = false;
+let s : string, s = "foo";
 )";
 
       std::string_view result = R"(
 (root)
  +-(language::var_declaration)
+ |   +-(language::name:n)
  |   +-(language::N_set)
  |   +-(language::name:n)
  |   `-(language::integer:2)
  +-(language::var_declaration)
+ |   +-(language::name:z)
  |   +-(language::Z_set)
  |   +-(language::name:z)
  |   `-(language::integer:3)
  +-(language::var_declaration)
+ |   +-(language::name:r)
  |   +-(language::R_set)
  |   +-(language::name:r)
  |   `-(language::real:2.3e-5)
  +-(language::var_declaration)
+ |   +-(language::name:b)
  |   +-(language::B_set)
  |   +-(language::name:b)
  |   `-(language::false_kw)
  `-(language::var_declaration)
+     +-(language::name:s)
      +-(language::string_type)
      +-(language::name:s)
      `-(language::literal:"foo")
@@ -62,42 +67,42 @@ string s = "foo";
     SECTION("affectations")
     {
       std::string_view data = R"(
-N n; n = 2;
-Z z; z = 3;
-R r; r = 2.3e-5;
-B b; b = false;
-string s; s = "foo";
+let n:N; n = 2;
+let z:Z; z = 3;
+let r:R; r = 2.3e-5;
+let b:B; b = false;
+let s:string; s = "foo";
 )";
 
       std::string_view result = R"(
 (root)
  +-(language::var_declaration)
- |   +-(language::N_set)
- |   `-(language::name:n)
+ |   +-(language::name:n)
+ |   `-(language::N_set)
  +-(language::eq_op)
  |   +-(language::name:n)
  |   `-(language::integer:2)
  +-(language::var_declaration)
- |   +-(language::Z_set)
- |   `-(language::name:z)
+ |   +-(language::name:z)
+ |   `-(language::Z_set)
  +-(language::eq_op)
  |   +-(language::name:z)
  |   `-(language::integer:3)
  +-(language::var_declaration)
- |   +-(language::R_set)
- |   `-(language::name:r)
+ |   +-(language::name:r)
+ |   `-(language::R_set)
  +-(language::eq_op)
  |   +-(language::name:r)
  |   `-(language::real:2.3e-5)
  +-(language::var_declaration)
- |   +-(language::B_set)
- |   `-(language::name:b)
+ |   +-(language::name:b)
+ |   `-(language::B_set)
  +-(language::eq_op)
  |   +-(language::name:b)
  |   `-(language::false_kw)
  +-(language::var_declaration)
- |   +-(language::string_type)
- |   `-(language::name:s)
+ |   +-(language::name:s)
+ |   `-(language::string_type)
  `-(language::eq_op)
      +-(language::name:s)
      `-(language::literal:"foo")
@@ -420,9 +425,9 @@ if (a > 0) {
     {
       std::string_view data = R"(
 if (a > 0) {
-  R b = a;
+  let b:R, b = a;
 } else {
-  R c = 2*a;
+  let c:R, c = 2*a;
 }
 )";
 
@@ -434,11 +439,13 @@ if (a > 0) {
      |   `-(language::integer:0)
      +-(language::block)
      |   `-(language::var_declaration)
+     |       +-(language::name:b)
      |       +-(language::R_set)
      |       +-(language::name:b)
      |       `-(language::name:a)
      `-(language::block)
          `-(language::var_declaration)
+             +-(language::name:c)
              +-(language::R_set)
              +-(language::name:c)
              `-(language::multiply_op)
@@ -452,9 +459,9 @@ if (a > 0) {
     {
       std::string_view data = R"(
 if (a > 0) {
-  R b = a;
+  let b:R, b = a;
 } else {
-  R c = 2*a;
+  let c:R, c = 2*a;
   ++a;
 }
 )";
@@ -467,11 +474,13 @@ if (a > 0) {
      |   `-(language::integer:0)
      +-(language::block)
      |   `-(language::var_declaration)
+     |       +-(language::name:b)
      |       +-(language::R_set)
      |       +-(language::name:b)
      |       `-(language::name:a)
      `-(language::block)
          +-(language::var_declaration)
+         |   +-(language::name:c)
          |   +-(language::R_set)
          |   +-(language::name:c)
          |   `-(language::multiply_op)
@@ -487,10 +496,10 @@ if (a > 0) {
     {
       std::string_view data = R"(
 if (a > 0) {
-  R b = a;
+  let b:R, b = a;
   ++b;
 } else {
-  R c = 2*a;
+  let c:R, c = 2*a;
 }
 )";
 
@@ -502,6 +511,7 @@ if (a > 0) {
      |   `-(language::integer:0)
      +-(language::block)
      |   +-(language::var_declaration)
+     |   |   +-(language::name:b)
      |   |   +-(language::R_set)
      |   |   +-(language::name:b)
      |   |   `-(language::name:a)
@@ -509,6 +519,7 @@ if (a > 0) {
      |       `-(language::name:b)
      `-(language::block)
          `-(language::var_declaration)
+             +-(language::name:c)
              +-(language::R_set)
              +-(language::name:c)
              `-(language::multiply_op)
@@ -521,7 +532,7 @@ if (a > 0) {
     SECTION("for-statements simplification")
     {
       std::string_view data = R"(
-for(N i=0; i<10; ++i) {
+for(let i:N, i=0; i<10; ++i) {
   i += 3;
 }
 )";
@@ -530,6 +541,7 @@ for(N i=0; i<10; ++i) {
 (root)
  `-(language::for_statement)
      +-(language::var_declaration)
+     |   +-(language::name:i)
      |   +-(language::N_set)
      |   +-(language::name:i)
      |   `-(language::integer:0)
@@ -548,9 +560,9 @@ for(N i=0; i<10; ++i) {
     SECTION("for-statements simplification (complex block)")
     {
       std::string_view data = R"(
-for(N i=0; i<10; ++i) {
+for(let i:N, i=0; i<10; ++i) {
   i += 3;
-  R j=i/5.;
+  let j:R, j=i/5.;
 }
 )";
 
@@ -558,6 +570,7 @@ for(N i=0; i<10; ++i) {
 (root)
  `-(language::for_statement)
      +-(language::var_declaration)
+     |   +-(language::name:i)
      |   +-(language::N_set)
      |   +-(language::name:i)
      |   `-(language::integer:0)
@@ -571,6 +584,7 @@ for(N i=0; i<10; ++i) {
          |   +-(language::name:i)
          |   `-(language::integer:3)
          `-(language::var_declaration)
+             +-(language::name:j)
              +-(language::R_set)
              +-(language::name:j)
              `-(language::divide_op)
diff --git a/tests/test_ASTDotPrinter.cpp b/tests/test_ASTDotPrinter.cpp
index c9f24580223247b5e844ace411be1df1f6da1a1b..458ce5edf8a01a2efea456e4cf08197a162cae48 100644
--- a/tests/test_ASTDotPrinter.cpp
+++ b/tests/test_ASTDotPrinter.cpp
@@ -23,7 +23,7 @@ TEST_CASE("ASTDotPrinter", "[language]")
   rang::setControlMode(rang::control::Off);
 
   std::string_view data = R"(
-N n = 2 + 3;
+let n:N, n = 2 + 3;
 )";
 
   std::string_view result = R"(
@@ -31,14 +31,15 @@ digraph parse_tree
 {
   x0 [ label="root \nundefined" ]
   x0 -> { x1 }
-  x1 [ label="language::var_declaration\nN n = 2 + 3\nundefined" ]
-  x1 -> { x2, x3, x4 }
-  x2 [ label="language::N_set\nN\nundefined" ]
-  x3 [ label="language::name\nn\nundefined" ]
-  x4 [ label="language::plus_op\nundefined" ]
-  x4 -> { x5, x6 }
-  x5 [ label="language::integer\n2\nundefined" ]
-  x6 [ label="language::integer\n3\nundefined" ]
+  x1 [ label="language::var_declaration\nlet n:N, n = 2 + 3\nundefined" ]
+  x1 -> { x2, x3, x4, x5 }
+  x2 [ label="language::name\nn\nundefined" ]
+  x3 [ label="language::N_set\nN\nundefined" ]
+  x4 [ label="language::name\nn\nundefined" ]
+  x5 [ label="language::plus_op\nundefined" ]
+  x5 -> { x6, x7 }
+  x6 [ label="language::integer\n2\nundefined" ]
+  x7 [ label="language::integer\n3\nundefined" ]
 }
 )";
   CHECK_DOT(data, result);
diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
index 3e3f3168cb78dc8c2b26c868e49f49b2b3efe7af..c0711fe871338f0db8047eae982edcdcdba65302 100644
--- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
@@ -70,7 +70,7 @@ TEST_CASE("ASTNodeAffectationExpressionBuilder", "[language]")
       SECTION("B <- B")
       {
         std::string_view data = R"(
-B b=true;
+let b:B, b=true;
 )";
 
         std::string_view result = R"(
@@ -89,7 +89,7 @@ B b=true;
       SECTION("N <- B")
       {
         std::string_view data = R"(
-N n=true;
+let n:N, n=true;
 )";
 
         std::string_view result = R"(
@@ -105,7 +105,7 @@ N n=true;
       SECTION("N <- N")
       {
         std::string_view data = R"(
-N m; N n=m;
+let m : N; let n:N, n=m;
 )";
 
         std::string_view result = R"(
@@ -121,7 +121,7 @@ N m; N n=m;
       SECTION("N <- Z")
       {
         std::string_view data = R"(
-Z z; N n=z;
+let z:Z; let n :N, n=z;
 )";
 
         std::string_view result = R"(
@@ -140,7 +140,7 @@ Z z; N n=z;
       SECTION("Z <- B")
       {
         std::string_view data = R"(
-Z z=true;
+let z : Z, z=true;
 )";
 
         std::string_view result = R"(
@@ -156,7 +156,7 @@ Z z=true;
       SECTION("Z <- N")
       {
         std::string_view data = R"(
-N m; Z z=m;
+let m : N; let z : Z, z=m;
 )";
 
         std::string_view result = R"(
@@ -172,7 +172,7 @@ N m; Z z=m;
       SECTION("Z <- Z")
       {
         std::string_view data = R"(
-Z q; Z z=q;
+let q : Z; let z : Z, z=q;
 )";
 
         std::string_view result = R"(
@@ -191,7 +191,7 @@ Z q; Z z=q;
       SECTION("R <- B")
       {
         std::string_view data = R"(
-R r=true;
+let r : R, r=true;
 )";
 
         std::string_view result = R"(
@@ -207,7 +207,7 @@ R r=true;
       SECTION("R <- N")
       {
         std::string_view data = R"(
-N m; R r=m;
+let m : N; let r : R, r=m;
 )";
 
         std::string_view result = R"(
@@ -223,7 +223,7 @@ N m; R r=m;
       SECTION("R <- Z")
       {
         std::string_view data = R"(
-Z z; R r=z;
+let z : Z; let r : R, r=z;
 )";
 
         std::string_view result = R"(
@@ -239,7 +239,7 @@ Z z; R r=z;
       SECTION("R <- R")
       {
         std::string_view data = R"(
-R s; R r=s;
+let s : R; let r : R, r=s;
 )";
 
         std::string_view result = R"(
@@ -258,8 +258,8 @@ R s; R r=s;
       SECTION("R^1 <- R^1")
       {
         std::string_view data = R"(
-R^1 x;
-R^1 y = x;
+let x : R^1;
+let y : R^1, y = x;
 )";
 
         std::string_view result = R"(
@@ -275,7 +275,7 @@ R^1 y = x;
       SECTION("R^1 <- R")
       {
         std::string_view data = R"(
-R^1 x = 1.3;
+let x : R^1, x = 1.3;
 )";
 
         std::string_view result = R"(
@@ -291,7 +291,7 @@ R^1 x = 1.3;
       SECTION("R^1 <- Z")
       {
         std::string_view data = R"(
-R^1 x = -1;
+let x : R^1, x = -1;
 )";
 
         std::string_view result = R"(
@@ -308,8 +308,8 @@ R^1 x = -1;
       SECTION("R^1 <- N")
       {
         std::string_view data = R"(
-N n;
-R^1 x = n;
+let n : N;
+let x : R^1, x = n;
 )";
 
         std::string_view result = R"(
@@ -325,8 +325,8 @@ R^1 x = n;
       SECTION("R^1 <- B")
       {
         std::string_view data = R"(
-B b;
-R^1 x = b;
+let b : B;
+let x : R^1, x = b;
 )";
 
         std::string_view result = R"(
@@ -342,7 +342,7 @@ R^1 x = b;
       SECTION("R^1 <- 0")
       {
         std::string_view data = R"(
-R^1 x = 0;
+let x : R^1, x = 0;
 )";
 
         std::string_view result = R"(
@@ -358,8 +358,8 @@ R^1 x = 0;
       SECTION("R^2 <- R^2")
       {
         std::string_view data = R"(
-R^2 x;
-R^2 y = x;
+let x : R^2;
+let y : R^2, y = x;
 )";
 
         std::string_view result = R"(
@@ -375,7 +375,7 @@ R^2 y = x;
       SECTION("R^2 <- (.,.)")
       {
         std::string_view data = R"(
-R^2 y = (0,1);
+let y : R^2, y = (0,1);
 )";
 
         std::string_view result = R"(
@@ -393,7 +393,7 @@ R^2 y = (0,1);
       SECTION("R^2 <- 0")
       {
         std::string_view data = R"(
-R^2 x = 0;
+let x : R^2, x = 0;
 )";
 
         std::string_view result = R"(
@@ -409,8 +409,8 @@ R^2 x = 0;
       SECTION("R^3 <- R^3")
       {
         std::string_view data = R"(
-R^3 x;
-R^3 y = x;
+let x : R^3;
+let y : R^3, y = x;
 )";
 
         std::string_view result = R"(
@@ -426,7 +426,7 @@ R^3 y = x;
       SECTION("R^3 <- 0")
       {
         std::string_view data = R"(
-R^3 x = 0;
+let x : R^3, x = 0;
 )";
 
         std::string_view result = R"(
@@ -442,7 +442,7 @@ R^3 x = 0;
       SECTION("R^3 <- (.,.)")
       {
         std::string_view data = R"(
-R^3 y = (1,2,3);
+let y : R^3, y = (1,2,3);
 )";
 
         std::string_view result = R"(
@@ -464,7 +464,7 @@ R^3 y = (1,2,3);
       SECTION("string <- B")
       {
         std::string_view data = R"(
-string s=true;
+let s : string, s=true;
 )";
 
         std::string result = R"(
@@ -481,7 +481,7 @@ string s=true;
       SECTION("string <- N")
       {
         std::string_view data = R"(
-N n; string s=n;
+let n : N; let s : string, s=n;
 )";
 
         std::string result = R"(
@@ -498,7 +498,7 @@ N n; string s=n;
       SECTION("string <- Z")
       {
         std::string_view data = R"(
-Z z; string s=z;
+let z : Z; let s : string, s=z;
 )";
 
         std::string result = R"(
@@ -516,7 +516,7 @@ Z z; string s=z;
       SECTION("string <- R")
       {
         std::string_view data = R"(
-R r; string s=r;
+let r : R; let s : string, s=r;
 )";
 
         std::string result = R"(
@@ -534,7 +534,7 @@ R r; string s=r;
       SECTION("string <- string")
       {
         std::string_view data = R"(
-string s="foo";
+let s : string, s="foo";
 )";
 
         std::string result = R"(
@@ -555,7 +555,7 @@ string s="foo";
     SECTION("N += N")
     {
       std::string_view data = R"(
-N n=1; n+=n;
+let n : N, n=1; n+=n;
 )";
 
       std::string_view result = R"(
@@ -574,7 +574,7 @@ N n=1; n+=n;
     SECTION("R += N")
     {
       std::string_view data = R"(
-R x=1; x+=2;
+let x : R, x=1; x+=2;
 )";
 
       std::string_view result = R"(
@@ -593,7 +593,7 @@ R x=1; x+=2;
     SECTION("string += N")
     {
       std::string_view data = R"(
-string s="foo"; s+=2;
+let s : string, s="foo"; s+=2;
 )";
 
       std::string result = R"(
@@ -615,8 +615,8 @@ string s="foo"; s+=2;
     SECTION("R^1 += R^1")
     {
       std::string_view data = R"(
-R^1 x;
-R^1 y;
+let x : R^1;
+let y : R^1;
 x += y;
 )";
 
@@ -633,8 +633,8 @@ x += y;
     SECTION("R^2 += R^2")
     {
       std::string_view data = R"(
-R^2 x;
-R^2 y;
+let x : R^2;
+let y : R^2;
 x += y;
 )";
 
@@ -651,8 +651,8 @@ x += y;
     SECTION("R^3 += R^3")
     {
       std::string_view data = R"(
-R^3 x;
-R^3 y;
+let x : R^3;
+let y : R^3;
 x += y;
 )";
 
@@ -672,7 +672,7 @@ x += y;
     SECTION("Z -= Z")
     {
       std::string_view data = R"(
-Z z=1; z-=2;
+let z : Z, z=1; z-=2;
 )";
 
       std::string_view result = R"(
@@ -691,7 +691,7 @@ Z z=1; z-=2;
     SECTION("R -= R")
     {
       std::string_view data = R"(
-R x=1; x-=2.3;
+let x : R, x=1; x-=2.3;
 )";
 
       std::string_view result = R"(
@@ -710,8 +710,8 @@ R x=1; x-=2.3;
     SECTION("R^1 -= R^1")
     {
       std::string_view data = R"(
-R^1 x;
-R^1 y;
+let x : R^1;
+let y : R^1;
 x -= y;
 )";
 
@@ -728,8 +728,8 @@ x -= y;
     SECTION("R^2 -= R^2")
     {
       std::string_view data = R"(
-R^2 x;
-R^2 y;
+let x : R^2;
+let y : R^2;
 x -= y;
 )";
 
@@ -746,8 +746,8 @@ x -= y;
     SECTION("R^3 -= R^3")
     {
       std::string_view data = R"(
-R^3 x;
-R^3 y;
+let x : R^3;
+let y : R^3;
 x -= y;
 )";
 
@@ -767,7 +767,7 @@ x -= y;
     SECTION("Z *= Z")
     {
       std::string_view data = R"(
-Z z=1; z*=2;
+let z : Z, z=1; z*=2;
 )";
 
       std::string_view result = R"(
@@ -786,7 +786,7 @@ Z z=1; z*=2;
     SECTION("R *= R")
     {
       std::string_view data = R"(
-R x=1; x*=2.3;
+let x : R, x=1; x*=2.3;
 )";
 
       std::string_view result = R"(
@@ -805,7 +805,7 @@ R x=1; x*=2.3;
     SECTION("R^1 *= R")
     {
       std::string_view data = R"(
-R^1 x; x*=2.3;
+let x : R^1; x*=2.3;
 )";
 
       std::string_view result = R"(
@@ -821,7 +821,7 @@ R^1 x; x*=2.3;
     SECTION("R^2 *= R")
     {
       std::string_view data = R"(
-R^2 x; x*= 6.2;
+let x : R^2; x*= 6.2;
 )";
 
       std::string_view result = R"(
@@ -837,7 +837,7 @@ R^2 x; x*= 6.2;
     SECTION("R^3 *= R")
     {
       std::string_view data = R"(
-R^3 x; x*= 3.1;
+let x : R^3; x*= 3.1;
 )";
 
       std::string_view result = R"(
@@ -853,7 +853,7 @@ R^3 x; x*= 3.1;
     SECTION("R *= Z")
     {
       std::string_view data = R"(
-R x=1; x*=2;
+let x : R, x=1; x*=2;
 )";
 
       std::string_view result = R"(
@@ -872,7 +872,7 @@ R x=1; x*=2;
     SECTION("R^1 *= Z")
     {
       std::string_view data = R"(
-R^1 x; x *= 3;
+let x : R^1; x *= 3;
 )";
 
       std::string_view result = R"(
@@ -888,7 +888,7 @@ R^1 x; x *= 3;
     SECTION("R^2 *= Z")
     {
       std::string_view data = R"(
-R^2 x; x *= 6;
+let x : R^2; x *= 6;
 )";
 
       std::string_view result = R"(
@@ -904,7 +904,7 @@ R^2 x; x *= 6;
     SECTION("R^3 *= Z")
     {
       std::string_view data = R"(
-R^3 x; x *= 4;
+let x : R^3; x *= 4;
 )";
 
       std::string_view result = R"(
@@ -920,7 +920,7 @@ R^3 x; x *= 4;
     SECTION("R *= N")
     {
       std::string_view data = R"(
-N n=2; R x=1; x *= n;
+let n : N, n=2; let x : R, x=1; x *= n;
 )";
 
       std::string_view result = R"(
@@ -942,8 +942,8 @@ N n=2; R x=1; x *= n;
     SECTION("R^1 *= N")
     {
       std::string_view data = R"(
-N n;
-R^1 x; x *= n;
+let n : N;
+let x : R^1; x *= n;
 )";
 
       std::string_view result = R"(
@@ -959,8 +959,8 @@ R^1 x; x *= n;
     SECTION("R^2 *= N")
     {
       std::string_view data = R"(
-N n;
-R^2 x; x *= n;
+let n : N;
+let x : R^2; x *= n;
 )";
 
       std::string_view result = R"(
@@ -976,8 +976,8 @@ R^2 x; x *= n;
     SECTION("R^3 *= N")
     {
       std::string_view data = R"(
-N n;
-R^3 x; x *= n;
+let n : N;
+let x : R^3; x *= n;
 )";
 
       std::string_view result = R"(
@@ -993,7 +993,7 @@ R^3 x; x *= n;
     SECTION("R *= B")
     {
       std::string_view data = R"(
-R x=1; x *= true;
+let x : R, x=1; x *= true;
 )";
 
       std::string_view result = R"(
@@ -1012,7 +1012,7 @@ R x=1; x *= true;
     SECTION("R^1 *= B")
     {
       std::string_view data = R"(
-R^1 x; x *= true;
+let x : R^1; x *= true;
 )";
 
       std::string_view result = R"(
@@ -1028,7 +1028,7 @@ R^1 x; x *= true;
     SECTION("R^2 *= B")
     {
       std::string_view data = R"(
-R^2 x; x *= false;
+let x : R^2; x *= false;
 )";
 
       std::string_view result = R"(
@@ -1044,7 +1044,7 @@ R^2 x; x *= false;
     SECTION("R^3 *= B")
     {
       std::string_view data = R"(
-B b; R^3 x; x *= b;
+let b : B; let x : R^3; x *= b;
 )";
 
       std::string_view result = R"(
@@ -1063,7 +1063,7 @@ B b; R^3 x; x *= b;
     SECTION("Z /= Z")
     {
       std::string_view data = R"(
-Z z=6; z/=2;
+let z : Z, z=6; z/=2;
 )";
 
       std::string_view result = R"(
@@ -1082,7 +1082,7 @@ Z z=6; z/=2;
     SECTION("R /= R")
     {
       std::string_view data = R"(
-R x=1; x/=2.3;
+let x : R, x=1; x/=2.3;
 )";
 
       std::string_view result = R"(
@@ -1146,7 +1146,7 @@ R x=1; x/=2.3;
       SECTION("string -= string")
       {
         std::string_view data = R"(
-string s="foo"; s-="bar";
+let s : string, s="foo"; s-="bar";
 )";
 
         std::string error_message = "invalid operator for string affectation";
@@ -1157,7 +1157,7 @@ string s="foo"; s-="bar";
       SECTION("string *= Z")
       {
         std::string_view data = R"(
-string s="foo"; s*=2;
+let s : string, s="foo"; s*=2;
 )";
 
         std::string error_message = "invalid operator for string affectation";
@@ -1168,7 +1168,7 @@ string s="foo"; s*=2;
       SECTION("string /= string")
       {
         std::string_view data = R"(
-string s="foo"; s/="bar";
+let s : string, s="foo"; s/="bar";
 )";
 
         std::string error_message = "invalid operator for string affectation";
@@ -1182,7 +1182,7 @@ string s="foo"; s/="bar";
       SECTION("R^3 <- R^1")
       {
         std::string_view data = R"(
-R^3 x; R^1 y; x = y;
+let x : R^3; let y : R^1; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1193,7 +1193,7 @@ R^3 x; R^1 y; x = y;
       SECTION("R^3 <- R^2")
       {
         std::string_view data = R"(
-R^3 x; R^2 y; x = y;
+let x : R^3; let y : R^2; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1204,7 +1204,7 @@ R^3 x; R^2 y; x = y;
       SECTION("R^2 <- R^1")
       {
         std::string_view data = R"(
-R^2 x; R^1 y; x = y;
+let x : R^2; let y : R^1; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1215,7 +1215,7 @@ R^2 x; R^1 y; x = y;
       SECTION("R^2 <- R^3")
       {
         std::string_view data = R"(
-R^2 x; R^3 y; x = y;
+let x : R^2; let y : R^3; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1226,7 +1226,7 @@ R^2 x; R^3 y; x = y;
       SECTION("R^1 <- R^2")
       {
         std::string_view data = R"(
-R^1 x; R^2 y; x = y;
+let x : R^1; let y : R^2; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1237,7 +1237,7 @@ R^1 x; R^2 y; x = y;
       SECTION("R^1 <- R^3")
       {
         std::string_view data = R"(
-R^1 x; R^2 y; x = y;
+let x : R^1; let y : R^2; x = y;
 )";
 
         std::string error_message = "incompatible dimensions in affectation";
@@ -1251,7 +1251,7 @@ R^1 x; R^2 y; x = y;
       SECTION("R^3 <- Z")
       {
         std::string_view data = R"(
-R^3 x = 3;
+let x : R^3, x = 3;
 )";
 
         std::string error_message = "invalid implicit conversion: Z -> R^3";
@@ -1262,7 +1262,7 @@ R^3 x = 3;
       SECTION("R^2 <- Z")
       {
         std::string_view data = R"(
-R^2 x = 2;
+let x : R^2, x = 2;
 )";
 
         std::string error_message = "invalid implicit conversion: Z -> R^2";
@@ -1276,7 +1276,7 @@ R^2 x = 2;
       SECTION("R^3 <- R^3")
       {
         std::string_view data = R"(
-R^3 x; R^3 y; x /= y;
+let x : R^3; let y : R^3; x /= y;
 )";
 
         std::string error_message = "invalid affectation operator for R^3";
@@ -1287,7 +1287,7 @@ R^3 x; R^3 y; x /= y;
       SECTION("R^2 <- R^2")
       {
         std::string_view data = R"(
-R^2 x; R^2 y; x /= y;
+let x : R^2; let y : R^2; x /= y;
 )";
 
         std::string error_message = "invalid affectation operator for R^2";
@@ -1298,7 +1298,7 @@ R^2 x; R^2 y; x /= y;
       SECTION("R^1 <- R^1")
       {
         std::string_view data = R"(
-R^1 x; R^1 y; x /= y;
+let x : R^1; let y : R^1; x /= y;
 )";
 
         std::string error_message = "invalid affectation operator for R^1";
@@ -1312,7 +1312,7 @@ R^1 x; R^1 y; x /= y;
       SECTION("R^3 <- R^3")
       {
         std::string_view data = R"(
-R^3 x; R^3 y; x *= y;
+let x : R^3; let y : R^3; x *= y;
 )";
 
         std::string error_message = "expecting scalar operand type";
@@ -1323,7 +1323,7 @@ R^3 x; R^3 y; x *= y;
       SECTION("R^2 <- R^2")
       {
         std::string_view data = R"(
-R^2 x; R^2 y; x *= y;
+let x : R^2; let y : R^2; x *= y;
 )";
 
         std::string error_message = "expecting scalar operand type";
@@ -1334,7 +1334,7 @@ R^2 x; R^2 y; x *= y;
       SECTION("R^1 <- R^1")
       {
         std::string_view data = R"(
-R^1 x; R^1 y; x *= y;
+let x : R^1; let y : R^1; x *= y;
 )";
 
         std::string error_message = "expecting scalar operand type";
diff --git a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
index 741182f8a2f36b7325cfb5b8180ab466c293e05f..09bbc86ce0b435bcb3517ade4d01ff642dd2534a 100644
--- a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
@@ -64,7 +64,7 @@ TEST_CASE("ASTNodeBinaryOperatorExpressionBuilder", "[language]")
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b*true;
 false*b*true;
 )";
@@ -87,8 +87,8 @@ false*b*true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n*m*n;
 )";
 
@@ -107,7 +107,7 @@ n*m*n;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a*3*a;
 )";
 
@@ -146,7 +146,7 @@ a*3*a;
     SECTION("R^1")
     {
       std::string_view data = R"(
-R^1 x = 3.7;
+let x : R^1, x = 3.7;
 2*x;
 )";
 
@@ -166,7 +166,7 @@ R^1 x = 3.7;
     SECTION("R^2")
     {
       std::string_view data = R"(
-R^2 x = (3.2,6);
+let x : R^2, x = (3.2,6);
 2*x;
 )";
 
@@ -188,7 +188,7 @@ R^2 x = (3.2,6);
     SECTION("R^3")
     {
       std::string_view data = R"(
-R^3 x = (3.2,6,1.2);
+let x : R^3, x = (3.2,6,1.2);
 2*x;
 )";
 
@@ -214,7 +214,7 @@ R^3 x = (3.2,6,1.2);
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b/true;
 false/b/true;
 )";
@@ -237,8 +237,8 @@ false/b/true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n/m/n;
 )";
 
@@ -257,7 +257,7 @@ n/m/n;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a/3/a;
 )";
 
@@ -299,7 +299,7 @@ a/3/a;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b+true;
 false+b+true;
 )";
@@ -322,8 +322,8 @@ false+b+true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n+m+n;
 )";
 
@@ -342,7 +342,7 @@ n+m+n;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a+3+a;
 )";
 
@@ -381,8 +381,8 @@ a+3+a;
     SECTION("R^1")
     {
       std::string_view data = R"(
-R^1 x = 1;
-R^1 y = 2;
+let x : R^1, x = 1;
+let y : R^1, y = 2;
 x+y;
 )";
 
@@ -405,8 +405,8 @@ x+y;
     SECTION("R^2")
     {
       std::string_view data = R"(
-R^2 x = (1,2);
-R^2 y = (0.3,0.7);
+let x : R^2, x = (1,2);
+let y : R^2, y = (0.3,0.7);
 x+y;
 )";
 
@@ -433,8 +433,8 @@ x+y;
     SECTION("R^3")
     {
       std::string_view data = R"(
-R^3 x = (1,2,3);
-R^3 y = (4,3,2);
+let x : R^3, x = (1,2,3);
+let y : R^3, y = (4,3,2);
 x+y;
 )";
 
@@ -479,7 +479,7 @@ x+y;
     SECTION("string concatenate N")
     {
       std::string_view data = R"(
-N n=0;
+let n : N, n=0;
 "foo"+n;
 )";
 
@@ -553,7 +553,7 @@ N n=0;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b-true;
 false-b-true;
 )";
@@ -576,8 +576,8 @@ false-b-true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n-m-n;
 )";
 
@@ -596,7 +596,7 @@ n-m-n;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a-3-a;
 )";
 
@@ -635,8 +635,8 @@ a-3-a;
     SECTION("R^1")
     {
       std::string_view data = R"(
-R^1 x = 1;
-R^1 y = 2;
+let x : R^1, x = 1;
+let y : R^1, y = 2;
 x-y;
 )";
 
@@ -659,8 +659,8 @@ x-y;
     SECTION("R^2")
     {
       std::string_view data = R"(
-R^2 x = (1,2);
-R^2 y = (0.3,0.7);
+let x : R^2, x = (1,2);
+let y : R^2, y = (0.3,0.7);
 x-y;
 )";
 
@@ -687,8 +687,8 @@ x-y;
     SECTION("R^3")
     {
       std::string_view data = R"(
-R^3 x = (1,2,3);
-R^3 y = (4,3,2);
+let x : R^3, x = (1,2,3);
+let y : R^3, y = (4,3,2);
 x-y;
 )";
 
@@ -720,7 +720,7 @@ x-y;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b or true;
 false or b or true;
 )";
@@ -746,7 +746,7 @@ false or b or true;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b and true;
 false and b and true;
 )";
@@ -772,7 +772,7 @@ false and b and true;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b xor true;
 false xor b xor true;
 )";
@@ -798,7 +798,7 @@ false xor b xor true;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b > true;
 )";
 
@@ -815,8 +815,8 @@ b > true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n > m;
 )";
 
@@ -833,7 +833,7 @@ n > m;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a > 3;
 )";
 
@@ -869,7 +869,7 @@ a > 3;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b : B;
 b < true;
 )";
 
@@ -886,8 +886,8 @@ b < true;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n < m;
 )";
 
@@ -904,7 +904,7 @@ n < m;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z a;
+let a : Z;
 a < 3;
 )";
 
@@ -939,7 +939,7 @@ a < 3;
       SECTION("B")
       {
         std::string_view data = R"(
-B b;
+let b : B;
 b >= true;
 )";
 
@@ -956,8 +956,8 @@ b >= true;
       SECTION("N")
       {
         std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n >= m;
 )";
 
@@ -974,7 +974,7 @@ n >= m;
       SECTION("Z")
       {
         std::string_view data = R"(
-Z a;
+let a : Z;
 a >= 3;
 )";
 
@@ -1010,7 +1010,7 @@ a >= 3;
       SECTION("B")
       {
         std::string_view data = R"(
-B b;
+let b : B;
 b <= true;
 )";
 
@@ -1027,8 +1027,8 @@ b <= true;
       SECTION("N")
       {
         std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n <= m;
 )";
 
@@ -1045,7 +1045,7 @@ n <= m;
       SECTION("Z")
       {
         std::string_view data = R"(
-Z a;
+let a : Z;
 a <= 3;
 )";
 
@@ -1081,7 +1081,7 @@ a <= 3;
       SECTION("B")
       {
         std::string_view data = R"(
-B b;
+let b : B;
 b == true;
 )";
 
@@ -1098,8 +1098,8 @@ b == true;
       SECTION("N")
       {
         std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n == m;
 )";
 
@@ -1116,7 +1116,7 @@ n == m;
       SECTION("Z")
       {
         std::string_view data = R"(
-Z a;
+let a : Z;
 a == 3;
 )";
 
@@ -1168,8 +1168,8 @@ a == 3;
       SECTION("R^1")
       {
         std::string_view data = R"(
-R^1 x = 1;
-R^1 y = 2;
+let x : R^1, x = 1;
+let y : R^1, y = 2;
 x==y;
 )";
 
@@ -1192,8 +1192,8 @@ x==y;
       SECTION("R^2")
       {
         std::string_view data = R"(
-R^2 x = (1,2);
-R^2 y = (0.3,0.7);
+let x : R^2, x = (1,2);
+let y : R^2, y = (0.3,0.7);
 x==y;
 )";
 
@@ -1220,8 +1220,8 @@ x==y;
       SECTION("R^3")
       {
         std::string_view data = R"(
-R^3 x = (1,2,3);
-R^3 y = (4,3,2);
+let x : R^3, x = (1,2,3);
+let y : R^3, y = (4,3,2);
 x==y;
 )";
 
@@ -1253,7 +1253,7 @@ x==y;
       SECTION("B")
       {
         std::string_view data = R"(
-B b;
+let b : B;
 b != true;
 )";
 
@@ -1270,8 +1270,8 @@ b != true;
       SECTION("N")
       {
         std::string_view data = R"(
-N n;
-N m;
+let n : N;
+let m : N;
 n != m;
 )";
 
@@ -1288,7 +1288,7 @@ n != m;
       SECTION("Z")
       {
         std::string_view data = R"(
-Z a;
+let a : Z;
 a != 3;
 )";
 
@@ -1321,8 +1321,8 @@ a != 3;
       SECTION("R^1")
       {
         std::string_view data = R"(
-R^1 x = 1;
-R^1 y = 2;
+let x : R^1, x = 1;
+let y : R^1, y = 2;
 x!=y;
 )";
 
@@ -1345,8 +1345,8 @@ x!=y;
       SECTION("R^2")
       {
         std::string_view data = R"(
-R^2 x = (1,2);
-R^2 y = (0.3,0.7);
+let x : R^2, x = (1,2);
+let y : R^2, y = (0.3,0.7);
 x!=y;
 )";
 
@@ -1373,8 +1373,8 @@ x!=y;
       SECTION("R^3")
       {
         std::string_view data = R"(
-R^3 x = (1,2,3);
-R^3 y = (4,3,2);
+let x : R^3, x = (1,2,3);
+let y : R^3, y = (4,3,2);
 x!=y;
 )";
 
@@ -1906,8 +1906,8 @@ x!=y;
       SECTION("invalid operator R^1 > R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 0;
+let x : R^1, x = 0;
+let y : R^1, y = 0;
 x > y;
 )";
 
@@ -1917,8 +1917,8 @@ x > y;
       SECTION("invalid operator R^1 >= R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 0;
+let x : R^1, x = 0;
+let y : R^1, y = 0;
 x >= y;
 )";
 
@@ -1928,8 +1928,8 @@ x >= y;
       SECTION("invalid operator R^1 < R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 0;
+let x : R^1, x = 0;
+let y : R^1, y = 0;
 x < y;
 )";
 
@@ -1939,8 +1939,8 @@ x < y;
       SECTION("invalid operator R^1 <= R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 1;
+let x : R^1, x = 0;
+let y : R^1, y = 1;
 x <= y;
 )";
 
@@ -1950,8 +1950,8 @@ x <= y;
       SECTION("invalid operator R^1 * R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 0;
+let x : R^1, x = 0;
+let y : R^1, y = 0;
 x * y;
 )";
 
@@ -1961,8 +1961,8 @@ x * y;
       SECTION("invalid operator R^1 / R^1")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^1 y = 0;
+let x : R^1, x = 0;
+let y : R^1, y = 0;
 x / y;
 )";
 
@@ -1972,8 +1972,8 @@ x / y;
       SECTION("invalid operator R^2 > R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x > y;
 )";
 
@@ -1983,8 +1983,8 @@ x > y;
       SECTION("invalid operator R^2 >= R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x >= y;
 )";
 
@@ -1994,8 +1994,8 @@ x >= y;
       SECTION("invalid operator R^2 < R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x < y;
 )";
 
@@ -2005,8 +2005,8 @@ x < y;
       SECTION("invalid operator R^2 <= R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x <= y;
 )";
 
@@ -2016,8 +2016,8 @@ x <= y;
       SECTION("invalid operator R^2 * R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x * y;
 )";
 
@@ -2027,8 +2027,8 @@ x * y;
       SECTION("invalid operator R^2 / R^2")
       {
         std::string_view data = R"(
-R^2 x = 0;
-R^2 y = 0;
+let x : R^2, x = 0;
+let y : R^2, y = 0;
 x / y;
 )";
 
@@ -2038,8 +2038,8 @@ x / y;
       SECTION("invalid operator R^3 > R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x > y;
 )";
 
@@ -2049,8 +2049,8 @@ x > y;
       SECTION("invalid operator R^3 >= R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x >= y;
 )";
 
@@ -2060,8 +2060,8 @@ x >= y;
       SECTION("invalid operator R^3 < R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x < y;
 )";
 
@@ -2071,8 +2071,8 @@ x < y;
       SECTION("invalid operator R^3 <= R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x <= y;
 )";
 
@@ -2082,8 +2082,8 @@ x <= y;
       SECTION("invalid operator R^3 * R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x * y;
 )";
 
@@ -2093,8 +2093,8 @@ x * y;
       SECTION("invalid operator R^3 / R^3")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^3 y = 0;
+let x : R^3, x = 0;
+let y : R^3, y = 0;
 x / y;
 )";
 
@@ -2107,8 +2107,8 @@ x / y;
       SECTION("incompatible operand dimensions")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^1 y = 0;
+let x : R^3, x = 0;
+let y : R^1, y = 0;
 x + y;
 )";
 
@@ -2118,8 +2118,8 @@ x + y;
       SECTION("incompatible operand dimensions")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^2 y = 0;
+let x : R^1, x = 0;
+let y : R^2, y = 0;
 x - y;
 )";
 
@@ -2129,8 +2129,8 @@ x - y;
       SECTION("incompatible operand dimensions")
       {
         std::string_view data = R"(
-R^3 x = 0;
-R^2 y = 0;
+let x : R^3, x = 0;
+let y : R^2, y = 0;
 x == y;
 )";
 
@@ -2140,8 +2140,8 @@ x == y;
       SECTION("incompatible operand dimensions")
       {
         std::string_view data = R"(
-R^1 x = 0;
-R^2 y = 0;
+let x : R^1, x = 0;
+let y : R^2, y = 0;
 x != y;
 )";
 
diff --git a/tests/test_ASTNodeCFunctionExpressionBuilder.cpp b/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
index 665136bee8a087ebade4f484a516808503a972db..8d6534fa6342b6b525e1aa3f765fe36221fc8a40 100644
--- a/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
@@ -166,7 +166,7 @@ RtoR(1);
     SECTION("from N")
     {
       std::string_view data = R"(
-N n = 1;
+let n : N, n = 1;
 RtoR(n);
 )";
 
@@ -218,7 +218,7 @@ ZtoR(1);
     SECTION("from N")
     {
       std::string_view data = R"(
-N n = 1;
+let n : N, n = 1;
 ZtoR(n);
 )";
 
@@ -270,7 +270,7 @@ NtoR(1);
     SECTION("from N")
     {
       std::string_view data = R"(
-N n = 1;
+let n : N, n = 1;
 NtoR(n);
 )";
 
diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp
index 1a92afb708b84460fed3cee5e9b7c49d54f7cae5..10a551a019975e6eb0577607508f7206ebf5b314 100644
--- a/tests/test_ASTNodeDataTypeBuilder.cpp
+++ b/tests/test_ASTNodeDataTypeBuilder.cpp
@@ -232,22 +232,22 @@ false;
     SECTION("declaration")
     {
       std::string_view data = R"(
-R*B*N*string (x,b,n,s);
+let (x,b,n,s) : R*B*N*string;
 )";
 
       std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:typename)
-     +-(language::type_expression:typename)
-     |   +-(language::R_set:typename)
-     |   +-(language::B_set:typename)
-     |   +-(language::N_set:typename)
-     |   `-(language::string_type:typename)
-     `-(language::name_list:void)
-         +-(language::name:x:R)
-         +-(language::name:b:B)
-         +-(language::name:n:N)
-         `-(language::name:s:string)
+     +-(language::name_list:void)
+     |   +-(language::name:x:R)
+     |   +-(language::name:b:B)
+     |   +-(language::name:n:N)
+     |   `-(language::name:s:string)
+     `-(language::type_expression:typename)
+         +-(language::R_set:typename)
+         +-(language::B_set:typename)
+         +-(language::N_set:typename)
+         `-(language::string_type:typename)
 )";
 
       CHECK_AST(data, result);
@@ -258,7 +258,7 @@ R*B*N*string (x,b,n,s);
       SECTION("invalid array subscript")
       {
         std::string_view data = R"(
-R x; x[2];
+let x : R; x[2];
 )";
 
         string_input input{data, "test.pgs"};
@@ -271,35 +271,35 @@ R x; x[2];
       SECTION("too many variables")
       {
         std::string_view data = R"(
-R*B*N*string (x,b,n,s,t);
+let (x,b,n,s,t) : R*B*N*string;
 )";
 
         string_input input{data, "test.pgs"};
         auto ast = ASTBuilder::build(input);
         ASTSymbolTableBuilder{*ast};
 
-        REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "number of product spaces (4) R*B*N*string  differs from "
-                                                          "number of variables (5) (x,b,n,s,t)");
+        REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "number of product spaces (4) R*B*N*string differs from "
+                                                          "number of variables (5) (x,b,n,s,t) ");
       }
 
       SECTION("too few variables")
       {
         std::string_view data = R"(
-R*B*N*string (x,b,n);
+let (x,b,n) : R*B*N*string;
 )";
 
         string_input input{data, "test.pgs"};
         auto ast = ASTBuilder::build(input);
         ASTSymbolTableBuilder{*ast};
 
-        REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "number of product spaces (4) R*B*N*string  differs from "
-                                                          "number of variables (3) (x,b,n)");
+        REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "number of product spaces (4) R*B*N*string differs from "
+                                                          "number of variables (3) (x,b,n) ");
       }
 
       SECTION("unexpected variable list")
       {
         std::string_view data = R"(
-R (x,y);
+let  (x,y) : R;
 )";
 
         string_input input{data, "test.pgs"};
@@ -590,7 +590,7 @@ let f : R -> R*R, x -> x*x*x;
       {
         std::string_view data = R"(
 let f : R^2 -> R^2, x -> (x[0]+1, x[1]-2);
-R^2 x = (1,2);
+let x : R^2, x = (1,2);
 x = f(x);
 )";
 
@@ -599,6 +599,7 @@ x = f(x);
  +-(language::fct_declaration:void)
  |   `-(language::name:f:function)
  +-(language::var_declaration:R^2)
+ |   +-(language::name:x:R^2)
  |   +-(language::vector_type:typename)
  |   |   +-(language::R_set:typename)
  |   |   `-(language::integer:2:Z)
@@ -623,7 +624,7 @@ x = f(x);
       {
         std::string_view data = R"(
 let incr : R -> R, x -> x+1;
-R x = incr(3);
+let x : R, x = incr(3);
 )";
 
         std::string_view result = R"(
@@ -631,6 +632,7 @@ R x = incr(3);
  +-(language::fct_declaration:void)
  |   `-(language::name:incr:function)
  `-(language::var_declaration:R)
+     +-(language::name:x:R)
      +-(language::R_set:typename)
      +-(language::name:x:R)
      `-(language::function_evaluation:R)
@@ -645,7 +647,7 @@ R x = incr(3);
       {
         std::string_view data = R"(
 let substract : R*R -> R, (x,y) -> x-y;
-R diff = substract(3,2);
+let  diff : R, diff = substract(3,2);
 )";
 
         std::string_view result = R"(
@@ -653,6 +655,7 @@ R diff = substract(3,2);
  +-(language::fct_declaration:void)
  |   `-(language::name:substract:function)
  `-(language::var_declaration:R)
+     +-(language::name:diff:R)
      +-(language::R_set:typename)
      +-(language::name:diff:R)
      `-(language::function_evaluation:R)
@@ -670,7 +673,7 @@ R diff = substract(3,2);
     {
       std::string_view data = R"(
 let incr : Z -> Z, z -> z+1;
-Z z = incr(3);
+let z : Z, z = incr(3);
 )";
 
       std::string_view result = R"(
@@ -678,6 +681,7 @@ Z z = incr(3);
  +-(language::fct_declaration:void)
  |   `-(language::name:incr:function)
  `-(language::var_declaration:Z)
+     +-(language::name:z:Z)
      +-(language::Z_set:typename)
      +-(language::name:z:Z)
      `-(language::function_evaluation:Z)
@@ -692,7 +696,7 @@ Z z = incr(3);
     {
       std::string_view data = R"(
 let double : N -> N, n -> 2*n;
-N n = double(3);
+let n : N, n = double(3);
 )";
 
       std::string_view result = R"(
@@ -700,6 +704,7 @@ N n = double(3);
  +-(language::fct_declaration:void)
  |   `-(language::name:double:function)
  `-(language::var_declaration:N)
+     +-(language::name:n:N)
      +-(language::N_set:typename)
      +-(language::name:n:N)
      `-(language::function_evaluation:N)
@@ -714,7 +719,7 @@ N n = double(3);
     {
       std::string_view data = R"(
 let greater_than_2 : R -> B, x -> x>2;
-B b = greater_than_2(3);
+let b : B, b = greater_than_2(3);
 )";
 
       std::string_view result = R"(
@@ -722,6 +727,7 @@ B b = greater_than_2(3);
  +-(language::fct_declaration:void)
  |   `-(language::name:greater_than_2:function)
  `-(language::var_declaration:B)
+     +-(language::name:b:B)
      +-(language::B_set:typename)
      +-(language::name:b:B)
      `-(language::function_evaluation:B)
@@ -736,7 +742,7 @@ B b = greater_than_2(3);
     {
       std::string_view data = R"(
 let cat : string*string -> string, (s,t) -> s+t;
-string s = cat("foo", "bar");
+let s : string, s = cat("foo", "bar");
 )";
 
       std::string_view result = R"(
@@ -744,6 +750,7 @@ string s = cat("foo", "bar");
  +-(language::fct_declaration:void)
  |   `-(language::name:cat:function)
  `-(language::var_declaration:string)
+     +-(language::name:s:string)
      +-(language::string_type:typename)
      +-(language::name:s:string)
      `-(language::function_evaluation:string)
@@ -760,7 +767,7 @@ string s = cat("foo", "bar");
     {
       std::string_view data = R"(
 let x_x2 : R -> R*R, x -> (x,x*x);
-R*R (x,x2) = x_x2(3);
+let (x,x2) : R*R, (x,x2) = x_x2(3);
 )";
 
       std::string_view result = R"(
@@ -768,6 +775,9 @@ R*R (x,x2) = x_x2(3);
  +-(language::fct_declaration:void)
  |   `-(language::name:x_x2:function)
  `-(language::var_declaration:typename)
+     +-(language::name_list:void)
+     |   +-(language::name:x:R)
+     |   `-(language::name:x2:R)
      +-(language::type_expression:typename)
      |   +-(language::R_set:typename)
      |   `-(language::R_set:typename)
@@ -787,7 +797,7 @@ R*R (x,x2) = x_x2(3);
       SECTION("not a function")
       {
         std::string_view data = R"(
-R not_a_function = 3;
+let not_a_function : R, not_a_function = 3;
 not_a_function(2,3);
 )";
         string_input input{data, "test.pgs"};
@@ -823,7 +833,7 @@ clog << "clog\n";
   SECTION("for-statement")
   {
     std::string_view data = R"(
-for (N i=0; i<3; ++i){
+for (let i : N, i=0; i<3; ++i){
   cout << i << "\n";
 }
 )";
@@ -832,6 +842,7 @@ for (N i=0; i<3; ++i){
 (root:void)
  `-(language::for_statement:void)
      +-(language::var_declaration:N)
+     |   +-(language::name:i:N)
      |   +-(language::N_set:typename)
      |   +-(language::name:i:N)
      |   `-(language::integer:0:Z)
@@ -851,14 +862,14 @@ for (N i=0; i<3; ++i){
   SECTION("B set")
   {
     std::string_view data = R"(
-B b;
+let b:B;
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:B)
-     +-(language::B_set:typename)
-     `-(language::name:b:B)
+     +-(language::name:b:B)
+     `-(language::B_set:typename)
 )";
 
     CHECK_AST(data, result);
@@ -867,14 +878,14 @@ B b;
   SECTION("N set")
   {
     std::string_view data = R"(
-N n;
+let n :N;
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:N)
-     +-(language::N_set:typename)
-     `-(language::name:n:N)
+     +-(language::name:n:N)
+     `-(language::N_set:typename)
 )";
 
     CHECK_AST(data, result);
@@ -883,14 +894,14 @@ N n;
   SECTION("Z set")
   {
     std::string_view data = R"(
-Z z;
+let z:Z;
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:Z)
-     +-(language::Z_set:typename)
-     `-(language::name:z:Z)
+     +-(language::name:z:Z)
+     `-(language::Z_set:typename)
 )";
 
     CHECK_AST(data, result);
@@ -899,14 +910,14 @@ Z z;
   SECTION("R set")
   {
     std::string_view data = R"(
-R r;
+let r:R;
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:R)
-     +-(language::R_set:typename)
-     `-(language::name:r:R)
+     +-(language::name:r:R)
+     `-(language::R_set:typename)
 )";
 
     CHECK_AST(data, result);
@@ -915,14 +926,14 @@ R r;
   SECTION("string")
   {
     std::string_view data = R"(
-string s;
+let s: string;
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::var_declaration:string)
-     +-(language::string_type:typename)
-     `-(language::name:s:string)
+     +-(language::name:s:string)
+     `-(language::string_type:typename)
 )";
 
     CHECK_AST(data, result);
@@ -959,15 +970,15 @@ break;
   SECTION("eq_op")
   {
     std::string_view data = R"(
-N a;
+let a:N;
 a = 1;
 )";
 
     std::string_view result = R"(
 (root:void)
  +-(language::var_declaration:N)
- |   +-(language::N_set:typename)
- |   `-(language::name:a:N)
+ |   +-(language::name:a:N)
+ |   `-(language::N_set:typename)
  `-(language::eq_op:N)
      +-(language::name:a:N)
      `-(language::integer:1:Z)
@@ -979,13 +990,14 @@ a = 1;
   SECTION("multiplyeq_op")
   {
     std::string_view data = R"(
-N a = 1;
+let a:N, a = 1;
 a *= 1.2;
 )";
 
     std::string_view result = R"(
 (root:void)
  +-(language::var_declaration:N)
+ |   +-(language::name:a:N)
  |   +-(language::N_set:typename)
  |   +-(language::name:a:N)
  |   `-(language::integer:1:Z)
@@ -1000,13 +1012,14 @@ a *= 1.2;
   SECTION("divideeq_op")
   {
     std::string_view data = R"(
-R a = 3;
+let a:R, a = 3;
 a /= 2;
 )";
 
     std::string_view result = R"(
 (root:void)
  +-(language::var_declaration:R)
+ |   +-(language::name:a:R)
  |   +-(language::R_set:typename)
  |   +-(language::name:a:R)
  |   `-(language::integer:3:Z)
@@ -1021,13 +1034,14 @@ a /= 2;
   SECTION("pluseq_op")
   {
     std::string_view data = R"(
-Z a = 3;
+let a :Z, a = 3;
 a += 2;
 )";
 
     std::string_view result = R"(
 (root:void)
  +-(language::var_declaration:Z)
+ |   +-(language::name:a:Z)
  |   +-(language::Z_set:typename)
  |   +-(language::name:a:Z)
  |   `-(language::integer:3:Z)
@@ -1042,13 +1056,14 @@ a += 2;
   SECTION("minuseq_op")
   {
     std::string_view data = R"(
-Z a = 1;
+let a:Z, a = 1;
 a -= 2;
 )";
 
     std::string_view result = R"(
 (root:void)
  +-(language::var_declaration:Z)
+ |   +-(language::name:a:Z)
  |   +-(language::Z_set:typename)
  |   +-(language::name:a:Z)
  |   `-(language::integer:1:Z)
@@ -1081,13 +1096,14 @@ for (;;);
   SECTION("for std")
   {
     std::string_view data = R"(
-for (Z i=0; i<3; i += 1) { i += 2; }
+for (let i:Z, i=0; i<3; i += 1) { i += 2; }
 )";
 
     std::string_view result = R"(
 (root:void)
  `-(language::for_statement:void)
      +-(language::var_declaration:Z)
+     |   +-(language::name:i:Z)
      |   +-(language::Z_set:typename)
      |   +-(language::name:i:Z)
      |   `-(language::integer:0:Z)
diff --git a/tests/test_ASTNodeDataTypeChecker.cpp b/tests/test_ASTNodeDataTypeChecker.cpp
index bb4c7474dbd0fa70d8c1d90013ba0c9acf156d9f..624489ba674d7a144e51d3212fa029c8fbe7e3aa 100644
--- a/tests/test_ASTNodeDataTypeChecker.cpp
+++ b/tests/test_ASTNodeDataTypeChecker.cpp
@@ -11,7 +11,7 @@ TEST_CASE("ASTNodeDataTypeChecker", "[language]")
   SECTION("everything ok: nothrow")
   {
     std::string_view data = R"(
-for(Z i=0; i<10; ++i) {
+for(let i:Z, i=0; i<10; ++i) {
  cout << "i=" << i;
  cout<< "\n";
 }
@@ -29,7 +29,7 @@ for(Z i=0; i<10; ++i) {
   SECTION("everything uninitialized node type")
   {
     std::string_view data = R"(
-for(Z i=0; i<10; ++i) {
+for(let i:Z, i=0; i<10; ++i) {
  cout << "i=" << i;
  cout<< "\n";
 }
diff --git a/tests/test_ASTNodeDataTypeFlattener.cpp b/tests/test_ASTNodeDataTypeFlattener.cpp
index eac32591648857a404e585373c70fd8a46174e54..a8c17999b0111adf43484b6dd313efe452bfe26c 100644
--- a/tests/test_ASTNodeDataTypeFlattener.cpp
+++ b/tests/test_ASTNodeDataTypeFlattener.cpp
@@ -19,7 +19,7 @@ TEST_CASE("ASTNodeDataTypeFlattener", "[language]")
     SECTION("B")
     {
       std::string_view data = R"(
-B b = true;
+let b : B, b = true;
 b;
 )";
 
@@ -42,7 +42,7 @@ b;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
+let n : N;
 n;
 )";
 
diff --git a/tests/test_ASTNodeDeclarationToAffectationConverter.cpp b/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
index 115145a570de045e55d07b856c5523e2f4493214..ec2b03892ea8d10790f49b6f44cffa05cbd71106 100644
--- a/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
+++ b/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
@@ -33,14 +33,14 @@ TEST_CASE("ASTNodeDeclarationToAffectationConverter", "[language]")
   SECTION("nothing to convert")
   {
     std::string_view data = R"(
-R z;
+let z:R;
 )";
 
     std::string_view result = R"(
 (root)
  `-(language::var_declaration)
-     +-(language::R_set)
-     `-(language::name:z)
+     +-(language::name:z)
+     `-(language::R_set)
 )";
 
     CHECK_AST(data, result);
@@ -49,7 +49,7 @@ R z;
   SECTION("simple constructor")
   {
     std::string_view data = R"(
-R z = 0;
+let z :R, z = 0;
 )";
 
     std::string_view result = R"(
@@ -65,9 +65,9 @@ R z = 0;
   SECTION("complex constructors")
   {
     std::string_view data = R"(
-N k = 0;
-for(N i=0; i<2; ++i) {
-  N j = 2*i+k;
+let k:N, k = 0;
+for(let i:N, i=0; i<2; ++i) {
+  let j:N, j = 2*i+k;
   k = 2*j-1;
 }
 )";
diff --git a/tests/test_ASTNodeEmptyBlockCleaner.cpp b/tests/test_ASTNodeEmptyBlockCleaner.cpp
index 18c84cbbfb636f669051a750880dd34ccf132270..e04f1f9c26d45497df34b8b8b41bbbaeca64486c 100644
--- a/tests/test_ASTNodeEmptyBlockCleaner.cpp
+++ b/tests/test_ASTNodeEmptyBlockCleaner.cpp
@@ -60,7 +60,7 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
   {
     std::string_view data = R"(
 {
-  R x = 3;
+  let x:R, x = 3;
 }
 )";
 
@@ -79,7 +79,7 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
   {
     std::string_view data = R"(
 {
-  R x;
+  let x:R;
 }
 )";
 
@@ -94,14 +94,14 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
   {
     std::string_view data = R"(
 {
-  R x;
+  let x:R;
   {
-    R y;
+    let y :R;
   }
   {
-    R z;
+    let z: R;
     {
-      R w;
+      let w : R;
     }
   }
 }
@@ -118,14 +118,14 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
   {
     std::string_view data = R"(
 {
-  R x;
+  let x:R;
   {
-    R y;
+    let y:R;
   }
   {
-    R z;
+    let z:R;
     {
-      R w = 4;
+      let w:R, w = 4;
     }
   }
 }
diff --git a/tests/test_ASTNodeExpressionBuilder.cpp b/tests/test_ASTNodeExpressionBuilder.cpp
index c315caef963756d6f24e747d7f15c51040e7810a..4c45f526459e63cb3442062c6f5e613f4f085934 100644
--- a/tests/test_ASTNodeExpressionBuilder.cpp
+++ b/tests/test_ASTNodeExpressionBuilder.cpp
@@ -155,7 +155,7 @@ false;
   SECTION("name")
   {
     std::string_view data = R"(
-N i;
+let i:N;
 i;
 )";
 
@@ -172,7 +172,7 @@ i;
     SECTION("operator=")
     {
       std::string_view data = R"(
-N i = 1;
+let i:N, i = 1;
 )";
 
       std::string result = R"(
@@ -188,7 +188,7 @@ N i = 1;
     SECTION("operator*=")
     {
       std::string_view data = R"(
-N i = 1;
+let i:N, i = 1;
 i *= 3;
 )";
 
@@ -208,7 +208,7 @@ i *= 3;
     SECTION("operator/=")
     {
       std::string_view data = R"(
-R x = 1;
+let x:R, x = 1;
 x /= 2;
 )";
 
@@ -228,7 +228,7 @@ x /= 2;
     SECTION("operator+=")
     {
       std::string_view data = R"(
-N i = 1;
+let i:N, i = 1;
 i += 3;
 )";
 
@@ -248,7 +248,7 @@ i += 3;
     SECTION("operator-=")
     {
       std::string_view data = R"(
-Z z = 1;
+let z:Z, z = 1;
 z -= 2;
 )";
 
@@ -268,7 +268,7 @@ z -= 2;
     SECTION("tuple -> R^3")
     {
       std::string_view data = R"(
-R*R^3 (t,x) = (0,(1,2,3));
+let  (t,x): R*R^3, (t,x) = (0,(1,2,3));
 )";
 
       std::string result = R"(
@@ -291,7 +291,7 @@ R*R^3 (t,x) = (0,(1,2,3));
     SECTION("tuple -> R^2")
     {
       std::string_view data = R"(
-R*R^2 (t,x) = (0,(1,2));
+let (t,x): R*R^2, (t,x) = (0,(1,2));
 )";
 
       std::string result = R"(
@@ -331,7 +331,7 @@ R*R^2 (t,x) = (0,(1,2));
     SECTION("unary minus for N")
     {
       std::string_view data = R"(
-N n;
+let n:N;
 -n;
 )";
 
@@ -382,7 +382,7 @@ N n;
     SECTION("pre-increment operator")
     {
       std::string_view data = R"(
-Z a=1;
+let a:Z, a=1;
 ++a;
 )";
 
@@ -401,7 +401,7 @@ Z a=1;
     SECTION("pre-decrement operator")
     {
       std::string_view data = R"(
-Z a=1;
+let a:Z, a=1;
 --a;
 )";
 
@@ -420,7 +420,7 @@ Z a=1;
     SECTION("post-increment operator")
     {
       std::string_view data = R"(
-Z a=1;
+let a:Z, a=1;
 a++;
 )";
 
@@ -439,7 +439,7 @@ a++;
     SECTION("post-decrement operator")
     {
       std::string_view data = R"(
-Z a=1;
+let a:Z, a=1;
 a--;
 )";
 
@@ -458,7 +458,7 @@ a--;
     SECTION("array subscript")
     {
       std::string_view data = R"(
-R^3 x = (1, 2, 3);
+let x: R^3, x = (1, 2, 3);
 x[2];
 )";
 
@@ -757,7 +757,7 @@ while(true);
       SECTION("for_statement")
       {
         std::string_view data = R"(
-for(N i=0; i<10; ++i);
+for(let i:N, i=0; i<10; ++i);
 )";
 
         std::string result = R"(
@@ -780,7 +780,7 @@ for(N i=0; i<10; ++i);
       SECTION("no init")
       {
         std::string_view data = R"(
-N i=0;
+let i:N, i=0;
 for(; i<10; ++i);
 )";
 
@@ -805,7 +805,7 @@ for(; i<10; ++i);
       SECTION("no test")
       {
         std::string_view data = R"(
-for(N i=0; ; ++i);
+for(let i:N, i=0; ; ++i);
 )";
 
         std::string result = R"(
@@ -826,7 +826,7 @@ for(N i=0; ; ++i);
       SECTION("no post instruction")
       {
         std::string_view data = R"(
-for(N i=0; i<10;);
+for(let i:N, i=0; i<10;);
 )";
 
         std::string result = R"(
diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
index b44d99c1ade0f4d8a70da10767201f2bbb6365a7..3a34a4915a66a5fe60fc805186482475f0b9e85b 100644
--- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
@@ -276,7 +276,7 @@ cat("foo", true);
     {
       std::string_view data = R"(
 let cat : string*string -> string, (s1,s2) -> s1+s2;
-N n = 2;
+let n : N, n = 2;
 cat("foo", n);
 )";
 
@@ -335,7 +335,7 @@ cat("foo", 2.5e-3);
     {
       std::string_view data = R"(
 let f : R^1 -> R^1, x -> x+x;
-R^1 x = 1;
+let x : R^1, x = 1;
 f(x);
 )";
 
@@ -353,7 +353,7 @@ f(x);
     {
       std::string_view data = R"(
 let f : R^2 -> R^2, x -> x+x;
-R^2 x = (1,2);
+let x : R^2, x = (1,2);
 f(x);
 )";
 
@@ -371,7 +371,7 @@ f(x);
     {
       std::string_view data = R"(
 let f : R^3 -> R^3, x -> x+x;
-R^3 x = (1,2,3);
+let x : R^3, x = (1,2,3);
 f(x);
 )";
 
@@ -722,7 +722,7 @@ bad_B(3);
       {
         std::string_view data = R"(
 let negate : B -> B, b -> not b;
-N n = 2;
+let n : N, n = 2;
 negate(n);
 )";
 
diff --git a/tests/test_ASTNodeIncDecExpressionBuilder.cpp b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
index 9f24a2e0c5a5ff9b563b2490756937a2383b413a..947852f9b28a743a7e5c09ffc43d113b6130a225 100644
--- a/tests/test_ASTNodeIncDecExpressionBuilder.cpp
+++ b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
@@ -66,7 +66,7 @@ TEST_CASE("ASTNodeIncDecExpressionBuilder", "[language]")
     SECTION("N")
     {
       std::string_view data = R"(
-N i=0;
+let i : N, i=0;
 ++i;
 )";
 
@@ -85,7 +85,7 @@ N i=0;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z i=0;
+let i : Z, i=0;
 ++i;
 )";
 
@@ -104,7 +104,7 @@ Z i=0;
     SECTION("R")
     {
       std::string_view data = R"(
-R x=0;
+let x : R, x=0;
 ++x;
 )";
 
@@ -126,7 +126,7 @@ R x=0;
     SECTION("N")
     {
       std::string_view data = R"(
-N i=1;
+let i : N, i=1;
 --i;
 )";
 
@@ -145,7 +145,7 @@ N i=1;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z i=0;
+let i : Z, i=0;
 --i;
 )";
 
@@ -164,7 +164,7 @@ Z i=0;
     SECTION("R")
     {
       std::string_view data = R"(
-R x=2.3;
+let x : R, x=2.3;
 --x;
 )";
 
@@ -186,7 +186,7 @@ R x=2.3;
     SECTION("N")
     {
       std::string_view data = R"(
-N i=0;
+let i : N, i=0;
 i++;
 )";
 
@@ -205,7 +205,7 @@ i++;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z i=0;
+let i : Z, i=0;
 i++;
 )";
 
@@ -224,7 +224,7 @@ i++;
     SECTION("R")
     {
       std::string_view data = R"(
-R x=0;
+let x : R, x=0;
 x++;
 )";
 
@@ -246,7 +246,7 @@ x++;
     SECTION("N")
     {
       std::string_view data = R"(
-N i=1;
+let i : N, i=1;
 i--;
 )";
 
@@ -265,7 +265,7 @@ i--;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z i=0;
+let i : Z, i=0;
 i--;
 )";
 
@@ -284,7 +284,7 @@ i--;
     SECTION("R")
     {
       std::string_view data = R"(
-R x=2.3;
+let x : R, x=2.3;
 x--;
 )";
 
diff --git a/tests/test_ASTNodeListAffectationExpressionBuilder.cpp b/tests/test_ASTNodeListAffectationExpressionBuilder.cpp
index 654049f152547c1800bce0d94cc3628583abcac2..e4f3aab754186255c90b382e90bc530c10da02c4 100644
--- a/tests/test_ASTNodeListAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeListAffectationExpressionBuilder.cpp
@@ -69,7 +69,7 @@ TEST_CASE("ASTNodeListAffectationExpressionBuilder", "[language]")
     SECTION("without conversion R*R")
     {
       std::string_view data = R"(
-R*R (x,y) = (2.3, 6.2);
+let (x, y) : R*R, (x,y) = (2.3, 6.2);
 )";
 
       std::string_view result = R"(
@@ -89,8 +89,8 @@ R*R (x,y) = (2.3, 6.2);
     SECTION("without conversion B*Z*N")
     {
       std::string_view data = R"(
-N n = 2;
-B*Z*N (b,z,m) = (false, -2, n);
+let n:N, n = 2;
+let ( b, z , m ): B*Z*N, (b,z,m) = (false, -2, n);
 )";
 
       std::string_view result = R"(
@@ -116,7 +116,7 @@ B*Z*N (b,z,m) = (false, -2, n);
     SECTION("with conversion R*B*Z*N")
     {
       std::string_view data = R"(
-R*B*Z*N (r,b,z,m) = (3.2, true, 6, 2);
+let (r,b,z,m) : R*B*Z*N, (r,b,z,m) = (3.2, true, 6, 2);
 )";
 
       std::string_view result = R"(
@@ -140,7 +140,7 @@ R*B*Z*N (r,b,z,m) = (3.2, true, 6, 2);
     SECTION("with conversion R*R*R*R")
     {
       std::string_view data = R"(
-R*R*R*R (r,b,z,m) = (3.2, 1, 6, 2);
+let (r,b,z,m): R*R*R*R , (r,b,z,m) = (3.2, 1, 6, 2);
 )";
 
       std::string_view result = R"(
@@ -164,10 +164,11 @@ R*R*R*R (r,b,z,m) = (3.2, 1, 6, 2);
     SECTION("without conversion R^1*R^2*R^3*R")
     {
       std::string_view data = R"(
-R^1 a = 0;
-R^2 b = (1,2);
-R^3 c = (1,2,3);
-R^1*R^2*R^3*R (x1,x2,x3,x) = (a, b, c, 2);
+let a:R^1, a = 0;
+let b:R^2, b = (1,2);
+let c:R^3, c = (1,2,3);
+let (x1,x2,x3,x) : R^1*R^2*R^3*R,
+    (x1,x2,x3,x) = (a, b, c, 2);
 )";
 
       std::string_view result = R"(
@@ -205,7 +206,7 @@ R^1*R^2*R^3*R (x1,x2,x3,x) = (a, b, c, 2);
     SECTION("Zero initialization")
     {
       std::string_view data = R"(
-R^1*R^2*R^3*R (x1,x2,x3,x) = (0, 0, 0, 0);
+let  (x1,x2,x3,x) : R^1*R^2*R^3*R, (x1,x2,x3,x) = (0, 0, 0, 0);
 )";
 
       std::string_view result = R"(
@@ -230,7 +231,7 @@ R^1*R^2*R^3*R (x1,x2,x3,x) = (0, 0, 0, 0);
     {
       std::string_view data = R"(
 let f: R -> R*R, x -> (x*x, x+1);
-R*R (x,y) = f(2);
+let  (x,y): R*R, (x,y) = f(2);
 )";
 
       std::string_view result = R"(
@@ -250,7 +251,7 @@ R*R (x,y) = f(2);
     SECTION("string without conversion")
     {
       std::string_view data = R"(
-string*string (s,r) = ("foo","bar");
+let  (s,r): string*string, (s,r) = ("foo","bar");
 )";
 
       std::string_view result = R"(
@@ -270,8 +271,9 @@ string*string (s,r) = ("foo","bar");
     SECTION("string with conversion")
     {
       std::string_view data = R"(
-N n =2;
-string*string*string*string (r,s,t,u) = (3.2, -2, true, n);
+let n:N, n =2;
+let  (r,s,t,u) : string*string*string*string,
+     (r,s,t,u) = (3.2, -2, true, n);
 )";
 
       std::string_view result = R"(
@@ -302,8 +304,8 @@ string*string*string*string (r,s,t,u) = (3.2, -2, true, n);
     SECTION("invalid affectation rhs")
     {
       std::string_view data = R"(
-R x;
-R i;
+let x:R;
+let i:R;
 (x,i) = 3;
 )";
 
@@ -313,7 +315,7 @@ R i;
     SECTION("incompatible list sizes")
     {
       std::string_view data = R"(
-R*R (x,y) = (3, 3, 2);
+let (x,y) : R*R, (x,y) = (3, 3, 2);
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"incompatible list sizes in affectation"});
@@ -322,7 +324,7 @@ R*R (x,y) = (3, 3, 2);
     SECTION("incompatible list sizes 2")
     {
       std::string_view data = R"(
-R*R*R (x,y,z) = (1, 2);
+let (x,y,z):R*R*R, (x,y,z) = (1, 2);
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"incompatible list sizes in affectation"});
@@ -332,7 +334,7 @@ R*R*R (x,y,z) = (1, 2);
     {
       std::string_view data = R"(
 let f: R -> R, x -> x*x;
-R*R (x,y) = f(3);
+let(x,y) : R*R, (x,y) = f(3);
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"incompatible list sizes in affectation"});
@@ -341,7 +343,7 @@ R*R (x,y) = f(3);
     SECTION("incompatible list sizes from function evaluation")
     {
       std::string_view data = R"(
-R*R (x,y) = (2,3);
+let(x,y):R*R,(x,y)=(2,3);
 (x,y) += (1,4);
 )";
 
@@ -352,7 +354,7 @@ R*R (x,y) = (2,3);
     {
       std::string_view data = R"(
 let f: R -> R, x -> x+1;
-R*R (x,y) = (f,2);
+let  (x,y) : R*R, (x,y) = (f,2);
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: function -> R"});
@@ -362,7 +364,7 @@ R*R (x,y) = (f,2);
     {
       std::string_view data = R"(
 let f: R -> R, x -> x+1;
-string*N (s,n) = (f,2);
+let (s,n):string*N, (s,n) = (f,2);
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: function -> string"});
@@ -372,7 +374,7 @@ string*N (s,n) = (f,2);
     {
       std::string_view data = R"(
 let f: R -> R, x -> x+1;
-R x;
+let x:R;
 
 (f,x) = (3,2);
 )";
@@ -383,8 +385,8 @@ R x;
     SECTION("invalid R^n -> R^m conversion")
     {
       std::string_view data = R"(
-R^2 x = (1,2);
-R^3 y = x;
+let x:R^2, x = (1,2);
+let y:R^3, y = x;
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"incompatible dimensions in affectation"});
@@ -393,7 +395,7 @@ R^3 y = x;
     SECTION("invalid Z -> R^d conversion (non-zero)")
     {
       std::string_view data = R"(
-R^2 x = 1;
+let x:R^2, x = 1;
 )";
 
       CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: Z -> R^2"});
diff --git a/tests/test_ASTNodeTypeCleaner.cpp b/tests/test_ASTNodeTypeCleaner.cpp
index 4bf4fcfddb391e9bf3ba8ca1195de84f932ab48f..ed5b18a47ef6c6353d6fe25141620de4a39e17e7 100644
--- a/tests/test_ASTNodeTypeCleaner.cpp
+++ b/tests/test_ASTNodeTypeCleaner.cpp
@@ -50,7 +50,7 @@ cout << "two=" << 2 << "\n";
   SECTION("single declaration")
   {
     std::string_view data = R"(
-R z;
+let z:R;
 z = 1;
 )";
 
@@ -67,10 +67,10 @@ z = 1;
   SECTION("multiple declaration")
   {
     std::string_view data = R"(
-Z z;
+let z:Z;
 z = 1;
 if (true) {
-  R x;
+  let x:R;
   x = 0.5 *z;
 }
 )";
diff --git a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
index 98944b1775ebe4250a5c58d7a5f0421ed4eea18b..9077e217a85ad2a68d208b9bb1c0a1b1e3e71ddf 100644
--- a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
@@ -58,7 +58,7 @@ TEST_CASE("ASTNodeUnaryOperatorExpressionBuilder", "[language]")
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b:B;
 -b;
 -true;
 -false;
@@ -80,7 +80,7 @@ B b;
     SECTION("N")
     {
       std::string_view data = R"(
-N n;
+let n:N;
 -n;
 )";
 
@@ -96,7 +96,7 @@ N n;
     SECTION("Z")
     {
       std::string_view data = R"(
-Z i;
+let i:Z;
 -i;
 )";
 
@@ -112,7 +112,7 @@ Z i;
     SECTION("R")
     {
       std::string_view data = R"(
-R x;
+let x:R;
 -x;
 )";
 
@@ -128,7 +128,7 @@ R x;
     SECTION("R^1")
     {
       std::string_view data = R"(
-R^1 x;
+let x:R^1;
 -x;
 )";
 
@@ -144,7 +144,7 @@ R^1 x;
     SECTION("R^2")
     {
       std::string_view data = R"(
-R^2 x;
+let x:R^2;
 -x;
 )";
 
@@ -160,7 +160,7 @@ R^2 x;
     SECTION("R^3")
     {
       std::string_view data = R"(
-R^3 x;
+let x:R^3;
 -x;
 )";
 
@@ -179,7 +179,7 @@ R^3 x;
     SECTION("B")
     {
       std::string_view data = R"(
-B b;
+let b:B;
 not b;
 )";
 
@@ -220,7 +220,7 @@ not b;
 
     SECTION("errors")
     {
-      CHECK_AST_THROWS_WITH(R"(N n; not n;)", "invalid implicit conversion: N -> B");
+      CHECK_AST_THROWS_WITH(R"(let n:N; not n;)", "invalid implicit conversion: N -> B");
       CHECK_AST_THROWS_WITH(R"(not 2;)", "invalid implicit conversion: Z -> B");
       CHECK_AST_THROWS_WITH(R"(not -2.3;)", "invalid implicit conversion: R -> B");
       CHECK_AST_THROWS_WITH(R"(not "foo";)", "invalid implicit conversion: string -> B");
diff --git a/tests/test_ASTPrinter.cpp b/tests/test_ASTPrinter.cpp
index eaaf6b759381b967437b61cef9c7c4acf5a3371e..cbf5f92e761f0db82049c4689ac11271118603ff 100644
--- a/tests/test_ASTPrinter.cpp
+++ b/tests/test_ASTPrinter.cpp
@@ -28,12 +28,13 @@ TEST_CASE("ASTPrinter", "[language]")
   SECTION("raw output")
   {
     std::string_view data = R"(
-N n = 2 + 3;
+let n:N, n = 2 + 3;
 )";
 
     std::string_view result = R"(
 (root:undefined)
  `-(language::var_declaration:undefined)
+     +-(language::name:n:undefined)
      +-(language::N_set:undefined)
      +-(language::name:n:undefined)
      `-(language::plus_op:undefined)
@@ -46,12 +47,13 @@ N n = 2 + 3;
   SECTION("pretty output")
   {
     std::string_view data = R"(
-N n = 2 + 3;
+let n:N, n = 2 + 3;
 )";
 
     std::string_view result = R"(
 (root:undefined)
  └──(language::var_declaration:undefined)
+     ├──(language::name:n:undefined)
      ├──(language::N_set:undefined)
      ├──(language::name:n:undefined)
      └──(language::plus_op:undefined)
@@ -64,12 +66,13 @@ N n = 2 + 3;
   SECTION("escaped sequences")
   {
     std::string_view data = R"(
-string s = "a string";
+let s:string, s = "a string";
 )";
 
     std::string_view result = R"(
 (root:undefined)
  `-(language::var_declaration:undefined)
+     +-(language::name:s:undefined)
      +-(language::string_type:undefined)
      +-(language::name:s:undefined)
      `-(language::literal:"a string":undefined)
diff --git a/tests/test_ASTSymbolInitializationChecker.cpp b/tests/test_ASTSymbolInitializationChecker.cpp
index a9faafc595b48bba234e0a621804a109855e2092..7c07e437fff28cd429301b1cb3fc3bf858a4010d 100644
--- a/tests/test_ASTSymbolInitializationChecker.cpp
+++ b/tests/test_ASTSymbolInitializationChecker.cpp
@@ -10,9 +10,9 @@ TEST_CASE("ASTSymbolInitializationChecker", "[language]")
   SECTION("Declarative initialization")
   {
     std::string_view data = R"(
-N m = 2;
-N n = m ;
-N p;
+let m:N, m = 2;
+let n:N, n = m ;
+let p:N;
 )";
 
     string_input input{data, "test.pgs"};
@@ -40,7 +40,7 @@ N p;
   SECTION("Array subscript initialization")
   {
     std::string_view data = R"(
-R^3 x;
+let x:R^3;
 x[0] = 1;
 )";
 
@@ -61,9 +61,9 @@ x[0] = 1;
   SECTION("Declaration plus affectation")
   {
     std::string_view data = R"(
-Z z;
-N m;
-N n;
+let z:Z;
+let m:N;
+let n:N;
 n = 2;
 m = n;
 )";
@@ -115,7 +115,7 @@ let f: R->R, x->x+1;
     SECTION("Declarative initialization")
     {
       std::string_view data = R"(
-R*R (x,y) = (2.3, 4.1);
+let (x,y):R*R, (x,y) = (2.3, 4.1);
 )";
 
       string_input input{data, "test.pgs"};
@@ -139,7 +139,7 @@ R*R (x,y) = (2.3, 4.1);
     SECTION("Declarative initialization")
     {
       std::string_view data = R"(
-R^2 x = (2.3, 4.1);
+let x:R^2, x = (2.3, 4.1);
 )";
 
       string_input input{data, "test.pgs"};
@@ -159,7 +159,7 @@ R^2 x = (2.3, 4.1);
     SECTION("Not initialized")
     {
       std::string_view data = R"(
-R*R (x,y);
+let(x,y):R*R;
 y = 3;
 )";
 
@@ -184,7 +184,7 @@ y = 3;
     SECTION("Affectation")
     {
       std::string_view data = R"(
-R*R (x,y);
+let (x,y):R*R;
 (x,y) = (2.3, 4.1);
 )";
 
@@ -209,7 +209,7 @@ R*R (x,y);
     SECTION("Affectation")
     {
       std::string_view data = R"(
-R^3*R (x,y);
+let (x,y):R^3*R;
 (x,y) = ((2.3, 2, 5), 4.1);
 )";
 
@@ -235,7 +235,7 @@ R^3*R (x,y);
   SECTION("Affectation")
   {
     std::string_view data = R"(
-R^3 x;
+let x:R^3;
 (x[2], x[1], x[0]) = (1, 2, 3);
 )";
 
@@ -258,8 +258,8 @@ R^3 x;
     SECTION("used uninitialized")
     {
       std::string_view data = R"(
-N n;
-N m = n;
+let n:N;
+let m:N, m = n;
 )";
 
       string_input input{data, "test.pgs"};
@@ -272,8 +272,8 @@ N m = n;
     SECTION("used uninitialized in list affectation")
     {
       std::string_view data = R"(
-N k;
-N*R (l, x);
+let k:N;
+let (l, x) : N*R;
 
 (k, x) = (l, 3.2);
 )";
@@ -288,7 +288,7 @@ N*R (l, x);
     SECTION("used uninitialized in function")
     {
       std::string_view data = R"(
-R y;
+let y:R;
 let f : R->R, x->x+y;
 )";
 
diff --git a/tests/test_ASTSymbolTableBuilder.cpp b/tests/test_ASTSymbolTableBuilder.cpp
index df84b4ff485e2ced82fa916708f5eda5a32ac11c..f39e5fac332eadd79b29347dfdf8310443aff283 100644
--- a/tests/test_ASTSymbolTableBuilder.cpp
+++ b/tests/test_ASTSymbolTableBuilder.cpp
@@ -8,10 +8,10 @@ TEST_CASE("ASTSymbolTableBuilder", "[language]")
   SECTION("Build symbols")
   {
     std::string_view data = R"(
-N n = 2;
+let n:N, n = 2;
 {
- N m = n;
- R n = m/3.;
+ let m:N, m = n;
+ let n:R, n = m/3.;
 }
 )";
 
@@ -24,11 +24,11 @@ N n = 2;
   SECTION("Populate symbol table")
   {
     std::string_view data = R"(
-B b;
-N n;
-Z z;
-R x;
-R*Z*N*B (c0,c1,c2,c3);
+let b:B;
+let n:N;
+let z:Z;
+let x:R;
+let (c0,c1,c2,c3):R*Z*N*B;
 let f: R*Z*B->R, (x,n,z) -> x+n;
 )";
 
@@ -64,7 +64,7 @@ let f: R*Z*B->R, (x,n,z) -> x+n;
     SECTION("Undeclared symbol")
     {
       std::string_view data = R"(
-N n = a;
+let n:N, n = a;
 )";
 
       string_input input{data, "test.pgs"};
@@ -76,8 +76,8 @@ N n = a;
     SECTION("Re-declared symbol")
     {
       std::string_view data = R"(
-N n = 0;
-N n = 1;
+let n:N, n = 0;
+let n:N, n = 1;
 )";
 
       string_input input{data, "test.pgs"};
@@ -89,7 +89,7 @@ N n = 1;
     SECTION("Re-declared symbol (function)")
     {
       std::string_view data = R"(
-N f;
+let f:N;
 let f : R -> R, x -> 1;
 )";
 
diff --git a/tests/test_AffectationProcessor.cpp b/tests/test_AffectationProcessor.cpp
index 06428a8a3fcdf1e370ad033f35cffdbf1200887d..4df698083702bbf1d92630560cd60345fcdd1c40 100644
--- a/tests/test_AffectationProcessor.cpp
+++ b/tests/test_AffectationProcessor.cpp
@@ -48,21 +48,6 @@
     REQUIRE(value == expected_value);                                         \
   }
 
-#define CHECK_AFFECTATION_THROWS(data)                                                       \
-  {                                                                                          \
-    string_input input{data, "test.pgs"};                                                    \
-    auto ast = ASTBuilder::build(input);                                                     \
-                                                                                             \
-    ASTSymbolTableBuilder{*ast};                                                             \
-    ASTNodeDataTypeBuilder{*ast};                                                            \
-                                                                                             \
-    ASTNodeDeclarationToAffectationConverter{*ast};                                          \
-    ASTNodeTypeCleaner<language::var_declaration>{*ast};                                     \
-                                                                                             \
-    REQUIRE_THROWS(ASTNodeExpressionBuilder{*ast},                                           \
-                   Catch::Matchers::Contains("invalid operands to affectation expression")); \
-  }
-
 #define CHECK_AFFECTATION_THROWS_WITH(data, error_message)              \
   {                                                                     \
     string_input input{data, "test.pgs"};                               \
@@ -83,69 +68,70 @@ TEST_CASE("AffectationProcessor", "[language]")
   {
     SECTION("B")
     {
-      CHECK_AFFECTATION_RESULT("B b; b = true;", "b", true);
+      CHECK_AFFECTATION_RESULT("let b : B; b = true;", "b", true);
     }
 
     SECTION("N")
     {
-      CHECK_AFFECTATION_RESULT("N n = 1;", "n", 1ul);
-      CHECK_AFFECTATION_RESULT("N m = 2; N n = m;", "n", 2ul);
-      CHECK_AFFECTATION_RESULT("N n = true;", "n", 1ul);
-      CHECK_AFFECTATION_RESULT("N n = false;", "n", 0ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1;", "n", 1ul);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let n : N, n = m;", "n", 2ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = true;", "n", 1ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = false;", "n", 0ul);
     }
 
     SECTION("Z")
     {
-      CHECK_AFFECTATION_RESULT("Z z = -1;", "z", -1l);
-      CHECK_AFFECTATION_RESULT("Z z = true;", "z", 1l);
-      CHECK_AFFECTATION_RESULT("Z z = false;", "z", 0l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = -1;", "z", -1l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = true;", "z", 1l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = false;", "z", 0l);
     }
 
     SECTION("R")
     {
-      CHECK_AFFECTATION_RESULT("R r = -1;", "r", double{-1});
-      CHECK_AFFECTATION_RESULT("R r = true;", "r", double{1});
-      CHECK_AFFECTATION_RESULT("R r = false;", "r", double{0});
-      CHECK_AFFECTATION_RESULT("R r = -2.3;", "r", double{-2.3});
+      CHECK_AFFECTATION_RESULT("let r : R, r = -1;", "r", double{-1});
+      CHECK_AFFECTATION_RESULT("let r : R, r = true;", "r", double{1});
+      CHECK_AFFECTATION_RESULT("let r : R, r = false;", "r", double{0});
+      CHECK_AFFECTATION_RESULT("let r : R, r = -2.3;", "r", double{-2.3});
     }
 
     SECTION("R^1")
     {
-      CHECK_AFFECTATION_RESULT("R^1 x = -1;", "x", (TinyVector<1>{-1}));
-      CHECK_AFFECTATION_RESULT("R^1 x = true;", "x", (TinyVector<1>{true}));
-      CHECK_AFFECTATION_RESULT("R^1 x = false;", "x", (TinyVector<1>{false}));
-      CHECK_AFFECTATION_RESULT("R^1 x = -2.3;", "x", (TinyVector<1>{-2.3}));
-      CHECK_AFFECTATION_RESULT("R^1 x; x[0] = -1;", "x", (TinyVector<1>{-1}));
-      CHECK_AFFECTATION_RESULT("R^1 x; x[0] = true;", "x", (TinyVector<1>{true}));
-      CHECK_AFFECTATION_RESULT("R^1 x; x[0] = false;", "x", (TinyVector<1>{false}));
-      CHECK_AFFECTATION_RESULT("R^1 x; x[0] = -2.3;", "x", (TinyVector<1>{-2.3}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = -1;", "x", (TinyVector<1>{-1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = true;", "x", (TinyVector<1>{true}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = false;", "x", (TinyVector<1>{false}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = -2.3;", "x", (TinyVector<1>{-2.3}));
+      CHECK_AFFECTATION_RESULT("let x : R^1; x[0] = -1;", "x", (TinyVector<1>{-1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1; x[0] = true;", "x", (TinyVector<1>{true}));
+      CHECK_AFFECTATION_RESULT("let x : R^1; x[0] = false;", "x", (TinyVector<1>{false}));
+      CHECK_AFFECTATION_RESULT("let x : R^1; x[0] = -2.3;", "x", (TinyVector<1>{-2.3}));
 
-      CHECK_AFFECTATION_RESULT("R^1 x = 0;", "x", (TinyVector<1>{zero}));
-      CHECK_AFFECTATION_RESULT("R^1 x; x = 0;", "x", (TinyVector<1>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 0;", "x", (TinyVector<1>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^1; x = 0;", "x", (TinyVector<1>{zero}));
     }
 
     SECTION("R^2")
     {
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true);", "x", (TinyVector<2>{-1, true}));
-      CHECK_AFFECTATION_RESULT("R^2 x = (true, false);", "x", (TinyVector<2>{true, false}));
-      CHECK_AFFECTATION_RESULT("R^2 x = (-0.3, 12);", "x", (TinyVector<2>{-0.3, 12}));
-      CHECK_AFFECTATION_RESULT("R^2 x; x[0] = -1; x[1] = true;", "x", (TinyVector<2>{-1, true}));
-      CHECK_AFFECTATION_RESULT("R^2 x; x[0] = true; x[1] = false;", "x", (TinyVector<2>{true, false}));
-      CHECK_AFFECTATION_RESULT("R^2 x; x[0] = -0.3; x[1] = 12;", "x", (TinyVector<2>{-0.3, 12}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true);", "x", (TinyVector<2>{-1, true}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (true, false);", "x", (TinyVector<2>{true, false}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-0.3, 12);", "x", (TinyVector<2>{-0.3, 12}));
+      CHECK_AFFECTATION_RESULT("let x : R^2; x[0] = -1; x[1] = true;", "x", (TinyVector<2>{-1, true}));
+      CHECK_AFFECTATION_RESULT("let x : R^2; x[0] = true; x[1] = false;", "x", (TinyVector<2>{true, false}));
+      CHECK_AFFECTATION_RESULT("let x : R^2; x[0] = -0.3; x[1] = 12;", "x", (TinyVector<2>{-0.3, 12}));
 
-      CHECK_AFFECTATION_RESULT("R^2 x = 0;", "x", (TinyVector<2>{zero}));
-      CHECK_AFFECTATION_RESULT("R^2 x; x = 0;", "x", (TinyVector<2>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = 0;", "x", (TinyVector<2>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^2; x = 0;", "x", (TinyVector<2>{zero}));
     }
 
     SECTION("R^3")
     {
-      CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false);", "x", (TinyVector<3>{-1, true, false}));
-      CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2);", "x", (TinyVector<3>{-0.3, 12, 6.2}));
-      CHECK_AFFECTATION_RESULT("R^3 x; x[0] = -1; x[1] = true; x[2] = false;", "x", (TinyVector<3>{-1, true, false}));
-      CHECK_AFFECTATION_RESULT("R^3 x; x[0] = -0.3; x[1] = 12; x[2] = 6.2;", "x", (TinyVector<3>{-0.3, 12, 6.2}));
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-1, true, false);", "x", (TinyVector<3>{-1, true, false}));
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-0.3, 12, 6.2);", "x", (TinyVector<3>{-0.3, 12, 6.2}));
+      CHECK_AFFECTATION_RESULT("let x : R^3; x[0] = -1; x[1] = true; x[2] = false;", "x",
+                               (TinyVector<3>{-1, true, false}));
+      CHECK_AFFECTATION_RESULT("let x : R^3; x[0] = -0.3; x[1] = 12; x[2] = 6.2;", "x", (TinyVector<3>{-0.3, 12, 6.2}));
 
-      CHECK_AFFECTATION_RESULT("R^3 x = 0;", "x", (TinyVector<3>{zero}));
-      CHECK_AFFECTATION_RESULT("R^3 x; x = 0;", "x", (TinyVector<3>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = 0;", "x", (TinyVector<3>{zero}));
+      CHECK_AFFECTATION_RESULT("let x : R^3; x = 0;", "x", (TinyVector<3>{zero}));
     }
   }
 
@@ -153,48 +139,49 @@ TEST_CASE("AffectationProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_AFFECTATION_RESULT("N n = 1; n += 3;", "n", 4ul);
-      CHECK_AFFECTATION_RESULT("N m = 2; N n = 1; n += m;", "n", 3ul);
-      CHECK_AFFECTATION_RESULT("N n = 1; n += true;", "n", 2ul);
-      CHECK_AFFECTATION_RESULT("N n = 3; n += false;", "n", 3ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1; n += 3;", "n", 4ul);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let n : N, n = 1; n += m;", "n", 3ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1; n += true;", "n", 2ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 3; n += false;", "n", 3ul);
     }
 
     SECTION("Z")
     {
-      CHECK_AFFECTATION_RESULT("Z z = 1; z += 3;", "z", 4l);
-      CHECK_AFFECTATION_RESULT("N m = 2; Z z = 1; z += m;", "z", 3l);
-      CHECK_AFFECTATION_RESULT("Z z = 1; z += true;", "z", 2l);
-      CHECK_AFFECTATION_RESULT("Z z = 3; z += false;", "z", 3l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z += 3;", "z", 4l);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let z : Z, z = 1; z += m;", "z", 3l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z += true;", "z", 2l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 3; z += false;", "z", 3l);
     }
 
     SECTION("R")
     {
-      CHECK_AFFECTATION_RESULT("R r = 1.2; r += 2.3;", "r", 3.5);
-      CHECK_AFFECTATION_RESULT("N m = 2; R r = 1.3; r += m;", "r", 3.3);
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r += true;", "r", 2.1);
-      CHECK_AFFECTATION_RESULT("R r = 3.3; r += false;", "r", 3.3);
-      CHECK_AFFECTATION_RESULT("R r = 2; r += 1.1;", "r", 3.1);
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.2; r += 2.3;", "r", 3.5);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let r : R, r = 1.3; r += m;", "r", 3.3);
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r += true;", "r", 2.1);
+      CHECK_AFFECTATION_RESULT("let r : R, r = 3.3; r += false;", "r", 3.3);
+      CHECK_AFFECTATION_RESULT("let r : R, r = 2; r += 1.1;", "r", 3.1);
     }
 
     SECTION("R^1")
     {
-      CHECK_AFFECTATION_RESULT("R^1 x = -1; R^1 y = 1; x += y;", "x", (TinyVector<1>{-1} + TinyVector<1>{1}));
-      CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] += 1;", "x", (TinyVector<1>{2} + TinyVector<1>{1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = -1; let y : R^1, y = 1; x += y;", "x",
+                               (TinyVector<1>{-1} + TinyVector<1>{1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 2; x[0] += 1;", "x", (TinyVector<1>{2} + TinyVector<1>{1}));
     }
 
     SECTION("R^2")
     {
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); R^2 y = (1,3); x += y;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); let y : R^2, y = (1,3); x += y;", "x",
                                (TinyVector<2>{-1, true} + TinyVector<2>{1, 3}));
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] += 2; x[1] += 1;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); x[0] += 2; x[1] += 1;", "x",
                                (TinyVector<2>{-1, true} + TinyVector<2>{2, 1}));
     }
 
     SECTION("R^3")
     {
-      CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); R^3 y = (1,2,3); x += y;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-1, true, false); let y : R^3, y = (1,2,3); x += y;", "x",
                                (TinyVector<3>{-1, true, false} + TinyVector<3>{1, 2, 3}));
-      CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] += 1; x[1] += -3; x[2] += 1;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-0.3, 12, 6.2); x[0] += 1; x[1] += -3; x[2] += 1;", "x",
                                (TinyVector<3>{-0.3, 12, 6.2} + TinyVector<3>{1, -3, 1}));
     }
   }
@@ -203,48 +190,49 @@ TEST_CASE("AffectationProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_AFFECTATION_RESULT("N n = 3; n -= 2;", "n", 1ul);
-      CHECK_AFFECTATION_RESULT("N m = 2; N n = 4; n -= m;", "n", 2ul);
-      CHECK_AFFECTATION_RESULT("N n = 1; n -= true;", "n", 0ul);
-      CHECK_AFFECTATION_RESULT("N n = 3; n -= false;", "n", 3ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 3; n -= 2;", "n", 1ul);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let n : N, n = 4; n -= m;", "n", 2ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1; n -= true;", "n", 0ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 3; n -= false;", "n", 3ul);
     }
 
     SECTION("Z")
     {
-      CHECK_AFFECTATION_RESULT("Z z = 1; z -= 3;", "z", -2l);
-      CHECK_AFFECTATION_RESULT("N m = 2; Z z = 1; z -= m;", "z", -1l);
-      CHECK_AFFECTATION_RESULT("Z z = 1; z -= true;", "z", 0l);
-      CHECK_AFFECTATION_RESULT("Z z = 3; z -= false;", "z", 3l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z -= 3;", "z", -2l);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let z : Z, z = 1; z -= m;", "z", -1l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z -= true;", "z", 0l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 3; z -= false;", "z", 3l);
     }
 
     SECTION("R")
     {
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r -= 2;", "r", (1.1 - 2l));
-      CHECK_AFFECTATION_RESULT("N m = 2; R r = 1.3; r -= m;", "r", (1.3 - 2ul));
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r -= true;", "r", (1.1 - true));
-      CHECK_AFFECTATION_RESULT("R r = 3.3; r -= false;", "r", 3.3);
-      CHECK_AFFECTATION_RESULT("R r = 2; r -= 1.1;", "r", (2. - 1.1));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r -= 2;", "r", (1.1 - 2l));
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let r : R, r = 1.3; r -= m;", "r", (1.3 - 2ul));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r -= true;", "r", (1.1 - true));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 3.3; r -= false;", "r", 3.3);
+      CHECK_AFFECTATION_RESULT("let r : R, r = 2; r -= 1.1;", "r", (2. - 1.1));
     }
 
     SECTION("R^1")
     {
-      CHECK_AFFECTATION_RESULT("R^1 x = -1; R^1 y = 1; x -= y;", "x", (TinyVector<1>{-1} - TinyVector<1>{1}));
-      CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] -= 1;", "x", (TinyVector<1>{2} - TinyVector<1>{1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = -1; let y : R^1, y = 1; x -= y;", "x",
+                               (TinyVector<1>{-1} - TinyVector<1>{1}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 2; x[0] -= 1;", "x", (TinyVector<1>{2} - TinyVector<1>{1}));
     }
 
     SECTION("R^2")
     {
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); R^2 y = (1,3); x -= y;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); let y : R^2, y = (1,3); x -= y;", "x",
                                (TinyVector<2>{-1, true} - TinyVector<2>{1, 3}));
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] -= 2; x[1] -= 1;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); x[0] -= 2; x[1] -= 1;", "x",
                                (TinyVector<2>{-1, true} - TinyVector<2>{2, 1}));
     }
 
     SECTION("R^3")
     {
-      CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); R^3 y = (1,2,3); x-=y;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-1, true, false); let y : R^3, y = (1,2,3); x-=y;", "x",
                                (TinyVector<3>{-1, true, false} - TinyVector<3>{1, 2, 3}));
-      CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] -= 1; x[1] -= -3; x[2] -= 1;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-0.3, 12, 6.2); x[0] -= 1; x[1] -= -3; x[2] -= 1;", "x",
                                (TinyVector<3>{-0.3, 12, 6.2} - TinyVector<3>{1, -3, 1}));
     }
   }
@@ -253,46 +241,48 @@ TEST_CASE("AffectationProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_AFFECTATION_RESULT("N n = 3; n *= 2;", "n", 6ul);
-      CHECK_AFFECTATION_RESULT("N m = 2; N n = 4; n *= m;", "n", 8ul);
-      CHECK_AFFECTATION_RESULT("N n = 1; n *= true;", "n", 1ul);
-      CHECK_AFFECTATION_RESULT("N n = 3; n *= false;", "n", 0ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 3; n *= 2;", "n", 6ul);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let n : N, n = 4; n *= m;", "n", 8ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1; n *= true;", "n", 1ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 3; n *= false;", "n", 0ul);
     }
 
     SECTION("Z")
     {
-      CHECK_AFFECTATION_RESULT("Z z = 1; z *= 3;", "z", 3l);
-      CHECK_AFFECTATION_RESULT("N m = 2; Z z = -2; z *= m;", "z", -4l);
-      CHECK_AFFECTATION_RESULT("Z z = 1; z *= true;", "z", 1l);
-      CHECK_AFFECTATION_RESULT("Z z = 3; z *= false;", "z", 0l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z *= 3;", "z", 3l);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let z : Z, z = -2; z *= m;", "z", -4l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 1; z *= true;", "z", 1l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 3; z *= false;", "z", 0l);
     }
 
     SECTION("R")
     {
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r *= 2;", "r", (1.1 * 2l));
-      CHECK_AFFECTATION_RESULT("N m = 2; R r = 1.3; r *= m;", "r", (1.3 * 2ul));
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r *= true;", "r", (1.1 * true));
-      CHECK_AFFECTATION_RESULT("R r = 3.3; r *= false;", "r", (3.3 * false));
-      CHECK_AFFECTATION_RESULT("R r = 2; r *= 1.1;", "r", (2. * 1.1));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r *= 2;", "r", (1.1 * 2l));
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let r : R, r = 1.3; r *= m;", "r", (1.3 * 2ul));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r *= true;", "r", (1.1 * true));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 3.3; r *= false;", "r", (3.3 * false));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 2; r *= 1.1;", "r", (2. * 1.1));
     }
 
     SECTION("R^1")
     {
-      CHECK_AFFECTATION_RESULT("R^1 x = 2; x *= 2;", "x", (TinyVector<1>{TinyVector<1>{2} *= 2}));
-      CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] *= 1.3;", "x", (TinyVector<1>{2 * 1.3}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 2; x *= 2;", "x", (TinyVector<1>{TinyVector<1>{2} *= 2}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 2; x[0] *= 1.3;", "x", (TinyVector<1>{2 * 1.3}));
     }
 
     SECTION("R^2")
     {
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true);  x *= 3;", "x", (TinyVector<2>{TinyVector<2>{-1, true} *= 3}));
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] *= 2; x[1] *= 3;", "x", (TinyVector<2>{-1 * 2, true * 3}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true);  x *= 3;", "x",
+                               (TinyVector<2>{TinyVector<2>{-1, true} *= 3}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); x[0] *= 2; x[1] *= 3;", "x",
+                               (TinyVector<2>{-1 * 2, true * 3}));
     }
 
     SECTION("R^3")
     {
-      CHECK_AFFECTATION_RESULT("R^3 x = (-1, true, false); x*=5.2;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-1, true, false); x*=5.2;", "x",
                                (TinyVector<3>{TinyVector<3>{-1, true, false} *= 5.2}));
-      CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] *= -1; x[1] *= -3; x[2] *= 2;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-0.3, 12, 6.2); x[0] *= -1; x[1] *= -3; x[2] *= 2;", "x",
                                (TinyVector<3>{-0.3 * -1, 12 * -3, 6.2 * 2}));
     }
   }
@@ -301,106 +291,127 @@ TEST_CASE("AffectationProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_AFFECTATION_RESULT("N n = 4; n /= 2;", "n", 2ul);
-      CHECK_AFFECTATION_RESULT("N m = 2; N n = 6; n /= m;", "n", 3ul);
-      CHECK_AFFECTATION_RESULT("N n = 1; n /= true;", "n", 1ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 4; n /= 2;", "n", 2ul);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let n : N, n = 6; n /= m;", "n", 3ul);
+      CHECK_AFFECTATION_RESULT("let n : N, n = 1; n /= true;", "n", 1ul);
     }
 
     SECTION("Z")
     {
-      CHECK_AFFECTATION_RESULT("Z z = 7; z /= -3;", "z", -2l);
-      CHECK_AFFECTATION_RESULT("N m = 3; Z z = 6; z /= m;", "z", 2l);
-      CHECK_AFFECTATION_RESULT("Z z = 6; z /= true;", "z", 6l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 7; z /= -3;", "z", -2l);
+      CHECK_AFFECTATION_RESULT("let m : N, m = 3; let z : Z, z = 6; z /= m;", "z", 2l);
+      CHECK_AFFECTATION_RESULT("let z : Z, z = 6; z /= true;", "z", 6l);
     }
 
     SECTION("R")
     {
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r /= 2;", "r", (1.1 / 2l));
-      CHECK_AFFECTATION_RESULT("N m = 2; R r = 1.3; r /= m;", "r", (1.3 / 2ul));
-      CHECK_AFFECTATION_RESULT("R r = 1.1; r /= true;", "r", (1.1 / true));
-      CHECK_AFFECTATION_RESULT("R r = 2; r /= 1.1;", "r", (2. / 1.1));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r /= 2;", "r", (1.1 / 2l));
+      CHECK_AFFECTATION_RESULT("let m : N, m = 2; let r : R, r = 1.3; r /= m;", "r", (1.3 / 2ul));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 1.1; r /= true;", "r", (1.1 / true));
+      CHECK_AFFECTATION_RESULT("let r : R, r = 2; r /= 1.1;", "r", (2. / 1.1));
     }
 
     SECTION("R^1")
     {
-      CHECK_AFFECTATION_RESULT("R^1 x = 2; x[0] /= 1.3;", "x", (TinyVector<1>{2 / 1.3}));
+      CHECK_AFFECTATION_RESULT("let x : R^1, x = 2; x[0] /= 1.3;", "x", (TinyVector<1>{2 / 1.3}));
     }
 
     SECTION("R^2")
     {
-      CHECK_AFFECTATION_RESULT("R^2 x = (-1, true); x[0] /= 2; x[1] /= 3;", "x", (TinyVector<2>{-1. / 2., true / 3.}));
+      CHECK_AFFECTATION_RESULT("let x : R^2, x = (-1, true); x[0] /= 2; x[1] /= 3;", "x",
+                               (TinyVector<2>{-1. / 2., true / 3.}));
     }
 
     SECTION("R^3")
     {
-      CHECK_AFFECTATION_RESULT("R^3 x = (-0.3, 12, 6.2); x[0] /= -1.2; x[1] /= -3.1; x[2] /= 2.4;", "x",
+      CHECK_AFFECTATION_RESULT("let x : R^3, x = (-0.3, 12, 6.2); x[0] /= -1.2; x[1] /= -3.1; x[2] /= 2.4;", "x",
                                (TinyVector<3>{-0.3 / -1.2, 12 / -3.1, 6.2 / 2.4}));
     }
   }
 
   SECTION("errors")
   {
-    SECTION("invalid B affections")
-    {
-      CHECK_AFFECTATION_THROWS("B b = true; b += 1;");
-      CHECK_AFFECTATION_THROWS("B b = true; b *= 1;");
-      CHECK_AFFECTATION_THROWS("B b = true; b -= 1;");
-      CHECK_AFFECTATION_THROWS("B b = true; b /= 1;");
-    }
-
     SECTION("invalid implicit conversions")
     {
       SECTION("-> B")
       {
-        CHECK_AFFECTATION_THROWS_WITH("N n = 1; B b; b = n;", "invalid implicit conversion: N -> B");
-        CHECK_AFFECTATION_THROWS_WITH("B b; b = 1;", "invalid implicit conversion: Z -> B");
-        CHECK_AFFECTATION_THROWS_WITH("B b; b = 2.3;", "invalid implicit conversion: R -> B");
-        CHECK_AFFECTATION_THROWS_WITH("B b; b = \"foo\";", "invalid implicit conversion: string -> B");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 1; let b : B; b = n;", "invalid implicit conversion: N -> B");
+        CHECK_AFFECTATION_THROWS_WITH("let b : B; b = 1;", "invalid implicit conversion: Z -> B");
+        CHECK_AFFECTATION_THROWS_WITH("let b : B; b = 2.3;", "invalid implicit conversion: R -> B");
+        CHECK_AFFECTATION_THROWS_WITH("let b : B; b = \"foo\";", "invalid implicit conversion: string -> B");
       }
 
       SECTION("-> N")
       {
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2.3;", "invalid implicit conversion: R -> N");
-        CHECK_AFFECTATION_THROWS_WITH("N n = \"bar\";", "invalid implicit conversion: string -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2.3;", "invalid implicit conversion: R -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = \"bar\";", "invalid implicit conversion: string -> N");
 
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n += 1.1;", "invalid implicit conversion: R -> N");
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n += \"foo\";", "invalid implicit conversion: string -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n += 1.1;", "invalid implicit conversion: R -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n += \"foo\";", "invalid implicit conversion: string -> N");
 
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n -= 1.1;", "invalid implicit conversion: R -> N");
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n -= \"bar\";", "invalid implicit conversion: string -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n -= 1.1;", "invalid implicit conversion: R -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n -= \"bar\";", "invalid implicit conversion: string -> N");
 
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n *= 2.51;", "invalid implicit conversion: R -> N");
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n *= \"foobar\";", "invalid implicit conversion: string -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n *= 2.51;", "invalid implicit conversion: R -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n *= \"foobar\";", "invalid implicit conversion: string -> N");
 
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n /= 2.51;", "invalid implicit conversion: R -> N");
-        CHECK_AFFECTATION_THROWS_WITH("N n = 2; n /= \"foo\";", "invalid implicit conversion: string -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n /= 2.51;", "invalid implicit conversion: R -> N");
+        CHECK_AFFECTATION_THROWS_WITH("let n : N, n = 2; n /= \"foo\";", "invalid implicit conversion: string -> N");
       }
 
       SECTION("-> Z")
       {
-        CHECK_AFFECTATION_THROWS_WITH("Z z = -2.3;", "invalid implicit conversion: R -> Z");
-        CHECK_AFFECTATION_THROWS_WITH("Z z = \"foobar\";", "invalid implicit conversion: string -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = -2.3;", "invalid implicit conversion: R -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = \"foobar\";", "invalid implicit conversion: string -> Z");
 
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z += 1.1;", "invalid implicit conversion: R -> Z");
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z += \"foo\";", "invalid implicit conversion: string -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z += 1.1;", "invalid implicit conversion: R -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z += \"foo\";", "invalid implicit conversion: string -> Z");
 
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z -= 2.1;", "invalid implicit conversion: R -> Z");
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z -= \"bar\";", "invalid implicit conversion: string -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z -= 2.1;", "invalid implicit conversion: R -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z -= \"bar\";", "invalid implicit conversion: string -> Z");
 
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z *= -2.51;", "invalid implicit conversion: R -> Z");
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z *= \"foobar\";", "invalid implicit conversion: string -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z *= -2.51;", "invalid implicit conversion: R -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z *= \"foobar\";", "invalid implicit conversion: string -> Z");
 
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 4; z /= -2.;", "invalid implicit conversion: R -> Z");
-        CHECK_AFFECTATION_THROWS_WITH("Z z = 2; z /= \"foo\";", "invalid implicit conversion: string -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 4; z /= -2.;", "invalid implicit conversion: R -> Z");
+        CHECK_AFFECTATION_THROWS_WITH("let z : Z, z = 2; z /= \"foo\";", "invalid implicit conversion: string -> Z");
       }
 
       SECTION("-> R")
       {
-        CHECK_AFFECTATION_THROWS_WITH("R x = \"foobar\";", "invalid implicit conversion: string -> R");
-        CHECK_AFFECTATION_THROWS_WITH("R x = 2.3; x += \"foo\";", "invalid implicit conversion: string -> R");
-        CHECK_AFFECTATION_THROWS_WITH("R x = 2.1; x -= \"bar\";", "invalid implicit conversion: string -> R");
-        CHECK_AFFECTATION_THROWS_WITH("R x = 1.2; x *= \"foobar\";", "invalid implicit conversion: string -> R");
-        CHECK_AFFECTATION_THROWS_WITH("R x =-2.3; x /= \"foo\";", "invalid implicit conversion: string -> R");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R, x = \"foobar\";", "invalid implicit conversion: string -> R");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R, x = 2.3; x += \"foo\";", "invalid implicit conversion: string -> R");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R, x = 2.1; x -= \"bar\";", "invalid implicit conversion: string -> R");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R, x = 1.2; x *= \"foobar\";",
+                                      "invalid implicit conversion: string -> R");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R, x =-2.3; x /= \"foo\";", "invalid implicit conversion: string -> R");
+      }
+
+      SECTION("-> R^n")
+      {
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^2, x = \"foobar\";", "invalid implicit conversion: string -> R^2");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^3, x = \"foobar\";", "invalid implicit conversion: string -> R^3");
+
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^2, x = 3.2;", "invalid implicit conversion: R -> R^2");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^3, x = 2.3;", "invalid implicit conversion: R -> R^3");
+
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^2, x = 4;", "invalid implicit conversion: Z -> R^2");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^3, x = 3;", "invalid implicit conversion: Z -> R^3");
+
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^1, x = 0; let y : R^2, y = x;",
+                                      "incompatible dimensions in affectation");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^1, x = 0; let y : R^3, y = x;",
+                                      "incompatible dimensions in affectation");
+
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^2, x = 0; let y : R^1, y = x;",
+                                      "incompatible dimensions in affectation");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^2, x = 0; let y : R^3, y = x;",
+                                      "incompatible dimensions in affectation");
+
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^3, x = 0; let y : R^1, y = x;",
+                                      "incompatible dimensions in affectation");
+        CHECK_AFFECTATION_THROWS_WITH("let x : R^3, x = 0; let y : R^2, y = x;",
+                                      "incompatible dimensions in affectation");
       }
     }
   }
diff --git a/tests/test_AffectationToStringProcessor.cpp b/tests/test_AffectationToStringProcessor.cpp
index 94763b67894f0f9708fdf321303f01f59723ae67..753e144626b484ece0950bbc26ef52bd194a11ab 100644
--- a/tests/test_AffectationToStringProcessor.cpp
+++ b/tests/test_AffectationToStringProcessor.cpp
@@ -52,49 +52,52 @@ TEST_CASE("ASTAffectationToStringProcessor", "[language]")
 {
   SECTION("Affectations")
   {
-    CHECK_AFFECTATION_RESULT(R"(string s; s = "foo";)", "s", std::string("foo"));
-    CHECK_AFFECTATION_RESULT(R"(N n = 2; string s; s = n;)", "s", std::to_string(2ul));
-    CHECK_AFFECTATION_RESULT(R"(string s; s = -1;)", "s", std::to_string(-1l));
-    CHECK_AFFECTATION_RESULT(R"(string s; s = true;)", "s", std::to_string(true));
-    CHECK_AFFECTATION_RESULT(R"(string s; s = 2.3;)", "s", std::to_string(2.3));
+    CHECK_AFFECTATION_RESULT(R"(let s : string; s = "foo";)", "s", std::string("foo"));
+    CHECK_AFFECTATION_RESULT(R"(let n : N, n = 2; let s : string; s = n;)", "s", std::to_string(2ul));
+    CHECK_AFFECTATION_RESULT(R"(let s : string; s = -1;)", "s", std::to_string(-1l));
+    CHECK_AFFECTATION_RESULT(R"(let s : string; s = true;)", "s", std::to_string(true));
+    CHECK_AFFECTATION_RESULT(R"(let s : string; s = 2.3;)", "s", std::to_string(2.3));
     {
       std::ostringstream os;
       os << TinyVector<1>{13} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^1 x = 13; string s; s = x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^1, x = 13; let s : string; s = x;)", "s", os.str());
     }
     {
       std::ostringstream os;
       os << TinyVector<2>{2, 3} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^2 x = (2,3); string s; s = x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^2, x = (2,3); let s : string; s = x;)", "s", os.str());
     }
     {
       std::ostringstream os;
       os << TinyVector<3>{1, 2, 3} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^3 x = (1,2,3); string s; s = x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^3, x = (1,2,3); let s : string; s = x;)", "s", os.str());
     }
   }
 
   SECTION("+=")
   {
-    CHECK_AFFECTATION_RESULT(R"(string s = "foo"; s += "bar";)", "s", std::string("foobar"));
-    CHECK_AFFECTATION_RESULT(R"(N n = 2; string s = "foo"; s += n;)", "s", (std::string("foo") + std::to_string(2ul)));
-    CHECK_AFFECTATION_RESULT(R"(string s = "foo"; s += -1;)", "s", (std::string("foo") + std::to_string(-1l)));
-    CHECK_AFFECTATION_RESULT(R"(string s = "foo"; s += true;)", "s", (std::string("foo") + std::to_string(true)));
-    CHECK_AFFECTATION_RESULT(R"(string s = "foo"; s += 2.3;)", "s", (std::string("foo") + std::to_string(2.3)));
+    CHECK_AFFECTATION_RESULT(R"(let s : string, s = "foo"; s += "bar";)", "s", std::string("foobar"));
+    CHECK_AFFECTATION_RESULT(R"(let n : N, n = 2; let s : string, s = "foo"; s += n;)", "s",
+                             (std::string("foo") + std::to_string(2ul)));
+    CHECK_AFFECTATION_RESULT(R"(let s : string, s = "foo"; s += -1;)", "s", (std::string("foo") + std::to_string(-1l)));
+    CHECK_AFFECTATION_RESULT(R"(let s : string, s = "foo"; s += true;)", "s",
+                             (std::string("foo") + std::to_string(true)));
+    CHECK_AFFECTATION_RESULT(R"(let s : string, s = "foo"; s += 2.3;)", "s",
+                             (std::string("foo") + std::to_string(2.3)));
     {
       std::ostringstream os;
       os << "foo" << TinyVector<1>{13} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^1 x = 13; string s="foo"; s += x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^1, x = 13; let s : string, s="foo"; s += x;)", "s", os.str());
     }
     {
       std::ostringstream os;
       os << "foo" << TinyVector<2>{2, 3} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^2 x = (2,3); string s="foo"; s += x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^2, x = (2,3); let s : string, s="foo"; s += x;)", "s", os.str());
     }
     {
       std::ostringstream os;
       os << "foo" << TinyVector<3>{1, 2, 3} << std::ends;
-      CHECK_AFFECTATION_RESULT(R"(R^3 x = (1,2,3); string s="foo"; s += x;)", "s", os.str());
+      CHECK_AFFECTATION_RESULT(R"(let x : R^3, x = (1,2,3); let s : string, s="foo"; s += x;)", "s", os.str());
     }
   }
 }
diff --git a/tests/test_ArraySubscriptProcessor.cpp b/tests/test_ArraySubscriptProcessor.cpp
index eaab8764aba71e2e41f3c9ccd7eb5c714f072e30..5be3280a586414399633d02248613a7c57d46f09 100644
--- a/tests/test_ArraySubscriptProcessor.cpp
+++ b/tests/test_ArraySubscriptProcessor.cpp
@@ -83,8 +83,8 @@ TEST_CASE("ArraySubscriptProcessor", "[language]")
   SECTION("R^1 component access")
   {
     std::string_view data = R"(
-R^1 x = 1;
-R x0 = x[0];
+let x : R^1, x = 1;
+let x0: R, x0 = x[0];
 )";
     CHECK_EVALUATION_RESULT(data, "x0", double{1});
   }
@@ -92,9 +92,9 @@ R x0 = x[0];
   SECTION("R^2 component access")
   {
     std::string_view data = R"(
-R^2 x = (1,2);
-R x0 = x[0];
-R x1 = x[1];
+let x : R^2, x = (1,2);
+let x0: R, x0 = x[0];
+let x1: R, x1 = x[1];
 )";
     CHECK_EVALUATION_RESULT(data, "x0", double{1});
     CHECK_EVALUATION_RESULT(data, "x1", double{2});
@@ -103,10 +103,10 @@ R x1 = x[1];
   SECTION("R^3 component access")
   {
     std::string_view data = R"(
-R^3 x = (1,2,3);
-R x0 = x[0];
-R x1 = x[1];
-R x2 = x[2];
+let x : R^3, x = (1,2,3);
+let x0 : R, x0 = x[0];
+let x1 : R, x1 = x[1];
+let x2 : R, x2 = x[2];
 )";
     CHECK_EVALUATION_RESULT(data, "x0", double{1});
     CHECK_EVALUATION_RESULT(data, "x1", double{2});
@@ -116,14 +116,14 @@ R x2 = x[2];
   SECTION("R^d component access from integer expression")
   {
     std::string_view data = R"(
-R^3 x = (1,2,3);
-R x0 = x[3-2-1];
+let x : R^3, x = (1,2,3);
+let x0: R,  x0 = x[3-2-1];
 
-R^2 y = (2,7);
-R y1 = y[2/2];
+let y : R^2, y = (2,7);
+let y1: R,  y1 = y[2/2];
 
-R^1 z = 8;
-R z0 = z[(2-2)*1];
+let z : R^1, z = 8;
+let z0: R,  z0 = z[(2-2)*1];
 )";
     CHECK_EVALUATION_RESULT(data, "x0", double{1});
     CHECK_EVALUATION_RESULT(data, "y1", double{7});
@@ -135,8 +135,8 @@ R z0 = z[(2-2)*1];
     SECTION("R index type")
     {
       std::string_view data = R"(
-R^3 x = (1,2,3);
-R x0 = x[2.3];
+let x : R^3, x = (1,2,3);
+let x0: R,  x0 = x[2.3];
 )";
 
       CHECK_EVALUATION_THROWS_WITH(data, std::string{"invalid implicit conversion: R -> Z"});
@@ -145,8 +145,8 @@ R x0 = x[2.3];
     SECTION("string index type")
     {
       std::string_view data = R"(
-R^3 x = (1,2,3);
-R x0 = x["foo"];
+let x : R^3, x = (1,2,3);
+let x0: R,  x0 = x["foo"];
 )";
 
       CHECK_EVALUATION_THROWS_WITH(data, std::string{"invalid implicit conversion: string -> Z"});
@@ -155,8 +155,8 @@ R x0 = x["foo"];
     SECTION("R^d index type")
     {
       std::string_view data = R"(
-R^3 x = (1,2,3);
-R x0 = x[x];
+let x : R^3, x = (1,2,3);
+let x0: R,  x0 = x[x];
 )";
 
       CHECK_EVALUATION_THROWS_WITH(data, std::string{"invalid implicit conversion: R^3 -> Z"});
diff --git a/tests/test_BinaryExpressionProcessor_arithmetic.cpp b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
index 9c229c5d5fb9f1b22e8e0fc3b645f0547d31944d..a1f31fbf21b47cbf37f628958adc58146c99e826 100644
--- a/tests/test_BinaryExpressionProcessor_arithmetic.cpp
+++ b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
@@ -8,39 +8,39 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + true;)", "z", 2l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = false + 1;)", "n", 1ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + 3;)", "z", 4l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false + 3;)", "z", 3l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = false + 3.6;)", "r", 3.6);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R s = -3.3; R r = true + s;)", "r", -2.3);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = true + true;)", "z", 2l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; n = true + 1;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; n = true + 1;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; n = false + 1;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = true + 3;)", "z", 4l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = false + 3;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = false + 3.6;)", "r", 3.6);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let s:R, s = -3.3; let r:R, r = true + s;)", "r", -2.3);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = n + true;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n + m;)", "n", 6ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -1; n = n + z;)", "n", 3ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; R x = n + 2.3;)", "x", 3.3);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; n = n + true;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; n = n + m;)", "n", 6ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = -1; n = n + z;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let x:R, x = n + 2.3;)", "x", 3.3);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 + true;)", "z", 0l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -3 + n;)", "z", 1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; Z z = -3 + n;)", "z", -1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 1 + 2;)", "z", 3l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R x = 3 + 2.5;)", "x", 5.5);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 + true;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = -3 + n;)", "z", 1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = -3 + n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 1 + 2;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 3 + 2.5;)", "x", 5.5);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + true;)", "r", (-1.2 + true));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 + n;)", "r", (-1.2 + uint64_t{2}));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 1;)", "r", (-1.2 + 1));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 2.3;)", "r", (-1.2 + 2.3));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + true;)", "r", (-1.2 + true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 + n;)", "r", (-1.2 + uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 1;)", "r", (-1.2 + 1));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 2.3;)", "r", (-1.2 + 2.3));
     }
   }
 
@@ -48,34 +48,34 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true - false;)", "n", 1ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true - n;)", "n", 0ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false - 1;)", "z", -1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true - 1.2;)", "r", (true - 1.2));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = true - false;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; n = true - n;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = false - 1;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = true - 1.2;)", "r", (true - 1.2));
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n - true;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n - m;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n - 4;)", "n", 1ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; R x = n - 2.3;)", "x", double{3ul - 2.3});
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; n = n - true;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; n = n - m;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 5; n = n - 4;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; let x:R, x = n - 2.3;)", "x", double{3ul - 2.3});
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 - true;)", "z", -2l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 - n;)", "z", -1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 - 2;)", "z", 5l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R x = 4 - 2.5;)", "x", 1.5);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 - true;)", "z", -2l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = 3 - n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 7 - 2;)", "z", 5l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 4 - 2.5;)", "x", 1.5);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - true;)", "r", (-1.2 - true));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 - n;)", "r", (-1.2 - uint64_t{2}));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 1;)", "r", (-1.2 - 1));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 2.3;)", "r", (-1.2 - 2.3));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 - true;)", "r", (-1.2 - true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 - n;)", "r", (-1.2 - uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 - 1;)", "r", (-1.2 - 1));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 - 2.3;)", "r", (-1.2 - 2.3));
     }
   }
 
@@ -83,34 +83,34 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true * false;)", "n", 0ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true * n;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false * 1;)", "z", 0l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true * 1.2;)", "r", (true * 1.2));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = true * false;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; n = true * n;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = false * 1;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = true * 1.2;)", "r", (true * 1.2));
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n * true;)", "n", 3ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n * m;)", "n", 8ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n * 4;)", "n", 20ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; R x = n * 2.3;)", "x", double{3ul * 2.3});
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; n = n * true;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; n = n * m;)", "n", 8ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 5; n = n * 4;)", "n", 20ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; let x:R, x = n * 2.3;)", "x", double{3ul * 2.3});
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 * true;)", "z", -1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 * n;)", "z", 12l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 * 2;)", "z", 14l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R x = 4 * 2.4;)", "x", double{4l * 2.4});
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 * true;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = 3 * n;)", "z", 12l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 7 * 2;)", "z", 14l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 4 * 2.4;)", "x", double{4l * 2.4});
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * true;)", "r", (-1.2 * true));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 * n;)", "r", (-1.2 * uint64_t{2}));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 11;)", "r", (-1.2 * 11));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 2.3;)", "r", (-1.2 * 2.3));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 * true;)", "r", (-1.2 * true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 * n;)", "r", (-1.2 * uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 * 11;)", "r", (-1.2 * 11));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 * 2.3;)", "r", (-1.2 * 2.3));
     }
   }
 
@@ -118,34 +118,34 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = false / true;)", "n", 0ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true / n;)", "n", 0ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false / 1;)", "z", 0l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true / 1.2;)", "r", (true / 1.2));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = false / true;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; n = true / n;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = false / 1;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = true / 1.2;)", "r", (true / 1.2));
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n / true;)", "n", 3ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n / m;)", "n", 2ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n / 4;)", "n", 1ul);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; R x = n / 2.3;)", "x", double{3ul / 2.3});
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; n = n / true;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; n = n / m;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 5; n = n / 4;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; let x:R, x = n / 2.3;)", "x", double{3ul / 2.3});
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 / true;)", "z", -1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 / n;)", "z", 0l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 / 2;)", "z", 3l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R x = 4 / 2.4;)", "x", double{4l / 2.4});
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 / true;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = 3 / n;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 7 / 2;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 4 / 2.4;)", "x", double{4l / 2.4});
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / true;)", "r", (-1.2 / true));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 / n;)", "r", (-1.2 / uint64_t{2}));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 11;)", "r", (-1.2 / 11));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 2.3;)", "r", (-1.2 / 2.3));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 / true;)", "r", (-1.2 / true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 / n;)", "r", (-1.2 / uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 / 11;)", "r", (-1.2 / 11));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 / 2.3;)", "r", (-1.2 / 2.3));
     }
   }
 }
diff --git a/tests/test_BinaryExpressionProcessor_comparison.cpp b/tests/test_BinaryExpressionProcessor_comparison.cpp
index 2a6ba6b9c1b9fa8ff16b3f33ba21fa4d91f933c2..b453405ce4283f8deeaf864533102e748f6c284f 100644
--- a/tests/test_BinaryExpressionProcessor_comparison.cpp
+++ b/tests/test_BinaryExpressionProcessor_comparison.cpp
@@ -8,65 +8,65 @@ TEST_CASE("BinaryExpressionProcessor comparison", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true < n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true < n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false < n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false < n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 0;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < -1.7;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false < 0.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true < -1.7;)", "b", false);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n < m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n < m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n < m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 4;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 5;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 2.3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n < m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let m:N, m = 2; let b:B, b = n < m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let m:N, m = 0; let b:B, b = n < m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n < 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n < 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n < 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n < 1.;)", "b", false);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 < false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 < n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 < n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 2.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1 < false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = -3 < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = 0 < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 < 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 < 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 < 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 < 3.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 < 2.5;)", "b", false);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. < false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 < n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. < n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 < false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = -1.2 < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = 0. < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 < 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. < 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 < -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 < -1.2;)", "b", false);
     }
   }
 
@@ -74,75 +74,75 @@ TEST_CASE("BinaryExpressionProcessor comparison", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true <= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= -1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = true <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= -1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false <= 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true <= 0.5;)", "b", false);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n <= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n <= m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n <= m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 5;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 4;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 2.3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 0.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = n <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n <= m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let m:N, m = 2; let b:B, b = n <= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n <= 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n <= 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n <= 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n <= 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n <= 0.5;)", "b", false);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 <= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 5 <= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= 2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = 4 <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = 5 <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 <= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 <= 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 <= 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 <= 3.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 <= 2.5;)", "b", false);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 <= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. <= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 <= false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 <= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 <= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 <= -2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 <= -2;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= -1.2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1.1 <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0.1 <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2. <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2.1 <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = 0.7 <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -2 <= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1 <= -2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 <= -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 <= -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. <= -1.2;)", "b", false);
     }
   }
 
@@ -150,71 +150,71 @@ TEST_CASE("BinaryExpressionProcessor comparison", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true > n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 0;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > -1.7;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = true > n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false > 0.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true > -1.7;)", "b", true);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n > true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n > false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n > m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n > m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n > m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 4;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 2.3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 0.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = n > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n > m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let m:N, m = 2; let b:B, b = n > m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let m:N, m = 0; let b:B, b = n > m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n > 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n > 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n > 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n > 0.3;)", "b", true);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 > false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 1 > n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 2;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = -3 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = 0 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = 1 > n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 > 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 > 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 > 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 > 3.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 > 2.5;)", "b", true);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.2 > false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. > false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -2.2 > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. > n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1. > -1.1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1.2 > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0.2 > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = -2.2 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = 0. > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1.2 > 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1. > -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 > -1.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 > -1.2;)", "b", false);
     }
   }
 
@@ -222,78 +222,78 @@ TEST_CASE("BinaryExpressionProcessor comparison", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true >= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false >= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= -1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0.5;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = true >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= -1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 0.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false >= 0.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true >= 1.5;)", "b", false);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n >= m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n >= m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 5;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 4;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 2.3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 0.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = n >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n >= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let m:N, m = 2; let b:B, b = n >= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n >= 5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n >= 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n >= 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n >= 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n >= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n >= 0.5;)", "b", true);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 3 >= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= 2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = 4 >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = 3 >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 2 >= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 >= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 >= 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 >= 3.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 >= 2.5;)", "b", true);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 >= true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 >= false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 >= n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 >= n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 >= -2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 >= -2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 >= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1.1 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0.1 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2. >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2.1 >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = 0.7 >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -2 >= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1 >= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 >= -1.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 >= -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. >= -1.2;)", "b", true);
     }
   }
 }
diff --git a/tests/test_BinaryExpressionProcessor_equality.cpp b/tests/test_BinaryExpressionProcessor_equality.cpp
index f2b000b2cbb4416590594a5d7acff5796f3251ec..0fd6ca00b0b10311ca72f9077cb0f0fa743d15fb 100644
--- a/tests/test_BinaryExpressionProcessor_equality.cpp
+++ b/tests/test_BinaryExpressionProcessor_equality.cpp
@@ -8,65 +8,65 @@ TEST_CASE("BinaryExpressionProcessor equality", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true == n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true == n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false == n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false == n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == -1.7;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false == 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true == -1.7;)", "b", false);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n == m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n == m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 4;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 5;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 2.3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n == m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let m:N, m = 2; let b:B, b = n == m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n == 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n == 5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n == 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n == 1.;)", "b", true);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 == n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 == n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == 2;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 == 11;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 2.5;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = -3 == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; let b:B, b = 3 == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 == 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 11 == 11;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 == 2.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 == 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 == 3.5;)", "b", false);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. == true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 == false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. == false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 == n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. == n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. == -2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 2.3;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0.1 == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = -1.2 == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2. == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 == 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -2. == -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 == 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 == -1.2;)", "b", true);
     }
   }
 
@@ -74,65 +74,65 @@ TEST_CASE("BinaryExpressionProcessor equality", "[language]")
   {
     SECTION("lhs is B")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true != n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true != n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false != n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false != n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1.;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != -1.7;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = true != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = true != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = false != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = false != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false != 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true != -1.7;)", "b", true);
     }
 
     SECTION("lhs is N")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n != m;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n != m;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 4;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 5;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 2.3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 0; let b:B, b = n != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let m:N, m = 2; let b:B, b = n != m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let m:N, m = 2; let b:B, b = n != m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n != 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = n != 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n != 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 1; let b:B, b = n != 1.;)", "b", false);
     }
 
     SECTION("lhs is Z")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 != n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 != n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != 2;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 != 11;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 2.5;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0 != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let b:B, b = -3 != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 3; let b:B, b = 3 != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1 != 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 11 != 11;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 != 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 != 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 3 != 3.5;)", "b", true);
     }
 
     SECTION("lhs is R")
     {
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != true;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. != true;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 != false;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. != false;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 != n;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. != n;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 1;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. != -2;)", "b", false);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 2.3;)", "b", true);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != -1.2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 1. != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0.1 != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = 0. != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = -1.2 != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let b:B, b = 2. != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 != 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -2. != -2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 != 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = -1.2 != -1.2;)", "b", false);
     }
   }
 }
diff --git a/tests/test_BinaryExpressionProcessor_logic.cpp b/tests/test_BinaryExpressionProcessor_logic.cpp
index 283dda9a20bf2049e081109cd184ff2e74c9c3a0..c60b206d0ff907b140682d0720b66841c1207211 100644
--- a/tests/test_BinaryExpressionProcessor_logic.cpp
+++ b/tests/test_BinaryExpressionProcessor_logic.cpp
@@ -6,32 +6,32 @@ TEST_CASE("BinaryExpressionProcessor logic", "[language]")
 {
   SECTION("and")
   {
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and true;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and true;)", "b", false);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and false;)", "b", false);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and false;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true and true;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false and true;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true and false;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false and false;)", "b", false);
 
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = (2<3) and ((3.2-1) != 2);)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = (1>4) and true;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = (2<3) and ((3.2-1) != 2);)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = (1>4) and true;)", "b", false);
   }
 
   SECTION("or")
   {
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or true;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or true;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or false;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or false;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true or true;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false or true;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true or false;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false or false;)", "b", false);
 
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = (2<3) and ((3.2-1) != 2);)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = (1>4) or true;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = (2<3) and ((3.2-1) != 2);)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = (1>4) or true;)", "b", true);
   }
 
   SECTION("xor")
   {
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor true;)", "b", false);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor true;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor false;)", "b", true);
-    CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor false;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true xor true;)", "b", false);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false xor true;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = true xor false;)", "b", true);
+    CHECK_BINARY_EXPRESSION_RESULT(R"(let b:B, b = false xor false;)", "b", false);
   }
 
   SECTION("errors")
@@ -40,8 +40,8 @@ TEST_CASE("BinaryExpressionProcessor logic", "[language]")
     {
       SECTION("and")
       {
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=1; n and true;)", "invalid implicit conversion: N -> B");
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=2; false and n;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=1; n and true;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=2; false and n;)", "invalid implicit conversion: N -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1 and true;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(false and 2;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1.1 and true;)", "invalid implicit conversion: R -> B");
@@ -50,8 +50,8 @@ TEST_CASE("BinaryExpressionProcessor logic", "[language]")
 
       SECTION("or")
       {
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=1; n or true;)", "invalid implicit conversion: N -> B");
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=2; false or n;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=1; n or true;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=2; false or n;)", "invalid implicit conversion: N -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1 or true;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(false or 2;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1.1 or true;)", "invalid implicit conversion: R -> B");
@@ -60,8 +60,8 @@ TEST_CASE("BinaryExpressionProcessor logic", "[language]")
 
       SECTION("xor")
       {
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=1; n xor true;)", "invalid implicit conversion: N -> B");
-        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(N n=2; false xor n;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=1; n xor true;)", "invalid implicit conversion: N -> B");
+        CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(let n:N, n=2; false xor n;)", "invalid implicit conversion: N -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1 xor true;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(false xor 2;)", "invalid implicit conversion: Z -> B");
         CHECK_BINARY_EXPRESSION_THROWS_WITH(R"(1.1 xor true;)", "invalid implicit conversion: R -> B");
diff --git a/tests/test_CFunctionProcessor.cpp b/tests/test_CFunctionProcessor.cpp
index 6c8c5c5b869ac5b12a062e23403ebe79066a9801..efd3efad7e56d35014d86d4d35546b2038f61cef 100644
--- a/tests/test_CFunctionProcessor.cpp
+++ b/tests/test_CFunctionProcessor.cpp
@@ -63,7 +63,7 @@ TEST_CASE("CFunctionProcessor", "[language]")
       tested_function_set.insert("sqrt");
       std::string_view data = R"(
 import math;
-R x = sqrt(4);
+let x:R, x = sqrt(4);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::sqrt(4l)});
     }
@@ -72,7 +72,7 @@ R x = sqrt(4);
       tested_function_set.insert("abs");
       std::string_view data = R"(
 import math;
-R x = abs(-3.4);
+let x:R, x = abs(-3.4);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::abs(-3.4)});
     }
@@ -81,7 +81,7 @@ R x = abs(-3.4);
       tested_function_set.insert("sin");
       std::string_view data = R"(
 import math;
-R x = sin(1.3);
+let x:R, x = sin(1.3);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::sin(1.3)});
     }
@@ -90,7 +90,7 @@ R x = sin(1.3);
       tested_function_set.insert("cos");
       std::string_view data = R"(
 import math;
-R x = cos(1.3);
+let x:R, x = cos(1.3);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::cos(1.3)});
     }
@@ -99,7 +99,7 @@ R x = cos(1.3);
       tested_function_set.insert("tan");
       std::string_view data = R"(
 import math;
-R x = tan(1.3);
+let x:R, x = tan(1.3);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::tan(1.3)});
     }
@@ -108,7 +108,7 @@ R x = tan(1.3);
       tested_function_set.insert("asin");
       std::string_view data = R"(
 import math;
-R x = asin(0.7);
+let x:R, x = asin(0.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::asin(0.7)});
     }
@@ -117,7 +117,7 @@ R x = asin(0.7);
       tested_function_set.insert("acos");
       std::string_view data = R"(
 import math;
-R x = acos(0.7);
+let x:R, x = acos(0.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::acos(0.7)});
     }
@@ -126,7 +126,7 @@ R x = acos(0.7);
       tested_function_set.insert("atan");
       std::string_view data = R"(
 import math;
-R x = atan(0.7);
+let x:R, x = atan(0.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::atan(0.7)});
     }
@@ -135,7 +135,7 @@ R x = atan(0.7);
       tested_function_set.insert("atan2");
       std::string_view data = R"(
 import math;
-R x = atan2(0.7, 0.4);
+let x:R, x = atan2(0.7, 0.4);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::atan2(0.7, 0.4)});
     }
@@ -144,7 +144,7 @@ R x = atan2(0.7, 0.4);
       tested_function_set.insert("sinh");
       std::string_view data = R"(
 import math;
-R x = sinh(0.6);
+let x:R, x = sinh(0.6);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::sinh(0.6)});
     }
@@ -153,7 +153,7 @@ R x = sinh(0.6);
       tested_function_set.insert("cosh");
       std::string_view data = R"(
 import math;
-R x = cosh(1.7);
+let x:R, x = cosh(1.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::cosh(1.7)});
     }
@@ -162,7 +162,7 @@ R x = cosh(1.7);
       tested_function_set.insert("tanh");
       std::string_view data = R"(
 import math;
-R x = tanh(0.6);
+let x:R, x = tanh(0.6);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::tanh(0.6)});
     }
@@ -171,7 +171,7 @@ R x = tanh(0.6);
       tested_function_set.insert("asinh");
       std::string_view data = R"(
 import math;
-R x = asinh(0.6);
+let x:R, x = asinh(0.6);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::asinh(0.6)});
     }
@@ -180,7 +180,7 @@ R x = asinh(0.6);
       tested_function_set.insert("acosh");
       std::string_view data = R"(
 import math;
-R x = acosh(1.7);
+let x:R, x = acosh(1.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::acosh(1.7)});
     }
@@ -189,7 +189,7 @@ R x = acosh(1.7);
       tested_function_set.insert("atanh");
       std::string_view data = R"(
 import math;
-R x = atanh(0.6);
+let x:R, x = atanh(0.6);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::atanh(0.6)});
     }
@@ -198,7 +198,7 @@ R x = atanh(0.6);
       tested_function_set.insert("exp");
       std::string_view data = R"(
 import math;
-R x = exp(1.7);
+let x:R, x = exp(1.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::exp(1.7)});
     }
@@ -207,7 +207,7 @@ R x = exp(1.7);
       tested_function_set.insert("log");
       std::string_view data = R"(
 import math;
-R x = log(1.6);
+let x:R, x = log(1.6);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::log(1.6)});
     }
@@ -216,7 +216,7 @@ R x = log(1.6);
       tested_function_set.insert("pow");
       std::string_view data = R"(
 import math;
-R x = pow(1.6, 2.3);
+let x:R, x = pow(1.6, 2.3);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "x", double{std::pow(1.6, 2.3)});
     }
@@ -225,7 +225,7 @@ R x = pow(1.6, 2.3);
       tested_function_set.insert("ceil");
       std::string_view data = R"(
 import math;
-Z z = ceil(-1.2);
+let z:Z, z = ceil(-1.2);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "z", int64_t{-1});
     }
@@ -234,7 +234,7 @@ Z z = ceil(-1.2);
       tested_function_set.insert("floor");
       std::string_view data = R"(
 import math;
-Z z = floor(-1.2);
+let z:Z, z = floor(-1.2);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "z", int64_t{-2});
     }
@@ -243,7 +243,7 @@ Z z = floor(-1.2);
       tested_function_set.insert("trunc");
       std::string_view data = R"(
 import math;
-Z z = trunc(-0.2) + trunc(0.7);
+let z:Z, z = trunc(-0.2) + trunc(0.7);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "z", int64_t{0});
     }
@@ -252,7 +252,7 @@ Z z = trunc(-0.2) + trunc(0.7);
       tested_function_set.insert("round");
       std::string_view data = R"(
 import math;
-Z z = round(-1.2);
+let z:Z, z = round(-1.2);
 )";
       CHECK_CFUNCTION_EVALUATION_RESULT(data, "z", int64_t{-1});
     }
diff --git a/tests/test_ConcatExpressionProcessor.cpp b/tests/test_ConcatExpressionProcessor.cpp
index 0eb52cfc0d419883857397956df1d1fd3aa025dd..b2d6df6640156f4bf938a8fcddb6b1b994294bb3 100644
--- a/tests/test_ConcatExpressionProcessor.cpp
+++ b/tests/test_ConcatExpressionProcessor.cpp
@@ -52,26 +52,27 @@ TEST_CASE("ConcatExpressionProcessor", "[language]")
 {
   SECTION("string + string")
   {
-    CHECK_CONCAT_EXPRESSION_RESULT(R"(string s = "foo"; s = s+"bar";)", "s", std::string{"foobar"});
+    CHECK_CONCAT_EXPRESSION_RESULT(R"(let s:string, s = "foo"; s = s+"bar";)", "s", std::string{"foobar"});
   }
 
   SECTION("string + N")
   {
-    CHECK_CONCAT_EXPRESSION_RESULT(R"(N n = 1; string s = "foo_"; s = s+n;)", "s", std::string{"foo_1"});
+    CHECK_CONCAT_EXPRESSION_RESULT(R"(let n:N, n = 1; let s:string, s = "foo_"; s = s+n;)", "s", std::string{"foo_1"});
   }
 
   SECTION("string + Z")
   {
-    CHECK_CONCAT_EXPRESSION_RESULT(R"(string s = "foo_"; s = s+2;)", "s", std::string{"foo_2"});
+    CHECK_CONCAT_EXPRESSION_RESULT(R"(let s:string, s = "foo_"; s = s+2;)", "s", std::string{"foo_2"});
   }
 
   SECTION("string + R")
   {
-    CHECK_CONCAT_EXPRESSION_RESULT(R"(string s = "foo_"; s = s+2.4;)", "s", std::string{"foo_"} + std::to_string(2.4));
+    CHECK_CONCAT_EXPRESSION_RESULT(R"(let s:string, s = "foo_"; s = s+2.4;)", "s",
+                                   std::string{"foo_"} + std::to_string(2.4));
   }
 
   SECTION("string + B")
   {
-    CHECK_CONCAT_EXPRESSION_RESULT(R"(string s = "foo_"; s = s+true;)", "s", std::string{"foo_1"});
+    CHECK_CONCAT_EXPRESSION_RESULT(R"(let s:string, s = "foo_"; s = s+true;)", "s", std::string{"foo_1"});
   }
 }
diff --git a/tests/test_DoWhileProcessor.cpp b/tests/test_DoWhileProcessor.cpp
index a4c50d9be6e185fc2188c5bae1521c4eec3cfddc..5bf155652cefbde99a7a765f74f2d2f34a81cb7a 100644
--- a/tests/test_DoWhileProcessor.cpp
+++ b/tests/test_DoWhileProcessor.cpp
@@ -63,8 +63,8 @@ TEST_CASE("DoWhileProcessor", "[language]")
   SECTION("simple loop")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 do {
   j++;
   i += j;
@@ -76,8 +76,8 @@ do {
   SECTION("do-while with break")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 do {
   j++;
   if (j==2) break;
@@ -90,8 +90,8 @@ do {
   SECTION("do-while with continue")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 do {
   j++;
   if (j<=3) continue;
diff --git a/tests/test_ForProcessor.cpp b/tests/test_ForProcessor.cpp
index 3c03b99f2e4fccc270ce240aff40e2dc06071d23..ec492c88d7ddc2d428f8343ff6a0e918650f70c4 100644
--- a/tests/test_ForProcessor.cpp
+++ b/tests/test_ForProcessor.cpp
@@ -63,8 +63,8 @@ TEST_CASE("ForProcessor", "[language]")
   SECTION("simple for")
   {
     std::string_view data = R"(
-N i = 0;
-for(N l=0; l<10; ++l) {
+let i:N, i = 0;
+for(let l:N, l=0; l<10; ++l) {
   i += l;
 }
 )";
@@ -74,8 +74,8 @@ for(N l=0; l<10; ++l) {
   SECTION("for with break")
   {
     std::string_view data = R"(
-N i = 0;
-for(N l=0; l<10; ++l) {
+let i:N, i = 0;
+for(let l:N, l=0; l<10; ++l) {
   i += l;
   if (i > 30) break;
 }
@@ -86,8 +86,8 @@ for(N l=0; l<10; ++l) {
   SECTION("for with continue")
   {
     std::string_view data = R"(
-N i = 0;
-for(N l=0; l<10; ++l) {
+let i:N, i = 0;
+for(let l:N, l=0; l<10; ++l) {
   if (l<3) continue;
   i += l;
 }
@@ -100,7 +100,7 @@ for(N l=0; l<10; ++l) {
     SECTION("bad test type")
     {
       std::string_view data = R"(
-for(N l=0; l; ++l) {
+for(let l:N, l=0; l; ++l) {
 }
 )";
 
diff --git a/tests/test_FunctionProcessor.cpp b/tests/test_FunctionProcessor.cpp
index 2a4deb6c4335264f424a52d99c4d93edefdac784..f86b56d54e526d341712ab990abd5563a2f58deb 100644
--- a/tests/test_FunctionProcessor.cpp
+++ b/tests/test_FunctionProcessor.cpp
@@ -66,7 +66,7 @@ TEST_CASE("FunctionProcessor", "[language]")
         {
           std::string_view data = R"(
 let f : B -> B, b -> not b;
-B b = f(true);
+let b:B, b = f(true);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -78,7 +78,7 @@ B b = f(true);
         {
           std::string_view data = R"(
 let f : N -> B, n -> n > 2;
-B b = f(true);
+let b:B, b = f(true);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -87,8 +87,8 @@ B b = f(true);
         {
           std::string_view data = R"(
 let f : N -> B, n -> n > 2;
-N n = 3;
-B b = f(n);
+let n:N, n = 3;
+let b:B, b = f(n);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", true);
         }
@@ -97,7 +97,7 @@ B b = f(n);
         {
           std::string_view data = R"(
 let f : N -> B, (n) -> (n > 2);
-B b = f(2);
+let b:B, b = f(2);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -109,7 +109,7 @@ B b = f(2);
         {
           std::string_view data = R"(
 let f : Z -> B, z -> z-3 >= 0;
-B b = f(true);
+let b:B, b = f(true);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -118,8 +118,8 @@ B b = f(true);
         {
           std::string_view data = R"(
 let f : Z -> B, z -> z-3 >= 0;
-N n = 3;
-B b = f(n);
+let n:N, n = 3;
+let b:B, b = f(n);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", true);
         }
@@ -128,7 +128,7 @@ B b = f(n);
         {
           std::string_view data = R"(
 let f : Z -> B, z -> (z-3 >= 0);
-B b = f(2);
+let b:B, b = f(2);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -140,7 +140,7 @@ B b = f(2);
         {
           std::string_view data = R"(
 let f : R -> B, x -> x*x < 4;
-B b = f(true);
+let b:B, b = f(true);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", true);
         }
@@ -149,8 +149,8 @@ B b = f(true);
         {
           std::string_view data = R"(
 let f : R -> B, x -> x*x < 4;
-N n = 3;
-B b = f(n);
+let n:N, n = 3;
+let b:B, b = f(n);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -159,7 +159,7 @@ B b = f(n);
         {
           std::string_view data = R"(
 let f : R -> B, x -> x*x < 4;
-B b = f(-2);
+let b:B, b = f(-2);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -168,7 +168,7 @@ B b = f(-2);
         {
           std::string_view data = R"(
 let f : R -> B, x -> x*x < 4;
-B b = f(-1.3);
+let b:B, b = f(-1.3);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", true);
         }
@@ -181,7 +181,7 @@ B b = f(-1.3);
       {
         std::string_view data = R"(
 let f : N*N -> N, (m,n) -> m*n;
-N n = f(2,4);
+let n:N, n = f(2,4);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "n", 8ul);
       }
@@ -190,7 +190,7 @@ N n = f(2,4);
       {
         std::string_view data = R"(
 let f : Z*Z -> N, (p,q) -> p*q;
-N n = f(-2,-4);
+let n:N, n = f(-2,-4);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "n", 8ul);
       }
@@ -202,7 +202,7 @@ N n = f(-2,-4);
       {
         std::string_view data = R"(
 let f : N*N -> Z, (m,n) -> m*n;
-Z z = f(2,4);
+let z:Z, z = f(2,4);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "z", 8l);
       }
@@ -211,7 +211,7 @@ Z z = f(2,4);
       {
         std::string_view data = R"(
 let f : Z*Z -> Z, (p,q) -> p*q;
-Z z = f(-2,4);
+let z:Z, z = f(-2,4);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "z", -8l);
       }
@@ -220,7 +220,7 @@ Z z = f(-2,4);
       {
         std::string_view data = R"(
 let f : R*Z -> R, (p,q) -> p*q;
-R x = f(-0.5,8);
+let x:R, x = f(-0.5,8);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{-0.5 * 8l});
       }
@@ -232,7 +232,7 @@ R x = f(-0.5,8);
       {
         std::string_view data = R"(
 let f : N*R -> R, (n,x) -> n*x;
-R r = f(2,4.2);
+let r:R, r = f(2,4.2);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "r", double{2ul * 4.2});
       }
@@ -241,7 +241,7 @@ R r = f(2,4.2);
       {
         std::string_view data = R"(
 let f : R -> R, x -> x*x-1;
-R r = f(4);
+let r:R, r = f(4);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "r", double{15});
       }
@@ -249,9 +249,9 @@ R r = f(4);
       SECTION("from R using global variable")
       {
         std::string_view data = R"(
-R x0 = 3;
+let x0:R, x0 = 3;
 let f : R -> R, x -> x-x0;
-R x = f(7.3);
+let x:R, x = f(7.3);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{7.3 - 3});
       }
@@ -263,7 +263,7 @@ R x = f(7.3);
       {
         std::string_view data = R"(
 let f : string -> string, s -> s+"bar";
-string s = f("foo");
+let s:string, s = f("foo");
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "s", std::string{"foobar"});
       }
@@ -272,7 +272,7 @@ string s = f("foo");
       {
         std::string_view data = R"(
 let f : string*N -> string, (s,n) -> s+n;
-string s = f("id", 2);
+let s:string, s = f("id", 2);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "s", std::string{"id2"});
       }
@@ -281,7 +281,7 @@ string s = f("id", 2);
       {
         std::string_view data = R"(
 let f : string*N -> string, (s,n) -> s+n;
-string s = f(3, 2);
+let s:string, s = f(3, 2);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "s", std::string{"32"});
       }
@@ -290,7 +290,7 @@ string s = f(3, 2);
       {
         std::string_view data = R"(
 let f : N -> string, n -> n;
-string s = f(3);
+let s:string, s = f(3);
 )";
         CHECK_FUNCTION_EVALUATION_RESULT(data, "s", std::string{"3"});
       }
@@ -303,7 +303,7 @@ string s = f(3);
     {
       std::string_view data = R"(
 let f : N -> N*R, n -> (2*n, 0.3*n);
-N*R (n,x) = f(2);
+let (n,x):N*R, (n,x) = f(2);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "n", uint64_t{4});
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{0.3 * int64_t{2}});
@@ -313,7 +313,7 @@ N*R (n,x) = f(2);
     {
       std::string_view data = R"(
 let f : N -> N*R*B, n -> (2*n, 0.3*n, 1.4*n>n*n);
-N*R*B (n,x,b) = f(2);
+let (n,x,b):N*R*B, (n,x,b) = f(2);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "n", uint64_t{4});
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{0.3 * int64_t{2}});
@@ -327,7 +327,7 @@ N*R*B (n,x,b) = f(2);
     {
       std::string_view data = R"(
 let f : N -> N, n -> 2*n;
-R*N (x,n) = (2.3, f(3));
+let (x,n):R*N, (x,n) = (2.3, f(3));
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "n", uint64_t{6});
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{2.3});
@@ -339,7 +339,7 @@ R*N (x,n) = (2.3, f(3));
 import math;
 
 let f : N -> N*R, n -> (2*n, 0.3*n);
-N*R*R (n,x,s) = (f(2), sin(1));
+let (n,x,s):N*R*R, (n,x,s) = (f(2), sin(1));
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "n", uint64_t{4});
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{0.3 * int64_t{2}});
@@ -353,9 +353,9 @@ N*R*R (n,x,s) = (f(2), sin(1));
     {
       std::string_view data = R"(
 let f : R^1 -> R^1, x -> 2*x;
-R^1 x = 3;
+let x:R^1, x = 3;
 
-R^1 fx = f(x);
+let fx:R^1, fx = f(x);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (2 * TinyVector<1>{3}));
     }
@@ -364,9 +364,9 @@ R^1 fx = f(x);
     {
       std::string_view data = R"(
 let f : R^2 -> R^2, x -> 2*x;
-R^2 x = (3, 7);
+let x:R^2, x = (3, 7);
 
-R^2 fx = f(x);
+let fx:R^2, fx = f(x);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (2 * TinyVector<2>{3, 7}));
     }
@@ -375,9 +375,9 @@ R^2 fx = f(x);
     {
       std::string_view data = R"(
 let f : R^3 -> R^3, x -> 2*x;
-R^3 x = (2, 4, 7);
+let x:R^3, x = (2, 4, 7);
 
-R^3 fx = f(x);
+let fx:R^3, fx = f(x);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (2 * TinyVector<3>{2, 4, 7}));
     }
@@ -386,9 +386,9 @@ R^3 fx = f(x);
     {
       std::string_view data = R"(
 let f : R -> R^1, x -> 2*x;
-R x = 3;
+let x:R, x = 3;
 
-R^1 fx = f(x);
+let fx:R^1, fx = f(x);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (2 * TinyVector<1>{3}));
     }
@@ -397,7 +397,7 @@ R^1 fx = f(x);
     {
       std::string_view data = R"(
 let f : R*R -> R^2, (x,y) -> (2*x, 3*y);
-R^2 fx = f(2, 3);
+let fx:R^2, fx = f(2, 3);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (TinyVector<2>{2 * 2, 3 * 3}));
     }
@@ -407,7 +407,7 @@ R^2 fx = f(2, 3);
       std::string_view data = R"(
 let f : R -> R^3, x -> (x, 2*x, x*x);
 
-R^3 fx = f(3);
+let fx:R^3, fx = f(3);
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "fx", (TinyVector<3>{3, 6, 9}));
     }
@@ -420,7 +420,7 @@ R^3 fx = f(3);
       std::string_view data = R"(
 let f : R -> R*R^1*R^2*R^3, x -> (x+1, 2*x, (x-2, x+2), (1, 0.5*x, x*x));
 
-R*R^1*R^2*R^3 (x, x1, x2, x3) = f(3);
+let  (x, x1, x2, x3):R*R^1*R^2*R^3, (x, x1, x2, x3) = f(3);
 )";
 
       const double x = 3;
@@ -436,9 +436,9 @@ R*R^1*R^2*R^3 (x, x1, x2, x3) = f(3);
 let f : R^2*R^3 -> R*R^1*R^2*R^3,
        (x2, x3) -> (x2[0]+x3[2], x3[1], (x3[0], x2[1]), (x3[0], x3[0]+x2[1], x3[2]));
 
-R^2 y2 = (2.3, 4.1);
-R^3 y3 = (1.2, 1.3, 2.1);
-R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, y3);
+let y2:R^2, y2 = (2.3, 4.1);
+let y3:R^3, y3 = (1.2, 1.3, 2.1);
+let(x, x1, x2, x3) : R*R^1*R^2*R^3, (x, x1, x2, x3) = f(y2, y3);
 )";
 
       TinyVector<2> y2{2.3, 4.1};
@@ -455,8 +455,8 @@ R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, y3);
 let f : R^2*R^3 -> R*R^1*R^2*R^3,
        (x2, x3) -> (x2[0]+x3[2], x3[1], (x3[0], x2[1]), (x3[0], x3[0]+x2[1], x3[2]));
 
-R^2 y2 = (2.3, 4.1);
-R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, 0);
+let y2:R^2, y2 = (2.3, 4.1);
+let (x, x1, x2, x3) : R*R^1*R^2*R^3, (x, x1, x2, x3) = f(y2, 0);
 )";
 
       TinyVector<2> y2{2.3, 4.1};
@@ -473,8 +473,8 @@ R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, 0);
 let f : R^2*R^3 -> R*R^1*R^2*R^3,
        (x2, x3) -> (x2[0]+x3[2], x3[1], 0, 0);
 
-R^2 y2 = (2.3, 4.1);
-R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, 0);
+let y2:R^2, y2 = (2.3, 4.1);
+let (x, x1, x2, x3):R*R^1*R^2*R^3, (x, x1, x2, x3) = f(y2, 0);
 )";
 
       TinyVector<2> y2{2.3, 4.1};
@@ -488,13 +488,13 @@ R*R^1*R^2*R^3 (x, x1, x2, x3) = f(y2, 0);
 
   SECTION("function composition")
   {
-    SECTION("R -> R -> R")
+    SECTION("N -> N -> R")
     {
       std::string_view data = R"(
 let f : N -> N, n -> 2*n;
 let g : N -> R, n -> 2*n+0.5;
 
-R x = g(f(3));
+let x:R, x = g(f(3));
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{(2 * 3) * 2 + 0.5});
     }
@@ -506,7 +506,7 @@ import math;
 let f : N -> N, n -> 2*n;
 let g : N -> R, n -> sin(2*n)+0.5;
 
-R x = g(f(3));
+let x:R, x = g(f(3));
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{std::sin((2 * 3) * 2) + 0.5});
     }
@@ -517,7 +517,7 @@ R x = g(f(3));
 import math;
 let f : R -> R*R, x -> (x+1, x*2);
 
-R x = pow(f(2));
+let x:R, x = pow(f(2));
 )";
       CHECK_FUNCTION_EVALUATION_RESULT(data, "x", double{std::pow(2. + 1, 2. * 2)});
     }
@@ -529,7 +529,7 @@ import math;
 let f : R -> R^2, x -> (x+1, x*2);
 let g : R^2 -> R, x -> x[0] + x[1];
 
-R x = g(f(3));
+let x:R, x = g(f(3));
 )";
 
       double x0 = 3;
@@ -543,7 +543,7 @@ import math;
 let f : R -> R^2*R^3, x -> ((x+1, x*2), (6*x, 7-x, x/2.3));
 let g : R^2*R^3 -> R, (x, y) -> x[0]*x[1] + y[0]*y[1]-y[2];
 
-R x = g(f(3));
+let x:R, x = g(f(3));
 )";
 
       double x0 = 3;
diff --git a/tests/test_IfProcessor.cpp b/tests/test_IfProcessor.cpp
index bc1c57e9b4c9b023e10331eeb9668433ade75adb..52e70c6d994e3d4b384897df7e60c0048110e149 100644
--- a/tests/test_IfProcessor.cpp
+++ b/tests/test_IfProcessor.cpp
@@ -63,7 +63,7 @@ TEST_CASE("IfProcessor", "[language]")
   SECTION("simple if(true)")
   {
     std::string_view data = R"(
-N i = 0;
+let i:N, i = 0;
 if(true) {
   i = 1;
 }
@@ -74,7 +74,7 @@ if(true) {
   SECTION("simple if(false)")
   {
     std::string_view data = R"(
-N i = 0;
+let i:N, i = 0;
 if(false) {
   i = 1;
 }
@@ -85,7 +85,7 @@ if(false) {
   SECTION("simple if(true)else")
   {
     std::string_view data = R"(
-N i = 0;
+let i:N, i = 0;
 if(true) {
   i = 1;
 } else {
@@ -98,7 +98,7 @@ if(true) {
   SECTION("simple if(false)")
   {
     std::string_view data = R"(
-N i = 0;
+let i:N, i = 0;
 if(false) {
   i = 1;
 } else {
diff --git a/tests/test_IncDecExpressionProcessor.cpp b/tests/test_IncDecExpressionProcessor.cpp
index 2aee0a6b52f7b43bc2e233ba6d1591f8d7f7e163..d53686634e7f89bbe8ac084aa2754bab4ef81a34 100644
--- a/tests/test_IncDecExpressionProcessor.cpp
+++ b/tests/test_IncDecExpressionProcessor.cpp
@@ -54,20 +54,20 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_INC_DEC_RESULT(R"(N n = 2; ++n;)", "n", 3ul);
-      CHECK_INC_DEC_RESULT(R"(N n = 2; N m = ++n;)", "m", 3ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; ++n;)", "n", 3ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; let m:N, m = ++n;)", "m", 3ul);
     }
 
     SECTION("Z")
     {
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; ++z;)", "z", 3l);
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; Z p = ++z;)", "p", 3l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; ++z;)", "z", 3l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = ++z;)", "p", 3l);
     }
 
     SECTION("R")
     {
-      CHECK_INC_DEC_RESULT(R"(R r = 2; ++r;)", "r", 3.);
-      CHECK_INC_DEC_RESULT(R"(R r = 2; R s = ++r;)", "s", 3.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; ++r;)", "r", 3.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = ++r;)", "s", 3.);
     }
   }
 
@@ -75,20 +75,20 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_INC_DEC_RESULT(R"(N n = 2; --n;)", "n", 1ul);
-      CHECK_INC_DEC_RESULT(R"(N n = 2; N m = --n;)", "m", 1ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; --n;)", "n", 1ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; let m:N, m = --n;)", "m", 1ul);
     }
 
     SECTION("Z")
     {
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; --z;)", "z", 1l);
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; Z p = --z;)", "p", 1l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; --z;)", "z", 1l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = --z;)", "p", 1l);
     }
 
     SECTION("R")
     {
-      CHECK_INC_DEC_RESULT(R"(R r = 2; --r;)", "r", 1.);
-      CHECK_INC_DEC_RESULT(R"(R r = 2; R s = --r;)", "s", 1.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; --r;)", "r", 1.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = --r;)", "s", 1.);
     }
   }
 
@@ -96,20 +96,20 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_INC_DEC_RESULT(R"(N n = 2; n++;)", "n", 3ul);
-      CHECK_INC_DEC_RESULT(R"(N n = 2; N m = n++;)", "m", 2ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; n++;)", "n", 3ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; let m:N, m = n++;)", "m", 2ul);
     }
 
     SECTION("Z")
     {
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; z++;)", "z", 3l);
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; Z p = z++;)", "p", 2l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; z++;)", "z", 3l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = z++;)", "p", 2l);
     }
 
     SECTION("R")
     {
-      CHECK_INC_DEC_RESULT(R"(R r = 2; r++;)", "r", 3.);
-      CHECK_INC_DEC_RESULT(R"(R r = 2; R s = r++;)", "s", 2.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; r++;)", "r", 3.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = r++;)", "s", 2.);
     }
   }
 
@@ -117,20 +117,20 @@ TEST_CASE("IncDecExpressionProcessor", "[language]")
   {
     SECTION("N")
     {
-      CHECK_INC_DEC_RESULT(R"(N n = 2; n--;)", "n", 1ul);
-      CHECK_INC_DEC_RESULT(R"(N n = 2; N m = n--;)", "m", 2ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; n--;)", "n", 1ul);
+      CHECK_INC_DEC_RESULT(R"(let n:N, n = 2; let m:N, m = n--;)", "m", 2ul);
     }
 
     SECTION("Z")
     {
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; z--;)", "z", 1l);
-      CHECK_INC_DEC_RESULT(R"(Z z = 2; Z p = z--;)", "p", 2l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; z--;)", "z", 1l);
+      CHECK_INC_DEC_RESULT(R"(let z:Z, z = 2; let p:Z, p = z--;)", "p", 2l);
     }
 
     SECTION("R")
     {
-      CHECK_INC_DEC_RESULT(R"(R r = 2; r--;)", "r", 1.);
-      CHECK_INC_DEC_RESULT(R"(R r = 2; R s = r--;)", "s", 2.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; r--;)", "r", 1.);
+      CHECK_INC_DEC_RESULT(R"(let r:R, r = 2; let s:R, s = r--;)", "s", 2.);
     }
   }
 }
diff --git a/tests/test_ListAffectationProcessor.cpp b/tests/test_ListAffectationProcessor.cpp
index b4397fdfbbff26844bf8584d7c08aadfcb7e37b2..572457aa4fd787f8f2bad898cfb7d3609f1f9b8f 100644
--- a/tests/test_ListAffectationProcessor.cpp
+++ b/tests/test_ListAffectationProcessor.cpp
@@ -83,43 +83,48 @@ TEST_CASE("ListAffectationProcessor", "[language]")
   {
     SECTION("R*R^2*string")
     {
-      CHECK_AFFECTATION_RESULT(R"(R*R^2*string (x,u,s) = (1.2, (2,3), "foo");)", "x", double{1.2});
-      CHECK_AFFECTATION_RESULT(R"(R*R^2*string (x,u,s) = (1.2, (2,3), "foo");)", "u", (TinyVector<2>{2, 3}));
-      CHECK_AFFECTATION_RESULT(R"(R*R^2*string (x,u,s) = (1.2, (2,3), "foo");)", "s", std::string{"foo"});
+      CHECK_AFFECTATION_RESULT(R"(let (x,u,s): R*R^2*string, (x,u,s) = (1.2, (2,3), "foo");)", "x", double{1.2});
+      CHECK_AFFECTATION_RESULT(R"(let (x,u,s): R*R^2*string, (x,u,s) = (1.2, (2,3), "foo");)", "u",
+                               (TinyVector<2>{2, 3}));
+      CHECK_AFFECTATION_RESULT(R"(let (x,u,s): R*R^2*string, (x,u,s) = (1.2, (2,3), "foo");)", "s", std::string{"foo"});
     }
 
     SECTION("compound with string conversion")
     {
-      CHECK_AFFECTATION_RESULT(R"(R z = 3; R*R^2*string (x,u,s) = (1.2, (2,3), z);)", "s", std::to_string(double{3}));
+      CHECK_AFFECTATION_RESULT(R"(let z:R, z = 3; let (x,u,s):R*R^2*string, (x,u,s) = (1.2, (2,3), z);)", "s",
+                               std::to_string(double{3}));
       {
         std::ostringstream os;
         os << TinyVector<1>{7} << std::ends;
-        CHECK_AFFECTATION_RESULT(R"(R^1 v = 7; R*R^2*string (x,u,s) = (1.2, (2,3), v);)", "s", os.str());
+        CHECK_AFFECTATION_RESULT(R"(let v:R^1, v = 7; let  (x,u,s):R*R^2*string, (x,u,s) = (1.2, (2,3), v);)", "s",
+                                 os.str());
       }
       {
         std::ostringstream os;
         os << TinyVector<2>{6, 3} << std::ends;
-        CHECK_AFFECTATION_RESULT(R"(R^2 v = (6,3); R*R^2*string (x,u,s) = (1.2, (2,3), v);)", "s", os.str());
+        CHECK_AFFECTATION_RESULT(R"(let v: R^2, v = (6,3); let (x,u,s):R*R^2*string, (x,u,s) = (1.2, (2,3), v);)", "s",
+                                 os.str());
       }
       {
         std::ostringstream os;
         os << TinyVector<3>{1, 2, 3} << std::ends;
-        CHECK_AFFECTATION_RESULT(R"(R^3 v = (1,2,3); R*R^2*string (x,u,s) = (1.2, (2,3), v);)", "s", os.str());
+        CHECK_AFFECTATION_RESULT(R"(let v:R^3, v = (1,2,3); let (x,u,s):R*R^2*string, (x,u,s) = (1.2, (2,3), v);)", "s",
+                                 os.str());
       }
     }
 
     SECTION("compound R^d from '0'")
     {
-      CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "x", (TinyVector<3>{zero}));
-      CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "y", (TinyVector<2>{zero}));
-      CHECK_AFFECTATION_RESULT(R"(R^3*R^2*R^1 (x,y,z) = (0,0,0);)", "z", (TinyVector<1>{zero}));
+      CHECK_AFFECTATION_RESULT(R"(let (x,y,z):R^3*R^2*R^1, (x,y,z) = (0,0,0);)", "x", (TinyVector<3>{zero}));
+      CHECK_AFFECTATION_RESULT(R"(let (x,y,z):R^3*R^2*R^1, (x,y,z) = (0,0,0);)", "y", (TinyVector<2>{zero}));
+      CHECK_AFFECTATION_RESULT(R"(let (x,y,z):R^3*R^2*R^1, (x,y,z) = (0,0,0);)", "z", (TinyVector<1>{zero}));
     }
 
     SECTION("compound with subscript values")
     {
-      CHECK_AFFECTATION_RESULT(R"(R^3 x; (x[0], x[2], x[1]) = (4, 6, 5);)", "x", (TinyVector<3>{4, 5, 6}));
-      CHECK_AFFECTATION_RESULT(R"(R^2 x; (x[1], x[0]) = (3, 6);)", "x", (TinyVector<2>{6, 3}));
-      CHECK_AFFECTATION_RESULT(R"(R^1 x; R y; (y, x[0]) = (4, 2.3);)", "x", (TinyVector<1>{2.3}));
+      CHECK_AFFECTATION_RESULT(R"(let x:R^3; (x[0], x[2], x[1]) = (4, 6, 5);)", "x", (TinyVector<3>{4, 5, 6}));
+      CHECK_AFFECTATION_RESULT(R"(let x:R^2; (x[1], x[0]) = (3, 6);)", "x", (TinyVector<2>{6, 3}));
+      CHECK_AFFECTATION_RESULT(R"(let x:R^1; let y:R; (y, x[0]) = (4, 2.3);)", "x", (TinyVector<1>{2.3}));
     }
   }
 }
diff --git a/tests/test_NameProcessor.cpp b/tests/test_NameProcessor.cpp
index b6db88102dfa5cfccc00c9c63e8267de36bcc464..026ccc86f98b0091c18b1de31746e0bfa0a99adb 100644
--- a/tests/test_NameProcessor.cpp
+++ b/tests/test_NameProcessor.cpp
@@ -25,8 +25,8 @@ TEST_CASE("NameProcessor", "[language]")
   rang::setControlMode(rang::control::Off);
 
   std::string_view data = R"(
-N n=3;
-N m = n;
+let n:N, n=3;
+let m:N, m = n;
 n = 2;
 )";
 
diff --git a/tests/test_TupleToVectorProcessor.cpp b/tests/test_TupleToVectorProcessor.cpp
index 1ef3e6ad9f853feeb1f64015ef39fe07e6db9625..3a6cad0a14fe01b2586c48fadda85dd1d45833a3 100644
--- a/tests/test_TupleToVectorProcessor.cpp
+++ b/tests/test_TupleToVectorProcessor.cpp
@@ -84,7 +84,7 @@ TEST_CASE("TupleToVectorProcessor", "[language]")
   {
     std::string_view data = R"(
 let f: R*R*R->R^3, (x,y,z) -> (x,y,z);
-R^3 x = f(1,2,3);
+let x:R^3, x = f(1,2,3);
 )";
     CHECK_EVALUATION_RESULT(data, "x", (TinyVector<3>{1, 2, 3}));
   }
@@ -93,8 +93,8 @@ R^3 x = f(1,2,3);
   {
     std::string_view data = R"(
 let f: R^3->R^2, x -> (x[2],x[1]);
-R^3 x = (1,2,3);
-R^2 y = f(x);
+let x:R^3, x = (1,2,3);
+let y:R^2, y = f(x);
 )";
     CHECK_EVALUATION_RESULT(data, "y", (TinyVector<2>{3, 2}));
   }
diff --git a/tests/test_UnaryExpressionProcessor.cpp b/tests/test_UnaryExpressionProcessor.cpp
index da5296b43a764784b8fc7a5b49a2a0f9b7ee35d4..f3cc152abcf91e570056d4442fd9b6b735d4160f 100644
--- a/tests/test_UnaryExpressionProcessor.cpp
+++ b/tests/test_UnaryExpressionProcessor.cpp
@@ -62,21 +62,21 @@ TEST_CASE("UnaryExpressionProcessor", "[language]")
 {
   SECTION("unary minus")
   {
-    CHECK_UNARY_EXPRESSION_RESULT(R"(N n = 2; Z z = -n;)", "z", -2l);
-    CHECK_UNARY_EXPRESSION_RESULT(R"(Z p = 2; Z q = -p;)", "q", -2l);
-    CHECK_UNARY_EXPRESSION_RESULT(R"(R r = 2; r = -r;)", "r", -2.);
+    CHECK_UNARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = -n;)", "z", -2l);
+    CHECK_UNARY_EXPRESSION_RESULT(R"(let p:Z, p = 2; let q:Z, q = -p;)", "q", -2l);
+    CHECK_UNARY_EXPRESSION_RESULT(R"(let r:R, r = 2; r = -r;)", "r", -2.);
   }
 
   SECTION("unary not")
   {
-    CHECK_UNARY_EXPRESSION_RESULT(R"(B b = false; b = not b;)", "b", true);
-    CHECK_UNARY_EXPRESSION_RESULT(R"(B b = true; b = not b;)", "b", false);
+    CHECK_UNARY_EXPRESSION_RESULT(R"(let b:B, b = false; b = not b;)", "b", true);
+    CHECK_UNARY_EXPRESSION_RESULT(R"(let b:B, b = true; b = not b;)", "b", false);
 
     SECTION("errors")
     {
       SECTION("bad implicit conversions")
       {
-        CHECK_UNARY_EXPRESSION_THROWS_WITH(R"(N n = 0; not n;)", "invalid implicit conversion: N -> B");
+        CHECK_UNARY_EXPRESSION_THROWS_WITH(R"(let n:N, n = 0; not n;)", "invalid implicit conversion: N -> B");
         CHECK_UNARY_EXPRESSION_THROWS_WITH(R"(not 1;)", "invalid implicit conversion: Z -> B");
         CHECK_UNARY_EXPRESSION_THROWS_WITH(R"(not 1.3;)", "invalid implicit conversion: R -> B");
         CHECK_UNARY_EXPRESSION_THROWS_WITH(R"(not "foo";)", "invalid implicit conversion: string -> B");
diff --git a/tests/test_WhileProcessor.cpp b/tests/test_WhileProcessor.cpp
index 4f4974868c7c549d1eadfbb85b4a69e1a4d5294d..e23051e5ac6529eafae94066ca92df3187fc5a29 100644
--- a/tests/test_WhileProcessor.cpp
+++ b/tests/test_WhileProcessor.cpp
@@ -63,8 +63,8 @@ TEST_CASE("WhileProcessor", "[language]")
   SECTION("simple loop")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 while(i<10) {
   j++;
   i += j;
@@ -76,8 +76,8 @@ while(i<10) {
   SECTION("simple with break")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 while(i<10) {
   j++;
   if (j==2) break;
@@ -90,8 +90,8 @@ while(i<10) {
   SECTION("simple with continue")
   {
     std::string_view data = R"(
-N i = 3;
-N j = 0;
+let i:N, i = 3;
+let j:N, j = 0;
 while(i<10) {
   j++;
   if (j<=3) continue;