2013-09-23 45 views
0

我有一個Algo試圖調用一個優先級函數來比較一個運算符是否比另一個有更高的優先級。我有一個錯誤,說我不能將類型令牌轉換爲字符,我想知道如何去做。將類型令牌轉換爲char類型?

enter code here 
int precedence(char op) 
{ 
if (op == '*' || op == '/') return 0; 
return 1; 
} 

bool comparePrecedence(char a, char b) 
{ 
return precedence(a) < precedence(b); 
} 

double eval_infix_expr(vector<Token> ie, map<string,double> sym_tab) 
{ 

vector<Token> postfix_expr; 
vector<Token> tok_list; 
vector<Token> t1; 
stack <Token> stack; 

while(!(ie.empty())){ 

    for(size_t i = 0; i < ie.size() ; i++){ 
      Token tok = ie[i]; 

    if(!(tok.type == OPERATOR)){ 
      postfix_expr.push_back(tok); 
    }else if(tok.type == OPERATOR){ 
      while(precedence(tok)){} 

     } 
    } 
} 
+1

你能告訴我們'Token'的定義嗎? – ch0kee

回答

0

你可以做到這一點在幾個不同的方式:

顯式類型轉換操作符

Token類,你需要定義一個類型轉換操作:當你

class Token 
{ 
public: 
    // rest of declaration 

    operator char() { return type; } // return whatever char value makes sense 
}; 

然後調用while (precedence(tok)) {},它將能夠隱含地投射它。

另外,

訪問者

不是依靠鑄造的,你可以聲明一個存取和實際使用訪問:

class Token 
{ 
public: 
    // rest of declaration 

    char GetType() const { return type; } // or whatever makes sense for your token class 
}; 

然後當你調用while (precedence(tok.GetType())) {}(注意在訪問方面有所不同),它會知道你在做什麼。

邊注:

的代碼後續塊是不是真的有必要:

if(!(tok.type == OPERATOR)) // if Not operator 
{ 
    postfix_expr.push_back(tok); 
} 
else if(tok.type == OPERATOR) // else if operator 
{ 
    while(precedence(tok)){} 
} 

避免潛在的無限循環中,條件句可以寫成

if (tok.type == OPERATOR) // if operator 
{ 
    while(precedence(tok)){} // NOTE: This will either be a noop, or an infinite loop ... never anything useful! 
} 
else // otherwise 
{ 
    postfix_expr.push_back(tok); 
} 

使它更可讀。

+0

我想(雖然我們沒有看到它)令牌有一個'char'類型的成員 – ch0kee

+0

他只是使用'char'類型的任何成員作爲訪問者或演員操作符的返回值。 –

+0

好的,但也許他的問題不是演員,但他使用錯誤的成員。 – ch0kee

0

在這一行:while(precedence(tok)){},你調用它們參與爭論一個char功能precedence但你傳遞變量tok這是一個Token

這兩種類型不能轉換。

我的水晶球說用while(precedence(tok.type)){},程序可能是編譯但是這一行沒有意義!充其量,它是無用的,在最壞的情況下,它是一個無限循環。