kaleidoscope_lexer.test.cpp (4106B)
1 2 #include "kaleidoscope_lexer.hpp" 3 4 #define CATCH_CONFIG_MAIN 5 #define CATCH_CONFIG_COLOUR_NONE 6 #include <catch2/catch.hpp> 7 8 #include <string> 9 #include <vector> 10 11 #include "kaleidoscope_tokens.hpp" 12 13 TEST_CASE("lex", "[lex]") 14 { 15 const std::string src{ R"(# Compute the x'th fibonacci number. 16 def fib(x) 17 if x < 3 then 18 1 19 else 20 fib(x-1)+fib(x-2) 21 22 # This expression will compute the 40th number. 23 fib(40) 24 25 extern sin(arg); 26 )" }; 27 std::vector<kal::Token> tokens; 28 auto sbeg = std::cbegin(src); 29 auto send = std::cend(src); 30 using kal::Token; 31 32 auto last = 33 kal::lex(sbeg, send, [&](kal::TkType t, const auto& f, const auto& l) { 34 auto b = f - sbeg; 35 auto e = l - sbeg; 36 auto tk = kal::Token{ t, b, e, src.substr(b, e - b), 0 }; 37 38 if (t == kal::TkType::Num) 39 tk.dbl = std::stod(tk.str); 40 41 tokens.emplace_back(std::move(tk)); 42 }); 43 44 #if 0 45 // Test check generator 46 for (auto i = 0u; i < tokens.size(); ++i) { 47 const auto& t = tokens[i]; 48 49 std::cout << "REQUIRE(tokens[" << i << "] == Token{" 50 << "\n kal::TkType::" 51 << kal::TKTYPE_STR[static_cast<int>(t.type)] << ",\n " << t.bpos 52 << ",\n " << t.epos << ",\n \"" << t.str << '"' << ",\n " 53 << t.dbl << "});\n"; 54 } 55 #endif 56 57 REQUIRE(last == send); 58 59 REQUIRE( 60 tokens[0] == 61 Token{ 62 kal::TkType::Comment, 0, 36, "# Compute the x'th fibonacci number.", 0 }); 63 REQUIRE(tokens[1] == Token{ kal::TkType::Def, 37, 40, "def", 0 }); 64 REQUIRE(tokens[2] == Token{ kal::TkType::Id, 41, 44, "fib", 0 }); 65 REQUIRE(tokens[3] == Token{ kal::TkType::Etc, 44, 45, "(", 0 }); 66 REQUIRE(tokens[4] == Token{ kal::TkType::Id, 45, 46, "x", 0 }); 67 REQUIRE(tokens[5] == Token{ kal::TkType::Etc, 46, 47, ")", 0 }); 68 REQUIRE(tokens[6] == Token{ kal::TkType::Id, 50, 52, "if", 0 }); 69 REQUIRE(tokens[7] == Token{ kal::TkType::Id, 53, 54, "x", 0 }); 70 REQUIRE(tokens[8] == Token{ kal::TkType::Etc, 55, 56, "<", 0 }); 71 REQUIRE(tokens[9] == Token{ kal::TkType::Num, 57, 58, "3", 3 }); 72 REQUIRE(tokens[10] == Token{ kal::TkType::Id, 59, 63, "then", 0 }); 73 REQUIRE(tokens[11] == Token{ kal::TkType::Num, 68, 69, "1", 1 }); 74 REQUIRE(tokens[12] == Token{ kal::TkType::Id, 72, 76, "else", 0 }); 75 REQUIRE(tokens[13] == Token{ kal::TkType::Id, 81, 84, "fib", 0 }); 76 REQUIRE(tokens[14] == Token{ kal::TkType::Etc, 84, 85, "(", 0 }); 77 REQUIRE(tokens[15] == Token{ kal::TkType::Id, 85, 86, "x", 0 }); 78 REQUIRE(tokens[16] == Token{ kal::TkType::Etc, 86, 87, "-", 0 }); 79 REQUIRE(tokens[17] == Token{ kal::TkType::Num, 87, 88, "1", 1 }); 80 REQUIRE(tokens[18] == Token{ kal::TkType::Etc, 88, 89, ")", 0 }); 81 REQUIRE(tokens[19] == Token{ kal::TkType::Etc, 89, 90, "+", 0 }); 82 REQUIRE(tokens[20] == Token{ kal::TkType::Id, 90, 93, "fib", 0 }); 83 REQUIRE(tokens[21] == Token{ kal::TkType::Etc, 93, 94, "(", 0 }); 84 REQUIRE(tokens[22] == Token{ kal::TkType::Id, 94, 95, "x", 0 }); 85 REQUIRE(tokens[23] == Token{ kal::TkType::Etc, 95, 96, "-", 0 }); 86 REQUIRE(tokens[24] == Token{ kal::TkType::Num, 96, 97, "2", 2 }); 87 REQUIRE(tokens[25] == Token{ kal::TkType::Etc, 97, 98, ")", 0 }); 88 REQUIRE(tokens[26] == 89 Token{ kal::TkType::Comment, 90 100, 91 147, 92 "# This expression will compute the 40th number.", 93 0 }); 94 REQUIRE(tokens[27] == Token{ kal::TkType::Id, 148, 151, "fib", 0 }); 95 REQUIRE(tokens[28] == Token{ kal::TkType::Etc, 151, 152, "(", 0 }); 96 REQUIRE(tokens[29] == Token{ kal::TkType::Num, 152, 154, "40", 40 }); 97 REQUIRE(tokens[30] == Token{ kal::TkType::Etc, 154, 155, ")", 0 }); 98 REQUIRE(tokens[31] == Token{ kal::TkType::Extern, 157, 163, "extern", 0 }); 99 REQUIRE(tokens[32] == Token{ kal::TkType::Id, 164, 167, "sin", 0 }); 100 REQUIRE(tokens[33] == Token{ kal::TkType::Etc, 167, 168, "(", 0 }); 101 REQUIRE(tokens[34] == Token{ kal::TkType::Id, 168, 171, "arg", 0 }); 102 REQUIRE(tokens[35] == Token{ kal::TkType::Etc, 171, 172, ")", 0 }); 103 REQUIRE(tokens[36] == Token{ kal::TkType::Etc, 172, 173, ";", 0 }); 104 REQUIRE(tokens[37] == Token{ kal::TkType::END, 174, 174, "", 0 }); 105 }