我有一个Algo尝试调用Precedence函数,以便比较一个运算符是否优先于另一个运算符。我有一个错误,说我无法将类型令牌转换为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)){}
}
}
}
答案 0 :(得分:0)
在这一行:while(precedence(tok)){}
中,您正在调用函数precedence
,该函数接受参数char
,但您传递的变量tok
是{ {1}}
这两种类型无法转换。
我的水晶球说Token
,程序可以编译,但这条线没有意义!充其量,它是无用的,在最坏的情况下,它是一个无限循环。
答案 1 :(得分: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);
}
让它更具可读性。