Advertisement
gertsog

Lizz

Sep 25th, 2019
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <algorithm>
  2. #include <cctype>
  3. #include <string>
  4.  
  5. namespace parser
  6. {
  7.   class parse_symbol
  8.   {
  9.     constexpr bool is_letter(const char & C) const { return (C >= 'a') && (C <= 'z'); }
  10.  
  11.     constexpr bool is_number(const char & C) const { return (C >= '0') && (C <= '9'); }
  12.  
  13.     constexpr bool is_operator(const char & C) const  { return (C == '-') || (C == '+') || (C == '*'); }
  14.  
  15.   public:
  16.     parse_symbol() = default;
  17.  
  18.     constexpr int operator<<(const char & C) const
  19.     {
  20.       if (is_letter(C))
  21.         return 1;
  22.       else if (is_operator(C))
  23.         return 2;
  24.       else if (C == '(')
  25.         return 3;
  26.       else if (C == ')')
  27.         return 4;
  28.       return 0;
  29.     }
  30.   }; // End of 'parse_symbol' class
  31.  
  32.   static parse_symbol Parser;
  33.  
  34.   bool parse_string(std::string & Str)
  35.   {
  36.     if (Str.size() <= 0)
  37.       return false;
  38.  
  39.     // remove spaces
  40.     Str.erase(std::remove(Str.begin(), Str.end(), ' '), Str.end());
  41.     // switch to lowercase
  42.     std::transform(Str.begin(), Str.end(), Str.begin(), [](unsigned char c) { return std::tolower(c); });
  43.  
  44.     int state = 0; // 1 - letter, 2 - operation, 3 - end, 4 - ), 5 - btw
  45.  
  46.     for (auto & a : Str)
  47.     {
  48.       switch (Parser << a)
  49.       {
  50.       case 3: // (
  51.         return ((Parser << Str.back()) == 4) ? parse_string(Str.substr(1, Str.size() - 2)) : false;
  52.         break;
  53.       case 1: // a
  54.         switch (state)
  55.         {
  56.         case 0: // no
  57.         case 2: // after op
  58.           state++;
  59.           break;
  60.         default: // end or after a
  61.           return false;
  62.           break;
  63.         }
  64.         break;
  65.       case 2: // +
  66.         switch (state)
  67.         {
  68.         case 1: // after a
  69.           state = 2;
  70.           break;
  71.         default:
  72.           return false;
  73.           break;
  74.         }
  75.         break;
  76.       case 4: // )
  77.       case 0: // odd symbols
  78.         return false;
  79.         break;
  80.       }
  81.     }
  82.     return true;
  83.   }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement