6

私は 2 つの言語間の翻訳を書きたいと思っており、インターネットでいくつか読んだ後、ANTLR を使用することにしました。私はそれを一から学ばなければなりませんでしたが、左再帰を排除することでいくつかのトラブルを除けば、今まではすべてうまくいきました.

しかし、今日、Haskell ベースのパーサー ジェネレーターである Happy を調べるように言われた人がいました。私は Haskell の知識がないので、Happy が実際に ANTLR よりも優れているかどうか、そしてそれを学ぶ価値があるかどうか、いくつかのアドバイスを使用できます。

特に気になるのは、翻訳者がマクロ置換をサポートする必要があることです。これは、ANTLR で行う方法がまだわかりません。Happyの方がやりやすいかも?

または、他のパーサー ジェネレーターの方が優れていると思われる場合は、それらについてお知らせいただければ幸いです。

4

1 に答える 1

6

人々は、パーサーを手に入れれば、言語ツールを構築するときにそれを作成したと信じ続けています。それは間違っています。パーサーがヒマラヤのふもとに連れて行ってくれるので、 真剣に登り始める必要があります。

言語トランスレータを構築するための非常に強力なサポートが必要な場合は、 DMS ソフトウェア リエンジニアリング ツールキットを参照してください。DMS が提供する

  • Unicode ベースのレクサー
  • 完全な文脈自由パーサー (左再帰? 問題ありません! 任意の先読み? 問題ありません。あいまいな文法? 問題ありません)
  • C、C#、COBOL、Java、C++、JavaScript などの完全なフロント エンド (C および C++ の完全なプリプロセッサを含む)
  • AST の自動構築
  • 任意のスコープ規則を使用したシンボル テーブルの構築のサポート
  • ツリー構造を活用するアナライザーを構築するための属性文法評価
  • 制御およびデータフロー分析のサポート (完全な C、Java、および COBOL に対するこれの実現も)、
  • ソースとターゲット言語の構文を使用したソースからソースへの変換
  • AST からソース コードへのプリティプリンティング、ターゲット言語のテキストの再現

マクロを処理する OP の要求について: C、COBOL、および C++ のフロント エンドは、a) 完全展開の従来の方法、または b) マクロ自体の解析後の変換を可能にする非展開 (実用的な場合) によって、それぞれの言語の前処理を処理します。 . 基盤としての DMS はマクロ処理を具体的に実装していませんが、マクロ処理の構築と変換をサポートできます。

DMS で構築されたトランスレータの例として 、B-2 爆撃機用に JOVIAL を C に変換する議論を参照してください。これは、1 MSLOC を超えるハード リアルタイム コードの 100% 変換です。[実際のプログラムが翻訳されているのを見ることは決して許されなかったことを知っておくと面白いかもしれません (極秘)]. はい、JOVIAL にはプリプロセッサがあり、ほとんどの JOVIAL マクロを同等の C バージョンに変換しました。

[Haskell はクールなプログラミング言語ですが、それだけではこのようなことはできません。これは言語で表現できることではありません。プログラムを操作するタスクをサポートするために必要な機械を見つけ出し、それを構築するのに 100 人年を費やします。]

于 2009-09-03T02:46:11.667 に答える