Проблемы с калькулятором RPN c++

Мне нужно создать калькулятор RPN, который работает с входными файлами. Он использует 4 стандартных арифметических оператора, а также pow и %. Я не уверен, почему следующая программа не работает для последних 4 строк ввода. Я получаю вывод «СИНТАКСИЧЕСКАЯ ОШИБКА» для последних 4 строк. Любые идеи или предложения? Пример входного файла .txt, который я использую:

3 4 5.0 * -

7

4 * 8 30 +

банан

9 10 + 30 -

  1. 7 3-+ 2 -3+

900 40.65-20+

45.2 23.999%

10 пау 2

И правильный вывод должен быть таким:

-17

7

ОШИБКА СИНТАКСИСА

ОШИБКА СИНТАКСИСА

-11

9

879.35

21.201

100

#include<iostream>
#include<fstream>
#include<string>
#include<stack>
#include<sstream>
#include<math.h> //pow
#define SPACE(b) if (!(b)) throw "";
using namespace std;
double evalrpn(stack<string> & tkline);
int main(void){

    string line;
    ifstream inputfile;
    string fileloc;
one:cout << "Enter the location of the input file: ";
    getline(cin, fileloc);
    inputfile.open(fileloc);
    while (inputfile.fail())
    {
        cout << "The file at location " << fileloc << " failed to open." << endl;
    goto one;
}
while (getline(inputfile, line)){
    stack<string> tkline;
    istringstream sstr(line);
    string tk;
    while (sstr >> tk)
        tkline.push(tk);
    if (!tkline.empty())
        try {
        auto z = evalrpn(tkline);
        SPACE(tkline.empty());
        cout << z << endl;
    }
    catch (...) { cout << "SYNTAX ERROR" << endl; }
    }


cin.ignore();
return 0;
}

double evalrpn(stack<string> & tkline){
SPACE(!tkline.empty());
double x, y;
auto tk = tkline.top();
tkline.pop();
auto n = tk.size();
if (n == 1 && string("+-*/%'pow'").find(tk) != string::npos) {
    y = evalrpn(tkline);
    x = evalrpn(tkline);
    if (tk[0] == '+') x += y;
    else if (tk[0] == '-') x -= y;
    else if (tk[0] == '*') x *= y;
    else if (tk[0] == '/') x /= y;
    else if (tk[0] == '%') x = fmod(x,y);
    else pow(x, y);
}
else {
    unsigned i; x = stod(tk, &i);
    SPACE(i == n);
}

return x;
}

person user3609522    schedule 06.05.2014    source источник
comment
Вы уверены, что последняя строка ввода 10 pow 2? Это было бы недопустимым выражением RPN, как определяет ваша программа.   -  person Mark B    schedule 06.05.2014


Ответы (1)


Ваша программа не обрабатывает случай, когда между токенами нет пробелов, потому что istringstream не обрабатывает этот случай за вас. Вам придется использовать более интеллектуальный синтаксический анализатор, чем разбиение на токены по пробелам.

person Mark B    schedule 06.05.2014