1. ホーム
  2. c++

[解決済み] なぜC++はLR(1)パーサーでパースできないのか?

2022-04-27 21:50:05

質問

パーサーとパーサー ジェネレーターについて読んでいたところ、wikipedia の LR parsing - page でこの記述を見つけました。

<ブロッククオート

多くのプログラミング言語は、LRパーサーのいくつかのバリエーションを使用して解析することができます。注目すべき例外は C++ です。

なぜそうなのでしょうか?C++のどのような特性が、LRパーサーでの解析を不可能にしているのでしょうか?

googleで調べたところ、C言語はLR(1)で完璧にパースできるのに、C++はLR(∞)が必要ということだけわかりました。

どのように解決するのですか?

に興味深いスレッドがあります。 究極のラムダ を議論しています。 C++のためのLALR文法 .

へのリンクが含まれています。 博士論文 には、C++のパースに関する議論が含まれており、その中で次のように述べられています。

C++の文法は曖昧である。 コンテキストに依存し、潜在的に を解決するために、無限のルックヘッドが必要です。 ある種の曖昧さ" 。

さらに、いくつかの例を挙げている(pdfの147ページ参照)。

その例とは

int(x), y, *const z;

意味

int x;
int y;
int *const z;

と比較してください。

int(x), y, new int;

意味

(int(x)), (y), (new int));

(カンマで区切られた式)を使用します。

2つのトークン列は、最初の部分配列は同じだが、最後の要素に依存する解析木が異なる。曖昧さ回避のためのトークンの前には、任意の数のトークンが存在する可能性があります。