Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void processExpr()//Обработка выражения.
- {
- skipSpaces();
- stack < Token > lexeme;
- stack < Token > operation;
- while (pos < s.length() && (s[pos] == '(' || s[pos] == ')' || s[pos] == '+' || s[pos] == '-' ||
- s[pos] == '*' || s[pos] == '/' || isalnum(s[pos])))//Т.е подоется что-то подходящие.
- {
- if (s[pos] == '(')
- {
- operation.push(tLeftBracket);
- tmp.push_back(tLeftBracket);
- }
- else if (s[pos] == ')')
- {
- tmp.push_back(tRightBracket);
- do
- {
- if (!operation.size() || lexeme.size() < 2)//Проверка на наличие LeftBracket и наличия того, что сравнивать.
- printError();
- lexeme.pop();
- operation.pop();
- } while (operation.top() != tLeftBracket);
- operation.pop();
- ++pos;
- }
- else if (isNumber())
- {
- tmp.push_back(literal);
- lexeme.push(literal);
- }
- else if (arithmetic.find(s[pos]) != arithmetic.end())//Есть map, в которой можно обращаться сразу к нужному token
- {
- Token temp = arithmetic.find(s[pos])->second;
- while (operation.size() && operation.top() != tLeftBracket &&
- priority[operation.top()] >= priority[temp])//что первым выполнять, например + и *
- {
- if (!operation.size() || lexeme.size() < 2)
- printError();
- lexeme.pop();
- operation.pop();
- }
- tmp.push_back(temp);
- operation.push(temp);
- }
- else
- {
- lexeme.push(literal);
- processVariable();
- }
- if (pos < s.length() && s[pos] != ')')
- ++pos;
- if (pos <= s.length() && s[pos - 1] == ':')
- --pos;
- skipSpaces();
- }
- if (lexeme.size() > 1)
- while (operation.size() && operation.top() != tLeftBracket &&
- priority[operation.top()] >= priority[arithmetic.find(s[pos])->second])
- {
- if (!operation.size())
- printError();
- lexeme.pop();
- operation.pop();
- }
- skipSpaces();
- if (pos < s.length() && !partOfCond && s[pos] != '#')
- printError();
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement