質問

なぜLL(k)とLL(∞)が左の回復と互換性がないのですか? LL(k)言語は、K-overaheadトークンであいまいさを解決できることを条件に、左からの再調査をサポートできることを理解しています。しかし、LL(∞)文法では、どのタイプの曖昧さを解決できませんか?

役に立ちましたか?

解決

$ ll $バリアントが残した再帰で持っている問題は、$ ll $の仕組みに固有のものです。これは、トップダウンタイプのパーサーであり、非末端を作品に置き換えます。

$ ll $スタイルのパーサーは次のように機能します。一度に入力を左から右に横断します。入力のある時点にいる場合、このポイントの左側のすべてが問題ないことがわかります。この点の右側にあるすべてのために、パーサーは次に見られると予想されるものの「近似」を構築しました。たとえば、この文法を考えてみましょう。

1:$ e to e + e $
2:$ e to x $

文法は$ ll $ではありませんが、それでも$ ll $スタイルで入力を解析できることに注意してください。入力$ x+x+x $では、$ ll $スタイルのパーサーが位置$ x+ bullet x+x $になります。左の部分である$ x+$が問題ないことを決定したと仮定しましょう。残りの入力では、$ x+e $が表示されると予想されます。その後、$ x+x+$が問題であり、$ e $が残っていることがわかります。その後、この$ e $を生産、特に上記の生産2に置き換えることができます。 $ x $が残っていると、パーサーは入力を受け入れます。

トリックは、特定の非ターミナルの交換生産を正しく決定することです。文法は、次の$ k $入力記号を見るだけでこれを行うことができる場合、$ ll(k)$であり、より強力な他の手法が知られています。

次に、次の文法を検討してください。

1:$ a to a $
2:$ a to varepsilon $

$ ll $パーサーが生産によって$ a $を置き換えようとする場合、生産1と2の間で決定する必要があります。

パーサーが全知であった場合、適切な行動方針がどうなるか考えてみましょう。生産1に$ a $を置き換えるたびに、残りの入力に対して予想されるものに$ a $を「追加」します(予想される残りは$ a $ aa $に$ aaa $ ...になります)、しかし、最初の$ a $は消えません。最終的には、生産2を選択する必要があります。その後、$ A $が消え、期待に$ A $ sを再び追加することはできません。

さらにいくつかの入力シンボルを一致させる機会はないため、パーサーは、生産1を一致させる回数を正確に入力位置で決定する必要があります。これは、私たちの場合、$ A $がこの時点で残りの入力に表示される回数を正確に知る必要があることを意味します。

ただし、$ ll(k)$は先に$ k $記号のみを見ることができます。これは、生産1を$ k $を超えて選択する必要がある場合、パーサーはこれを「見る」ことができないため、失敗する運命にあることを意味します。 $ ll(*)$は$ ll(k)$よりも解析に優れています。これは、入力で任意にはるかに先を見ることができるためですが、重要な詳細(常に言及されているわけではない)は、このLookaheadは 通常.

何が起こるかを想像するために、アルゴリズムを次のように表示できます。どのような生産を取得するかを決定する必要がある場合、有限状態マシン(DFA、これは正規表現と同等です)を起動し、このマシンが入力の残り。このマシンは、「この生産を使用する」と報告できます。ただし、このマシンは、できることは厳しく制限されています。次の$ k $シンボルのみを見るよりも厳密に優れていますが、たとえば「カウント」ではありません。つまり、上記の状況では役立ちません。

この有限のオートマトンでカウント機能で「ハック」したとしても、実際にさらにパワーが必要な左再帰的な文法があります。たとえば、この文法のために:

$ a to ab $
$ a to varepsilon $
$ b to(b)$
$ b to varepsilon $

一致するブレースの「タワー」を一致させる必要があります。これは、有限のオートマトンではできないことです。さらに悪いことに:

$ a to bcade $
$ a to a '$
$ a ' to a' de $
$ a ' to varepsilon $
$ b to a b a mid b b b mid aa mid bb $
$ c to c c c mid d c d mid cc mid dd $
$ d to e d e mid f d f mid ee mid ff $
$ e to g e g mid h e h mid gg mid hh $

完全にひどい文法であり、これは既知の線形時間解析アルゴリズムの動作がなく、すべての既知の一般的な解析アルゴリズムが二次時間をとることはかなり確かです。さらに悪いことに、この言語を説明する文法は必然的に左再帰的です。ただし、文法はまだ明確です。これらのモンスターを線形時間に解析するには、手作りのパーサーが必要です。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top