From 620be0d6523bf3f2430d6453bad84e89f69bad45 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 27 Nov 2019 14:04:42 +0100
Subject: [PATCH] Remove ASTNode::m_value member

Values are no more stored into AST nodes. The reason for that is that it was not
appropriate for multi-threaded evaluation of functions, since multiple
evaluations could not occur at the same time.

Now expression evaluation do not fill the node value but eventually return the
computed value.

Also, function are evaluated using a context array of values. Thus each function
calls is done in a separated context (as it should have always been).

This is a big change in the AST execution strategy. Nonetheless, it leads to a
seemingly better code, and there will be no more undefined trailing values in
the AST (for some node ASTNode::m_value would never be initialized/used).
---
 src/language/ASTNode.hpp                      |  11 +-
 .../ASTNodeCFunctionExpressionBuilder.cpp     |  20 +-
 .../ASTNodeCFunctionExpressionBuilder.hpp     |   3 +-
 src/language/ASTNodeDataTypeBuilder.cpp       |   1 -
 src/language/ASTNodeDataVariant.hpp           |   2 +-
 src/language/ASTNodeExpressionBuilder.cpp     |  26 ++-
 .../ASTNodeFunctionExpressionBuilder.cpp      |  39 ++--
 .../ASTNodeFunctionExpressionBuilder.hpp      |   3 +-
 ...STNodeListAffectationExpressionBuilder.cpp |  18 +-
 src/language/ASTNodeValueBuilder.cpp          |  67 -------
 src/language/ASTNodeValueBuilder.hpp          |  15 --
 src/language/ASTPrinter.cpp                   |  18 --
 src/language/ASTPrinter.hpp                   |   9 +-
 src/language/ASTSymbolTableBuilder.cpp        |  10 +-
 src/language/CFunctionEmbedder.hpp            |   8 +-
 src/language/CMakeLists.txt                   |   1 -
 src/language/PugsParser.cpp                   |   6 +-
 src/language/SymbolTable.hpp                  |  93 +++++++--
 .../ASTNodeExpressionListProcessor.hpp        |  29 +++
 .../node_processor/ASTNodeListProcessor.hpp   |   6 +-
 .../node_processor/AffectationProcessor.hpp   |  53 ++---
 .../BinaryExpressionProcessor.hpp             |  23 ++-
 .../node_processor/BreakProcessor.hpp         |   7 +-
 .../node_processor/CFunctionProcessor.hpp     |  59 ++----
 .../ConcatExpressionProcessor.hpp             |  19 +-
 .../node_processor/ContinueProcessor.hpp      |   7 +-
 .../node_processor/DoWhileProcessor.hpp       |  20 +-
 .../ExecUntilBreakOrContinue.hpp              |  45 -----
 .../node_processor/ExecutionPolicy.hpp        |  70 +++++++
 src/language/node_processor/FakeProcessor.hpp |   6 +-
 src/language/node_processor/ForProcessor.hpp  |  18 +-
 .../node_processor/FunctionProcessor.hpp      |  60 +++---
 .../node_processor/INodeProcessor.hpp         |   6 +-
 src/language/node_processor/IfProcessor.hpp   |   9 +-
 .../IncDecExpressionProcessor.hpp             |   6 +-
 .../node_processor/LocalNameProcessor.hpp     |  31 +++
 src/language/node_processor/NameProcessor.hpp |   6 +-
 .../node_processor/OStreamProcessor.hpp       |   9 +-
 .../UnaryExpressionProcessor.hpp              |   7 +-
 .../node_processor/ValueProcessor.hpp         |  48 +++++
 .../node_processor/WhileProcessor.hpp         |  17 +-
 tests/CMakeLists.txt                          |   3 +-
 tests/test_ASTModulesImporter.cpp             |   2 +-
 tests/test_ASTNode.cpp                        |   4 +-
 ...st_ASTNodeAffectationExpressionBuilder.cpp |  55 +++---
 ...ASTNodeBinaryOperatorExpressionBuilder.cpp | 184 +++++++++---------
 ...test_ASTNodeCFunctionExpressionBuilder.cpp |  32 ++-
 ...TNodeDeclarationToAffectationConverter.cpp |   3 -
 tests/test_ASTNodeEmptyBlockCleaner.cpp       |   7 +-
 tests/test_ASTNodeExpressionBuilder.cpp       | 123 ++++++------
 ...odeFunctionEvaluationExpressionBuilder.cpp |   9 +-
 .../test_ASTNodeFunctionExpressionBuilder.cpp |  24 +--
 tests/test_ASTNodeIncDecExpressionBuilder.cpp |  28 ++-
 tests/test_ASTNodeListProcessor.cpp           |   5 +-
 tests/test_ASTNodeTypeCleaner.cpp             |   3 -
 ..._ASTNodeUnaryOperatorExpressionBuilder.cpp |  11 +-
 tests/test_ASTNodeValueBuilder.cpp            | 138 -------------
 tests/test_ASTPrinter.cpp                     |  38 ++--
 tests/test_AffectationProcessor.cpp           |   6 +-
 tests/test_AffectationToStringProcessor.cpp   |   5 +-
 .../test_BinaryExpressionProcessor_utils.hpp  |   5 +-
 tests/test_BreakProcessor.cpp                 |   4 +-
 tests/test_CFunctionEmbedder.cpp              |  16 +-
 tests/test_CFunctionProcessor.cpp             |   5 +-
 tests/test_CMathModule.cpp                    |  97 ++++-----
 tests/test_ConcatExpressionProcessor.cpp      |   5 +-
 tests/test_ContinueProcessor.cpp              |   4 +-
 tests/test_DoWhileProcessor.cpp               |   5 +-
 tests/test_ExecUntilBreakOrContinue.cpp       |  32 ---
 tests/test_ExecutionPolicy.cpp                |  32 +++
 tests/test_FakeProcessor.cpp                  |   2 +-
 tests/test_ForProcessor.cpp                   |   5 +-
 tests/test_FunctionProcessor.cpp              |   5 +-
 tests/test_INodeProcessor.cpp                 |   2 +-
 tests/test_IfProcessor.cpp                    |   5 +-
 tests/test_IncDecExpressionProcessor.cpp      |   5 +-
 tests/test_NameProcessor.cpp                  |   5 +-
 tests/test_OStreamProcessor.cpp               |   5 +-
 tests/test_UnaryExpressionProcessor.cpp       |   5 +-
 tests/test_WhileProcessor.cpp                 |   5 +-
 80 files changed, 839 insertions(+), 1001 deletions(-)
 delete mode 100644 src/language/ASTNodeValueBuilder.cpp
 delete mode 100644 src/language/ASTNodeValueBuilder.hpp
 create mode 100644 src/language/node_processor/ASTNodeExpressionListProcessor.hpp
 delete mode 100644 src/language/node_processor/ExecUntilBreakOrContinue.hpp
 create mode 100644 src/language/node_processor/ExecutionPolicy.hpp
 create mode 100644 src/language/node_processor/LocalNameProcessor.hpp
 create mode 100644 src/language/node_processor/ValueProcessor.hpp
 delete mode 100644 tests/test_ASTNodeValueBuilder.cpp
 delete mode 100644 tests/test_ExecUntilBreakOrContinue.cpp
 create mode 100644 tests/test_ExecutionPolicy.cpp

diff --git a/src/language/ASTNode.hpp b/src/language/ASTNode.hpp
index 80b2a8c6e..5e6706a43 100644
--- a/src/language/ASTNode.hpp
+++ b/src/language/ASTNode.hpp
@@ -7,7 +7,7 @@
 #include <ASTNodeDataType.hpp>
 #include <ASTNodeDataVariant.hpp>
 
-#include <node_processor/ExecUntilBreakOrContinue.hpp>
+#include <node_processor/ExecutionPolicy.hpp>
 #include <node_processor/INodeProcessor.hpp>
 
 #include <pegtl/contrib/parse_tree.hpp>
@@ -22,7 +22,6 @@ struct ASTNode : public parse_tree::basic_node<ASTNode>
   std::unique_ptr<INodeProcessor> m_node_processor;
 
   ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t};
-  ASTNodeDataVariant m_value;
 
   PUGS_INLINE
   std::string
@@ -32,12 +31,14 @@ struct ASTNode : public parse_tree::basic_node<ASTNode>
   }
 
   PUGS_INLINE
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
     Assert(m_node_processor, "Undefined node processor");
     if (exec_policy.exec()) {
-      m_node_processor->execute(exec_policy);
+      return m_node_processor->execute(exec_policy);
+    } else {
+      return {};
     }
   }
 };
diff --git a/src/language/ASTNodeCFunctionExpressionBuilder.cpp b/src/language/ASTNodeCFunctionExpressionBuilder.cpp
index 0219ef309..b958907ab 100644
--- a/src/language/ASTNodeCFunctionExpressionBuilder.cpp
+++ b/src/language/ASTNodeCFunctionExpressionBuilder.cpp
@@ -6,24 +6,22 @@
 #include <node_processor/CFunctionProcessor.hpp>
 
 PUGS_INLINE std::unique_ptr<INodeProcessor>
