Я должен написать метод, который будет проверять заданное выражение инфикса из пользовательского ввода, который будет в векторе т.е.
У меня уже есть часть работающего метода, которая уравновешивает открывающие и закрывающие разделители, и теперь я добавляю вспомогательный метод, который проверяет синтаксис выражения, например, следующие случаи — это то, что происходит при запуске программы, включая ошибку:
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 элемент в вашем векторе токенов. Что вам нужно сделать, это убедиться, что вы не ссылаетесь на конец вектора токена. Добавьте явную проверку, что-то вроде:
if (i+1 >= v.size()) {
// code to handle final token being an operator
}
перед оператором if, который проверяет следующий токен.
Других решений пока нет …