检查运营商优先级?

时间:2015-11-27 22:44:00

标签: c++ operators token

所以我正在为一个项目创建一个解析器,它要求我创建一个if语句来检查我的当前令牌是否是一个左关联运算符,并且该令牌的优先级是否高于我的堆栈顶部。我不知道如何检查优先级。

该项目最终将成为一个计算器,它接收输入并将其切换为反向抛光表示法。因此,在收到输入之前,代码将不知道要检查哪些运算符。

while(is<Operator>(infixTokens.at(i)){
  if(is<LAssocOperator>(infixTokens.at(i)) && infixTokens.at(i) >=tkn.top()){
  //exits while loop
  }
}

tkn是一个堆栈,infixTokens是一个向量。 &gt; =似乎并没有起作用。 检查每个元素中哪个运算符大于另一个元素的最佳方法是什么?

1 个答案:

答案 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);

并不关心究竟是什么类型的运算符,因为多态的魔力照顾着你的簿记。程序将为正确的类调用正确的函数。