-ASTNodeCFunctionExpressionBuilder::_getArgumentProcessor(const ASTNodeDataType& parameter_type,
-                                                         ASTNode& argument_node,
-                                                         ASTNodeDataVariant& argument_value)
+ASTNodeCFunctionExpressionBuilder::_getArgumentProcessor(const ASTNodeDataType& parameter_type, ASTNode& argument_node)
 {
   auto get_function_argument_processor_for = [&](const auto& parameter_v) -> std::unique_ptr<INodeProcessor> {
     using ParameterT = std::decay_t<decltype(parameter_v)>;
     switch (argument_node.m_data_type) {
     case ASTNodeDataType::bool_t: {
-      return std::make_unique<CFunctionArgumentProcessor<ParameterT, bool>>(argument_node, argument_value);
+      return std::make_unique<CFunctionArgumentProcessor<ParameterT, bool>>(argument_node);
     }
     case ASTNodeDataType::unsigned_int_t: {
-      return std::make_unique<CFunctionArgumentProcessor<ParameterT, uint64_t>>(argument_node, argument_value);
+      return std::make_unique<CFunctionArgumentProcessor<ParameterT, uint64_t>>(argument_node);
     }
     case ASTNodeDataType::int_t: {
-      return std::make_unique<CFunctionArgumentProcessor<ParameterT, int64_t>>(argument_node, argument_value);
+      return std::make_unique<CFunctionArgumentProcessor<ParameterT, int64_t>>(argument_node);
     }
     case ASTNodeDataType::double_t: {
-      return std::make_unique<CFunctionArgumentProcessor<ParameterT, double>>(argument_node, argument_value);
+      return std::make_unique<CFunctionArgumentProcessor<ParameterT, double>>(argument_node);
     }
     default: {
       throw parse_error("invalid argument type for function", std::vector{argument_node.begin()});
@@ -61,10 +59,8 @@ ASTNodeCFunctionExpressionBuilder::_storeArgumentProcessor(const std::vector<AST
                                                            ASTNode& argument_node,
                                                            CFunctionProcessor& c_function_processor)
 {
-  auto& argument_values = c_function_processor.argumentValues();
-
   c_function_processor.addArgumentProcessor(
-    this->_getArgumentProcessor(parameter_type_list[argument_number], argument_node, argument_values[argument_number]));
+    this->_getArgumentProcessor(parameter_type_list[argument_number], argument_node));
 }
 
 PUGS_INLINE
@@ -78,8 +74,6 @@ ASTNodeCFunctionExpressionBuilder::_buildArgumentProcessors(const std::vector<AS
   const size_t arguments_number =
     argument_nodes.is_type<language::function_argument_list>() ? argument_nodes.children.size() : 1;
 
-  c_function_processor.setNumberOfArguments(arguments_number);
-
   const size_t parameters_number = parameter_type_list.size();
 
   if (arguments_number != parameters_number) {
@@ -117,7 +111,7 @@ ASTNodeCFunctionExpressionBuilder::ASTNodeCFunctionExpressionBuilder(ASTNode& no
   this->_buildArgumentProcessors(c_function_parameter_type_list, node, *c_function_processor);
 
   c_function_processor->setFunctionExpressionProcessor(
-    std::make_unique<CFunctionExpressionProcessor>(node, c_function_embedder, c_function_processor->argumentValues()));
+    std::make_unique<CFunctionExpressionProcessor>(c_function_embedder));
 
   node.m_node_processor = std::move(c_function_processor);
 }
diff --git a/src/language/ASTNodeCFunctionExpressionBuilder.hpp b/src/language/ASTNodeCFunctionExpressionBuilder.hpp
index f2e2de4f3..db4533bdb 100644
--- a/src/language/ASTNodeCFunctionExpressionBuilder.hpp
+++ b/src/language/ASTNodeCFunctionExpressionBuilder.hpp
@@ -10,8 +10,7 @@ class ASTNodeCFunctionExpressionBuilder
 {
  private:
   PUGS_INLINE std::unique_ptr<INodeProcessor> _getArgumentProcessor(const ASTNodeDataType& parameter_type,
-                                                                    ASTNode& argument_node,
-                                                                    ASTNodeDataVariant& argument_value);
+                                                                    ASTNode& argument_node);
 
   PUGS_INLINE
   void _storeArgumentProcessor(const std::vector<ASTNodeDataType>& parameter_type_list,
diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index 3e0033920..73be74fe8 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -322,7 +322,6 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const
         if (image_domain_node.children.size() > 0) {
           data_type = image_domain_node.m_data_type;
         } else {
-#warning check if it is really useful to compute exact types here?
           if (image_domain_node.is_type<language::B_set>()) {
             data_type = ASTNodeDataType::bool_t;
           } else if (image_domain_node.is_type<language::Z_set>()) {
diff --git a/src/language/ASTNodeDataVariant.hpp b/src/language/ASTNodeDataVariant.hpp
index 5dc17b57f..b2e4cbb25 100644
--- a/src/language/ASTNodeDataVariant.hpp
+++ b/src/language/ASTNodeDataVariant.hpp
@@ -77,7 +77,7 @@ class AggregateDataVariant
   AggregateDataVariant& operator=(const AggregateDataVariant&) = default;
   AggregateDataVariant& operator=(AggregateDataVariant&&) = default;
 
-  AggregateDataVariant(size_t size) : m_data_vector(size) {}
+  AggregateDataVariant(std::vector<ASTNodeDataVariant>&& data_vector) : m_data_vector(data_vector) {}
 
   AggregateDataVariant(const AggregateDataVariant&) = default;
   AggregateDataVariant(AggregateDataVariant&&)      = default;
diff --git a/src/language/ASTNodeExpressionBuilder.cpp b/src/language/ASTNodeExpressionBuilder.cpp
index c9378f165..e745d24f8 100644
--- a/src/language/ASTNodeExpressionBuilder.cpp
+++ b/src/language/ASTNodeExpressionBuilder.cpp
@@ -8,6 +8,7 @@
 #include <ASTNodeIncDecExpressionBuilder.hpp>
 #include <ASTNodeUnaryOperatorExpressionBuilder.hpp>
 
+#include <node_processor/ASTNodeExpressionListProcessor.hpp>
 #include <node_processor/ASTNodeListProcessor.hpp>
 #include <node_processor/BreakProcessor.hpp>
 #include <node_processor/ContinueProcessor.hpp>
@@ -15,8 +16,10 @@
 #include <node_processor/FakeProcessor.hpp>
 #include <node_processor/ForProcessor.hpp>
 #include <node_processor/IfProcessor.hpp>
+#include <node_processor/LocalNameProcessor.hpp>
 #include <node_processor/NameProcessor.hpp>
 #include <node_processor/OStreamProcessor.hpp>
+#include <node_processor/ValueProcessor.hpp>
 #include <node_processor/WhileProcessor.hpp>
 
 #include <PEGGrammar.hpp>
@@ -42,28 +45,33 @@ ASTNodeExpressionBuilder::_buildExpression(ASTNode& n)
     ASTNodeFunctionEvaluationExpressionBuilder{n};
 
   } else if (n.is_type<language::real>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
   } else if (n.is_type<language::integer>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
   } else if (n.is_type<language::literal>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
   } else if (n.is_type<language::true_kw>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
   } else if (n.is_type<language::false_kw>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
 
   } else if (n.is_type<language::function_argument_list>()) {
     n.m_node_processor = std::make_unique<FakeProcessor>();
 
   } else if (n.is_type<language::expression_list>()) {
-    n.m_node_processor = std::make_unique<ASTNodeListProcessor>(n);
+    n.m_node_processor = std::make_unique<ASTNodeExpressionListProcessor>(n);
 
   } else if (n.is_type<language::name_list>()) {
     n.m_node_processor = std::make_unique<FakeProcessor>();
 
   } else if (n.is_type<language::name>()) {
-    n.m_node_processor = std::make_unique<NameProcessor>(n);
-
+    // Dealing with contexts
+    auto [i_symbol, success] = n.m_symbol_table->find(n.string(), n.begin());
+    if (i_symbol->attributes().hasLocalContext()) {
+      n.m_node_processor = std::make_unique<LocalNameProcessor>(n);
+    } else {
+      n.m_node_processor = std::make_unique<NameProcessor>(n);
+    }
   } else if (n.is_type<language::unary_minus>() or n.is_type<language::unary_not>()) {
     ASTNodeUnaryOperatorExpressionBuilder{n};
 
@@ -102,7 +110,7 @@ ASTNodeExpressionBuilder::_buildExpression(ASTNode& n)
   } else if (n.is_type<language::for_post>()) {
     n.m_node_processor = std::make_unique<FakeProcessor>();
   } else if (n.is_type<language::for_test>()) {
-    n.m_node_processor = std::make_unique<FakeProcessor>();
+    n.m_node_processor = std::make_unique<ValueProcessor>(n);
   } else if (n.is_type<language::break_kw>()) {
     n.m_node_processor = std::make_unique<BreakProcessor>();
   } else if (n.is_type<language::continue_kw>()) {
diff --git a/src/language/ASTNodeFunctionExpressionBuilder.cpp b/src/language/ASTNodeFunctionExpressionBuilder.cpp
index 8833958c6..3d8000370 100644
--- a/src/language/ASTNodeFunctionExpressionBuilder.cpp
+++ b/src/language/ASTNodeFunctionExpressionBuilder.cpp
@@ -141,29 +141,26 @@ std::unique_ptr<INodeProcessor>
 ASTNodeFunctionExpressionBuilder::_getFunctionProcessor(const ASTNodeDataType expression_value_type,
                                                         const ASTNodeDataType return_value_type,
                                                         ASTNode& node,
-                                                        ASTNode& function_component_expression,
-                                                        ASTNodeDataVariant& node_value)
+                                                        ASTNode& function_component_expression)
 {
   auto get_function_processor_for_expression_value = [&](const auto& return_v) -> std::unique_ptr<INodeProcessor> {
     using ReturnT = std::decay_t<decltype(return_v)>;
     switch (expression_value_type) {
     case ASTNodeDataType::bool_t: {
-      return std::make_unique<FunctionExpressionProcessor<ReturnT, bool>>(function_component_expression, node_value);
+      return std::make_unique<FunctionExpressionProcessor<ReturnT, bool>>(function_component_expression);
     }
     case ASTNodeDataType::unsigned_int_t: {
-      return std::make_unique<FunctionExpressionProcessor<ReturnT, uint64_t>>(function_component_expression,
-                                                                              node_value);
+      return std::make_unique<FunctionExpressionProcessor<ReturnT, uint64_t>>(function_component_expression);
     }
     case ASTNodeDataType::int_t: {
-      return std::make_unique<FunctionExpressionProcessor<ReturnT, int64_t>>(function_component_expression, node_value);
+      return std::make_unique<FunctionExpressionProcessor<ReturnT, int64_t>>(function_component_expression);
     }
     case ASTNodeDataType::double_t: {
-      return std::make_unique<FunctionExpressionProcessor<ReturnT, double>>(function_component_expression, node_value);
+      return std::make_unique<FunctionExpressionProcessor<ReturnT, double>>(function_component_expression);
     }
     case ASTNodeDataType::string_t: {
       if constexpr (std::is_same_v<ReturnT, std::string>) {
-        return std::make_unique<FunctionExpressionProcessor<ReturnT, std::string>>(function_component_expression,
-                                                                                   node_value);
+        return std::make_unique<FunctionExpressionProcessor<ReturnT, std::string>>(function_component_expression);
       } else {
         throw parse_error("invalid string conversion", std::vector{node.children[1]->begin()});
       }
@@ -215,14 +212,17 @@ ASTNodeFunctionExpressionBuilder::ASTNodeFunctionExpressionBuilder(ASTNode& node
 
   FunctionDescriptor& function_descriptor = node.m_symbol_table->functionTable()[function_id];
 
-  std::unique_ptr function_processor = std::make_unique<FunctionProcessor>();
-
-  this->_buildArgumentProcessors(function_descriptor, node, *function_processor);
-
   ASTNode& function_image_domain = *function_descriptor.domainMappingNode().children[1];
   ASTNode& function_expression   = *function_descriptor.definitionNode().children[1];
 
-  auto add_component_expression = [&](ASTNode& expression_node, ASTNode& domain_node, ASTNodeDataVariant& value) {
+  Assert(function_expression.m_symbol_table->hasContext());
+  const SymbolTable::Context& context = function_expression.m_symbol_table->context();
+
+  std::unique_ptr function_processor = std::make_unique<FunctionProcessor>(context.size());
+
+  this->_buildArgumentProcessors(function_descriptor, node, *function_processor);
+
+  auto add_component_expression = [&](ASTNode& expression_node, ASTNode& domain_node) {
     ASTNodeDataType expression_value_type = expression_node.m_data_type;
     ASTNodeDataType return_value_type     = ASTNodeDataType::undefined_t;
 
@@ -243,23 +243,18 @@ ASTNodeFunctionExpressionBuilder::ASTNodeFunctionExpressionBuilder(ASTNode& node
     Assert(return_value_type != ASTNodeDataType::undefined_t);
 
     function_processor->addFunctionExpressionProcessor(
-      this->_getFunctionProcessor(expression_value_type, return_value_type, node, expression_node, value));
+      this->_getFunctionProcessor(expression_value_type, return_value_type, node, expression_node));
   };
 
   if (function_expression.is_type<language::expression_list>()) {
     Assert(function_image_domain.is_type<language::type_expression>());
     ASTNode& image_domain_node = function_image_domain;
-    const size_t& nb_component = function_expression.children.size();
-
-    AggregateDataVariant aggregate_value(nb_component);
 
     for (size_t i = 0; i < function_expression.children.size(); ++i) {
-      add_component_expression(*function_expression.children[i], *image_domain_node.children[i], aggregate_value[i]);
+      add_component_expression(*function_expression.children[i], *image_domain_node.children[i]);
     }
-
-    node.m_value = std::move(aggregate_value);
   } else {
-    add_component_expression(function_expression, function_image_domain, node.m_value);
+    add_component_expression(function_expression, function_image_domain);
   }
 
   node.m_node_processor = std::move(function_processor);
diff --git a/src/language/ASTNodeFunctionExpressionBuilder.hpp b/src/language/ASTNodeFunctionExpressionBuilder.hpp
index f8f69e9c6..193d60e27 100644
--- a/src/language/ASTNodeFunctionExpressionBuilder.hpp
+++ b/src/language/ASTNodeFunctionExpressionBuilder.hpp
@@ -28,8 +28,7 @@ class ASTNodeFunctionExpressionBuilder
   std::unique_ptr<INodeProcessor> _getFunctionProcessor(const ASTNodeDataType expression_value_type,
                                                         const ASTNodeDataType return_value_type,
                                                         ASTNode& node,
-                                                        ASTNode& function_component_expression,
-                                                        ASTNodeDataVariant& node_value);
+                                                        ASTNode& function_component_expression);
 
  public:
   ASTNodeFunctionExpressionBuilder(ASTNode& node);
diff --git a/src/language/ASTNodeListAffectationExpressionBuilder.cpp b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
index 7db25c42b..8b0005c90 100644
--- a/src/language/ASTNodeListAffectationExpressionBuilder.cpp
+++ b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
@@ -15,19 +15,19 @@ ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessorFromExpre
       using ValueT = std::decay_t<decltype(value)>;
       switch (data_type) {
       case ASTNodeDataType::bool_t: {
-        list_affectation_processor->template add<ValueT, bool>(value_node, data_node);
+        list_affectation_processor->template add<ValueT, bool>(value_node);
         break;
       }
       case ASTNodeDataType::unsigned_int_t: {
-        list_affectation_processor->template add<ValueT, uint64_t>(value_node, data_node);
+        list_affectation_processor->template add<ValueT, uint64_t>(value_node);
         break;
       }
       case ASTNodeDataType::int_t: {
-        list_affectation_processor->template add<ValueT, int64_t>(value_node, data_node);
+        list_affectation_processor->template add<ValueT, int64_t>(value_node);
         break;
       }
       case ASTNodeDataType::double_t: {
-        list_affectation_processor->template add<ValueT, double>(value_node, data_node);
+        list_affectation_processor->template add<ValueT, double>(value_node);
         break;
       }
       default: {
@@ -40,23 +40,23 @@ ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessorFromExpre
       if constexpr (std::is_same_v<OperatorT, language::eq_op> or std::is_same_v<OperatorT, language::pluseq_op>) {
         switch (data_type) {
         case ASTNodeDataType::bool_t: {
-          list_affectation_processor->template add<std::string, bool>(value_node, data_node);
+          list_affectation_processor->template add<std::string, bool>(value_node);
           break;
         }
         case ASTNodeDataType::unsigned_int_t: {
-          list_affectation_processor->template add<std::string, uint64_t>(value_node, data_node);
+          list_affectation_processor->template add<std::string, uint64_t>(value_node);
           break;
         }
         case ASTNodeDataType::int_t: {
-          list_affectation_processor->template add<std::string, int64_t>(value_node, data_node);
+          list_affectation_processor->template add<std::string, int64_t>(value_node);
           break;
         }
         case ASTNodeDataType::double_t: {
-          list_affectation_processor->template add<std::string, double>(value_node, data_node);
+          list_affectation_processor->template add<std::string, double>(value_node);
           break;
         }
         case ASTNodeDataType::string_t: {
-          list_affectation_processor->template add<std::string, std::string>(value_node, data_node);
+          list_affectation_processor->template add<std::string, std::string>(value_node);
           break;
         }
         default: {
diff --git a/src/language/ASTNodeValueBuilder.cpp b/src/language/ASTNodeValueBuilder.cpp
deleted file mode 100644
index d0320c4ea..000000000
--- a/src/language/ASTNodeValueBuilder.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include <ASTNodeValueBuilder.hpp>
-
-#include <PEGGrammar.hpp>
-#include <PugsAssert.hpp>
-
-#include <EscapedString.hpp>
-
-#include <FunctionTable.hpp>
-#include <SymbolTable.hpp>
-
-void
-ASTNodeValueBuilder::_buildNodeValue(ASTNode& n)
-{
-  if (n.is_type<language::block>()) {
-    if (!n.children.empty()) {
-      for (auto& child : n.children) {
-        this->_buildNodeValue(*child);
-      }
-    }
-    n.m_data_type = ASTNodeDataType::void_t;
-  } else {
-    for (auto& child : n.children) {
-      this->_buildNodeValue(*child);
-    }
-
-    if (n.has_content()) {
-      if (n.is_type<language::real>()) {
-        std::stringstream ss(n.string());
-        double v;
-        ss >> v;
-        n.m_value = v;
-      } else if (n.is_type<language::integer>()) {
-        std::stringstream ss(n.string());
-        int64_t v;
-        ss >> v;
-        n.m_value = v;
-      } else if (n.is_type<language::literal>()) {
-        n.m_value = unescapeString(n.string());
-      } else if (n.is_type<language::for_test>()) {
-        // if AST contains a for_test statement, it means that no test were
-        // given to the for-loop, so its value is always true
-        n.m_value = true;
-      } else if (n.is_type<language::true_kw>()) {
-        n.m_value = true;
-      } else if (n.is_type<language::false_kw>()) {
-        n.m_value = false;
-      }
-    }
-  }
-}
-
-ASTNodeValueBuilder::ASTNodeValueBuilder(ASTNode& node)
-{
-  Assert(node.is_root());
-  node.m_data_type = ASTNodeDataType::void_t;
-  this->_buildNodeValue(node);
-
-  FunctionTable& function_table = node.m_symbol_table->functionTable();
-  for (size_t function_id = 0; function_id < function_table.size(); ++function_id) {
-    FunctionDescriptor& function_descriptor = function_table[function_id];
-    ASTNode& function_expression            = function_descriptor.definitionNode();
-
-    this->_buildNodeValue(function_expression);
-  }
-
-  std::cout << " - build node values\n";
-}
diff --git a/src/language/ASTNodeValueBuilder.hpp b/src/language/ASTNodeValueBuilder.hpp
deleted file mode 100644
index 0e60ccc71..000000000
--- a/src/language/ASTNodeValueBuilder.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef AST_NODE_VALUE_BUILDER_HPP
-#define AST_NODE_VALUE_BUILDER_HPP
-
-#include <ASTNode.hpp>
-
-class ASTNodeValueBuilder
-{
- private:
-  void _buildNodeValue(ASTNode& node);
-
- public:
-  ASTNodeValueBuilder(ASTNode& root_node);
-};
-
-#endif   // AST_NODE_VALUE_BUILDER_HPP
diff --git a/src/language/ASTPrinter.cpp b/src/language/ASTPrinter.cpp
index ca09efc5f..5b71a7094 100644
--- a/src/language/ASTPrinter.cpp
+++ b/src/language/ASTPrinter.cpp
@@ -24,24 +24,6 @@ ASTPrinter::_print(std::ostream& os, const ASTNode& node) const
     os << dataTypeName(node.m_data_type) << rang::fg::reset;
   }
 
-  if (m_info & static_cast<InfoBaseType>(Info::data_value)) {
-    os << ':';
-    os << rang::fgB::cyan;
-    std::visit(   // LCOV_EXCL_LINE
-      [&](const auto& value) {
-        using T = std::decay_t<decltype(value)>;
-        if constexpr (std::is_same_v<T, std::monostate>) {
-          os << "--";
-        } else if constexpr (std::is_same_v<T, std::string>) {
-          os << '\"' << escapeString(value) << '\"';
-        } else {
-          os << value;
-        }
-      },
-      node.m_value);
-    os << rang::fg::reset;
-  }
-
   if (m_info & static_cast<InfoBaseType>(Info::exec_type)) {
     if (node.m_node_processor) {
       os << ':';
diff --git a/src/language/ASTPrinter.hpp b/src/language/ASTPrinter.hpp
index d8eb0802a..22566006e 100644
--- a/src/language/ASTPrinter.hpp
+++ b/src/language/ASTPrinter.hpp
@@ -16,11 +16,10 @@ class ASTPrinter
 
   enum class Info : InfoBaseType
   {
-    none       = 0,
-    data_type  = 1 << 0,
-    data_value = 1 << 1,
-    exec_type  = 1 << 2,
-    all        = std::numeric_limits<InfoBaseType>::max()
+    none      = 0,
+    data_type = 1 << 0,
+    exec_type = 1 << 1,
+    all       = std::numeric_limits<InfoBaseType>::max()
   };
 
  private:
diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index d78100060..7db59aae4 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -16,10 +16,12 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
       }
     }
   } else if (n.is_type<language::let_declaration>()) {
-    std::shared_ptr local_symbol_table = std::make_shared<SymbolTable>(symbol_table);
-    n.m_symbol_table                   = local_symbol_table;
-    const std::string& symbol          = n.children[0]->string();
-    auto [i_symbol, success]           = symbol_table->add(symbol, n.children[0]->begin());
+    std::shared_ptr local_symbol_table =
+      std::make_shared<SymbolTable>(symbol_table, std::make_shared<SymbolTable::Context>());
+
+    n.m_symbol_table          = local_symbol_table;
+    const std::string& symbol = n.children[0]->string();
+    auto [i_symbol, success]  = symbol_table->add(symbol, n.children[0]->begin());
     if (not success) {
       std::ostringstream error_message;
       error_message << "symbol '" << rang::fg::red << symbol << rang::fg::reset << "' was already defined!";
diff --git a/src/language/CFunctionEmbedder.hpp b/src/language/CFunctionEmbedder.hpp
index 1abbde7aa..5434d4fa0 100644
--- a/src/language/CFunctionEmbedder.hpp
+++ b/src/language/CFunctionEmbedder.hpp
@@ -24,7 +24,7 @@ class ICFunctionEmbedder
 
   virtual std::vector<ASTNodeDataType> getParameterDataTypes() const = 0;
 
-  virtual void apply(const std::vector<ASTNodeDataVariant>& x, ASTNodeDataVariant& f_x) const = 0;
+  virtual ASTNodeDataVariant apply(const std::vector<ASTNodeDataVariant>& x) const = 0;
 
   virtual ~ICFunctionEmbedder() = default;
 };
@@ -99,15 +99,15 @@ class CFunctionEmbedder : public ICFunctionEmbedder
   }
 
   PUGS_INLINE
-  void
-  apply(const std::vector<ASTNodeDataVariant>& x, ASTNodeDataVariant& f_x) const final
+  ASTNodeDataVariant
+  apply(const std::vector<ASTNodeDataVariant>& x) const final
   {
     constexpr size_t N = std::tuple_size_v<ArgsTuple>;
     ArgsTuple t;
     using IndexSequence = std::make_index_sequence<N>;
 
     this->_copy_from_vector(t, x, IndexSequence{});
-    f_x = std::apply(m_f, t);
+    return {std::apply(m_f, t)};
   }
 
   // @note This is written in a template fashion to ensure that function type
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index 21a0c78fe..d37835666 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -25,7 +25,6 @@ add_library(
   ASTNodeJumpPlacementChecker.cpp
   ASTNodeListAffectationExpressionBuilder.cpp
   ASTNodeUnaryOperatorExpressionBuilder.cpp
-  ASTNodeValueBuilder.cpp
   ASTPrinter.cpp
   ASTSymbolTableBuilder.cpp
   ASTSymbolInitializationChecker.cpp
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index 5603fa424..ea4a37cd5 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -39,8 +39,6 @@
 #include <ASTDotPrinter.hpp>
 #include <ASTPrinter.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 void
 parser(const std::string& filename)
 {
@@ -75,8 +73,6 @@ parser(const std::string& filename)
 
     ASTNodeDataTypeChecker{*root_node};
 
-    ASTNodeValueBuilder{*root_node};
-
     ASTNodeJumpPlacementChecker{*root_node};
 
     // optimizations
@@ -91,7 +87,7 @@ parser(const std::string& filename)
 
     std::cout << ASTPrinter{*root_node} << '\n';
 
-    ExecUntilBreakOrContinue exec_all;
+    ExecutionPolicy exec_all;
     root_node->execute(exec_all);
     std::cout << *(root_node->m_symbol_table) << '\n';
   }
diff --git a/src/language/SymbolTable.hpp b/src/language/SymbolTable.hpp
index 328e200cb..648f71c6e 100644
--- a/src/language/SymbolTable.hpp
+++ b/src/language/SymbolTable.hpp
@@ -19,13 +19,21 @@ class SymbolTable
   class Attributes
   {
    private:
+    TAO_PEGTL_NAMESPACE::position m_position;
+    bool m_has_local_context;
+
     bool m_is_initialized{false};
+
     ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t};
     ASTNodeDataVariant m_value;
 
-    TAO_PEGTL_NAMESPACE::position m_position;
-
    public:
+    bool
+    hasLocalContext() const
+    {
+      return m_has_local_context;
+    }
+
     auto&
     value()
     {
@@ -88,7 +96,9 @@ class SymbolTable
       return os;
     }
 
-    Attributes(const TAO_PEGTL_NAMESPACE::position& position) : m_position(position) {}
+    Attributes(const TAO_PEGTL_NAMESPACE::position& position, const bool& has_local_context)
+      : m_position{position}, m_has_local_context{has_local_context}
+    {}
 
     Attributes(const Attributes&) = default;
   };
@@ -131,13 +141,57 @@ class SymbolTable
     ~Symbol()             = default;
   };
 
+  class Context
+  {
+   private:
+    size_t m_size{0};
+
+   public:
+    size_t
+    size() const
+    {
+      return m_size;
+    }
+
+    size_t
+    getNextSymbolId()
+    {
+      return m_size++;
+    }
+
+    Context() = default;
+
+    Context& operator=(Context&&) = default;
+    Context& operator=(const Context&) = default;
+
+    Context(const Context&) = default;
+    Context(Context&&)      = default;
+    ~Context()              = default;
+  };
+
  private:
   std::vector<Symbol> m_symbol_list;
+
   std::shared_ptr<SymbolTable> m_parent_table;
+  std::shared_ptr<Context> m_context;
+
   std::shared_ptr<FunctionTable> m_function_table;
   std::shared_ptr<CFunctionEmbedderTable> m_c_function_embedder_table;
 
  public:
+  bool
+  hasContext() const
+  {
+    return bool{m_context};
+  }
+
+  const Context&
+  context() const
+  {
+    Assert(m_context);
+    return *m_context;
+  }
+
   const FunctionTable&
   functionTable() const
   {
@@ -210,22 +264,39 @@ class SymbolTable
         return std::make_pair(i_stored_symbol, false);
       }
     }
-    return std::make_pair(m_symbol_list.emplace(m_symbol_list.end(), Symbol{symbol_name, Attributes(symbol_position)}),
-                          true);
+    auto i_symbol =
+      m_symbol_list.emplace(m_symbol_list.end(), Symbol{symbol_name, Attributes{symbol_position, this->hasContext()}});
+
+    if (this->hasContext()) {
+      i_symbol->attributes().value() = m_context->getNextSymbolId();
+    }
+
+    return std::make_pair(i_symbol, true);
+  }
+
+  SymbolTable(const std::shared_ptr<SymbolTable>& parent_table, const std::shared_ptr<Context>& context)
+    : m_parent_table{parent_table},
+      m_context{context},
+      m_function_table{parent_table->m_function_table},
+      m_c_function_embedder_table{parent_table->m_c_function_embedder_table}
+  {
+    ;
   }
 
   SymbolTable(const std::shared_ptr<SymbolTable>& parent_table)
-    : m_parent_table(parent_table),
-      m_function_table(parent_table->m_function_table),
-      m_c_function_embedder_table(parent_table->m_c_function_embedder_table)
+    : m_parent_table{parent_table},
+      m_context{parent_table->m_context},
+      m_function_table{parent_table->m_function_table},
+      m_c_function_embedder_table{parent_table->m_c_function_embedder_table}
   {
     ;
   }
 
   SymbolTable()
-    : m_parent_table(nullptr),
-      m_function_table(std::make_shared<FunctionTable>()),
-      m_c_function_embedder_table(std::make_shared<CFunctionEmbedderTable>())
+    : m_parent_table{nullptr},
+      m_context{nullptr},
+      m_function_table{std::make_shared<FunctionTable>()},
+      m_c_function_embedder_table{std::make_shared<CFunctionEmbedderTable>()}
   {
     ;
   }
diff --git a/src/language/node_processor/ASTNodeExpressionListProcessor.hpp b/src/language/node_processor/ASTNodeExpressionListProcessor.hpp
new file mode 100644
index 000000000..88703b838
--- /dev/null
+++ b/src/language/node_processor/ASTNodeExpressionListProcessor.hpp
@@ -0,0 +1,29 @@
+#ifndef AST_NODE_EXPRESSION_LIST_PROCESSOR_HPP
+#define AST_NODE_EXPRESSION_LIST_PROCESSOR_HPP
+
+#include <node_processor/INodeProcessor.hpp>
+
+#include <vector>
+
+class ASTNodeExpressionListProcessor final : public INodeProcessor
+{
+ private:
+  ASTNode& m_node;
+
+ public:
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
+  {
+    std::vector<ASTNodeDataVariant> list_values;
+    list_values.reserve(m_node.children.size());
+    for (auto& child : m_node.children) {
+      list_values.emplace_back(child->execute(exec_policy));
+    }
+
+    return ASTNodeDataVariant{std::move(list_values)};
+  }
+
+  ASTNodeExpressionListProcessor(ASTNode& node) : m_node{node} {}
+};
+
+#endif   // AST_NODE_EXPRESSION_LIST_PROCESSOR_HPP
diff --git a/src/language/node_processor/ASTNodeListProcessor.hpp b/src/language/node_processor/ASTNodeListProcessor.hpp
index b907b6fda..2303d3f2f 100644
--- a/src/language/node_processor/ASTNodeListProcessor.hpp
+++ b/src/language/node_processor/ASTNodeListProcessor.hpp
@@ -9,12 +9,14 @@ class ASTNodeListProcessor final : public INodeProcessor
   ASTNode& m_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
     for (auto& child : m_node.children) {
       child->execute(exec_policy);
     }
+
+    return {};
   }
 
   ASTNodeListProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp
index a538c351a..cbb7c4e74 100644
--- a/src/language/node_processor/AffectationProcessor.hpp
+++ b/src/language/node_processor/AffectationProcessor.hpp
@@ -54,7 +54,8 @@ struct AffOp<language::minuseq_op>
 
 struct IAffectationExecutor
 {
-  virtual void execute()          = 0;
+  virtual void affect(ASTNodeDataVariant&& rhs) = 0;
+
   virtual ~IAffectationExecutor() = default;
 };
 
@@ -63,7 +64,6 @@ class AffectationExecutor final : public IAffectationExecutor
 {
  private:
   ASTNodeDataVariant* m_lhs{nullptr};
-  ASTNodeDataVariant* m_rhs{nullptr};
 
   static inline const bool _is_defined{[] {
     if constexpr (std::is_same_v<std::decay_t<ValueT>, bool>) {
@@ -75,7 +75,7 @@ class AffectationExecutor final : public IAffectationExecutor
   }()};
 
  public:
-  AffectationExecutor(ASTNode& node, ASTNodeDataVariant* lhs, ASTNodeDataVariant* rhs) : m_lhs(lhs), m_rhs(rhs)
+  AffectationExecutor(ASTNode& node, ASTNodeDataVariant* lhs) : m_lhs(lhs)
   {
     if constexpr (not _is_defined) {
       throw parse_error("invalid operands to affectation expression", std::vector{node.begin()});
@@ -83,33 +83,33 @@ class AffectationExecutor final : public IAffectationExecutor
   }
 
   PUGS_INLINE void
-  execute()
+  affect(ASTNodeDataVariant&& rhs)
   {
     if constexpr (_is_defined) {
       if constexpr (std::is_same_v<ValueT, std::string>) {
         if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
           if constexpr (std::is_same_v<std::string, DataT>) {
-            *m_lhs = *m_rhs;
+            *m_lhs = rhs;
           } else {
-            *m_lhs = std::to_string(std::get<DataT>(*m_rhs));
+            *m_lhs = std::to_string(std::get<DataT>(rhs));
           }
         } else {
           static_assert(std::is_same_v<OperatorT, language::pluseq_op>, "unexpected operator type");
           if constexpr (std::is_same_v<std::string, DataT>) {
-            std::get<std::string>(*m_lhs) += std::get<std::string>(*m_rhs);
+            std::get<std::string>(*m_lhs) += std::get<std::string>(rhs);
           } else {
-            std::get<std::string>(*m_lhs) += std::to_string(std::get<DataT>(*m_rhs));
+            std::get<std::string>(*m_lhs) += std::to_string(std::get<DataT>(rhs));
           }
         }
       } else {
         if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
           if constexpr (std::is_same_v<ValueT, DataT>) {
-            *m_lhs = *m_rhs;
+            *m_lhs = rhs;
           } else {
-            *m_lhs = static_cast<ValueT>(std::get<DataT>(*m_rhs));
+            *m_lhs = static_cast<ValueT>(std::get<DataT>(rhs));
           }
         } else {
-          AffOp<OperatorT>().eval(std::get<ValueT>(*m_lhs), std::get<DataT>(*m_rhs));
+          AffOp<OperatorT>().eval(std::get<ValueT>(*m_lhs), std::get<DataT>(rhs));
         }
       }
     }
@@ -126,11 +126,12 @@ class AffectationProcessor final : public INodeProcessor
   std::unique_ptr<AffectationExecutorT> m_affectation_executor;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_node.children[1]->execute(exec_policy);
-    m_affectation_executor->execute();
+    m_affectation_executor->affect(m_node.children[1]->execute(exec_policy));
+
+    return {};
   }
 
   AffectationProcessor(ASTNode& node) : m_node{node}
@@ -139,8 +140,7 @@ class AffectationProcessor final : public INodeProcessor
     auto [i_symbol, found]    = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin());
     Assert(found);
 
-    m_affectation_executor =
-      std::make_unique<AffectationExecutorT>(m_node, &i_symbol->attributes().value(), &m_node.children[1]->m_value);
+    m_affectation_executor = std::make_unique<AffectationExecutorT>(m_node, &i_symbol->attributes().value());
   }
 };
 
@@ -155,24 +155,27 @@ class ListAffectationProcessor final : public INodeProcessor
  public:
   template <typename ValueT, typename DataT>
   void
-  add(ASTNode& lhs_node, ASTNode& rhs_node)
+  add(ASTNode& lhs_node)
   {
     const std::string& symbol = lhs_node.string();
     auto [i_symbol, found]    = m_node.m_symbol_table->find(symbol, m_node.children[0]->end());
     Assert(found);
 
     m_affectation_executor_list.emplace_back(
-      std::make_unique<AffectationExecutor<OperatorT, ValueT, DataT>>(m_node, &i_symbol->attributes().value(),
-                                                                      &rhs_node.m_value));
+      std::make_unique<AffectationExecutor<OperatorT, ValueT, DataT>>(m_node, &i_symbol->attributes().value()));
   }
 
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_node.children[1]->execute(exec_policy);
-    for (auto& affectation_executor : m_affectation_executor_list) {
-      affectation_executor->execute();
+    AggregateDataVariant children_values = std::get<AggregateDataVariant>(m_node.children[1]->execute(exec_policy));
+    Assert(m_affectation_executor_list.size() == children_values.size());
+
+    for (size_t i = 0; i < m_affectation_executor_list.size(); ++i) {
+      m_affectation_executor_list[i]->affect(std::move(children_values[i]));
     }
+
+    return {};
   }
 
   ListAffectationProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/BinaryExpressionProcessor.hpp b/src/language/node_processor/BinaryExpressionProcessor.hpp
index da8fa59f7..c8561f61c 100644
--- a/src/language/node_processor/BinaryExpressionProcessor.hpp
+++ b/src/language/node_processor/BinaryExpressionProcessor.hpp
@@ -156,8 +156,8 @@ class BinaryExpressionProcessor final : public INodeProcessor
 {
   ASTNode& m_node;
 
-  PUGS_INLINE auto
-  _eval(const ASTNodeDataVariant& a, const ASTNodeDataVariant& b, ASTNodeDataVariant& value)
+  PUGS_INLINE ASTNodeDataVariant
+  _eval(const ASTNodeDataVariant& a, const ASTNodeDataVariant& b)
   {
     // Add 'signed' when necessary to avoid signed/unsigned comparison warnings
     if constexpr ((not(std::is_same_v<A_DataT, bool> or std::is_same_v<B_DataT, bool>)) and
@@ -171,18 +171,18 @@ class BinaryExpressionProcessor final : public INodeProcessor
       if constexpr (std::is_unsigned_v<A_DataT>) {
         using signed_A_DataT          = std::make_signed_t<A_DataT>;
         const signed_A_DataT signed_a = static_cast<signed_A_DataT>(std::get<A_DataT>(a));
-        value                         = BinOp<BinaryOpT>().eval(signed_a, std::get<B_DataT>(b));
+        return BinOp<BinaryOpT>().eval(signed_a, std::get<B_DataT>(b));
       } else {
         using signed_B_DataT          = std::make_signed_t<B_DataT>;
         const signed_B_DataT signed_b = static_cast<signed_B_DataT>(std::get<B_DataT>(b));
-        value                         = BinOp<BinaryOpT>().eval(std::get<A_DataT>(a), signed_b);
+        return BinOp<BinaryOpT>().eval(std::get<A_DataT>(a), signed_b);
       }
     } else {
       auto result = BinOp<BinaryOpT>().eval(std::get<A_DataT>(a), std::get<B_DataT>(b));
       if constexpr (std::is_same_v<decltype(result), int>) {
-        value = static_cast<int64_t>(result);
+        return static_cast<int64_t>(result);
       } else {
-        value = result;
+        return result;
       }
     }
   }
@@ -195,14 +195,13 @@ class BinaryExpressionProcessor final : public INodeProcessor
   }()};
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
     if constexpr (_is_defined) {
-      m_node.children[0]->execute(exec_policy);
-      m_node.children[1]->execute(exec_policy);
-
-      this->_eval(m_node.children[0]->m_value, m_node.children[1]->m_value, m_node.m_value);
+      return this->_eval(m_node.children[0]->execute(exec_policy), m_node.children[1]->execute(exec_policy));
+    } else {
+      return {};
     }
   }
 
diff --git a/src/language/node_processor/BreakProcessor.hpp b/src/language/node_processor/BreakProcessor.hpp
index e00bf861f..292184271 100644
--- a/src/language/node_processor/BreakProcessor.hpp
+++ b/src/language/node_processor/BreakProcessor.hpp
@@ -6,10 +6,11 @@
 class BreakProcessor final : public INodeProcessor
 {
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    exec_policy = ExecUntilBreakOrContinue(ExecUntilBreakOrContinue::JumpType::break_jump);
+    exec_policy = ExecutionPolicy(ExecutionPolicy::JumpType::break_jump, exec_policy.sharedContext());
+    return {};
   }
 
   BreakProcessor() = default;
diff --git a/src/language/node_processor/CFunctionProcessor.hpp b/src/language/node_processor/CFunctionProcessor.hpp
index 2cefd9def..55354f788 100644
--- a/src/language/node_processor/CFunctionProcessor.hpp
+++ b/src/language/node_processor/CFunctionProcessor.hpp
@@ -12,45 +12,35 @@ class CFunctionArgumentProcessor final : public INodeProcessor
 {
  private:
   ASTNode& m_provided_value_node;
-  ASTNodeDataVariant& m_argument_value;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_provided_value_node.execute(exec_policy);
-
     if constexpr (std::is_same_v<ExpectedValueType, ProvidedValueType>) {
-      m_argument_value = m_provided_value_node.m_value;
+      return m_provided_value_node.execute(exec_policy);
     } else {
-      m_argument_value = static_cast<ExpectedValueType>(std::get<ProvidedValueType>(m_provided_value_node.m_value));
+      return static_cast<ExpectedValueType>(std::get<ProvidedValueType>(m_provided_value_node.execute(exec_policy)));
     }
   }
 
-  CFunctionArgumentProcessor(ASTNode& provided_value_node, ASTNodeDataVariant& argument_value)
-    : m_provided_value_node{provided_value_node}, m_argument_value{argument_value}
-  {}
+  CFunctionArgumentProcessor(ASTNode& provided_value_node) : m_provided_value_node{provided_value_node} {}
 };
 
 class CFunctionExpressionProcessor final : public INodeProcessor
 {
  private:
-  ASTNode& m_node;
-
   std::shared_ptr<ICFunctionEmbedder> m_embedded_c_function;
-  std::vector<ASTNodeDataVariant>& m_argument_values;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue&)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_embedded_c_function->apply(m_argument_values, m_node.m_value);
+    return m_embedded_c_function->apply(exec_policy.context());
   }
 
-  CFunctionExpressionProcessor(ASTNode& node,
-                               std::shared_ptr<ICFunctionEmbedder> embedded_c_function,
-                               std::vector<ASTNodeDataVariant>& argument_values)
-    : m_node{node}, m_embedded_c_function(embedded_c_function), m_argument_values{argument_values}
+  CFunctionExpressionProcessor(std::shared_ptr<ICFunctionEmbedder> embedded_c_function)
+    : m_embedded_c_function(embedded_c_function)
   {}
 };
 
@@ -60,22 +50,8 @@ class CFunctionProcessor : public INodeProcessor
   std::unique_ptr<INodeProcessor> m_function_expression_processor;
 
   std::vector<std::unique_ptr<INodeProcessor>> m_argument_processors;
-  std::vector<ASTNodeDataVariant> m_argument_values;
 
  public:
-  void
-  setNumberOfArguments(const size_t& number_of_arguments)
-  {
-    Assert(m_argument_values.size() == 0, "argument number has already been provided");
-    m_argument_values.resize(number_of_arguments);
-  }
-
-  std::vector<ASTNodeDataVariant>&
-  argumentValues()
-  {
-    return m_argument_values;
-  }
-
   void
   addArgumentProcessor(std::unique_ptr<INodeProcessor>&& argument_processor)
   {
@@ -88,15 +64,18 @@ class CFunctionProcessor : public INodeProcessor
     m_function_expression_processor = std::move(function_processor);
   }
 
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    Assert(m_argument_processors.size() == m_argument_values.size());
-    for (auto& argument_processor : m_argument_processors) {
-      argument_processor->execute(exec_policy);
+    ExecutionPolicy context_exec_policy{exec_policy.jumpType(),
+                                        std::make_shared<ExecutionPolicy::Context>(m_argument_processors.size())};
+    auto& argument_values = context_exec_policy.context();
+
+    for (size_t i = 0; i < argument_values.size(); ++i) {
+      argument_values[i] = m_argument_processors[i]->execute(context_exec_policy);
     }
 
-    m_function_expression_processor->execute(exec_policy);
+    return m_function_expression_processor->execute(context_exec_policy);
   }
 
   CFunctionProcessor() = default;
diff --git a/src/language/node_processor/ConcatExpressionProcessor.hpp b/src/language/node_processor/ConcatExpressionProcessor.hpp
index a82495607..5f493b8d6 100644
--- a/src/language/node_processor/ConcatExpressionProcessor.hpp
+++ b/src/language/node_processor/ConcatExpressionProcessor.hpp
@@ -9,24 +9,23 @@ class ConcatExpressionProcessor final : public INodeProcessor
  private:
   ASTNode& m_node;
 
-  PUGS_INLINE void
-  _eval(const std::string& a, const ASTNodeDataVariant& b, ASTNodeDataVariant& value)
+  PUGS_INLINE
+  ASTNodeDataVariant
+  _eval(const std::string& a, const ASTNodeDataVariant& b)
   {
     if constexpr (std::is_same_v<B_DataT, std::string>) {
-      value = a + std::get<B_DataT>(b);
+      return a + std::get<B_DataT>(b);
     } else {
-      value = a + std::to_string(std::get<B_DataT>(b));
+      return a + std::to_string(std::get<B_DataT>(b));
     }
   }
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_node.children[0]->execute(exec_policy);
-    m_node.children[1]->execute(exec_policy);
-
-    this->_eval(std::get<std::string>(m_node.children[0]->m_value), m_node.children[1]->m_value, m_node.m_value);
+    return this->_eval(std::get<std::string>(m_node.children[0]->execute(exec_policy)),
+                       m_node.children[1]->execute(exec_policy));
   }
 
   ConcatExpressionProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/ContinueProcessor.hpp b/src/language/node_processor/ContinueProcessor.hpp
index a6d64d3d5..29cd31a47 100644
--- a/src/language/node_processor/ContinueProcessor.hpp
+++ b/src/language/node_processor/ContinueProcessor.hpp
@@ -6,10 +6,11 @@
 class ContinueProcessor final : public INodeProcessor
 {
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    exec_policy = ExecUntilBreakOrContinue(ExecUntilBreakOrContinue::JumpType::continue_jump);
+    exec_policy = ExecutionPolicy(ExecutionPolicy::JumpType::continue_jump, exec_policy.sharedContext());
+    return {};
   }
 
   ContinueProcessor() = default;
diff --git a/src/language/node_processor/DoWhileProcessor.hpp b/src/language/node_processor/DoWhileProcessor.hpp
index 3a1a9d59b..a9c8a2005 100644
--- a/src/language/node_processor/DoWhileProcessor.hpp
+++ b/src/language/node_processor/DoWhileProcessor.hpp
@@ -9,23 +9,24 @@ class DoWhileProcessor final : public INodeProcessor
   ASTNode& m_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
     bool continuation_test = true;
-    ExecUntilBreakOrContinue exec_until_jump;
+    ExecutionPolicy exec_until_jump;
     do {
       m_node.children[0]->execute(exec_until_jump);
       if (not exec_until_jump.exec()) {
-        if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::break_jump) {
+        if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::break_jump) {
           break;
-        } else if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::continue_jump) {
-          exec_until_jump = ExecUntilBreakOrContinue{};   // getting ready for next loop traversal
+        } else if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::continue_jump) {
+          exec_until_jump = ExecutionPolicy{};   // getting ready for next loop traversal
         }
       }
