Advertisement
Guest User

Untitled

a guest
May 26th, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. void processExpr()//Обработка выражения.
  2. {
  3.     skipSpaces();
  4.     stack < Token > lexeme;
  5.     stack < Token > operation;
  6.     while (pos < s.length() && (s[pos] == '(' || s[pos] == ')' || s[pos] == '+' || s[pos] == '-' ||
  7.            s[pos] == '*' || s[pos] == '/' || isalnum(s[pos])))//Т.е подоется что-то подходящие.
  8.     {
  9.         if (s[pos] == '(')
  10.         {
  11.             operation.push(tLeftBracket);
  12.             tmp.push_back(tLeftBracket);
  13.         }
  14.         else if (s[pos] == ')')
  15.         {
  16.             tmp.push_back(tRightBracket);
  17.             do
  18.             {
  19.                 if (!operation.size() || lexeme.size() < 2)//Проверка на наличие LeftBracket и наличия того, что сравнивать.
  20.                     printError();
  21.                 lexeme.pop();
  22.                 operation.pop();
  23.             } while (operation.top() != tLeftBracket);
  24.             operation.pop();
  25.             ++pos;
  26.         }
  27.         else if (isNumber())
  28.         {
  29.             tmp.push_back(literal);
  30.             lexeme.push(literal);
  31.         }
  32.         else if (arithmetic.find(s[pos]) != arithmetic.end())//Есть map, в которой можно обращаться сразу к нужному token
  33.         {
  34.             Token temp = arithmetic.find(s[pos])->second;
  35.             while (operation.size() && operation.top() != tLeftBracket &&
  36.                 priority[operation.top()] >= priority[temp])//что первым выполнять, например + и *
  37.             {
  38.                 if (!operation.size() || lexeme.size() < 2)
  39.                     printError();
  40.                 lexeme.pop();
  41.                 operation.pop();
  42.             }
  43.             tmp.push_back(temp);
  44.             operation.push(temp);
  45.         }
  46.         else
  47.         {
  48.             lexeme.push(literal);
  49.             processVariable();
  50.         }
  51.         if (pos < s.length() && s[pos] != ')')
  52.             ++pos;
  53.         if (pos <= s.length() && s[pos - 1] == ':')
  54.             --pos;
  55.         skipSpaces();
  56.     }
  57.     if (lexeme.size() > 1)
  58.         while (operation.size() && operation.top() != tLeftBracket &&
  59.             priority[operation.top()] >= priority[arithmetic.find(s[pos])->second])
  60.         {
  61.             if (!operation.size())
  62.                 printError();
  63.             lexeme.pop();
  64.             operation.pop();
  65.         }
  66.     skipSpaces();
  67.     if (pos < s.length() && !partOfCond && s[pos] != '#')
  68.         printError();
  69.     return;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement