3

コンパイラの構築において、主なあいまいさの問題の1つは、他の問題がぶら下がっていることです。Aho、Lam、Sethi、およびUllmanによるCompilers:Principles、Techniques、and Toolsの本で述べられているように、他のぶら下がりの文法はLL(1)パーサーでは使用できません。

LL(1)として扱えないというのは本当ですか?

4

1 に答える 1

4

確かに、LL(k)またはLALR(k)によって純粋な形式で解析することはできません。問題は、ぶら下がっている他の2つの可能な解釈があるということです。そのあいまいさの問題(「else」は最も近い「if」に属するか、属さない)。

それは通常、2つの解釈のうちの1つだけを主張することによって治癒されます。たとえば、「elseは最も近いifに属します」。

多くのパーサジェネレータは、これを「偶然に」取得する可能性があります。LLを使用した解決策は、機能する最初の解析を受け入れ、最初に「elseattachtoclosest」を試行することです。LRの解決策は、「shift on else」です。これは、「reduce」アクションの前に「shift」アクションをチェックするだけで簡単に発生します。

これは、GLRなどのあいまいな解析を実際に取得するパーサーでのみ問題になります。ここでは、「他のシフト」などの文法外のヒントを提供できます。

于 2012-04-13T23:32:47.587 に答える