GCCがC ++とCのバイソンから再帰的降下パーサーに切り替えたのはなぜですか?


10

それを必要とする言語変更、またはバイソンがもはや適切または最適ではなくなったいくつかの実際的な理由はありましたか?

私は上を見ウィキペディア彼らが参照し、切り替えることGCC 3.4GCC 4.1のリリースノート。

これらのリリースノートには次のように記載されています。

手書きの再帰降下C ++パーサーは、以前のGCCリリースからのYACC派生のC ++パーサーに取って代わりました。新しいパーサーには、C ++ソースコードのより適切な解析、拡張機能の処理、適切なセマンティクス分析と解析の間の(可能な場合は)明確な分離に必要な、大幅に改善されたインフラストラクチャが含まれています。新しいパーサーは、古いパーサーで見つかった多くのバグを修正します。

そして:

古いBisonベースのCおよびObjective-Cパーサーは、新しい、より高速な手書きの再帰下降パーサーに置き換えられました

私が知りたいのは、彼らが抱えていた実際の問題と、Bisonを使用して解決することが不可能/非実用的である理由です。


1
パーサージェネレーターが要件を処理できない場合、最終的にすべてのパーサーは十分な変更を行った後に自作になります
ラチェットフリーク

1
あなたの研究を共有することはすべての人を助けます。何を試したか、なぜそれがニーズを満たしていないかを教えてください。これは、時間をかけて自分自身を助けようとしたことを示しており、明白な答えを繰り返すことから私たちを救い、そして何よりも、より具体的で関連性のある答えを得るのに役立ちます。参照してください掲載する方法
GNAT

1
@gnat質問を広げました
neelsg

1
C ++は、他のほとんどのプログラミング言語と比較して、解析が非常に複雑な言語です。私の直感は、汎用パーサーがおそらく自家製のパーサーが使用できる特定の最適化をサポートできなかったことです。

回答:


16

ここで説明したよう、再帰降下法を使用するとエラーメッセージがより意味を持つため、GCCは手書きの解析に切り替えまし

また、C ++は、構文解析的にこのような(構文的に)複雑な言語になりつつあり、パーサージェネレーターを使用する価値はありません。

最後に、実際のコンパイラーの作業の大部分は解析ではなく、最適化しています。GCCミドルエンドの最適化パスは、解析よりもはるかに複雑です。

(ところで、たとえばプラグインやMELTを使用してGCCをカスタマイズできますが、それが受け入れる言語の構文を実際に拡張することはできません-属性とプラグマを追加することを除きます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.