所以我正在为一个项目创建一个解析器,它要求我创建一个if语句来检查我的当前令牌是否是一个左关联运算符,并且该令牌的优先级是否高于我的堆栈顶部。我不知道如何检查优先级。
该项目最终将成为一个计算器,它接收输入并将其切换为反向抛光表示法。因此,在收到输入之前,代码将不知道要检查哪些运算符。
while(is<Operator>(infixTokens.at(i)){
if(is<LAssocOperator>(infixTokens.at(i)) && infixTokens.at(i) >=tkn.top()){
//exits while loop
}
}
tkn是一个堆栈,infixTokens是一个向量。 &gt; =似乎并没有起作用。 检查每个元素中哪个运算符大于另一个元素的最佳方法是什么?
答案 0 :(得分:0)
我可以想到几个简单的方法。
最简单的是按优先级排序的运算符列表。如果new运算符位于堆栈顶部的运算符之前,则new运算符具有更高的优先级。不会在这里花很多时间,因为它有致命的缺陷。这有问题,因为许多运算符具有相同的优先级(例如+和 - ),并且必须按找到它们的顺序执行。
第二个是运营商与其优先级之间的映射。例如:
struct Operator
{
std::string op;
int precedence;
}
在这种情况下,您比较precedence
以查看哪个更大。
if (newoperator.precedence > stack.peek().precedence)
{
// do something
}
else if (newoperator.precedence < stack.peek().precedence)
{
// do something else
}
else
{
// do whatever you do when the operators have the same precedence
}
因为这是C ++,你可以
struct Operator
{
std::string op;
int precedence;
int prioritycompare(const Operator & other)
{
return precedence - other.precedence;
}
}
让你的生活更轻松。
然后你可以更进一步,建立一个班级层次结构,虽然在你的编程生涯中你可能还不想去这里。请相信我的话,写起来容易得多。
struct Operator
{
std::string op;
int precedence;
~Operator()
{
\\does nothing
}
virtual int operate(int A, int B) = 0; // pure virtual function
int prioritycompare(const Operator & other)
{
return precedence - other.precedence;
}
}
struct plus: public Operator
{
int operate(int A, int B)
{
return A+B;
}
}
然后,如果您手头有任何操作员,您可以测试优先级并执行操作
result = newoperator.operate(val1, val2);
并不关心究竟是什么类型的运算符,因为多态的魔力照顾着你的簿记。程序将为正确的类调用正确的函数。