-      m_node.children[1]->execute(exec_policy);
+
+      ;
       continuation_test = static_cast<bool>(std::visit(
-        [](const auto& value) -> bool {
+        [](auto&& value) -> bool {
           using T = std::decay_t<decltype(value)>;
           if constexpr (std::is_arithmetic_v<T>) {
             return value;
@@ -33,8 +34,9 @@ class DoWhileProcessor final : public INodeProcessor
             return false;   // LCOV_EXCL_LINE (unreachable: only there for compilation purpose)
           }
         },
-        m_node.children[1]->m_value));
+        m_node.children[1]->execute(exec_policy)));
     } while (continuation_test);
+    return {};
   }
 
   DoWhileProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/ExecUntilBreakOrContinue.hpp b/src/language/node_processor/ExecUntilBreakOrContinue.hpp
deleted file mode 100644
index c9aea0bc5..000000000
--- a/src/language/node_processor/ExecUntilBreakOrContinue.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
-#define EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
-
-#include <PugsMacros.hpp>
-
-struct ExecUntilBreakOrContinue
-{
-  enum class JumpType
-  {
-    no_jump,
-    break_jump,
-    continue_jump
-  };
-
- private:
-  JumpType m_jump_type;
-  bool m_exec;
-
- public:
-  PUGS_INLINE
-  bool
-  exec() const
-  {
-    return m_exec;
-  }
-
-  PUGS_INLINE
-  JumpType
-  jumpType() const
-  {
-    return m_jump_type;
-  }
-
-  ExecUntilBreakOrContinue& operator=(const ExecUntilBreakOrContinue&) = delete;
-  ExecUntilBreakOrContinue& operator=(ExecUntilBreakOrContinue&&) = default;
-
-  ExecUntilBreakOrContinue() : m_jump_type{JumpType::no_jump}, m_exec{true} {}
-
-  ExecUntilBreakOrContinue(const JumpType& jump_type) : m_jump_type(jump_type), m_exec((jump_type == JumpType::no_jump))
-  {
-    ;
-  }
-};
-
-#endif   // EXEC_UNTIL_BREAK_OR_CONTINUE_HPP
diff --git a/src/language/node_processor/ExecutionPolicy.hpp b/src/language/node_processor/ExecutionPolicy.hpp
new file mode 100644
index 000000000..3374a694c
--- /dev/null
+++ b/src/language/node_processor/ExecutionPolicy.hpp
@@ -0,0 +1,70 @@
+#ifndef EXECUTION_POLICY_HPP
+#define EXECUTION_POLICY_HPP
+
+#include <PugsMacros.hpp>
+
+#include <ASTNodeDataVariant.hpp>
+
+#include <memory>
+#include <vector>
+
+class ExecutionPolicy
+{
+ public:
+  enum class JumpType
+  {
+    no_jump,
+    break_jump,
+    continue_jump
+  };
+
+  using Context       = std::vector<ASTNodeDataVariant>;
+  using SharedContext = std::shared_ptr<Context>;
+
+ private:
+  JumpType m_jump_type;
+  bool m_exec;
+
+  SharedContext m_shared_context;
+
+ public:
+  PUGS_INLINE
+  bool
+  exec() const
+  {
+    return m_exec;
+  }
+
+  PUGS_INLINE
+  JumpType
+  jumpType() const
+  {
+    return m_jump_type;
+  }
+
+  Context&
+  context()
+  {
+    Assert(m_shared_context);
+    return *m_shared_context;
+  }
+
+  SharedContext
+  sharedContext() const
+  {
+    return m_shared_context;
+  }
+
+  ExecutionPolicy& operator=(const ExecutionPolicy&) = delete;
+  ExecutionPolicy& operator=(ExecutionPolicy&&) = default;
+
+  ExecutionPolicy() : m_jump_type{JumpType::no_jump}, m_exec{true} {}
+
+  ExecutionPolicy(const JumpType& jump_type, const SharedContext& shared_context)
+    : m_jump_type{jump_type}, m_exec{jump_type == JumpType::no_jump}, m_shared_context{shared_context}
+  {
+    ;
+  }
+};
+
+#endif   // EXECUTION_POLICY_HPP
diff --git a/src/language/node_processor/FakeProcessor.hpp b/src/language/node_processor/FakeProcessor.hpp
index ac75d68ad..a93af47de 100644
--- a/src/language/node_processor/FakeProcessor.hpp
+++ b/src/language/node_processor/FakeProcessor.hpp
@@ -6,10 +6,10 @@
 class FakeProcessor final : public INodeProcessor
 {
  public:
-  void
-  execute(ExecUntilBreakOrContinue&)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy&)
   {
-    ;
+    return {};
   }
 
   FakeProcessor() = default;
diff --git a/src/language/node_processor/ForProcessor.hpp b/src/language/node_processor/ForProcessor.hpp
index e06db01d0..09362e7fa 100644
--- a/src/language/node_processor/ForProcessor.hpp
+++ b/src/language/node_processor/ForProcessor.hpp
@@ -9,15 +9,14 @@ class ForProcessor final : public INodeProcessor
   ASTNode& m_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    ExecUntilBreakOrContinue exec_until_jump;
+    ExecutionPolicy exec_until_jump;
     m_node.children[0]->execute(exec_policy);
     while ([&]() {
-      m_node.children[1]->execute(exec_policy);
       return static_cast<bool>(std::visit(
-        [](const auto& value) -> bool {
+        [](auto&& value) -> bool {
           using T = std::decay_t<decltype(value)>;
           if constexpr (std::is_arithmetic_v<T>) {
             return value;
@@ -25,19 +24,20 @@ class ForProcessor final : public INodeProcessor
             return false;   // LCOV_EXCL_LINE (unreachable: only there for compilation purpose)
           }
         },
-        m_node.children[1]->m_value));
+        m_node.children[1]->execute(exec_policy)));
     }()) {
       m_node.children[3]->execute(exec_until_jump);
       if (not exec_until_jump.exec()) {
-        if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::break_jump) {
+        if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::break_jump) {
           break;
-        } else if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::continue_jump) {
-          exec_until_jump = ExecUntilBreakOrContinue{};   // getting ready for next loop traversal
+        } else if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::continue_jump) {
+          exec_until_jump = ExecutionPolicy{};   // getting ready for next loop traversal
         }
       }
 
       m_node.children[2]->execute(exec_policy);
     }
+    return {};
   }
 
   ForProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/FunctionProcessor.hpp b/src/language/node_processor/FunctionProcessor.hpp
index ccc7ce560..e2759e260 100644
--- a/src/language/node_processor/FunctionProcessor.hpp
+++ b/src/language/node_processor/FunctionProcessor.hpp
@@ -12,26 +12,29 @@ template <typename ExpectedValueType, typename ProvidedValueType>
 class FunctionArgumentProcessor final : public INodeProcessor
 {
  private:
-  ASTNodeDataVariant& m_symbol_value;
+  size_t m_symbol_id;
   ASTNode& m_provided_value_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_provided_value_node.execute(exec_policy);
+    ;
 
     if constexpr (std::is_same_v<ExpectedValueType, ProvidedValueType>) {
-      m_symbol_value = m_provided_value_node.m_value;
+      exec_policy.context()[m_symbol_id] = m_provided_value_node.execute(exec_policy);
     } else if constexpr (std::is_same_v<ExpectedValueType, std::string>) {
-      m_symbol_value = std::to_string(std::get<ProvidedValueType>(m_provided_value_node.m_value));
+      exec_policy.context()[m_symbol_id] =
+        std::to_string(std::get<ProvidedValueType>(m_provided_value_node.execute(exec_policy)));
     } else {
-      m_symbol_value = static_cast<ExpectedValueType>(std::get<ProvidedValueType>(m_provided_value_node.m_value));
+      exec_policy.context()[m_symbol_id] =
+        static_cast<ExpectedValueType>(std::get<ProvidedValueType>(m_provided_value_node.execute(exec_policy)));
     }
+    return {};
   }
 
   FunctionArgumentProcessor(SymbolTable::Symbol& argument_symbol, ASTNode& provided_value_node)
-    : m_symbol_value{argument_symbol.attributes().value()}, m_provided_value_node{provided_value_node}
+    : m_symbol_id{std::get<size_t>(argument_symbol.attributes().value())}, m_provided_value_node{provided_value_node}
   {}
 };
 
@@ -39,32 +42,31 @@ template <typename ReturnType, typename ExpressionValueType>
 class FunctionExpressionProcessor final : public INodeProcessor
 {
  private:
-  ASTNodeDataVariant& m_value;
   ASTNode& m_function_expression;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_function_expression.execute(exec_policy);
-
     if constexpr (std::is_same_v<ReturnType, ExpressionValueType>) {
-      m_value = m_function_expression.m_value;
+      return m_function_expression.execute(exec_policy);
     } else if constexpr (std::is_same_v<ReturnType, std::string>) {
-      m_value = std::to_string(std::get<ExpressionValueType>(m_function_expression.m_value));
+      return std::to_string(std::get<ExpressionValueType>(m_function_expression.execute(exec_policy)));
     } else {
-      m_value = static_cast<ReturnType>(std::get<ExpressionValueType>(m_function_expression.m_value));
+      return static_cast<ReturnType>(std::get<ExpressionValueType>(m_function_expression.execute(exec_policy)));
     }
   }
 
-  FunctionExpressionProcessor(ASTNode& function_component_expression, ASTNodeDataVariant& value)
-    : m_value{value}, m_function_expression{function_component_expression}
+  FunctionExpressionProcessor(ASTNode& function_component_expression)
+    : m_function_expression{function_component_expression}
   {}
 };
 
 class FunctionProcessor : public INodeProcessor
 {
  private:
+  const size_t m_context_size;
+
   std::vector<std::unique_ptr<INodeProcessor>> m_argument_processors;
   std::vector<std::unique_ptr<INodeProcessor>> m_function_expression_processors;
 
@@ -81,19 +83,29 @@ class FunctionProcessor : public INodeProcessor
     m_function_expression_processors.emplace_back(std::move(function_processor));
   }
 
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
+    ExecutionPolicy context_exec_policy{exec_policy.jumpType(),
+                                        std::make_shared<ExecutionPolicy::Context>(m_context_size)};
+
     for (auto& argument_processor : m_argument_processors) {
-      argument_processor->execute(exec_policy);
+      argument_processor->execute(context_exec_policy);
     }
 
-    for (auto& function_expression_processor : m_function_expression_processors) {
-      function_expression_processor->execute(exec_policy);
+#warning ugly: should define special case for multi-valued functions
+    if (m_function_expression_processors.size() == 1) {
+      return m_function_expression_processors[0]->execute(context_exec_policy);
+    } else {
+      for (auto& function_expression_processor : m_function_expression_processors) {
+        function_expression_processor->execute(context_exec_policy);
+      }
+#warning incorrect return value
+      return {};
     }
   }
 
-  FunctionProcessor() = default;
+  FunctionProcessor(const size_t& context_size) : m_context_size{context_size} {}
 };
 
 #endif   // FUNCTION_PROCESSOR_HPP
diff --git a/src/language/node_processor/INodeProcessor.hpp b/src/language/node_processor/INodeProcessor.hpp
index 7c582b491..903175383 100644
--- a/src/language/node_processor/INodeProcessor.hpp
+++ b/src/language/node_processor/INodeProcessor.hpp
@@ -2,14 +2,16 @@
 #define I_NODE_PROCESSOR_HPP
 
 #include <Demangle.hpp>
-#include <node_processor/ExecUntilBreakOrContinue.hpp>
+#include <node_processor/ExecutionPolicy.hpp>
 
 #include <string>
 #include <typeinfo>
 
