0

あるオペレーターが他のオペレーターよりも優先度が高いかどうかを比較するために、Precedence 関数を呼び出そうとするアルゴがあります。タイプ Token を 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)){}

        }
    }
}
4

2 に答える 2

0

この行 :では、引数 a を受け取るwhile(precedence(tok)){}関数を呼び出していますが、a である変数を渡しています。precedencechartokToken

2 つのタイプは変換できません。

私の水晶玉は、 を使用するとwhile(precedence(tok.type)){}、プログラムコンパイルされる可能性がありますが、この行は意味がありません! 良くても無駄、悪く言えば無限ループ。

于 2013-09-23T18:45:53.737 に答える
0

いくつかの異なる方法でそれを行うことができます:

明示的なキャスト演算子

classTokenでは、キャスト演算子を定義する必要があります:

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

より読みやすくします。

于 2013-09-23T19:06:16.770 に答える