LL(0)パーサーとLR(0)パーサーの違いを尋ねる質問をどこかで見ました。 LL(0)パーサーのようなものはありますか?もしそうなら、トークンを見ずにどのように解析しますか?
LL(0)パーサーはトークンを調べますが、どのプロダクションをトークンに適用するかを決定しません。シーケンスがその言語に属しているかどうかを判断するだけです。これは、すべての非終端記号の右側が1つでなければならず、再帰がない可能性があることを意味します。
_G == ID name lastname
name == STRING
lastname == STRING
# lexer rules
# -----------
ID == [0-9]+
STRING == <unicode>+
_
@ 280Z28で述べたように、可変長部分(ID
およびSTRING
)を処理するには、別のレクサーが必要であることに注意してください。そうしないと、文法はLL(0)
になりません。 。
その文法で入力を解析するために適用する一連のプロダクションでは、先読みが不要です。
指定された入力シーケンスの一部が解析された後に適用できるプロダクションが複数ある場合、決定論には先読みが必要です。
理論的には、文法生成言語であり、その点で、あいまいさ(特定のフレーズを導出する方法が複数ある)は問題ありません。構文解析では、唯一無二の方法を持つことは意味論(意味)の方法であり、それが私たちが望んでいることです。
プログラミング言語の構文解析では、先読みは、次に使用する文法生成を知るために必要な情報です。
LL(0)言語では、選択肢がないため、入力シーケンスが受け入れられて解析されるか、拒否されます。
私がコンパイラを取り上げたとき、LL(1)については話しましたが、コンパイラについては話しませんでした。 ウィキペディア にはそれらについての言及はありません。
LL(0)パーサーは、パーサーがストリーム内の次のトークンを知らなくても決定を下すことができることを意味します。そのプロパティを持つ言語が存在する場合、それらはかなりまれであると思います。
LR(k)のkは、先読みトークンの数を示します。実行するアクションを決定するために、常に少なくとも1つのトークンを使用します。 ウィキペディアページ ページには、これに関する詳細情報があります。
直感的には、追加の先読み記号を使用すると、より多くの情報を使用して削減を選択できるため、より大きなクラスの文法を競合することなく表現できます。