3

この文法の完全に括弧で囲まれた Exp を解析しようとしています:

exp->(exp + exp)
    |(exp - exp)
    | num
num->[0-9]

...しかし、問題があります。「1+4」と入力してもエラーは表示されません。どうすれば解決できますか??

4

2 に答える 2

2

これは再帰下降パーサーの典型的な問題です。文法では、入力全体が消費される必要はありません。「whileisdigit」ループで終了すると+4、入力の一部を無視して、ジョブが完了したと見なします。

この問題に対処するために、トップレベルの式を呼び出した後に行末に到達することを確認するチェックを追加します。

void TopExp() {
    Expr();
    Match('\n');
}

追加の入力が利用できない場合にMatch一致を許可するように変更する必要があります。\n

void Match(char c) {
    int p = cin.peek();
    if(p==c) {
        cin>>c;
    } else if (p == EOF && c == '\n') {
        return
    } else {
        cout<<"Syntax Error! "<<(char)cin.peek()<<endl;
        cin.ignore();
    }
}
于 2012-12-15T13:50:03.473 に答える
2

この変更された命令を試してください: if (openParenthesis-closeParenthesis>0)

    int Match(char c)
    {
        if(cin.peek()==c) {
            cin>>c;
            return 1;
        } else
        {
            cout<<"Syntax Error! "<<(char)cin.peek()<<endl;
            cin.ignore();
            return 0;
        }
    }

    void MatchOp()
    {
        if(cin.peek()=='+') 
            Match('+');
        else if(cin.peek()=='-')
            Match('-');
        else
        {
            cout<<"invalid Operation: "<<(char)cin.peek()<<endl;
            cin.ignore();
        }
    }

    void Exp()
    {   static int openParenthesis = 0; 
        static int closeParenthesis = 0;  
        if(cin.peek()!='\n')
            if(cin.peek()=='(')
            {
                if (Match('(') == 1) {
                    openParenthesis += 1;
                }
                Exp();MatchOp();Exp();
                if (Match(')') == 1) {
                    closeParenthesis -= 1;
                }
            }
            else if(isdigit(cin.peek()))
            {   
                if (openParenthesis-closeParenthesis>0) {
                    cout<<"Syntax Error! "<<(char)cin.peek()<<endl;
                    cin.ignore();               
                } else {
                    while(isdigit(cin.peek()))
                    { cout<<(char)cin.peek();
                    Match(cin.peek());  
                    }
                }   
            }
            else 
            {
                cout<<"Syntax Error!"<<(char)cin.peek()<<endl;
                cin.ignore();
            }
    }
于 2012-12-15T14:30:12.803 に答える