验证和中缀表达式
Validating and Infix Expression
我必须编写一个方法来验证来自用户输入的给定中缀表达式,该表达式将在 Vector 中即。
我已经运行了平衡开头和结束分隔符的方法的一部分,现在我正在添加一个检查表达式语法的辅助方法,例如以下情况是程序运行时发生的情况,包括错误:
validate (4+5)
returns true
validate (45+)
returns false
validate 45+
Vector out of range.
我相信这是由于我对 v.at(i+1).type
的调用而发生的,但是,在添加 if 语句以返回false
if 我的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 语句之前。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 来自C++结构编程中的中缀表达式的表达式树
- 中缀到后缀表达式转换代码不起作用
- 使用Stacks从中缀表达式转换为后缀(C++)
- 验证和中缀表达式
- c++二进制表达式树:如何打印带有适当括号的中缀表达式
- 从中缀表达式构建二叉树,而不使用堆栈