[英]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.