diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 19da37a168fdeda6f87010f633d8bc29dd53bc8a..e3cdf5ea9ad08377eb167ef805a10887bdc70e42 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -27,7 +27,10 @@ add_executable (unit_tests
   test_ASTSymbolTableBuilder.cpp
   test_ASTSymbolInitializationChecker.cpp
   test_BreakProcessor.cpp
-  test_BinaryExpressionProcessor.cpp
+  test_BinaryExpressionProcessor_arithmetic.cpp
+  test_BinaryExpressionProcessor_comparison.cpp
+  test_BinaryExpressionProcessor_equality.cpp
+  test_BinaryExpressionProcessor_logic.cpp
   test_BiCGStab.cpp
   test_ContinueProcessor.cpp
   test_ConcatExpressionProcessor.cpp
diff --git a/tests/test_BinaryExpressionProcessor.cpp b/tests/test_BinaryExpressionProcessor.cpp
deleted file mode 100644
index 2e94350397af5a707a1ab1b3011034be2d23a78b..0000000000000000000000000000000000000000
--- a/tests/test_BinaryExpressionProcessor.cpp
+++ /dev/null
@@ -1,806 +0,0 @@
-#include <catch2/catch.hpp>
-
-#include <ASTNodeValueBuilder.hpp>
-
-#include <ASTBuilder.hpp>
-#include <ASTNodeDataTypeBuilder.hpp>
-
-#include <ASTNodeDeclarationCleaner.hpp>
-#include <ASTNodeDeclarationToAffectationConverter.hpp>
-
-#include <ASTNodeExpressionBuilder.hpp>
-
-#include <ASTNodeAffectationExpressionBuilder.hpp>
-
-#include <ASTSymbolTableBuilder.hpp>
-
-#include <ASTPrinter.hpp>
-
-#include <Demangle.hpp>
-
-#include <PEGGrammar.hpp>
-
-#include <sstream>
-
-#define CHECK_BINARY_EXPRESSION_RESULT(data, variable_name, expected_value) \
-  {                                                                         \
-    string_input input{data, "test.pgs"};                                   \
-    auto ast = ASTBuilder::build(input);                                    \
-                                                                            \
-    ASTSymbolTableBuilder{*ast};                                            \
-    ASTNodeDataTypeBuilder{*ast};                                           \
-    ASTNodeValueBuilder{*ast};                                              \
-                                                                            \
-    ASTNodeDeclarationToAffectationConverter{*ast};                         \
-    ASTNodeDeclarationCleaner{*ast};                                        \
-                                                                            \
-    ASTNodeExpressionBuilder{*ast};                                         \
-    ExecUntilBreakOrContinue exec_policy;                                   \
-    ast->execute(exec_policy);                                              \
-                                                                            \
-    auto symbol_table = ast->m_symbol_table;                                \
-                                                                            \
-    using namespace TAO_PEGTL_NAMESPACE;                                    \
-    position use_position{internal::iterator{"fixture"}, "fixture"};        \
-    use_position.byte    = 10000;                                           \
-    auto [symbol, found] = symbol_table->find(variable_name, use_position); \
-                                                                            \
-    auto attribute = symbol->second;                                        \
-    auto value     = std::get<decltype(expected_value)>(attribute.value()); \
-                                                                            \
-    REQUIRE(value == expected_value);                                       \
-  }
-
-TEST_CASE("BinaryExpressionProcessor", "[language]")
-{
-  SECTION("arithmetic operators")
-  {
-    SECTION("+")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + true;)", "z", 2l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = false + 1;)", "n", 1ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + 3;)", "z", 4l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false + 3;)", "z", 3l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = false + 3.6;)", "r", 3.6);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R s = -3.3; R r = true + s;)", "r", -2.3);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = n + true;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n + m;)", "n", 6ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -1; n = n + z;)", "n", 3ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1 + 2.3;)", "n", 3ul);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 + true;)", "z", 0l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -3 + n;)", "z", 1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; Z z = -3 + n;)", "z", -1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 1 + 2;)", "z", 3l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 3 + 2.5;)", "z", 5l);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + true;)", "r", (-1.2 + true));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 + n;)", "r", (-1.2 + uint64_t{2}));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 1;)", "r", (-1.2 + 1));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 2.3;)", "r", (-1.2 + 2.3));
-      }
-    }
-
-    SECTION("-")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true - false;)", "n", 1ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true - n;)", "n", 0ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false - 1;)", "z", -1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true - 1.2;)", "r", (true - 1.2));
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n - true;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n - m;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n - 4;)", "n", 1ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 - 2.3;)", "n", 0ul);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 - true;)", "z", -2l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 - n;)", "z", -1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 - 2;)", "z", 5l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 - 2.5;)", "z", 1l);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - true;)", "r", (-1.2 - true));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 - n;)", "r", (-1.2 - uint64_t{2}));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 1;)", "r", (-1.2 - 1));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 2.3;)", "r", (-1.2 - 2.3));
-      }
-    }
-
-    SECTION("*")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true * false;)", "n", 0ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true * n;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false * 1;)", "z", 0l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true * 1.2;)", "r", (true * 1.2));
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n * true;)", "n", 3ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n * m;)", "n", 8ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n * 4;)", "n", 20ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.3;)", "n", 6ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.5;)", "n", 7ul);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 * true;)", "z", -1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 * n;)", "z", 12l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 * 2;)", "z", 14l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 * 2.4;)", "z", 9l);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * true;)", "r", (-1.2 * true));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 * n;)", "r", (-1.2 * uint64_t{2}));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 11;)", "r", (-1.2 * 11));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 2.3;)", "r", (-1.2 * 2.3));
-      }
-    }
-
-    SECTION("/")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = false / true;)", "n", 0ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true / n;)", "n", 0ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false / 1;)", "z", 0l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true / 1.2;)", "r", (true / 1.2));
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n / true;)", "n", 3ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n / m;)", "n", 2ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n / 4;)", "n", 1ul);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 / 2.3;)", "n", 1ul);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 / true;)", "z", -1l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 / n;)", "z", 0l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 / 2;)", "z", 3l);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 / 2.4;)", "z", 1l);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / true;)", "r", (-1.2 / true));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 / n;)", "r", (-1.2 / uint64_t{2}));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 11;)", "r", (-1.2 / 11));
-        CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 2.3;)", "r", (-1.2 / 2.3));
-      }
-    }
-  }
-
-  SECTION("logic operators")
-  {
-    SECTION("and")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true and n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and -3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and -1.7;)", "b", true);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n and m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 0; B b = n and m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n and -1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and -1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 0.;)", "b", false);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 and true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 and n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -3 and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 0 and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 and 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 and 2.5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 and 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 2.5;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 0.;)", "b", false);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 and n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -1.2 and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 0. and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. and n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 0.;)", "b", false);
-      }
-    }
-
-    SECTION("or")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false or n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or -3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or -1.7;)", "b", true);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n or m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 0; B b = n or m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 2; B b = n or m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n or m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n or -1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n or 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or -1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 0.;)", "b", false);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 or false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -3 or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 0 or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 or n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 or 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 or 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 or 2.5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 or 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 2.5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 0.;)", "b", false);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -1.2 or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 0. or n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. or n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 0.;)", "b", false);
-      }
-    }
-
-    SECTION("xor")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor false;)", "b", false);
-      }
-    }
-  }
-
-  SECTION("equality operators")
-  {
-    SECTION("==")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true == n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true == n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false == n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false == n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == -1.7;)", "b", false);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n == m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n == m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 4;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 5;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 1.;)", "b", true);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 == n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 == n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == 2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 == 11;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 2.5;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.5;)", "b", false);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. == true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 == false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. == false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 == n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. == n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. == -2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == -1.2;)", "b", true);
-      }
-    }
-
-    SECTION("!=")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true != n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true != n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false != n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false != n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != -1.7;)", "b", true);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n != m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n != m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 4;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 1.;)", "b", false);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 != n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 != n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 != 11;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 2.5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.5;)", "b", true);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. != true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 != false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. != false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 != n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. != n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. != -2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != -1.2;)", "b", false);
-      }
-    }
-  }
-
-  SECTION("comparison operators")
-  {
-    SECTION("<")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true < n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true < n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false < n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false < n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < -1.7;)", "b", false);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n < m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n < m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n < m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 4;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 1.;)", "b", false);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 < false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 < n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 < n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 2.5;)", "b", false);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. < false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 < n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. < n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.2;)", "b", false);
-      }
-    }
-
-    SECTION("<=")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true <= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= -1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0.5;)", "b", false);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n <= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n <= m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n <= m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 4;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 2.3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 0.5;)", "b", false);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 <= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 5 <= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2.5;)", "b", false);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 <= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. <= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 <= false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 <= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 <= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 <= -2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 <= -2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= -1.2;)", "b", false);
-      }
-    }
-
-    SECTION(">")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true > n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > -1.7;)", "b", true);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n > true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n > false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n > m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n > m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n > m;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 4;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 0.3;)", "b", true);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 > false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 1 > n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 2;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 2.5;)", "b", true);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.2 > false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. > false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -2.2 > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. > n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1. > -1.1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.2;)", "b", false);
-      }
-    }
-
-    SECTION(">=")
-    {
-      SECTION("lhs is B")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true >= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false >= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= -1;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1.;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0.5;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.5;)", "b", false);
-      }
-
-      SECTION("lhs is N")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n >= m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n >= m;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 5;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 4;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 3;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 2.3;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 1.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 0.5;)", "b", true);
-      }
-
-      SECTION("lhs is Z")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 3 >= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2.5;)", "b", true);
-      }
-
-      SECTION("lhs is R")
-      {
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= true;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= false;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 >= true;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 >= false;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 >= n;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 >= n;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 >= -2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 >= -2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.1;)", "b", false);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.2;)", "b", true);
-        CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= -1.2;)", "b", true);
-      }
-    }
-  }
-}
diff --git a/tests/test_BinaryExpressionProcessor_arithmetic.cpp b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..edfd50dfff4b72e81b374bb092fbc6fe9edd44c3
--- /dev/null
+++ b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
@@ -0,0 +1,152 @@
+#include <catch2/catch.hpp>
+
+#include "test_BinaryExpressionProcessor_utils.hpp"
+
+TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
+{
+  SECTION("+")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + true;)", "z", 2l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = false + 1;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + 3;)", "z", 4l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false + 3;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = false + 3.6;)", "r", 3.6);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R s = -3.3; R r = true + s;)", "r", -2.3);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = n + true;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n + m;)", "n", 6ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -1; n = n + z;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1 + 2.3;)", "n", 3ul);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 + true;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -3 + n;)", "z", 1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; Z z = -3 + n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 1 + 2;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 3 + 2.5;)", "z", 5l);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + true;)", "r", (-1.2 + true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 + n;)", "r", (-1.2 + uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 1;)", "r", (-1.2 + 1));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 2.3;)", "r", (-1.2 + 2.3));
+    }
+  }
+
+  SECTION("-")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true - false;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true - n;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false - 1;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true - 1.2;)", "r", (true - 1.2));
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n - true;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n - m;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n - 4;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 - 2.3;)", "n", 0ul);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 - true;)", "z", -2l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 - n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 - 2;)", "z", 5l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 - 2.5;)", "z", 1l);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - true;)", "r", (-1.2 - true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 - n;)", "r", (-1.2 - uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 1;)", "r", (-1.2 - 1));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 2.3;)", "r", (-1.2 - 2.3));
+    }
+  }
+
+  SECTION("*")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true * false;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true * n;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false * 1;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true * 1.2;)", "r", (true * 1.2));
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n * true;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n * m;)", "n", 8ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n * 4;)", "n", 20ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.3;)", "n", 6ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.5;)", "n", 7ul);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 * true;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 * n;)", "z", 12l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 * 2;)", "z", 14l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 * 2.4;)", "z", 9l);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * true;)", "r", (-1.2 * true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 * n;)", "r", (-1.2 * uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 11;)", "r", (-1.2 * 11));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 2.3;)", "r", (-1.2 * 2.3));
+    }
+  }
+
+  SECTION("/")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = false / true;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true / n;)", "n", 0ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false / 1;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true / 1.2;)", "r", (true / 1.2));
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n / true;)", "n", 3ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n / m;)", "n", 2ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n / 4;)", "n", 1ul);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 / 2.3;)", "n", 1ul);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 / true;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 / n;)", "z", 0l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 / 2;)", "z", 3l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 / 2.4;)", "z", 1l);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / true;)", "r", (-1.2 / true));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 / n;)", "r", (-1.2 / uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 11;)", "r", (-1.2 / 11));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 2.3;)", "r", (-1.2 / 2.3));
+    }
+  }
+}
diff --git a/tests/test_BinaryExpressionProcessor_comparison.cpp b/tests/test_BinaryExpressionProcessor_comparison.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2a6ba6b9c1b9fa8ff16b3f33ba21fa4d91f933c2
--- /dev/null
+++ b/tests/test_BinaryExpressionProcessor_comparison.cpp
@@ -0,0 +1,299 @@
+#include <catch2/catch.hpp>
+
+#include "test_BinaryExpressionProcessor_utils.hpp"
+
+TEST_CASE("BinaryExpressionProcessor comparison", "[language]")
+{
+  SECTION("<")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false < 0.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true < -1.7;)", "b", false);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n < m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n < m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n < m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n < 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n < 1.;)", "b", false);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 < false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 < 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 3.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 < 2.5;)", "b", false);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. < false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 < n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. < n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. < 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 < -1.2;)", "b", false);
+    }
+  }
+
+  SECTION("<=")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= -1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false <= 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true <= 0.5;)", "b", false);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n <= m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n <= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n <= 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n <= 0.5;)", "b", false);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 5 <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 <= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 3.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 <= 2.5;)", "b", false);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 <= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. <= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 <= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 <= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 <= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 <= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 <= -2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 <= -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. <= -1.2;)", "b", false);
+    }
+  }
+
+  SECTION(">")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true > n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false > 0.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true > -1.7;)", "b", true);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n > m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 2; B b = n > m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n > m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n > 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n > 0.3;)", "b", true);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 1 > n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 > 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 3.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 > 2.5;)", "b", true);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.2 > false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. > false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -2.2 > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. > n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.2 > 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. > 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1. > -1.1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 > -1.2;)", "b", false);
+    }
+  }
+
+  SECTION(">=")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= -1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 0.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false >= 0.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true >= 1.5;)", "b", false);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = n >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n >= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n >= m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n >= 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n >= 0.5;)", "b", true);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 4 >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 3 >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 2 >= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 3.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 >= 2.5;)", "b", true);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1.1 >= true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 >= false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2.1 >= n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = 0.7 >= n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2 >= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 >= -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 >= -1.2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. >= -1.2;)", "b", true);
+    }
+  }
+}
diff --git a/tests/test_BinaryExpressionProcessor_equality.cpp b/tests/test_BinaryExpressionProcessor_equality.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f2b000b2cbb4416590594a5d7acff5796f3251ec
--- /dev/null
+++ b/tests/test_BinaryExpressionProcessor_equality.cpp
@@ -0,0 +1,138 @@
+#include <catch2/catch.hpp>
+
+#include "test_BinaryExpressionProcessor_utils.hpp"
+
+TEST_CASE("BinaryExpressionProcessor equality", "[language]")
+{
+  SECTION("==")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false == 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true == -1.7;)", "b", false);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n == m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n == m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 4;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n == 5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n == 1.;)", "b", true);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 == 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 == 11;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 2.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 == 3.5;)", "b", false);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. == true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 == false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. == false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 == n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. == n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. == -2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 == -1.2;)", "b", true);
+    }
+  }
+
+  SECTION("!=")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = true != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false != 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true != -1.7;)", "b", true);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n != m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; N m = 2; B b = n != m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 4;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n != 5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n != 1.;)", "b", false);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; B b = 3 != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 != 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 11 != 11;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 != 3.5;)", "b", true);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1. != true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0.1 != false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. != false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 != n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 2. != n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -2. != -2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 != -1.2;)", "b", false);
+    }
+  }
+}
diff --git a/tests/test_BinaryExpressionProcessor_logic.cpp b/tests/test_BinaryExpressionProcessor_logic.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a512b5efa35db8a812e7cdcdf5d13dc0d3ef6ec6
--- /dev/null
+++ b/tests/test_BinaryExpressionProcessor_logic.cpp
@@ -0,0 +1,174 @@
+#include <catch2/catch.hpp>
+
+#include "test_BinaryExpressionProcessor_utils.hpp"
+
+TEST_CASE("BinaryExpressionProcessor logic", "[language]")
+{
+  SECTION("and")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true and n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and -3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false and 1.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true and -1.7;)", "b", true);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n and m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 0; B b = n and m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n and -1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and -1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n and 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n and 0.;)", "b", false);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 and true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 and n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -3 and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 0 and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 and 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 2;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 and 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 and 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 2.5;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 and 0.;)", "b", false);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 and n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -1.2 and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 0. and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. and n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 1;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 and 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 2.3;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. and 0.;)", "b", false);
+    }
+  }
+
+  SECTION("or")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = true or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = true or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = false or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = false or n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or -3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 1.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false or 0.;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true or -1.7;)", "b", true);
+    }
+
+    SECTION("lhs is N")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; B b = n or m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; N m = 0; B b = n or m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 2; B b = n or m;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; N m = 0; B b = n or m;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n or -1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = n or 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or -1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; B b = n or 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = n or 0.;)", "b", false);
+    }
+
+    SECTION("lhs is Z")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1 or false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = -3 or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -3 or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; B b = 0 or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0 or n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 or 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 1 or 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 2;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 or 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 3 or 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 2.5;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0 or 0.;)", "b", false);
+    }
+
+    SECTION("lhs is R")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or false;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = -1.2 or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = -1.2 or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; B b = 0. or n;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 0; B b = 0. or n;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 0;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 1;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 0;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = -1.2 or 0.;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 2.3;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = 0. or 0.;)", "b", false);
+    }
+  }
+
+  SECTION("xor")
+  {
+    SECTION("lhs is B")
+    {
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor true;)", "b", false);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor true;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = true xor false;)", "b", true);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(B b = false xor false;)", "b", false);
+    }
+  }
+}
diff --git a/tests/test_BinaryExpressionProcessor_utils.hpp b/tests/test_BinaryExpressionProcessor_utils.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ddd8ce2c8bff5aaa95c2281082e5acbb185b1f16
--- /dev/null
+++ b/tests/test_BinaryExpressionProcessor_utils.hpp
@@ -0,0 +1,55 @@
+#ifndef TEST_BINARY_EXPRESSION_PROCESSOR_UTILS_HPP
+#define TEST_BINARY_EXPRESSION_PROCESSOR_UTILS_HPP
+
+#include <ASTNodeValueBuilder.hpp>
+
+#include <ASTBuilder.hpp>
+#include <ASTNodeDataTypeBuilder.hpp>
+
+#include <ASTNodeDeclarationCleaner.hpp>
+#include <ASTNodeDeclarationToAffectationConverter.hpp>
+
+#include <ASTNodeExpressionBuilder.hpp>
+
+#include <ASTNodeAffectationExpressionBuilder.hpp>
+
+#include <ASTSymbolTableBuilder.hpp>
+
+#include <ASTPrinter.hpp>
+
+#include <Demangle.hpp>
+
+#include <PEGGrammar.hpp>
+
+#include <sstream>
+
+#define CHECK_BINARY_EXPRESSION_RESULT(data, variable_name, expected_value) \
+  {                                                                         \
+    string_input input{data, "test.pgs"};                                   \
+    auto ast = ASTBuilder::build(input);                                    \
+                                                                            \
+    ASTSymbolTableBuilder{*ast};                                            \
+    ASTNodeDataTypeBuilder{*ast};                                           \
+    ASTNodeValueBuilder{*ast};                                              \
+                                                                            \
+    ASTNodeDeclarationToAffectationConverter{*ast};                         \
+    ASTNodeDeclarationCleaner{*ast};                                        \
+                                                                            \
+    ASTNodeExpressionBuilder{*ast};                                         \
+    ExecUntilBreakOrContinue exec_policy;                                   \
+    ast->execute(exec_policy);                                              \
+                                                                            \
+    auto symbol_table = ast->m_symbol_table;                                \
+                                                                            \
+    using namespace TAO_PEGTL_NAMESPACE;                                    \
+    position use_position{internal::iterator{"fixture"}, "fixture"};        \
+    use_position.byte    = 10000;                                           \
+    auto [symbol, found] = symbol_table->find(variable_name, use_position); \
+                                                                            \
+    auto attribute = symbol->second;                                        \
+    auto value     = std::get<decltype(expected_value)>(attribute.value()); \
+                                                                            \
+    REQUIRE(value == expected_value);                                       \
+  }
+
+#endif   // TEST_BINARY_EXPRESSION_PROCESSOR_UTILS_HPP