この言葉では、私はコンパイラのコースを持っており、現在文法 - 異なる文法とパーサーのタイプを研究しています。私は私が正確に把握することができない問題に遭遇した、または少なくとも私が正しくそれをやっていることを確認することはできません。私はすでに2回の試みを行い、反例が見つかった。 算術式のあいまいな文法があります: E→E + E | E-E | E * E | E/E | E^E | -E | (E)| id |ここで、^は力を表す。与えられたあいまいな算術式文法を明白なものに変換するLL(1)
私は優先事項を理解する必要がありました。最も優先度の高いものはカッコで、その後にパワーが続き、単項マイナスが続き、続いて乗算と除算が行われ、加算と減算が行われます。私はこれを相当のLL(1)文法に変換するように求められます。だから私はこれを書いた:
- E→E + A | E-A | A
- A→A * B | A/B | B
- B→-C | C
- C→D^C | D
- D→(E)| id |それは非曖昧だが、これに伴う問題のようです何NUM
は、最初のものと同等文法ではありません。例:与えられた文法は入力を認識できます:--5私の文法はできません。すべてのケースをカバーしていることを確認するにはどうすればよいですか?与えられた文法と同等になるように私の文法をどのように変更すればよいですか?前もって感謝します。
編集:もちろん、私はもちろん、左の再帰を排除し、このLL(1)を作るために分解することができますが、最初に私が上で尋ねたこの主要部分を理解する必要があります。電源二項演算子に対して、単項マイナス演算子に高い優先順位を割り当てることができますsome applicationsので、あなたの仕事の要件にも注意を払う:
あなたが書き込んだ内容を再確認できますか?私は論理に従おうとしていますが、右からC以外の場所にはCがありません。あなたが何か他のものを書こうと思ったのですが –
が更新されました:http://nopaste.linux-dev.org/?1021470 –
ありがとう!私はいくつかのコーナーケースでこの文法をテストしようとしますが、一見では大丈夫ですが、マイナスの周りの修正を気付くこともできます。 –