+#include <ASTNodeDataVariant.hpp>
+
 struct INodeProcessor
 {
-  virtual void execute(ExecUntilBreakOrContinue& exec_policy) = 0;
+  virtual ASTNodeDataVariant execute(ExecutionPolicy& exec_policy) = 0;
 
   std::string
   typeIdName() const
diff --git a/src/language/node_processor/IfProcessor.hpp b/src/language/node_processor/IfProcessor.hpp
index 46d677724..c7c735162 100644
--- a/src/language/node_processor/IfProcessor.hpp
+++ b/src/language/node_processor/IfProcessor.hpp
@@ -9,10 +9,9 @@ class IfProcessor final : public INodeProcessor
   ASTNode& m_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_node.children[0]->execute(exec_policy);
     const bool is_true = static_cast<bool>(std::visit(   // LCOV_EXCL_LINE (false negative)
       [](const auto& value) -> bool {
         using T = std::decay_t<decltype(value)>;
@@ -22,7 +21,7 @@ class IfProcessor final : public INodeProcessor
           return false;   // LCOV_EXCL_LINE (unreachable: only there for compilation purpose)
         }
       },
-      m_node.children[0]->m_value));
+      m_node.children[0]->execute(exec_policy)));
     if (is_true) {
       Assert(m_node.children[1] != nullptr);
       m_node.children[1]->execute(exec_policy);
@@ -33,6 +32,8 @@ class IfProcessor final : public INodeProcessor
         m_node.children[2]->execute(exec_policy);
       }
     }
+
+    return {};
   }
 
   IfProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/IncDecExpressionProcessor.hpp b/src/language/node_processor/IncDecExpressionProcessor.hpp
index 7eccb590e..91f825949 100644
--- a/src/language/node_processor/IncDecExpressionProcessor.hpp
+++ b/src/language/node_processor/IncDecExpressionProcessor.hpp
@@ -60,10 +60,10 @@ class IncDecExpressionProcessor final : public INodeProcessor
   ASTNodeDataVariant* p_value{nullptr};
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue&)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy&)
   {
-    m_node.m_value = IncDecOp<IncDecOpT>().eval(std::get<DataT>(*p_value));
+    return IncDecOp<IncDecOpT>().eval(std::get<DataT>(*p_value));
   }
 
   IncDecExpressionProcessor(ASTNode& node) : m_node{node}
diff --git a/src/language/node_processor/LocalNameProcessor.hpp b/src/language/node_processor/LocalNameProcessor.hpp
new file mode 100644
index 000000000..6076fc379
--- /dev/null
+++ b/src/language/node_processor/LocalNameProcessor.hpp
@@ -0,0 +1,31 @@
+#ifndef LOCAL_NODE_PROCESSOR_HPP
+#define LOCAL_NODE_PROCESSOR_HPP
+
+#include <node_processor/INodeProcessor.hpp>
+
+#include <ASTNode.hpp>
+#include <SymbolTable.hpp>
+
+class LocalNameProcessor final : public INodeProcessor
+{
+ private:
+  ASTNode& m_node;
+  uint64_t m_value_id;
+
+ public:
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
+  {
+    return exec_policy.context()[m_value_id];
+  }
+
+  LocalNameProcessor(ASTNode& node) : m_node{node}
+  {
+    const std::string& symbol = m_node.string();
+    auto [i_symbol, found]    = m_node.m_symbol_table->find(symbol, m_node.begin());
+    Assert(found);
+    m_value_id = std::get<uint64_t>(i_symbol->attributes().value());
+  }
+};
+
+#endif   // LOCAL_NODE_PROCESSOR_HPP
diff --git a/src/language/node_processor/NameProcessor.hpp b/src/language/node_processor/NameProcessor.hpp
index edb5d026c..c9515d7e9 100644
--- a/src/language/node_processor/NameProcessor.hpp
+++ b/src/language/node_processor/NameProcessor.hpp
@@ -13,10 +13,10 @@ class NameProcessor final : public INodeProcessor
   ASTNodeDataVariant* p_value{nullptr};
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue&)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy&)
   {
-    m_node.m_value = *p_value;
+    return *p_value;
   }
 
   NameProcessor(ASTNode& node) : m_node{node}
diff --git a/src/language/node_processor/OStreamProcessor.hpp b/src/language/node_processor/OStreamProcessor.hpp
index 615047e55..3ce3ca063 100644
--- a/src/language/node_processor/OStreamProcessor.hpp
+++ b/src/language/node_processor/OStreamProcessor.hpp
@@ -10,11 +10,10 @@ class OStreamProcessor final : public INodeProcessor
   std::ostream& m_os;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
     for (size_t i = 0; i < m_node.children.size(); ++i) {
-      m_node.children[i]->execute(exec_policy);
       std::visit(
         [&](auto&& value) {
           using ValueT = std::decay_t<decltype(value)>;
@@ -26,8 +25,10 @@ class OStreamProcessor final : public INodeProcessor
             }
           }
         },
-        m_node.children[i]->m_value);
+        m_node.children[i]->execute(exec_policy));
     }
+
+    return {};
   }
 
   OStreamProcessor(ASTNode& node, std::ostream& os) : m_node{node}, m_os(os)
diff --git a/src/language/node_processor/UnaryExpressionProcessor.hpp b/src/language/node_processor/UnaryExpressionProcessor.hpp
index 8f53bd09e..7e5c53916 100644
--- a/src/language/node_processor/UnaryExpressionProcessor.hpp
+++ b/src/language/node_processor/UnaryExpressionProcessor.hpp
@@ -43,11 +43,10 @@ class UnaryExpressionProcessor final : public INodeProcessor
   }
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    m_node.children[0]->execute(exec_policy);
-    m_node.m_value = this->_eval(m_node.children[0]->m_value);
+    return this->_eval(m_node.children[0]->execute(exec_policy));
   }
 
   UnaryExpressionProcessor(ASTNode& node) : m_node{node} {}
diff --git a/src/language/node_processor/ValueProcessor.hpp b/src/language/node_processor/ValueProcessor.hpp
new file mode 100644
index 000000000..134726f7b
--- /dev/null
+++ b/src/language/node_processor/ValueProcessor.hpp
@@ -0,0 +1,48 @@
+#ifndef VALUE_PROCESSOR_HPP
+#define VALUE_PROCESSOR_HPP
+
+#include <PEGGrammar.hpp>
+#include <node_processor/INodeProcessor.hpp>
+
+#include <EscapedString.hpp>
+
+class ValueProcessor final : public INodeProcessor
+{
+ private:
+  ASTNodeDataVariant m_value;
+
+ public:
+  PUGS_INLINE
+  ASTNodeDataVariant
+  execute(ExecutionPolicy&)
+  {
+    return m_value;
+  }
+
+  ValueProcessor(ASTNode& node)
+  {
+    if (node.is_type<language::real>()) {
+      std::stringstream ss(node.string());
+      double v;
+      ss >> v;
+      m_value = v;
+    } else if (node.is_type<language::integer>()) {
+      std::stringstream ss(node.string());
+      int64_t v;
+      ss >> v;
+      m_value = v;
+    } else if (node.is_type<language::literal>()) {
+      m_value = unescapeString(node.string());
+    } else if (node.is_type<language::for_test>()) {
+      // if AST contains a for_test statement, it means that no test were
+      // given to the for-loop, so its value is always true
+      m_value = true;
+    } else if (node.is_type<language::true_kw>()) {
+      m_value = true;
+    } else if (node.is_type<language::false_kw>()) {
+      m_value = false;
+    }
+  }
+};
+
+#endif   // VALUE_PROCESSOR_HPP
diff --git a/src/language/node_processor/WhileProcessor.hpp b/src/language/node_processor/WhileProcessor.hpp
index 1a180f20d..3f66194bf 100644
--- a/src/language/node_processor/WhileProcessor.hpp
+++ b/src/language/node_processor/WhileProcessor.hpp
@@ -9,12 +9,11 @@ class WhileProcessor final : public INodeProcessor
   ASTNode& m_node;
 
  public:
-  void
-  execute(ExecUntilBreakOrContinue& exec_policy)
+  ASTNodeDataVariant
+  execute(ExecutionPolicy& exec_policy)
   {
-    ExecUntilBreakOrContinue exec_until_jump;
+    ExecutionPolicy exec_until_jump;
     while ([&]() {
-      m_node.children[0]->execute(exec_policy);
       return static_cast<bool>(std::visit(
         [](const auto& value) -> bool {
           using T = std::decay_t<decltype(value)>;
@@ -24,17 +23,19 @@ class WhileProcessor final : public INodeProcessor
             return false;   // LCOV_EXCL_LINE (unreachable: only there for compilation purpose)
           }
         },
-        m_node.children[0]->m_value));
+        m_node.children[0]->execute(exec_policy)));
     }()) {
       m_node.children[1]->execute(exec_until_jump);
       if (not exec_until_jump.exec()) {
-        if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::break_jump) {
+        if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::break_jump) {
           break;
-        } else if (exec_until_jump.jumpType() == ExecUntilBreakOrContinue::JumpType::continue_jump) {
-          exec_until_jump = ExecUntilBreakOrContinue{};   // getting ready for next loop traversal
+        } else if (exec_until_jump.jumpType() == ExecutionPolicy::JumpType::continue_jump) {
+          exec_until_jump = ExecutionPolicy{};   // getting ready for next loop traversal
         }
       }
     }
+
+    return {};
   }
 
   WhileProcessor(ASTNode& node) : m_node{node} {}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 48856c05e..11242857c 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -27,7 +27,6 @@ add_executable (unit_tests
   test_ASTNodeListProcessor.cpp
   test_ASTNodeTypeCleaner.cpp
   test_ASTNodeUnaryOperatorExpressionBuilder.cpp
-  test_ASTNodeValueBuilder.cpp
   test_ASTPrinter.cpp
   test_ASTSymbolTableBuilder.cpp
   test_ASTSymbolInitializationChecker.cpp
@@ -45,7 +44,7 @@ add_executable (unit_tests
   test_ConcatExpressionProcessor.cpp
   test_CRSMatrix.cpp
   test_DoWhileProcessor.cpp
-  test_ExecUntilBreakOrContinue.cpp
+  test_ExecutionPolicy.cpp
   test_FakeProcessor.cpp
   test_ForProcessor.cpp
   test_FunctionProcessor.cpp
diff --git a/tests/test_ASTModulesImporter.cpp b/tests/test_ASTModulesImporter.cpp
index a85927783..a2fed9058 100644
--- a/tests/test_ASTModulesImporter.cpp
+++ b/tests/test_ASTModulesImporter.cpp
@@ -23,7 +23,7 @@
     ASTNodeTypeCleaner<language::import_instruction>{*ast};                                         \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
-    ExecUntilBreakOrContinue exec_policy;                                                           \
+    ExecutionPolicy exec_policy;                                                                    \
     ast->execute(exec_policy);                                                                      \
                                                                                                     \
     std::stringstream ast_output;                                                                   \
diff --git a/tests/test_ASTNode.cpp b/tests/test_ASTNode.cpp
index 4505c8664..a8366f4b1 100644
--- a/tests/test_ASTNode.cpp
+++ b/tests/test_ASTNode.cpp
@@ -12,7 +12,7 @@ TEST_CASE("ASTNode", "[language]")
   SECTION("execute")
   {
     ASTNode ast_node;
-    ExecUntilBreakOrContinue exec_policy;
+    ExecutionPolicy exec_policy;
 
 #ifndef NDEBUG
     REQUIRE_THROWS(ast_node.execute(exec_policy));
@@ -26,7 +26,7 @@ TEST_CASE("ASTNode", "[language]")
   SECTION("name")
   {
     ASTNode ast_node;
-    ExecUntilBreakOrContinue exec_policy;
+    ExecutionPolicy exec_policy;
 
     ast_node.set_type<language::name>();
 
diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
index cdceab453..4883f0995 100644
--- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -31,7 +29,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -62,7 +59,7 @@ B b=true;
 (root:ASTNodeListProcessor)
  `-(language::eq_op:AffectationProcessor<language::eq_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -129,7 +126,7 @@ N n=true;
 (root:ASTNodeListProcessor)
  `-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, bool>)
      +-(language::name:n:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -194,7 +191,6 @@ N n="foo";
 
         ASTSymbolTableBuilder{*ast};
         ASTNodeDataTypeBuilder{*ast};
-        ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
         ASTNodeTypeCleaner<language::declaration>{*ast};
@@ -215,7 +211,7 @@ Z z=true;
 (root:ASTNodeListProcessor)
  `-(language::eq_op:AffectationProcessor<language::eq_op, long, bool>)
      +-(language::name:z:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -280,7 +276,6 @@ Z z="foo";
 
         ASTSymbolTableBuilder{*ast};
         ASTNodeDataTypeBuilder{*ast};
-        ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
         ASTNodeTypeCleaner<language::declaration>{*ast};
@@ -301,7 +296,7 @@ R r=true;
 (root:ASTNodeListProcessor)
  `-(language::eq_op:AffectationProcessor<language::eq_op, double, bool>)
      +-(language::name:r:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -366,7 +361,6 @@ R r="foo";
 
         ASTSymbolTableBuilder{*ast};
         ASTNodeDataTypeBuilder{*ast};
-        ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
         ASTNodeTypeCleaner<language::declaration>{*ast};
@@ -388,7 +382,7 @@ string s=true;
  `-(language::eq_op:AffectationProcessor<language::eq_op, )" +
                              demangled_stdstring + R"(, bool>)
      +-(language::name:s:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -458,7 +452,7 @@ string s="foo";
  `-(language::eq_op:AffectationProcessor<language::eq_op, )" +
                              demangled_stdstring + ", " + demangled_stdstring + R"( >)
      +-(language::name:s:NameProcessor)
-     `-(language::literal:"foo":FakeProcessor)
+     `-(language::literal:"foo":ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -478,7 +472,7 @@ N n=1; n+=n;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:n:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::pluseq_op:AffectationProcessor<language::pluseq_op, unsigned long, unsigned long>)
      +-(language::name:n:NameProcessor)
      `-(language::name:n:NameProcessor)
@@ -497,10 +491,10 @@ R x=1; x+=2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::pluseq_op:AffectationProcessor<language::pluseq_op, double, long>)
      +-(language::name:x:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -517,12 +511,12 @@ string s="foo"; s+=2;
  +-(language::eq_op:AffectationProcessor<language::eq_op, )" +
                            demangled_stdstring + ", " + demangled_stdstring + R"( >)
  |   +-(language::name:s:NameProcessor)
- |   `-(language::literal:"foo":FakeProcessor)
+ |   `-(language::literal:"foo":ValueProcessor)
  `-(language::pluseq_op:AffectationProcessor<language::pluseq_op, )" +
                            demangled_stdstring +
                            R"(, long>)
      +-(language::name:s:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -541,10 +535,10 @@ Z z=1; z-=2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:z:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::minuseq_op:AffectationProcessor<language::minuseq_op, long, long>)
      +-(language::name:z:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -560,10 +554,10 @@ R x=1; x-=2.3;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::minuseq_op:AffectationProcessor<language::minuseq_op, double, double>)
      +-(language::name:x:NameProcessor)
-     `-(language::real:2.3:FakeProcessor)
+     `-(language::real:2.3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -580,7 +574,6 @@ string s="foo"; s-="bar";
 
       ASTSymbolTableBuilder{*ast};
       ASTNodeDataTypeBuilder{*ast};
-      ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
       ASTNodeTypeCleaner<language::declaration>{*ast};
@@ -601,10 +594,10 @@ Z z=1; z*=2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:z:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::multiplyeq_op:AffectationProcessor<language::multiplyeq_op, long, long>)
      +-(language::name:z:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -620,10 +613,10 @@ R x=1; x*=2.3;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::multiplyeq_op:AffectationProcessor<language::multiplyeq_op, double, double>)
      +-(language::name:x:NameProcessor)
-     `-(language::real:2.3:FakeProcessor)
+     `-(language::real:2.3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -640,7 +633,6 @@ string s="foo"; s*=2;
 
       ASTSymbolTableBuilder{*ast};
       ASTNodeDataTypeBuilder{*ast};
-      ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
       ASTNodeTypeCleaner<language::declaration>{*ast};
@@ -661,10 +653,10 @@ Z z=6; z/=2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:z:NameProcessor)
- |   `-(language::integer:6:FakeProcessor)
+ |   `-(language::integer:6:ValueProcessor)
  `-(language::divideeq_op:AffectationProcessor<language::divideeq_op, long, long>)
      +-(language::name:z:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -680,10 +672,10 @@ R x=1; x/=2.3;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::divideeq_op:AffectationProcessor<language::divideeq_op, double, double>)
      +-(language::name:x:NameProcessor)
-     `-(language::real:2.3:FakeProcessor)
+     `-(language::real:2.3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -700,7 +692,6 @@ string s="foo"; s/="bar";
 
       ASTSymbolTableBuilder{*ast};
       ASTNodeDataTypeBuilder{*ast};
-      ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
       ASTNodeTypeCleaner<language::declaration>{*ast};
diff --git a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
index 1bff3eb40..22a93e75b 100644
--- a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -31,7 +29,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -54,7 +51,6 @@
                                                                                                 \
     ASTSymbolTableBuilder{*ast};                                                                \
     ASTNodeDataTypeBuilder{*ast};                                                               \
-    ASTNodeValueBuilder{*ast};                                                                  \
                                                                                                 \
     ASTNodeDeclarationToAffectationConverter{*ast};                                             \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                            \
@@ -78,12 +74,12 @@ false*b*true;
 (root:ASTNodeListProcessor)
  +-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, long, bool>)
      +-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -121,7 +117,7 @@ a*3*a;
  `-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, long, long>)
      +-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -139,10 +135,10 @@ a*3*a;
  `-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, double, bool>)
      +-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, double, long>)
      |   +-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -163,12 +159,12 @@ false/b/true;
 (root:ASTNodeListProcessor)
  +-(language::divide_op:BinaryExpressionProcessor<language::divide_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::divide_op:BinaryExpressionProcessor<language::divide_op, long, bool>)
      +-(language::divide_op:BinaryExpressionProcessor<language::divide_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -206,7 +202,7 @@ a/3/a;
  `-(language::divide_op:BinaryExpressionProcessor<language::divide_op, long, long>)
      +-(language::divide_op:BinaryExpressionProcessor<language::divide_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -224,10 +220,10 @@ a/3/a;
  `-(language::divide_op:BinaryExpressionProcessor<language::divide_op, double, bool>)
      +-(language::divide_op:BinaryExpressionProcessor<language::divide_op, double, long>)
      |   +-(language::divide_op:BinaryExpressionProcessor<language::divide_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -248,12 +244,12 @@ false+b+true;
 (root:ASTNodeListProcessor)
  +-(language::plus_op:BinaryExpressionProcessor<language::plus_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::plus_op:BinaryExpressionProcessor<language::plus_op, long, bool>)
      +-(language::plus_op:BinaryExpressionProcessor<language::plus_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -291,7 +287,7 @@ a+3+a;
  `-(language::plus_op:BinaryExpressionProcessor<language::plus_op, long, long>)
      +-(language::plus_op:BinaryExpressionProcessor<language::plus_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -309,10 +305,10 @@ a+3+a;
  `-(language::plus_op:BinaryExpressionProcessor<language::plus_op, double, bool>)
      +-(language::plus_op:BinaryExpressionProcessor<language::plus_op, double, long>)
      |   +-(language::plus_op:BinaryExpressionProcessor<language::plus_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -327,8 +323,8 @@ a+3+a;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::plus_op:ConcatExpressionProcessor<bool>)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::true_kw:FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -345,9 +341,9 @@ N n=0;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:n:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::plus_op:ConcatExpressionProcessor<unsigned long>)
-     +-(language::literal:"foo":FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
      `-(language::name:n:NameProcessor)
 )";
 
@@ -363,8 +359,8 @@ N n=0;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::plus_op:ConcatExpressionProcessor<long>)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::integer:1:FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -379,8 +375,8 @@ N n=0;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::plus_op:ConcatExpressionProcessor<double>)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -398,8 +394,8 @@ N n=0;
 (root:ASTNodeListProcessor)
  `-(language::plus_op:ConcatExpressionProcessor<)" +
                            string_name + R"( >)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::literal:"bar":FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::literal:"bar":ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -420,12 +416,12 @@ false-b-true;
 (root:ASTNodeListProcessor)
  +-(language::minus_op:BinaryExpressionProcessor<language::minus_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::minus_op:BinaryExpressionProcessor<language::minus_op, long, bool>)
      +-(language::minus_op:BinaryExpressionProcessor<language::minus_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -463,7 +459,7 @@ a-3-a;
  `-(language::minus_op:BinaryExpressionProcessor<language::minus_op, long, long>)
      +-(language::minus_op:BinaryExpressionProcessor<language::minus_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -481,10 +477,10 @@ a-3-a;
  `-(language::minus_op:BinaryExpressionProcessor<language::minus_op, double, bool>)
      +-(language::minus_op:BinaryExpressionProcessor<language::minus_op, double, long>)
      |   +-(language::minus_op:BinaryExpressionProcessor<language::minus_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -505,12 +501,12 @@ false or b or true;
 (root:ASTNodeListProcessor)
  +-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, bool>)
      +-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -548,7 +544,7 @@ a or 3 or a;
  `-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, long>)
      +-(language::or_op:BinaryExpressionProcessor<language::or_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -566,10 +562,10 @@ a or 3 or a;
  `-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, bool>)
      +-(language::or_op:BinaryExpressionProcessor<language::or_op, bool, long>)
      |   +-(language::or_op:BinaryExpressionProcessor<language::or_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -590,12 +586,12 @@ false and b and true;
 (root:ASTNodeListProcessor)
  +-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, bool>)
      +-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -633,7 +629,7 @@ a and 3 and a;
  `-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, long>)
      +-(language::and_op:BinaryExpressionProcessor<language::and_op, long, long>)
      |   +-(language::name:a:NameProcessor)
-     |   `-(language::integer:3:FakeProcessor)
+     |   `-(language::integer:3:ValueProcessor)
      `-(language::name:a:NameProcessor)
 )";
 
@@ -651,10 +647,10 @@ a and 3 and a;
  `-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, bool>)
      +-(language::and_op:BinaryExpressionProcessor<language::and_op, bool, long>)
      |   +-(language::and_op:BinaryExpressionProcessor<language::and_op, double, double>)
-     |   |   +-(language::real:2.3:FakeProcessor)
-     |   |   `-(language::real:1.2:FakeProcessor)
-     |   `-(language::integer:2:FakeProcessor)
-     `-(language::false_kw:FakeProcessor)
+     |   |   +-(language::real:2.3:ValueProcessor)
+     |   |   `-(language::real:1.2:ValueProcessor)
+     |   `-(language::integer:2:ValueProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -675,12 +671,12 @@ false xor b xor true;
 (root:ASTNodeListProcessor)
  +-(language::xor_op:BinaryExpressionProcessor<language::xor_op, bool, bool>)
  |   +-(language::name:b:NameProcessor)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::xor_op:BinaryExpressionProcessor<language::xor_op, bool, bool>)
      +-(language::xor_op:BinaryExpressionProcessor<language::xor_op, bool, bool>)
-     |   +-(language::false_kw:FakeProcessor)
+     |   +-(language::false_kw:ValueProcessor)
      |   `-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -717,7 +713,7 @@ a xor 3;
 (root:ASTNodeListProcessor)
  `-(language::xor_op:BinaryExpressionProcessor<language::xor_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -747,7 +743,7 @@ b > true;
 (root:ASTNodeListProcessor)
  `-(language::greater_op:BinaryExpressionProcessor<language::greater_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -782,7 +778,7 @@ a > 3;
 (root:ASTNodeListProcessor)
  `-(language::greater_op:BinaryExpressionProcessor<language::greater_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -797,8 +793,8 @@ a > 3;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::greater_op:BinaryExpressionProcessor<language::greater_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -818,7 +814,7 @@ b < true;
 (root:ASTNodeListProcessor)
  `-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -853,7 +849,7 @@ a < 3;
 (root:ASTNodeListProcessor)
  `-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -868,8 +864,8 @@ a < 3;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -888,7 +884,7 @@ b >= true;
 (root:ASTNodeListProcessor)
  `-(language::greater_or_eq_op:BinaryExpressionProcessor<language::greater_or_eq_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -923,7 +919,7 @@ a >= 3;
 (root:ASTNodeListProcessor)
  `-(language::greater_or_eq_op:BinaryExpressionProcessor<language::greater_or_eq_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -938,8 +934,8 @@ a >= 3;
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::greater_or_eq_op:BinaryExpressionProcessor<language::greater_or_eq_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -959,7 +955,7 @@ b <= true;
 (root:ASTNodeListProcessor)
  `-(language::lesser_or_eq_op:BinaryExpressionProcessor<language::lesser_or_eq_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -994,7 +990,7 @@ a <= 3;
 (root:ASTNodeListProcessor)
  `-(language::lesser_or_eq_op:BinaryExpressionProcessor<language::lesser_or_eq_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1009,8 +1005,8 @@ a <= 3;
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::lesser_or_eq_op:BinaryExpressionProcessor<language::lesser_or_eq_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1030,7 +1026,7 @@ b == true;
 (root:ASTNodeListProcessor)
  `-(language::eqeq_op:BinaryExpressionProcessor<language::eqeq_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1065,7 +1061,7 @@ a == 3;
 (root:ASTNodeListProcessor)
  `-(language::eqeq_op:BinaryExpressionProcessor<language::eqeq_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1080,8 +1076,8 @@ a == 3;
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::eqeq_op:BinaryExpressionProcessor<language::eqeq_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1099,8 +1095,8 @@ a == 3;
 (root:ASTNodeListProcessor)
  `-(language::eqeq_op:BinaryExpressionProcessor<language::eqeq_op, )" +
                              string_name + ", " + string_name + R"( >)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::literal:"bar":FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::literal:"bar":ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1120,7 +1116,7 @@ b != true;
 (root:ASTNodeListProcessor)
  `-(language::not_eq_op:BinaryExpressionProcessor<language::not_eq_op, bool, bool>)
      +-(language::name:b:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1155,7 +1151,7 @@ a != 3;
 (root:ASTNodeListProcessor)
  `-(language::not_eq_op:BinaryExpressionProcessor<language::not_eq_op, long, long>)
      +-(language::name:a:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1170,8 +1166,8 @@ a != 3;
         std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::not_eq_op:BinaryExpressionProcessor<language::not_eq_op, double, double>)
-     +-(language::real:2.3:FakeProcessor)
-     `-(language::real:1.2:FakeProcessor)
+     +-(language::real:2.3:ValueProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -1189,8 +1185,8 @@ a != 3;
 (root:ASTNodeListProcessor)
  `-(language::not_eq_op:BinaryExpressionProcessor<language::not_eq_op, )" +
                              string_name + ", " + string_name + R"( >)
-     +-(language::literal:"foo":FakeProcessor)
-     `-(language::literal:"bar":FakeProcessor)
+     +-(language::literal:"foo":ValueProcessor)
+     `-(language::literal:"bar":ValueProcessor)
 )";
 
         CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeCFunctionExpressionBuilder.cpp b/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
index 7ce9f1f32..da62df5a0 100644
--- a/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeCFunctionExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -101,7 +99,6 @@ class CFunctionRegister
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
     ASTNodeExpressionBuilder{*ast};                                                                 \
@@ -125,7 +122,6 @@ class CFunctionRegister
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
     REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, Catch::Matchers::Contains(expected_error)); \
@@ -145,7 +141,7 @@ RtoR(1.);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:RtoR:NameProcessor)
-     `-(language::real:1.:FakeProcessor)
+     `-(language::real:1.:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -161,7 +157,7 @@ RtoR(1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:RtoR:NameProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -194,7 +190,7 @@ RtoR(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:RtoR:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -213,7 +209,7 @@ ZtoR(1.);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:ZtoR:NameProcessor)
-     `-(language::real:1.:FakeProcessor)
+     `-(language::real:1.:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -229,7 +225,7 @@ ZtoR(1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:ZtoR:NameProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -262,7 +258,7 @@ ZtoR(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:ZtoR:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -281,7 +277,7 @@ NtoR(1.);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:NtoR:NameProcessor)
-     `-(language::real:1.:FakeProcessor)
+     `-(language::real:1.:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -297,7 +293,7 @@ NtoR(1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:NtoR:NameProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -330,7 +326,7 @@ NtoR(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:NtoR:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -349,7 +345,7 @@ BtoR(1.);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:BtoR:NameProcessor)
-     `-(language::real:1.:FakeProcessor)
+     `-(language::real:1.:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -365,7 +361,7 @@ BtoR(1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:BtoR:NameProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -398,7 +394,7 @@ BtoR(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:BtoR:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -416,8 +412,8 @@ R2toB(1., 0.);
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:R2toB:NameProcessor)
      `-(language::function_argument_list:FakeProcessor)
-         +-(language::real:1.:FakeProcessor)
-         `-(language::real:0.:FakeProcessor)
+         +-(language::real:1.:ValueProcessor)
+         `-(language::real:0.:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeDeclarationToAffectationConverter.cpp b/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
index c1226f3ee..5d9503d9b 100644
--- a/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
+++ b/tests/test_ASTNodeDeclarationToAffectationConverter.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -21,7 +19,6 @@
                                                                                                \
     ASTSymbolTableBuilder{*ast};                                                               \
     ASTNodeDataTypeBuilder{*ast};                                                              \
-    ASTNodeValueBuilder{*ast};                                                                 \
                                                                                                \
     ASTNodeDeclarationToAffectationConverter{*ast};                                            \
                                                                                                \
diff --git a/tests/test_ASTNodeEmptyBlockCleaner.cpp b/tests/test_ASTNodeEmptyBlockCleaner.cpp
index f1076d45e..5a8048662 100644
--- a/tests/test_ASTNodeEmptyBlockCleaner.cpp
+++ b/tests/test_ASTNodeEmptyBlockCleaner.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -31,7 +29,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -72,7 +69,7 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
  `-(language::block:ASTNodeListProcessor)
      `-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
          +-(language::name:x:NameProcessor)
-         `-(language::integer:3:FakeProcessor)
+         `-(language::integer:3:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
@@ -141,7 +138,7 @@ TEST_CASE("ASTNodeEmptyBlockCleaner", "[language]")
          `-(language::block:ASTNodeListProcessor)
              `-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
                  +-(language::name:w:NameProcessor)
-                 `-(language::integer:4:FakeProcessor)
+                 `-(language::integer:4:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeExpressionBuilder.cpp b/tests/test_ASTNodeExpressionBuilder.cpp
index fbadc0d1e..53b7b963f 100644
--- a/tests/test_ASTNodeExpressionBuilder.cpp
+++ b/tests/test_ASTNodeExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,7 +27,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -65,7 +62,7 @@ TEST_CASE("ASTNodeExpressionBuilder", "[language]")
 
       std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::integer:3:FakeProcessor)
+ `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -79,7 +76,7 @@ TEST_CASE("ASTNodeExpressionBuilder", "[language]")
 
       std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::real:2.3e-5:FakeProcessor)
+ `-(language::real:2.3e-5:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -93,7 +90,7 @@ TEST_CASE("ASTNodeExpressionBuilder", "[language]")
 
       std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::literal:"foo":FakeProcessor)
+ `-(language::literal:"foo":ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -107,7 +104,7 @@ true;
 
       std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::true_kw:FakeProcessor)
+ `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -121,7 +118,7 @@ false;
 
       std::string result = R"(
 (root:ASTNodeListProcessor)
- `-(language::false_kw:FakeProcessor)
+ `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -139,7 +136,7 @@ false;
     std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::block:ASTNodeListProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
@@ -172,7 +169,7 @@ N i = 1;
 (root:ASTNodeListProcessor)
  `-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
      +-(language::name:i:NameProcessor)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -189,10 +186,10 @@ i *= 3;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::multiplyeq_op:AffectationProcessor<language::multiplyeq_op, unsigned long, long>)
      +-(language::name:i:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -209,10 +206,10 @@ x /= 2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::divideeq_op:AffectationProcessor<language::divideeq_op, double, long>)
      +-(language::name:x:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -229,10 +226,10 @@ i += 3.;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::pluseq_op:AffectationProcessor<language::pluseq_op, unsigned long, double>)
      +-(language::name:i:NameProcessor)
-     `-(language::real:3.:FakeProcessor)
+     `-(language::real:3.:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -249,10 +246,10 @@ z -= 2;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:z:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::minuseq_op:AffectationProcessor<language::minuseq_op, long, long>)
      +-(language::name:z:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -270,7 +267,7 @@ z -= 2;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, bool>)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -301,7 +298,7 @@ N n;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -316,7 +313,7 @@ N n;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, double, double>)
-     `-(language::real:1.2:FakeProcessor)
+     `-(language::real:1.2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -331,7 +328,7 @@ not 1;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_not:UnaryExpressionProcessor<language::unary_not, bool, long>)
-     `-(language::integer:1:FakeProcessor)
+     `-(language::integer:1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -348,7 +345,7 @@ Z a=1;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:a:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, long>)
      `-(language::name:a:NameProcessor)
 )";
@@ -367,7 +364,7 @@ Z a=1;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:a:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::unary_minusminus:IncDecExpressionProcessor<language::unary_minusminus, long>)
      `-(language::name:a:NameProcessor)
 )";
@@ -386,7 +383,7 @@ a++;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:a:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::post_plusplus:IncDecExpressionProcessor<language::post_plusplus, long>)
      `-(language::name:a:NameProcessor)
 )";
@@ -405,7 +402,7 @@ a--;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:a:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::post_minusminus:IncDecExpressionProcessor<language::post_minusminus, long>)
      `-(language::name:a:NameProcessor)
 )";
@@ -425,8 +422,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::multiply_op:BinaryExpressionProcessor<language::multiply_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -441,8 +438,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::divide_op:BinaryExpressionProcessor<language::divide_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -457,8 +454,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::plus_op:BinaryExpressionProcessor<language::plus_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -473,8 +470,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::minus_op:BinaryExpressionProcessor<language::minus_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -489,8 +486,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::or_op:BinaryExpressionProcessor<language::or_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -505,8 +502,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::and_op:BinaryExpressionProcessor<language::and_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -521,8 +518,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::xor_op:BinaryExpressionProcessor<language::xor_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -537,8 +534,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -553,8 +550,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::lesser_or_eq_op:BinaryExpressionProcessor<language::lesser_or_eq_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -569,8 +566,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::greater_op:BinaryExpressionProcessor<language::greater_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -585,8 +582,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::greater_or_eq_op:BinaryExpressionProcessor<language::greater_or_eq_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -601,8 +598,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::eqeq_op:BinaryExpressionProcessor<language::eqeq_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -617,8 +614,8 @@ a--;
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::not_eq_op:BinaryExpressionProcessor<language::not_eq_op, long, long>)
-     +-(language::integer:1:FakeProcessor)
-     `-(language::integer:2:FakeProcessor)
+     +-(language::integer:1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -681,7 +678,7 @@ if(true);
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::if_statement:IfProcessor)
-     +-(language::true_kw:FakeProcessor)
+     +-(language::true_kw:ValueProcessor)
      `-(language::statement_block:ASTNodeListProcessor)
 )";
 
@@ -698,7 +695,7 @@ do; while(true);
 (root:ASTNodeListProcessor)
  `-(language::do_while_statement:DoWhileProcessor)
      +-(language::statement_block:ASTNodeListProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -713,7 +710,7 @@ while(true);
       std::string result = R"(
 (root:ASTNodeListProcessor)
  `-(language::while_statement:WhileProcessor)
-     +-(language::true_kw:FakeProcessor)
+     +-(language::true_kw:ValueProcessor)
      `-(language::statement_block:ASTNodeListProcessor)
 )";
 
@@ -733,10 +730,10 @@ for(N i=0; i<10; ++i);
  `-(language::for_statement:ForProcessor)
      +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:0:FakeProcessor)
+     |   `-(language::integer:0:ValueProcessor)
      +-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:10:FakeProcessor)
+     |   `-(language::integer:10:ValueProcessor)
      +-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, unsigned long>)
      |   `-(language::name:i:NameProcessor)
      `-(language::for_statement_block:ASTNodeListProcessor)
@@ -756,12 +753,12 @@ for(; i<10; ++i);
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::for_statement:ForProcessor)
      +-(language::for_init:FakeProcessor)
      +-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:10:FakeProcessor)
