3

私は文法と構文解析の分野に不慣れです。

次のような文字列を評価する再帰下降パーサーを作成しようとしています。

((3 == 5 AND 4 == 5)OR(6 == 6))

ネストされた括弧の処理を開始するまで、すべてが正常に機能します。基本的に、ターゲット文字列の終わりに到達するのが早すぎます。

問題は、「6」のようなトークンや最後から2番目の括弧に遭遇したときに、それを評価してから次のトークンに移動するという事実に起因すると思います。次のトークンに進むためのコードを削除しますが、どのように進めるかわかりません。

私の文法は、次のようになっています(「=>」記号は、ルールの「翻訳」を表す私自身の表記法です)。

テスト:CompoundSentenceの場合CompoundSentence | 重文

CompoundSentence :( CompoundSentence)PCSopt|CompoundSentence接続詞文|

文=>

CompoundSentence =(CompoundSentence)PCSopt | 文CSOpt

PCSOpt = ParenConjunction CompoundSentence PCSOpt | イプシロン

CSOpt=接続詞CSOpt| イプシロン

ParenConjunction:そして|または

接続詞:そして|または

文:主語の動詞の接頭辞

件名:件名の中置値| 値=>

件名=値SubjectOpt

SubjectOpt=中置値SubjectOpt| イプシロン

動詞:== |!= |> | <

述語:述語中置値| 値=>

Predicate = Value PredicateOpt

PredicateOpt=中置値PredicateOpt| イプシロン

中置:+、-、*、/

複文の私のコードは次のとおりです。

    private string CompoundSentence(IEnumerator<Token> ts)
    {
        //  CompoundSentence = ( CompoundSentence ) PCSopt  | Sentence CSOpt

        string sReturnValue = "";

        switch(ts.Current.Category) {

            case "OPENPAREN":
            {
                     //Skip past the open parenthesis
                ts.MoveNext();

                string sCSValue = CompoundSentence(ts);

                if(ts.Current.Category != "CLOSEPAREN") {

                    sReturnValue = "Missing parenthesis at " + ts.Current.OriginalString;
                    return sError;
                }
                else {

                        //Skip past the close parenthesis
                    ts.MoveNext();  
                }

                sReturnValue = PCSOpt(sCSValue, ts);

                break;
            }
            default:
            {
                string sSentenceVal = Sentence(ts);

                    //sSentenceVal is the truth value -- "TRUE" or "FALSE"
                    //of the initial Sentence component
                    //CSOpt will use that value, along with the particular conjunction
                    //and the value of the current token, 
                    //to generate a new truth value.
                sReturnValue = CSOpt(sSentenceVal, ts);

                break;
            }
        }

        return sReturnValue;
    }

私が言っているように、私はこの分野に不慣れなので、おそらく非常に基本的なことを理解していません。

誰かが私を正しい方向に導くことができれば、私はそれを大いに感謝します。

4

3 に答える 3

1

式の場合、手動でコーディングされた再帰降下パーサーは、非常に簡単にコーディングできます。

再帰降下パーサーの書き方については、私の SO の回答を参照してください。

パーサーの構造を理解したら、式を解析しながら評価するのは非常に簡単です。

于 2012-07-09T23:23:05.887 に答える
0

解析のために従うべき基本的な規則は次のとおりです。

  1. ルールの開始時に、現在のトークンがルールがカバーする最初のトークンである必要があります。

  2. ルールは、それがカバーするすべてのトークンを消費する必要があります。

于 2012-07-09T23:59:03.040 に答える
0

信じられないほど微妙だと思っていましたが、非常に単純であることが判明しました。私のスキャナーは、2 番目の (そしておそらくそれより上の) 閉じ括弧を検出していませんでした。ああ。

助けてくれてありがとう。

Ira、RDP で提供される詳細なヘルプに対するあなたの回答を受け入れます。

于 2012-07-10T00:53:05.027 に答える