Проверка и выражение инфикса

Я должен написать метод, который будет проверять заданное выражение инфикса из пользовательского ввода, который будет в векторе т.е.

У меня уже есть часть работающего метода, которая уравновешивает открывающие и закрывающие разделители, и теперь я добавляю вспомогательный метод, который проверяет синтаксис выражения, например, следующие случаи — это то, что происходит при запуске программы, включая ошибку:

validate (4+5)
returns true
validate (45+)
returns false
validate 45+
Vector out of range.

Я считаю, что это происходит из-за моих призывов к v.at(i+1).type, но после добавления операторов if возвращать false если мой int i = v.size() && tt.type == OPERATOR, чтобы проверить, что самый последний токен является оператором, он все же выдает тот же вектор из-за ошибки диапазона.

Любой вход, почему эта ошибка произошла?

bool isValArith(vector<Token> v){

bool lol;
Token tt;
stack<Token> st;
for (int i = 0; i < v.size(); i++){
tt= v.at(i);
if (tt.type != OPERATOR && tt.value != "[" && tt.value != "(" &&
tt.value != "{" &&  tt.value != "}" && tt.value != ")" &&
tt.value != "]"){
st.push(tt);
}

if (tt.type == OPERATOR){
if (st.top().type != OPERATOR && v.at(i+1).type != OPERATOR &&
v.at(i+1).value != "[" && v.at(i+1).value != "{" &&
v.at(i+1).value != "(" && v.at(i+1).value != "}" &&
v.at(i+1).value != "]" && v.at(i+1).value != ")"){
lol = true;
cout << "here" << endl;
}
else {
cout << "Error: Invalid Expression" << endl;
lol = false;
}
}
}
return lol;
}

1

Решение

Когда вы пытаетесь обработать ОПЕРАТОР, вы ожидаете 1 элемент в вашем векторе токенов. Что вам нужно сделать, это убедиться, что вы не ссылаетесь на конец вектора токена. Добавьте явную проверку, что-то вроде:

if (i+1 >= v.size()) {
// code to handle final token being an operator
}

перед оператором if, который проверяет следующий токен.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]