+     |   `-(language::integer:10:ValueProcessor)
      +-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, unsigned long>)
      |   `-(language::name:i:NameProcessor)
      `-(language::for_statement_block:ASTNodeListProcessor)
@@ -781,8 +778,8 @@ for(N i=0; ; ++i);
  `-(language::for_statement:ForProcessor)
      +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:0:FakeProcessor)
-     +-(language::for_test:FakeProcessor)
+     |   `-(language::integer:0:ValueProcessor)
+     +-(language::for_test:ValueProcessor)
      +-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, unsigned long>)
      |   `-(language::name:i:NameProcessor)
      `-(language::for_statement_block:ASTNodeListProcessor)
@@ -802,10 +799,10 @@ for(N i=0; i<10;);
  `-(language::for_statement:ForProcessor)
      +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:0:FakeProcessor)
+     |   `-(language::integer:0:ValueProcessor)
      +-(language::lesser_op:BinaryExpressionProcessor<language::lesser_op, unsigned long, long>)
      |   +-(language::name:i:NameProcessor)
-     |   `-(language::integer:10:FakeProcessor)
+     |   `-(language::integer:10:ValueProcessor)
      +-(language::for_post:FakeProcessor)
      `-(language::for_statement_block:ASTNodeListProcessor)
 )";
diff --git a/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp
index cd9583f7a..80844f7be 100644
--- a/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -33,7 +31,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeTypeCleaner<language::let_declaration>{*ast};                                            \
                                                                                                     \
@@ -57,7 +54,7 @@ sin(3);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:CFunctionProcessor)
      +-(language::name:sin:NameProcessor)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
@@ -75,8 +72,8 @@ sum(1,2);
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:sum:NameProcessor)
      `-(language::function_argument_list:FakeProcessor)
-         +-(language::integer:1:FakeProcessor)
-         `-(language::integer:2:FakeProcessor)
+         +-(language::integer:1:ValueProcessor)
+         `-(language::integer:2:ValueProcessor)
 )";
 
     CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
index 3512e2133..a98670a13 100644
--- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -34,7 +32,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
     ASTNodeTypeCleaner<language::let_declaration>{*ast};                                            \
@@ -58,7 +55,6 @@
                                                                                    \
     ASTSymbolTableBuilder{*ast};                                                   \
     ASTNodeDataTypeBuilder{*ast};                                                  \
-    ASTNodeValueBuilder{*ast};                                                     \
                                                                                    \
     ASTNodeTypeCleaner<language::declaration>{*ast};                               \
     ASTNodeTypeCleaner<language::let_declaration>{*ast};                           \
@@ -82,7 +78,7 @@ not_v(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:not_v:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -118,7 +114,7 @@ not_v(-1);
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:not_v:NameProcessor)
      `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
-         `-(language::integer:1:FakeProcessor)
+         `-(language::integer:1:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -135,7 +131,7 @@ not_v(1.3);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:not_v:NameProcessor)
-     `-(language::real:1.3:FakeProcessor)
+     `-(language::real:1.3:ValueProcessor)
 )";
 
         CHECK_AST(data, result);
@@ -153,7 +149,7 @@ test(2);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:test:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -170,7 +166,7 @@ test(2);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:test:NameProcessor)
-     `-(language::integer:2:FakeProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -187,7 +183,7 @@ test(2.1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:test:NameProcessor)
-     `-(language::real:2.1:FakeProcessor)
+     `-(language::real:2.1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -207,7 +203,7 @@ test(2.1);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:test:NameProcessor)
-     `-(language::real:2.1:FakeProcessor)
+     `-(language::real:2.1:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -225,7 +221,7 @@ absolute(-2);
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:absolute:NameProcessor)
      `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
-         `-(language::integer:2:FakeProcessor)
+         `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -245,7 +241,7 @@ minus(true);
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:minus:NameProcessor)
-     `-(language::true_kw:FakeProcessor)
+     `-(language::true_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -263,7 +259,7 @@ times_2_3(-2);
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:times_2_3:NameProcessor)
      `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
-         `-(language::integer:2:FakeProcessor)
+         `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeIncDecExpressionBuilder.cpp b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
index b3a2971c7..7a68d8ca6 100644
--- a/tests/test_ASTNodeIncDecExpressionBuilder.cpp
+++ b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -31,7 +29,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -55,7 +52,6 @@
                                                                                               \
     ASTSymbolTableBuilder{*ast};                                                              \
     ASTNodeDataTypeBuilder{*ast};                                                             \
-    ASTNodeValueBuilder{*ast};                                                                \
                                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                          \
@@ -78,7 +74,7 @@ N i=0;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, unsigned long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -97,7 +93,7 @@ Z i=0;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -116,7 +112,7 @@ R x=0;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::unary_plusplus:IncDecExpressionProcessor<language::unary_plusplus, double>)
      `-(language::name:x:NameProcessor)
 )";
@@ -138,7 +134,7 @@ N i=1;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::unary_minusminus:IncDecExpressionProcessor<language::unary_minusminus, unsigned long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -157,7 +153,7 @@ Z i=0;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::unary_minusminus:IncDecExpressionProcessor<language::unary_minusminus, long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -176,7 +172,7 @@ R x=2.3;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, double>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::real:2.3:FakeProcessor)
+ |   `-(language::real:2.3:ValueProcessor)
  `-(language::unary_minusminus:IncDecExpressionProcessor<language::unary_minusminus, double>)
      `-(language::name:x:NameProcessor)
 )";
@@ -198,7 +194,7 @@ i++;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::post_plusplus:IncDecExpressionProcessor<language::post_plusplus, unsigned long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -217,7 +213,7 @@ i++;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::post_plusplus:IncDecExpressionProcessor<language::post_plusplus, long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -236,7 +232,7 @@ x++;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, long>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::post_plusplus:IncDecExpressionProcessor<language::post_plusplus, double>)
      `-(language::name:x:NameProcessor)
 )";
@@ -258,7 +254,7 @@ i--;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, unsigned long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:1:FakeProcessor)
+ |   `-(language::integer:1:ValueProcessor)
  `-(language::post_minusminus:IncDecExpressionProcessor<language::post_minusminus, unsigned long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -277,7 +273,7 @@ i--;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, long, long>)
  |   +-(language::name:i:NameProcessor)
- |   `-(language::integer:0:FakeProcessor)
+ |   `-(language::integer:0:ValueProcessor)
  `-(language::post_minusminus:IncDecExpressionProcessor<language::post_minusminus, long>)
      `-(language::name:i:NameProcessor)
 )";
@@ -296,7 +292,7 @@ x--;
 (root:ASTNodeListProcessor)
  +-(language::eq_op:AffectationProcessor<language::eq_op, double, double>)
  |   +-(language::name:x:NameProcessor)
- |   `-(language::real:2.3:FakeProcessor)
+ |   `-(language::real:2.3:ValueProcessor)
  `-(language::post_minusminus:IncDecExpressionProcessor<language::post_minusminus, double>)
      `-(language::name:x:NameProcessor)
 )";
diff --git a/tests/test_ASTNodeListProcessor.cpp b/tests/test_ASTNodeListProcessor.cpp
index 49bc6fe34..aaa78a060 100644
--- a/tests/test_ASTNodeListProcessor.cpp
+++ b/tests/test_ASTNodeListProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -33,13 +31,12 @@ true;
 
   ASTSymbolTableBuilder{*ast};
   ASTNodeDataTypeBuilder{*ast};
-  ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
   ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
   ast->execute(exec_policy);
 
   REQUIRE(ast->children[0]->is_type<language::integer>());
diff --git a/tests/test_ASTNodeTypeCleaner.cpp b/tests/test_ASTNodeTypeCleaner.cpp
index 02da34b90..e166b11d2 100644
--- a/tests/test_ASTNodeTypeCleaner.cpp
+++ b/tests/test_ASTNodeTypeCleaner.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -21,7 +19,6 @@
                                                                                                \
     ASTSymbolTableBuilder{*ast};                                                               \
     ASTNodeDataTypeBuilder{*ast};                                                              \
-    ASTNodeValueBuilder{*ast};                                                                 \
                                                                                                \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                           \
                                                                                                \
diff --git a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
index 402b9f417..485486889 100644
--- a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -31,7 +29,6 @@
                                                                                                     \
     ASTSymbolTableBuilder{*ast};                                                                    \
     ASTNodeDataTypeBuilder{*ast};                                                                   \
-    ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
@@ -62,9 +59,9 @@ B b;
  +-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, bool>)
  |   `-(language::name:b:NameProcessor)
  +-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, bool>)
- |   `-(language::true_kw:FakeProcessor)
+ |   `-(language::true_kw:ValueProcessor)
  `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, bool>)
