誰かが言語の実装に両方を使用し、長所と短所を指摘してそれらを比較できますか? AST Walker コード生成をサポートする RAD ツールを探しています。SableCC は LALR であるため、「左再帰」をサポートしますが、ANTLR は LL(*) です。これは典型的な文法や DSL にとって重要ですか? ドメイン固有の分析も実行する必要があります。(私のコンパイラのターゲット言語は OpenCL C になります)。これは学生のプロジェクトのためのものなので、言語のフロントエンドを実装するという退屈な側面で多くの時間を無駄にしないことが重要です。
1 に答える
ANTLR については多くを語ることはできませんが、SableCC についての情報があるかもしれません。
デザイン
生成されたコードと手書きのコードが訪問者パターンを使用してきれいに分離されるパーサーを生成し、具象構文ツリーから抽象構文ツリーへの変換を統合します。その結果、パーサーが入力を正しく解析した後、設計者は AST を取得でき、ツリーをたどって対応するノードでアクションを実行できます。
設計者はまず自分の文法を書いてデバッグし、具象構文木から抽象構文木への変換を最適化しようとします。しっかりした AST を取得した後、別のクラスでアクション コードを記述できます。そのため、デザイナーは文法を 1 回だけ記述し、文法に対してより多くのタイプのアクションを記述できます。たとえば、構文ハイライト用に 1 回、セマンティック分析とコード ジェネレーター用に 1 回などです。私は生産システムでそれを行いました。それは非常にうまく機能します。
ANTLR を使用すると、設計者は、AST を生成する文法にアクション コードを追加して AST ツリーを構築し、それを別の方法で再利用できます。しかし、生成されたコードと手書きのコードの間に明確な分離はありません。
もう 1 つの側面は、IDE のサポートかもしれません。SableCC ではコードが分離されているため、IDE のオートコンプリート機能を簡単に使用できます。
文法
SableCC は LR(1) パーサー ジェネレーターであるため、LL(k) パーサー ジェネレーターである ANTLR の文法を記述する方が IMO より簡単です (トリックなし)。私は(確信が持てませんが)SableCCが唯一のLR(1)Javaパーサージェネレーターであり、非常に人気があると思います。
出力パーサー
ANTLR は多くの言語でパーサーを生成できますが、SableCC は Java (メインストリーム) でのみパーサーを生成できます。他の言語でパーサーを生成するためのプラグイン/アダプターがありますが、著者 (http://www.mare.ee/indrek/sablecc/) によると、それらは古すぎます。SableCC 4 はさらに生成できますが、ベータ版であるため、本格的なプロジェクトにはお勧めできません。
開発支援
ANTLR は、文法を書くための IDE を備えています。視覚的な文法、ソース内のナビゲート(トークンの定義やプロダクションへのジャンプなど)ができるANTLRWorksです。SableCC にはそのようなツールはありません。VIM 用の原始的な Syntax Highlight スクリプトと、Netbeans 用の貧弱な機能プラグインがあります。
結論
IMO 大規模なプロジェクトで、長期のメンテナンスが必要な場合は、SableCC が ANTLR よりも適していると思います。
Martin Fowler が SableCC に関する有益な情報を提供しています。ここで見つけることができます。 http://martinfowler.com/bliki/HelloSablecc.html