2016-03-26 10 views
1

この言葉では、私はコンパイラのコースを持っており、現在文法 - 異なる文法とパーサーのタイプを研究しています。私は私が正確に把握することができない問題に遭遇した、または少なくとも私が正しくそれをやっていることを確認することはできません。私はすでに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ので、あなたの仕事の要件にも注意を払う:

+0

あなたが書き込んだ内容を再確認できますか?私は論理に従おうとしていますが、右からC以外の場所にはCがありません。あなたが何か他のものを書こうと思ったのですが –

+1

が更新されました:http://nopaste.linux-dev.org/?1021470 –

+0

ありがとう!私はいくつかのコーナーケースでこの文法をテストしようとしますが、一見では大丈夫ですが、マイナスの周りの修正を気付くこともできます。 –

答えて

1

はここに追記したようにあなたのケース

E = E+A | E-A | A 
A = A*C | A/C | C 
C = C^B | B 
B = -B | D 
D = (E) | id | num 

のために働くべきものです。

+0

私はコメントで言ったように私はそれをテストします。ありがとう!ところで、なぜあなたは優先順位を考えてそれをしますか?私は、ほとんどの言語では優先順位が高いことを見てきましたが、Excelや他のプログラムのような例外は覚えていません。しかし、オペレータとしての電力をサポートするプログラミング言語を考えてみると、私が読んだところでは、最も優先度の高い電力を考えてください。 –

+0

@LukaBulatovic私はそれがあなたの特定の問題に本当に沸騰していると思います。私は小さな[メモ](https ://en.wikipedia.org/wiki/Memorandum) –

+0

これらの優先順位を交換するための変更は何ですか? –

関連する問題