私は文法と構文解析の分野に不慣れです。
次のような文字列を評価する再帰下降パーサーを作成しようとしています。
((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;
}
私が言っているように、私はこの分野に不慣れなので、おそらく非常に基本的なことを理解していません。
誰かが私を正しい方向に導くことができれば、私はそれを大いに感謝します。