簡體   English   中英

檢查運算符優先級?

[英]Checking for Operator precedence?

所以我正在為一個項目制作一個解析器,它要求我做一個 if 語句來檢查我當前的標記是否是左關聯運算符,並且該標記是否比我的堆棧頂部具有更高的優先級。 我不知道如何檢查優先級。

該項目最終將成為一個計算器,它接收輸入並將其轉換為逆波蘭符號。 因此,在收到輸入之前,代碼將不知道要檢查哪些運算符。

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

tkn 是一個堆棧,infixTokens 是一個向量。 >= 似乎不起作用。 檢查每個元素中的哪個運算符大於另一個的最佳方法是什么?

我能想到幾個簡單的方法。

最簡單的是按優先級排序的運算符列表。 如果新運算符在堆棧頂部的運算符之前,則新運算符具有更高的優先級。 不會在這里花太多時間,因為它有致命的缺陷。 這有問題,因為許多運算符具有相同的優先級(例如,+ 和 -)並且必須按照它們被找到的順序執行。

第二個是運算符與其優先級之間的映射。 例如:

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

並且不關心它是什么類型的運算符,因為多態的魔力會為您處理簿記。 程序將為正確的類調用正確的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM