toctave

t(iny)octave
git clone https://0xff.ir/g/toctave.git
Log | Files | Refs | README

ast.test.cpp (2348B)


      1 // AST (Abstract Syntax Tree) tests
      2 
      3 // Copyright (C) 2022, Mohammad-Reza Nabipoor
      4 // SPDX-License-Identifier: GPL-3.0-or-later
      5 
      6 #include "ast.hpp"
      7 
      8 #include <cassert>
      9 #include <iostream>
     10 #include <sstream>
     11 
     12 namespace {
     13 
     14 void
     15 ast_1()
     16 {
     17   auto i{ 0 };
     18   auto post = [](const auto& f) {
     19     std::ostringstream oss;
     20 
     21     for (const auto& n : stlab::postorder_range(f))
     22       oss << n << ' ';
     23     return oss.str();
     24   };
     25   auto p = [&](const auto& s) {
     26     std::cout << "# " << i << " {\n" << s << "\n# " << i << " }\n";
     27     ++i;
     28   };
     29 
     30   ast::Nodes binop1{ ast::mkop(ast::Op{ '+' }, ast::mknum(1), ast::mknum(2)) };
     31 
     32   {
     33     auto s{ post(binop1) };
     34 
     35     p(s);
     36     assert(s == "Num{ 1 } Num{ 2 } Op{ + } ");
     37   }
     38 
     39   ast::Nodes binop2{ ast::mkop(
     40     ast::Op{ '+' },
     41     ast::mkop(ast::Op{ '/' }, ast::mknum(1), ast::mknum(2)),
     42     ast::mkop(ast::Op{ '*' }, ast::mknum(3), ast::mknum(4))) };
     43 
     44   {
     45     auto s{ post(binop2) };
     46 
     47     p(s);
     48     assert(s == "Num{ 1 } Num{ 2 } Op{ / } Num{ 3 } Num{ 4 } Op{ * } Op{ + } ");
     49   }
     50 
     51   ast::Nodes binop3{ ast::mkop(
     52     ast::Op{ '+' },
     53     binop2,
     54     ast::mkop(ast::Op{ '-' }, ast::mknum(5), ast::mknum(6))) };
     55 
     56   {
     57     auto s{ post(binop3) };
     58 
     59     p(s);
     60     assert(s ==
     61            "Num{ 1 } Num{ 2 } Op{ / } Num{ 3 } Num{ 4 } Op{ * } Op{ + } Num{ 5 "
     62            "} Num{ 6 } Op{ - } Op{ + } ");
     63   }
     64 
     65   ast::Nodes ass1{ ast::mkass(
     66     ast::Id{ "x" },
     67     ast::mkop(ast::Op{ '+' },
     68               ast::mkop(ast::Op{ '/' }, ast::mknum(1), ast::mknum(2)),
     69               ast::mkop(ast::Op{ '*' }, ast::mknum(3), ast::mknum(4)))) };
     70 
     71   {
     72     auto s{ post(ass1) };
     73 
     74     p(s);
     75     assert(s ==
     76            "Num{ 1 } Num{ 2 } Op{ / } Num{ 3 } Num{ 4 } Op{ * } Op{ + } Ass{ "
     77            "Id{ x } } ");
     78   }
     79 
     80   ast::Nodes ass2{ ast::mkass(ast::Id{ "y" },
     81                               ast::mkop(ast::Op{ '+' }, binop1, binop2)) };
     82 
     83   {
     84     auto s{ post(ass2) };
     85 
     86     p(s);
     87     assert(s ==
     88            "Num{ 1 } Num{ 2 } Op{ + } Num{ 1 } Num{ 2 } Op{ / } Num{ 3 } Num{ "
     89            "4 } Op{ * } Op{ + } Op{ + } Ass{ Id{ y } } ");
     90   }
     91 
     92   ast::Nodes eval1{ ast::mkcall(ast::Id{ "eval" },
     93                                 ast::mkstr(ast::Str{ "y = 1 + x" })) };
     94 
     95   {
     96     auto s{ post(eval1) };
     97 
     98     p(s);
     99     assert(s == "Str{ \"y = 1 + x\" } Call{ Id{ eval } } ");
    100   }
    101 }
    102 
    103 } // anonymous namespace
    104 
    105 int
    106 main()
    107 {
    108   ast_1();
    109   return 0;
    110 }