1

ユーザー入力から特定の中置式を検証するメソッドを作成する必要があります。これはベクトルになります。

開始区切り文字と終了区切り文字のバランスをとるメソッドの一部を既に実行しています。現在、式の構文をチェックするヘルパー メソッドを追加しています。たとえば、次のケースは、エラーを含め、プログラムの実行時に発生します。

validate (4+5) 
returns true
validate (45+)
returns false
validate 45+ 
Vector out of range. 

これは の呼び出しが原因で発生していると思いますv.at(i+1).typeが、 if ステートメントを追加してfalseif myを返すようにした後int i = v.size() && tt.type == OPERATOR、最後のトークンが演算子であるかどうかを確認しても、同じベクトルが範囲外エラーになりました。

このエラーが発生する理由について何か意見はありますか?

bool isValArith(vector<Token> v){

    bool lol;
    Token tt;
    stack<Token> st;
    for (int i = 0; i < v.size(); i++){
        tt= v.at(i);
        if (tt.type != OPERATOR && tt.value != "[" && tt.value != "(" && 
                tt.value != "{" &&  tt.value != "}" && tt.value != ")" && 
                tt.value != "]"){
                st.push(tt);
        }

        if (tt.type == OPERATOR){
            if (st.top().type != OPERATOR && v.at(i+1).type != OPERATOR && 
                v.at(i+1).value != "[" && v.at(i+1).value != "{" && 
                v.at(i+1).value != "(" && v.at(i+1).value != "}" &&  
                v.at(i+1).value != "]" && v.at(i+1).value != ")"){
                lol = true;
                cout << "here" << endl;
            }
            else {
                cout << "Error: Invalid Expression" << endl;
                lol = false;
            }
        }
    }
    return lol;
}
4

1 に答える 1

3

OPERATOR を処理しようとすると、トークン ベクトル内の 1 つの要素が前方に表示されます。あなたがする必要があるのは、トークンベクトルの最後を参照していないことを確認することです. 次のような明示的なチェックを追加します。

if (i+1 >= v.size()) {
// code to handle final token being an operator
}

次のトークンをチェックする if ステートメントの前。

于 2013-09-24T20:58:26.160 に答える