O_Egor

token.cpp

Oct 15th, 2022
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include "token.h"
  2.  
  3. #include <stdexcept>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. vector<Token> Tokenize(istream& cl)
  9. {
  10.     vector<Token> tokens;
  11.  
  12.     char c;
  13.     while (cl >> c)
  14.     {
  15.         if (isdigit(c))
  16.         {
  17.             string date(1, c);
  18.             for (int i = 0; i < 3; ++i)
  19.             {
  20.                 while (isdigit(cl.peek()))
  21.                 {
  22.                     date += cl.get();
  23.                 }
  24.                 if (i < 2)
  25.                 {
  26.                     date += cl.get(); // Consume '-'
  27.                 }
  28.             }
  29.             tokens.push_back({ date, TokenType::DATE });
  30.         }
  31.         else if (c == '"')
  32.         {
  33.             string event;
  34.             getline(cl, event, '"');
  35.             tokens.push_back({ event, TokenType::EVENT });
  36.         }
  37.         else if (c == 'd')
  38.         {
  39.             if (cl.get() == 'a' && cl.get() == 't' && cl.get() == 'e')
  40.             {
  41.                 tokens.push_back({ "date", TokenType::COLUMN });
  42.             }
  43.             else
  44.             {
  45.                 throw logic_error("Unknown token");
  46.             }
  47.         }
  48.         else if (c == 'e')
  49.         {
  50.             if (cl.get() == 'v' && cl.get() == 'e' && cl.get() == 'n' &&
  51.                 cl.get() == 't')
  52.             {
  53.                 tokens.push_back({ "event", TokenType::COLUMN });
  54.             }
  55.             else
  56.             {
  57.                 throw logic_error("Unknown token");
  58.             }
  59.         }
  60.         else if (c == 'A')
  61.         {
  62.             if (cl.get() == 'N' && cl.get() == 'D')
  63.             {
  64.                 tokens.push_back({ "AND", TokenType::LOGICAL_OP });
  65.             }
  66.             else
  67.             {
  68.                 throw logic_error("Unknown token");
  69.             }
  70.         }
  71.         else if (c == 'O')
  72.         {
  73.             if (cl.get() == 'R')
  74.             {
  75.                 tokens.push_back({ "OR", TokenType::LOGICAL_OP });
  76.             }
  77.             else
  78.             {
  79.                 throw logic_error("Unknown token");
  80.             }
  81.         }
  82.         else if (c == '(')
  83.         {
  84.             tokens.push_back({ "(", TokenType::PAREN_LEFT });
  85.         }
  86.         else if (c == ')')
  87.         {
  88.             tokens.push_back({ ")", TokenType::PAREN_RIGHT });
  89.         }
  90.         else if (c == '<')
  91.         {
  92.             if (cl.peek() == '=')
  93.             {
  94.                 cl.get();
  95.                 tokens.push_back({ "<=", TokenType::COMPARE_OP });
  96.             }
  97.             else
  98.             {
  99.                 tokens.push_back({ "<", TokenType::COMPARE_OP });
  100.             }
  101.         }
  102.         else if (c == '>')
  103.         {
  104.             if (cl.peek() == '=')
  105.             {
  106.                 cl.get();
  107.                 tokens.push_back({ ">=", TokenType::COMPARE_OP });
  108.             }
  109.             else
  110.             {
  111.                 tokens.push_back({ ">", TokenType::COMPARE_OP });
  112.             }
  113.         }
  114.         else if (c == '=')
  115.         {
  116.             if (cl.get() == '=')
  117.             {
  118.                 tokens.push_back({ "==", TokenType::COMPARE_OP });
  119.             }
  120.             else
  121.             {
  122.                 throw logic_error("Unknown token");
  123.             }
  124.         }
  125.         else if (c == '!')
  126.         {
  127.             if (cl.get() == '=')
  128.             {
  129.                 tokens.push_back({ "!=", TokenType::COMPARE_OP });
  130.             }
  131.             else
  132.             {
  133.                 throw logic_error("Unknown token");
  134.             }
  135.         }
  136.     }
  137.  
  138.     return tokens;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment