5

「実際のコンパイラライター」は、パーサージェネレーターを使用するのではなく、独自の手作りパーサーを作成すると聞いています。また、パーサジェネレータは実際の言語には対応していないと聞きました。おそらく、パーサジェネレータを使用して実装するのが難しい多くの特殊なケースがあります。私はこれについて疑問を持っています:

  1. 理論的には、GLRパーサージェネレーターはほとんどのプログラミング言語の設計を処理できるはずです(おそらくC ++を除く...)
  2. パーサジェネレータを使用するプロダクション言語を少なくとも1つ知っています:Ruby[1]。
  3. 学校でコンパイラーのクラスを受講したとき、パーサージェネレーターを使用しました。

だから私の質問:パーサジェネレータを使用して本番コンパイラを作成することは合理的ですか、それともパーサジェネレータを使用することはコンパイラコミュニティによって不十分な設計決定と見なされていますか?

[1] https://github.com/ruby/ruby/blob/trunk/parse.y

4

3 に答える 3

4

その価値については、GCCは4.0より前のパーサジェネレータを使用しましたが、保守と拡張が簡単だったため、手書きの再帰下降パーサに切り替えました。

パーサジェネレータは「実際の」言語に対して「カット」しますが、文法を実行可能なものに変換するための作業量は指数関数的に増加します。

編集:理由と利点とコスト分析を含む変更の詳細を示すGCCドキュメントへのリンク:http://gcc.gnu.org/wiki/New_C_Parser

于 2011-06-17T16:41:37.113 に答える
1

私は数年間会社で働いていましたが、そこでは多かれ少なかれコンパイラーを書いていました。パフォーマンスにはあまり関心がありませんでした。作業/メンテナンスの量を減らすだけです。これを実現するために、生成されたパーサーと手書きコードの組み合わせを使用しました。理想的なバランスは、パーサジェネレータを使用して簡単で反復的な部分を自動化し、カスタム関数の難しい部分に取り組むことです。

于 2011-06-18T22:31:24.897 に答える
0

パーサーを使用してコードを生成し、後でそのコードを「手動で」変更するなど、両方の方法を組み合わせて使用​​することもあります。

もう1つの方法は、一部のスキャナー(レクサー)およびパーサーツールを使用して、「セマンティックアクション」と呼ばれる文法規則に加えてカスタムコードを追加できるようにすることです。この場合の良い例は、パーサーが一般的な識別子を検出し、いくつかのカスタムコードが、いくつかの特定の識別子をキーワードに変換することです。

編集:「セマンティックアクション」を追加

于 2011-06-17T22:39:15.867 に答える