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 }