Advertisement
Ardente

Lexer class 2

Aug 17th, 2020 (edited)
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1.     std::stringstream inputStream(input);
  2.     char token;
  3.  
  4.     Token lastOperator;
  5.     while (!inputStream.eof())
  6.     {
  7.         token = inputStream.get();
  8.  
  9.         Token inOperator = Token{ TokenTypes{token}, token };
  10.  
  11.         switch (token)
  12.         {
  13.         case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
  14.             if (!outputStack.empty())
  15.             {
  16.                 if (lastOperator == TokenTypes::NUMBER)
  17.                 {
  18.                     inOperator = Token{ TokenTypes::NUMBER, std::stoi(lastOperator.toString() + inOperator.toString()) };
  19.                     outputStack.pop();
  20.                     outputStack.push(inOperator);
  21.                     break;
  22.                 }
  23.             }
  24.  
  25.             inOperator = Token{ TokenTypes::NUMBER, (int)(token - '0') };
  26.             outputStack.push(inOperator);
  27.             break;
  28.  
  29.         case '+': case '-': case '*': case '/': case '^':
  30.             while (!operatorStack.empty() && (operatorStack.top() > inOperator || (operatorStack.top() == inOperator && inOperator.isLeftAssociative())) && operatorStack.top() != TokenTypes{ '(' })
  31.             {
  32.                 outputStack.push(operatorStack.top());
  33.                 operatorStack.pop();
  34.             }
  35.  
  36.             operatorStack.push(inOperator);
  37.             break;
  38.  
  39.         case '(':
  40.             operatorStack.push(inOperator);
  41.             break;
  42.  
  43.         case ')':
  44.             lastOperator = inOperator;
  45.  
  46.             while (operatorStack.top() != TokenTypes{ '(' })
  47.             {
  48.                 inOperator = operatorStack.top();
  49.  
  50.                 if (lastOperator == TokenTypes::NUMBER)
  51.                     inOperator = Token{ TokenTypes::NUMBER, std::stoi(lastOperator.toString() + inOperator.toString()) };
  52.  
  53.                 outputStack.push(inOperator);
  54.                 operatorStack.pop();
  55.  
  56.                 lastOperator = inOperator;
  57.             }
  58.  
  59.             if (operatorStack.top() == TokenTypes{ '(' })
  60.                 operatorStack.pop();
  61.             break;
  62.         }
  63.  
  64.         lastOperator = inOperator;
  65.     }
  66.  
  67.     while (!operatorStack.empty())
  68.     {
  69.         outputStack.push(operatorStack.top());
  70.         operatorStack.pop();
  71.     }
  72.  
  73.     size_t size = outputStack.size();
  74.     std::vector<Token> tokens;
  75.     for (size_t i = 0; i < size; i++)
  76.     {
  77.         tokens.push_back(outputStack.top());
  78.         outputStack.pop();
  79.     }
  80.  
  81.     //std::reverse(tokens.begin(), tokens.end());
  82.  
  83.     for (size_t i = 0; i < size; i++)
  84.         outputStack.push(tokens[i]);
  85.  
  86.     /*std::string outputString;
  87.  
  88.     size_t stackSize = outputStack.size();
  89.     for (size_t i = 0; i < stackSize; i++)
  90.     {
  91.         outputString += outputStack.top().toString() + ' ';
  92.         outputStack.pop();
  93.     }
  94.  
  95.     std::istringstream iss(outputstring);
  96.  
  97.     std::vector<std::string> splitstring{ std::istream_iterator<std::string>(iss), {} };
  98.  
  99.     std::reverse(splitstring.begin(), splitstring.end());
  100.  
  101.     std::ostringstream oss;
  102.     std::copy(splitstring.begin(), splitstring.end(), std::ostream_iterator<std::string>(oss, " "));
  103.  
  104.     outputstring = oss.str();*/
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement