E -> E+E|E*E|(E)|a
文法が与えられた場合、文法を LL(1) 形式に変換するにはどうすればよいですか?
E->aX|(E)
X->+E|*E|epsilon
これは LL(1) 文法ですか?
E -> E+E|E*E|(E)|a
文法が与えられた場合、文法を LL(1) 形式に変換するにはどうすればよいですか?
E->aX|(E)
X->+E|*E|epsilon
これは LL(1) 文法ですか?
元の文法は再帰的に残されているため、LL(1) ではなく、実際には任意の k に対して LL(k) ではありません。
幸いなことに、左再帰は削除できます。標準アルゴリズムは、直接左再帰 (ここにあるように) と間接左再帰を別々に処理することによってこれを行います。即時左再帰は、2 つのうちの単純なケースです。ウィキペディアの記事では、ここで説明しています。
基本的に、再帰参照に続く部分を新しいプロダクション (テール) に移動します。これにはε
代替手段もあります。
X -> ε|+E|*E
次に、元のプロダクションから左の再帰的代替を削除しX
、残りのすべての非再帰的代替を追跡できるようにします。
E -> (E)X|aX
あなたの提案はX
、括弧で囲まれた表現に従わないため、同じ言語を認識しないことに注意してください。