質問: 現代の言語はまだパーサージェネレーターを使用していますか? これが出てきたとき、私はwikipediaのgccコンパイラスイートについて調査していた here : gccは、bisonで生成されたlalrパーサーの使用を開始しましたが、次第に手書きの再帰下降パーサーに切り替えました。 2004年のc++、および2006年のcおよびobjective-cの場合。現在、すべてのフロントエンドは手書きの再帰降下パーサーを使用しています。 つまり、その最後の文までに(そして私がwikipediaを信頼している限り)、c(gcc)、c++(g ++)、objective-c、objective-c++、fortran(gfortran)、java(gcj)、ada(gnat)、go(gccgo)、pascal(gpc)、... mercury、modula-2、modula-3、pl/i、d(gdc)、およびvhdl(ghdl ) "はすべて、パーサージェネレーターを使用しなくなったすべてのフロントエンドです。つまり、すべて手書きパーサーを使用しています。私の質問は、この慣習はどこにでもあるのですか?具体的には、[python、swift、ruby、java、scala、ml、haskell]の「xの標準/公式実装には、手書きのパーサーがありますか」に対する正確な答えを探しています。 (実際、他の言語の情報もここで歓迎されます。)たくさんの調査の結果、私は自分でこれを見つけることができると確信しています。しかし、これはコミュニティによって簡単に答えられると確信しています。ありがとう!
回答: パーサージェネレーターとパーサーエンジンは非常に一般的です。一般性の利点は、全体的なスキームにおいて、正確なパーサーをすばやく構築して機能させるのが簡単なことです。パーサーエンジン自体は、その一般性のためにパフォーマンスの面で問題があります。手書きのコードは、常にテーブル駆動のパーサーエンジンよりもはるかに高速です。パーサージェネレーター/エンジンが困難な2番目の領域は、実際のプログラミング言語はすべて状況依存であり、多くの場合非常に微妙な点にあります。 lr言語はコンテキストフリーです。つまり、位置付けと環境について、構文で適切に伝えることができない微妙な点が数多くあります。属性グラマーは、「使用前に宣言する」などの基本的な言語規則に対処しようとします。この状況依存性を手書きのコードに配線するのは簡単です。