-     `-(language::false_kw:FakeProcessor)
+     `-(language::false_kw:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -162,7 +159,7 @@ not 3;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_not:UnaryExpressionProcessor<language::unary_not, bool, long>)
-     `-(language::integer:3:FakeProcessor)
+     `-(language::integer:3:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -177,7 +174,7 @@ not 3.5;
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::unary_not:UnaryExpressionProcessor<language::unary_not, bool, double>)
-     `-(language::real:3.5:FakeProcessor)
+     `-(language::real:3.5:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
diff --git a/tests/test_ASTNodeValueBuilder.cpp b/tests/test_ASTNodeValueBuilder.cpp
deleted file mode 100644
index a39ca80a1..000000000
--- a/tests/test_ASTNodeValueBuilder.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-#include <catch2/catch.hpp>
-
-#include <ASTNodeValueBuilder.hpp>
-
-#include <ASTBuilder.hpp>
-#include <ASTNodeDataTypeBuilder.hpp>
-
-#include <ASTSymbolTableBuilder.hpp>
-
-#include <ASTPrinter.hpp>
-
-#define CHECK_AST_VALUES(data, expected_output)                                                      \
-  {                                                                                                  \
-    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);                   \
-    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view>);        \
-                                                                                                     \
-    string_input input{data, "test.pgs"};                                                            \
-    auto ast = ASTBuilder::build(input);                                                             \
-                                                                                                     \
-    ASTSymbolTableBuilder{*ast};                                                                     \
-    ASTNodeDataTypeBuilder{*ast};                                                                    \
-    ASTNodeValueBuilder{*ast};                                                                       \
-                                                                                                     \
-    std::stringstream ast_output;                                                                    \
-    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::data_value}}; \
-                                                                                                     \
-    REQUIRE(ast_output.str() == expected_output);                                                    \
-  }
-
-TEST_CASE("ASTNodeValuebuilder", "[language]")
-{
-  SECTION("integer")
-  {
-    std::string_view data = R"(
-01;
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::integer:01:1)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("real")
-  {
-    std::string_view data = R"(
-1.300;
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::real:1.300:1.3)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("true")
-  {
-    std::string_view data = R"(
-true;
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::true_kw:1)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("false")
-  {
-    std::string_view data = R"(
-false;
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::false_kw:0)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("string")
-  {
-    std::string_view data = R"(
-"\"foo\" or \"bar\"";
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::literal:"\"foo\" or \"bar\"":"\"foo\" or \"bar\"")
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("for empty test")
-  {
-    std::string_view data = R"(
-for(;;);
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::for_statement:--)
-     +-(language::for_init:--)
-     +-(language::for_test:1)
-     +-(language::for_post:--)
-     `-(language::for_statement_block:--)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-
-  SECTION("block values")
-  {
-    std::string_view data = R"(
-{
-  1;
-  2.3;
-}
-)";
-
-    std::string_view result = R"(
-(root:--)
- `-(language::block:--)
-     +-(language::integer:1:1)
-     `-(language::real:2.3:2.3)
-)";
-
-    CHECK_AST_VALUES(data, result);
-  }
-}
diff --git a/tests/test_ASTPrinter.cpp b/tests/test_ASTPrinter.cpp
index a81699a60..a2e593e0d 100644
--- a/tests/test_ASTPrinter.cpp
+++ b/tests/test_ASTPrinter.cpp
@@ -32,13 +32,13 @@ N n = 2 + 3;
 )";
 
     std::string_view result = R"(
-(root:undefined:--)
- `-(language::declaration:undefined:--)
-     +-(language::N_set:undefined:--)
-     +-(language::name:n:undefined:--)
-     `-(language::plus_op:undefined:--)
-         +-(language::integer:2:undefined:--)
-         `-(language::integer:3:undefined:--)
+(root:undefined)
+ `-(language::declaration:undefined)
+     +-(language::N_set:undefined)
+     +-(language::name:n:undefined)
+     `-(language::plus_op:undefined)
+         +-(language::integer:2:undefined)
+         `-(language::integer:3:undefined)
 )";
     CHECK_OUTPUT(data, result, ASTPrinter::Format::raw);
   }
@@ -50,13 +50,13 @@ N n = 2 + 3;
 )";
 
     std::string_view result = R"(
-(root:undefined:--)
- └──(language::declaration:undefined:--)
-     ├──(language::N_set:undefined:--)
-     ├──(language::name:n:undefined:--)
-     └──(language::plus_op:undefined:--)
-         ├──(language::integer:2:undefined:--)
-         └──(language::integer:3:undefined:--)
+(root:undefined)
+ └──(language::declaration:undefined)
+     ├──(language::N_set:undefined)
+     ├──(language::name:n:undefined)
+     └──(language::plus_op:undefined)
+         ├──(language::integer:2:undefined)
+         └──(language::integer:3:undefined)
 )";
     CHECK_OUTPUT(data, result, ASTPrinter::Format::pretty);
   }
@@ -68,11 +68,11 @@ string s = "a string";
 )";
 
     std::string_view result = R"(
-(root:undefined:--)
- `-(language::declaration:undefined:--)
-     +-(language::string_type:undefined:--)
-     +-(language::name:s:undefined:--)
-     `-(language::literal:"a string":undefined:--)
+(root:undefined)
+ `-(language::declaration:undefined)
+     +-(language::string_type:undefined)
+     +-(language::name:s:undefined)
+     `-(language::literal:"a string":undefined)
 )";
     CHECK_OUTPUT(data, result, ASTPrinter::Format::raw);
   }
diff --git a/tests/test_AffectationProcessor.cpp b/tests/test_AffectationProcessor.cpp
index aeb6e4859..b37a47c71 100644
--- a/tests/test_AffectationProcessor.cpp
+++ b/tests/test_AffectationProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
@@ -58,7 +55,6 @@
                                                                                              \
     ASTSymbolTableBuilder{*ast};                                                             \
     ASTNodeDataTypeBuilder{*ast};                                                            \
-    ASTNodeValueBuilder{*ast};                                                               \
                                                                                              \
     ASTNodeDeclarationToAffectationConverter{*ast};                                          \
     ASTNodeTypeCleaner<language::declaration>{*ast};                                         \
diff --git a/tests/test_AffectationToStringProcessor.cpp b/tests/test_AffectationToStringProcessor.cpp
index bdd384762..57209b308 100644
--- a/tests/test_AffectationToStringProcessor.cpp
+++ b/tests/test_AffectationToStringProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_BinaryExpressionProcessor_utils.hpp b/tests/test_BinaryExpressionProcessor_utils.hpp
index d442a6763..6481ff830 100644
--- a/tests/test_BinaryExpressionProcessor_utils.hpp
+++ b/tests/test_BinaryExpressionProcessor_utils.hpp
@@ -1,8 +1,6 @@
 #ifndef TEST_BINARY_EXPRESSION_PROCESSOR_UTILS_HPP
 #define TEST_BINARY_EXPRESSION_PROCESSOR_UTILS_HPP
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -30,13 +28,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_BreakProcessor.cpp b/tests/test_BreakProcessor.cpp
index 7fb00cebb..d96f94ed2 100644
--- a/tests/test_BreakProcessor.cpp
+++ b/tests/test_BreakProcessor.cpp
@@ -8,7 +8,7 @@ TEST_CASE("BreakProcessor", "[language]")
 {
   rang::setControlMode(rang::control::Off);
 
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
 
   REQUIRE(exec_policy.exec() == true);
 
@@ -16,5 +16,5 @@ TEST_CASE("BreakProcessor", "[language]")
   break_processor.execute(exec_policy);
 
   REQUIRE(exec_policy.exec() == false);
-  REQUIRE(exec_policy.jumpType() == ExecUntilBreakOrContinue::JumpType::break_jump);
+  REQUIRE(exec_policy.jumpType() == ExecutionPolicy::JumpType::break_jump);
 }
diff --git a/tests/test_CFunctionEmbedder.cpp b/tests/test_CFunctionEmbedder.cpp
index 032cf7f66..df76af84c 100644
--- a/tests/test_CFunctionEmbedder.cpp
+++ b/tests/test_CFunctionEmbedder.cpp
@@ -14,9 +14,7 @@ TEST_CASE("CFunctionEmbedder", "[language]")
     double arg                     = 2;
     ASTNodeDataVariant arg_variant = arg;
 
-    ASTNodeDataVariant result;
-
-    embedded_sin.apply({arg_variant}, result);
+    ASTNodeDataVariant result = embedded_sin.apply({arg_variant});
 
     REQUIRE(std::get<double>(result) == std::sin(arg));
     REQUIRE(embedded_sin.numberOfParameters() == 1);
@@ -38,9 +36,7 @@ TEST_CASE("CFunctionEmbedder", "[language]")
     args.push_back(d_arg);
     args.push_back(i_arg);
 
-    ASTNodeDataVariant result;
-
-    embedded_c.apply(args, result);
+    ASTNodeDataVariant result = embedded_c.apply(args);
 
     REQUIRE(std::get<bool>(result) == c(d_arg, i_arg));
     REQUIRE(embedded_c.numberOfParameters() == 2);
@@ -63,9 +59,7 @@ TEST_CASE("CFunctionEmbedder", "[language]")
     args.push_back(d_arg);
     args.push_back(i_arg);
 
-    ASTNodeDataVariant result;
-
-    i_embedded_c->apply(args, result);
+    ASTNodeDataVariant result = i_embedded_c->apply(args);
 
     REQUIRE(std::get<bool>(result) == c(d_arg, i_arg));
     REQUIRE(i_embedded_c->numberOfParameters() == 2);
@@ -86,8 +80,6 @@ TEST_CASE("CFunctionEmbedder", "[language]")
     std::vector<ASTNodeDataVariant> args;
     args.push_back(arg);
 
-    ASTNodeDataVariant result;
-
-    REQUIRE_THROWS(embedded_positive.apply(args, result));
+    REQUIRE_THROWS(embedded_positive.apply(args));
   }
 }
diff --git a/tests/test_CFunctionProcessor.cpp b/tests/test_CFunctionProcessor.cpp
index 0a0a83230..7f47ada23 100644
--- a/tests/test_CFunctionProcessor.cpp
+++ b/tests/test_CFunctionProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -26,14 +24,13 @@
                                                                                \
     ASTSymbolTableBuilder{*ast};                                               \
     ASTNodeDataTypeBuilder{*ast};                                              \
-    ASTNodeValueBuilder{*ast};                                                 \
                                                                                \
     ASTNodeDeclarationToAffectationConverter{*ast};                            \
     ASTNodeTypeCleaner<language::declaration>{*ast};                           \
     ASTNodeTypeCleaner<language::let_declaration>{*ast};                       \
                                                                                \
     ASTNodeExpressionBuilder{*ast};                                            \
-    ExecUntilBreakOrContinue exec_policy;                                      \
+    ExecutionPolicy exec_policy;                                               \
     ast->execute(exec_policy);                                                 \
                                                                                \
     auto symbol_table = ast->m_symbol_table;                                   \
diff --git a/tests/test_CMathModule.cpp b/tests/test_CMathModule.cpp
index 7d2b3b878..9ef32bf86 100644
--- a/tests/test_CMathModule.cpp
+++ b/tests/test_CMathModule.cpp
@@ -19,7 +19,6 @@ TEST_CASE("CMathModule", "[language]")
     double arg = 0.7;
 
     ASTNodeDataVariant arg_variant = arg;
-    ASTNodeDataVariant result_variant;
 
     SECTION("sqrt")
     {
@@ -27,8 +26,8 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
-      function_embedder.apply({arg_variant}, result_variant);
       auto result = std::sqrt(arg);
 
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -40,21 +39,25 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
+      {
+        ASTNodeDataVariant result_variant = function_embedder.apply({arg_variant});
 
-      function_embedder.apply({arg_variant}, result_variant);
-      auto result = std::abs(arg);
+        auto result = std::abs(arg);
 
-      REQUIRE(std::get<decltype(result)>(result_variant) == std::abs(arg));
+        REQUIRE(std::get<decltype(result)>(result_variant) == std::abs(arg));
+      }
 
-      double arg = -3;
+      {
+        arg = -3;
 
-      ASTNodeDataVariant arg_variant = arg;
+        ASTNodeDataVariant arg_variant = arg;
 
-      function_embedder.apply({arg_variant}, result_variant);
+        ASTNodeDataVariant result_variant = function_embedder.apply({arg_variant});
 
-      result = std::abs(arg);
+        auto result = std::abs(arg);
 
-      REQUIRE(std::get<decltype(result)>(result_variant) == result);
+        REQUIRE(std::get<decltype(result)>(result_variant) == result);
+      }
     }
 
     SECTION("sin")
@@ -63,8 +66,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::sin(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -76,8 +78,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::cos(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -89,8 +90,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::tan(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -102,8 +102,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::asin(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -115,8 +114,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::acos(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -128,8 +126,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::atan(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -144,8 +141,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::sinh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -157,8 +153,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::cosh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -170,8 +165,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::tanh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -183,8 +177,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::asinh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -199,8 +192,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::acosh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -212,8 +204,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::atanh(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -225,8 +216,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::exp(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -238,8 +228,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::log(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -251,8 +240,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::nearbyint(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -264,8 +252,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::ceil(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -277,8 +264,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::floor(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -290,8 +276,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::trunc(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -303,8 +288,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::round(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -316,8 +300,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::rint(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -329,7 +312,6 @@ TEST_CASE("CMathModule", "[language]")
     double arg = 1.3;
 
     ASTNodeDataVariant arg_variant = arg;
-    ASTNodeDataVariant result_variant;
 
     SECTION("lround")
     {
@@ -337,8 +319,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       auto result = std::lround(arg);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -350,8 +331,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg_variant});
 
       //      REQUIRE(std::get<int64_t>(result_variant) == std::lrint(arg));
       auto result = std::lrint(arg);
@@ -366,7 +346,6 @@ TEST_CASE("CMathModule", "[language]")
 
     ASTNodeDataVariant arg0_variant = arg0;
     ASTNodeDataVariant arg1_variant = arg1;
-    ASTNodeDataVariant result_variant;
 
     SECTION("atan2")
     {
@@ -374,8 +353,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg0_variant, arg1_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg0_variant, arg1_variant});
 
       auto result = std::atan2(arg0, arg1);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
@@ -387,8 +365,7 @@ TEST_CASE("CMathModule", "[language]")
       REQUIRE(i_function != name_cfunction.end());
 
       ICFunctionEmbedder& function_embedder = *i_function->second;
-
-      function_embedder.apply({arg0_variant, arg1_variant}, result_variant);
+      ASTNodeDataVariant result_variant     = function_embedder.apply({arg0_variant, arg1_variant});
 
       auto result = std::pow(arg0, arg1);
       REQUIRE(std::get<decltype(result)>(result_variant) == result);
diff --git a/tests/test_ConcatExpressionProcessor.cpp b/tests/test_ConcatExpressionProcessor.cpp
index 7bcfc0a1d..79c20b9d4 100644
--- a/tests/test_ConcatExpressionProcessor.cpp
+++ b/tests/test_ConcatExpressionProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_ContinueProcessor.cpp b/tests/test_ContinueProcessor.cpp
index 24cc87dcf..5dc50dfe2 100644
--- a/tests/test_ContinueProcessor.cpp
+++ b/tests/test_ContinueProcessor.cpp
@@ -8,7 +8,7 @@ TEST_CASE("ContinueProcessor", "[language]")
 {
   rang::setControlMode(rang::control::Off);
 
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
 
   REQUIRE(exec_policy.exec() == true);
 
@@ -16,5 +16,5 @@ TEST_CASE("ContinueProcessor", "[language]")
   continue_processor.execute(exec_policy);
 
   REQUIRE(exec_policy.exec() == false);
-  REQUIRE(exec_policy.jumpType() == ExecUntilBreakOrContinue::JumpType::continue_jump);
+  REQUIRE(exec_policy.jumpType() == ExecutionPolicy::JumpType::continue_jump);
 }
diff --git a/tests/test_DoWhileProcessor.cpp b/tests/test_DoWhileProcessor.cpp
index 9ccf21e37..135c8d221 100644
--- a/tests/test_DoWhileProcessor.cpp
+++ b/tests/test_DoWhileProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_ExecUntilBreakOrContinue.cpp b/tests/test_ExecUntilBreakOrContinue.cpp
deleted file mode 100644
index 4b96a799a..000000000
--- a/tests/test_ExecUntilBreakOrContinue.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <catch2/catch.hpp>
-
-#include <node_processor/ExecUntilBreakOrContinue.hpp>
-
-#include <rang.hpp>
-
-TEST_CASE("ExecUntilBreakOrContinue", "[language]")
-{
-  rang::setControlMode(rang::control::Off);
-
-  ExecUntilBreakOrContinue exec_policy;
-  SECTION("no jump")
-  {
-    exec_policy = ExecUntilBreakOrContinue{ExecUntilBreakOrContinue::JumpType::no_jump};
-    REQUIRE(exec_policy.exec() == true);
-    REQUIRE(exec_policy.jumpType() == ExecUntilBreakOrContinue::JumpType::no_jump);
-  }
-
-  SECTION("break jump")
-  {
-    exec_policy = ExecUntilBreakOrContinue{ExecUntilBreakOrContinue::JumpType::break_jump};
-    REQUIRE(exec_policy.exec() == false);
-    REQUIRE(exec_policy.jumpType() == ExecUntilBreakOrContinue::JumpType::break_jump);
-  }
-
-  SECTION("continue jump")
-  {
-    exec_policy = ExecUntilBreakOrContinue{ExecUntilBreakOrContinue::JumpType::continue_jump};
-    REQUIRE(exec_policy.exec() == false);
-    REQUIRE(exec_policy.jumpType() == ExecUntilBreakOrContinue::JumpType::continue_jump);
-  }
-}
diff --git a/tests/test_ExecutionPolicy.cpp b/tests/test_ExecutionPolicy.cpp
new file mode 100644
index 000000000..f69dc72c0
--- /dev/null
+++ b/tests/test_ExecutionPolicy.cpp
@@ -0,0 +1,32 @@
+#include <catch2/catch.hpp>
+
+#include <node_processor/ExecutionPolicy.hpp>
+
+#include <rang.hpp>
+
+TEST_CASE("ExecutionPolicy", "[language]")
+{
+  rang::setControlMode(rang::control::Off);
+
+  ExecutionPolicy exec_policy;
+  SECTION("no jump")
+  {
+    exec_policy = ExecutionPolicy{ExecutionPolicy::JumpType::no_jump, nullptr};
+    REQUIRE(exec_policy.exec() == true);
+    REQUIRE(exec_policy.jumpType() == ExecutionPolicy::JumpType::no_jump);
+  }
+
+  SECTION("break jump")
+  {
+    exec_policy = ExecutionPolicy{ExecutionPolicy::JumpType::break_jump, nullptr};
+    REQUIRE(exec_policy.exec() == false);
+    REQUIRE(exec_policy.jumpType() == ExecutionPolicy::JumpType::break_jump);
+  }
+
+  SECTION("continue jump")
+  {
+    exec_policy = ExecutionPolicy{ExecutionPolicy::JumpType::continue_jump, nullptr};
+    REQUIRE(exec_policy.exec() == false);
+    REQUIRE(exec_policy.jumpType() == ExecutionPolicy::JumpType::continue_jump);
+  }
+}
diff --git a/tests/test_FakeProcessor.cpp b/tests/test_FakeProcessor.cpp
index 85e6ab827..c391423bc 100644
--- a/tests/test_FakeProcessor.cpp
+++ b/tests/test_FakeProcessor.cpp
@@ -12,6 +12,6 @@ TEST_CASE("FakeProcessor", "[language]")
   FakeProcessor fake_processor;
   REQUIRE(fake_processor.typeIdName() == demangle<FakeProcessor>());
 
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
   REQUIRE_NOTHROW(fake_processor.execute(exec_policy));
 }
diff --git a/tests/test_ForProcessor.cpp b/tests/test_ForProcessor.cpp
index 4261a8193..7b4faa855 100644
--- a/tests/test_ForProcessor.cpp
+++ b/tests/test_ForProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_FunctionProcessor.cpp b/tests/test_FunctionProcessor.cpp
index b4e2ea79a..9b163f022 100644
--- a/tests/test_FunctionProcessor.cpp
+++ b/tests/test_FunctionProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,14 +27,13 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
     ASTNodeTypeCleaner<language::let_declaration>{*ast};                      \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_INodeProcessor.cpp b/tests/test_INodeProcessor.cpp
index 5ccb1b88a..8295e977f 100644
--- a/tests/test_INodeProcessor.cpp
+++ b/tests/test_INodeProcessor.cpp
@@ -12,6 +12,6 @@ TEST_CASE("INodeProcessor", "[language]")
   std::unique_ptr<INodeProcessor> node_processor = std::make_unique<FakeProcessor>();
   REQUIRE(node_processor->typeIdName() == demangle<FakeProcessor>());
 
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
   REQUIRE_NOTHROW(node_processor->execute(exec_policy));
 }
diff --git a/tests/test_IfProcessor.cpp b/tests/test_IfProcessor.cpp
index 4ec597352..9df57fc07 100644
--- a/tests/test_IfProcessor.cpp
+++ b/tests/test_IfProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_IncDecExpressionProcessor.cpp b/tests/test_IncDecExpressionProcessor.cpp
index 0562c3f31..a2a2d988f 100644
--- a/tests/test_IncDecExpressionProcessor.cpp
+++ b/tests/test_IncDecExpressionProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_NameProcessor.cpp b/tests/test_NameProcessor.cpp
index cd7374ae7..28e81a461 100644
--- a/tests/test_NameProcessor.cpp
+++ b/tests/test_NameProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -37,13 +35,12 @@ n = 2;
 
   ASTSymbolTableBuilder{*ast};
   ASTNodeDataTypeBuilder{*ast};
-  ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
   ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
-  ExecUntilBreakOrContinue exec_policy;
+  ExecutionPolicy exec_policy;
   ast->execute(exec_policy);
 
   auto symbol_table = ast->m_symbol_table;
diff --git a/tests/test_OStreamProcessor.cpp b/tests/test_OStreamProcessor.cpp
index e217fa107..ad6b8578e 100644
--- a/tests/test_OStreamProcessor.cpp
+++ b/tests/test_OStreamProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -43,13 +41,12 @@ _replaceOStream(ASTNode& node, std::ostringstream& sout)
                                                               \
     ASTSymbolTableBuilder{*ast};                              \
     ASTNodeDataTypeBuilder{*ast};                             \
-    ASTNodeValueBuilder{*ast};                                \
                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};           \
     ASTNodeTypeCleaner<language::declaration>{*ast};          \
                                                               \
     ASTNodeExpressionBuilder{*ast};                           \
-    ExecUntilBreakOrContinue exec_policy;                     \
+    ExecutionPolicy exec_policy;                              \
                                                               \
     std::ostringstream sout;                                  \
     _replaceOStream(*ast, sout);                              \
diff --git a/tests/test_UnaryExpressionProcessor.cpp b/tests/test_UnaryExpressionProcessor.cpp
index 5c6a69436..d141ec0f2 100644
--- a/tests/test_UnaryExpressionProcessor.cpp
+++ b/tests/test_UnaryExpressionProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
diff --git a/tests/test_WhileProcessor.cpp b/tests/test_WhileProcessor.cpp
index b94cd9738..d9200a1f5 100644
--- a/tests/test_WhileProcessor.cpp
+++ b/tests/test_WhileProcessor.cpp
@@ -1,7 +1,5 @@
 #include <catch2/catch.hpp>
 
-#include <ASTNodeValueBuilder.hpp>
-
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
@@ -29,13 +27,12 @@
                                                                               \
     ASTSymbolTableBuilder{*ast};                                              \
     ASTNodeDataTypeBuilder{*ast};                                             \
-    ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
     ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
-    ExecUntilBreakOrContinue exec_policy;                                     \
+    ExecutionPolicy exec_policy;                                              \
     ast->execute(exec_policy);                                                \
                                                                               \
     auto symbol_table = ast->m_symbol_table;                                  \
-- 
GitLab