2015-11-27 84 views
-3

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

該項目最終將成爲一個計算器,接受輸入並將其切換爲反向波蘭符號。所以在收到輸入之前,代碼將不知道要檢查哪些運算符。

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

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

+1

請看這裏:http://en.cppreference.com/w/cpp/language/operator_precedence –

+0

「似乎沒有工作」不是一個有效的問題。除了你知道什麼是「tkn」,或者你所發佈的微小代碼片段中引用的所有類和模板的定義之外,沒有人知道你的代碼的其餘部分。 –

+0

我提過tkn是一個堆棧。整個代碼太大而無法投入。所有我需要知道的是,如果我不知道哪些運算符將被檢查,我將如何檢查哪個運算符比哪個運算符具有更高的優先級。 – Brightscales

回答

0

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

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

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

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

,並不在乎它到底是什麼樣的操作,因爲多態性的魔力照顧爲你保存書籍。該程序將爲正確的類調用正確的函數。

+0

這破壞了我當前的班級體系。類型拒絕排隊。有沒有簡單的方法來做到這一點?我覺得就像我的教授給我的「僞」代碼似乎是這樣建議的,雖然並不告訴我如何......我覺得我在這裏缺少一些東西 – Brightscales

+0

「最簡單的是按優先級排序的運算符列表。新運營商位於堆棧頂端的運營商之前,新運營商具有更高的優先級。「最好的辦法是什麼? – Brightscales