llvm-journey

LLVM Journey
git clone git://0xff.ir/g/llvm-journey.git
Log | Files | Refs | README | LICENSE

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 }