懸念事項は、ドキュメンテーション/学習可能性、Eclipse の統合、ツール、コミュニティ サポート、およびパフォーマンスです (ほぼこの順序で)。
8 に答える
除外してはならない選択肢がいくつかあります。
- JParsecは、コードから完全にパーサーを構築できるパーサーコンビネーターフレームワークです。
- Scalaのパーサーコンビネーターフレームワークは、同様の懸念に対処します。ただし、Scalaの構文により、これらすべてがはるかに読みやすくなります。
- 次に、JohnMetskerが著書BuildingParsersWithJava用に作成したパーサーコンビネーターフレームワークもあります。図書館がどこにあるのか正確には覚えていませんが、少なくとも過去にはインターネット上で浮かんでいました。これは同じ懸念に対処します。文法とトークンの定義を別の非Javaファイルで定義しないでください。代わりに、それはすべてJavaです。
- Fortress、Sunが長年取り組んできたプログラミング言語は、このツールキットであるRatsに基づいて構築されているようです。あまり情報はありませんが、新しいプログラミング言語に使っているとしたら、面白い機能があると思います。
一般的に、コードジェネレーターの年月は終わったという印象を受けます。私があなたなら、Scalaのパーサーコンビネーターツールキットを使用します。基本的に、ScalaをサポートするIDEはすべて、このパーサーコンビネーターフレームワークも「サポート」します。パフォーマンスは良いです、AFAICT。
ちなみに、ANTLRはEclipseプラグインとしてかなりまともなIDEサポートを持っています(しかし、おそらくIntelliJにも何かがあります-私は覚えていません)。したがって、字句解析器とパーサーを外部で定義するという古典的なアプローチを選択する場合あなたの言語なら、ANTLRがあなたの選択だと思います。これはJava開発者の間で最大のマインドシェアを持ち、ツールのサポートがあり、ANTLRの作者による素晴らしい本があります。他のどのツールキットもそれを主張できるとは思いません。
あなたが言及した懸念に関しては、JavaCCがより良い選択だったと思います。Java 開発者が習得するのはより迅速かつ簡単であり (構文は通常の Java と非常に似ています)、ドキュメントは包括的であり、Eclipse 統合は適切です。
ANTLR はより完全な機能を備えています。レキシング、解析、AST、ツリー変換、およびコード生成など、はるかにすぐに使えるコンパイラ コンパイラです。
JavaCC の場合、これはコンパイラ コンパイラというよりもパーサー ジェネレータです。AST サポートは、JJTree と呼ばれる別のライブラリを通じて提供されます。
最初の概算として、実際に実際に問題になるのは、表記がどれだけ便利で直感的かということです。
そうは言っても、私は ANTLR と JavaCC でプロジェクトを行ったことがあり、ANTLR はほとんどの場合、非常に重いことがわかりました。
JavaCC に対する ANTLR の具体的な利点は、Java 以外の言語用のジェネレーターがあることです。これにより、言語を他の場所に移植するのがずっと簡単になるかもしれません。
上記の2番目のjamesh。
ANTLRは、より完全な機能を備えています。これは、字句解析、解析、AST、ツリー変換、コード生成など、すぐに使用できるコンパイラコンパイラです。
JavaCCの場合、これはコンパイラコンパイラよりもはるかにパーサジェネレータです。ASTサポートは、JJTreeと呼ばれる別のライブラリを介して提供されます。
私の個人的な経験から、ANTLRを使用すると、ルール間やすべてのサブルールを介してパラメーターを渡すなど、さらに多くのことができます。これは、C#のパーサーのような複雑なパーサーを作成するときに非常に役立ちます。また、ルールの書き直しも古典的です。理想的なASTを簡単にフォーマットするのに役立ちます。
しかし、それは本当に重いです。単純なプロジェクトの場合、おそらくこれらの機能を使用することはありません。Javaccの方がクールです。
私はしばらくパーサー ジェネレーターを使用していませんでしたが、数年前にパーサー ジェネレーターに興味を持ったとき、 SableCCが一番好きだったことを覚えています。オブジェクト指向のパーサー生成に関して、いくつかの興味深いアイデアが実装されています。
Maple や MuPAD などの CAS 言語用のコンパイラを SableCC で作成して、この単一の言語を Maxima (CAS-Capacity 用) と LaTeX (表示用) に変換しました。SableCC の AST は厳密なオブジェクト指向であり、それを拡張して差分言語を生成するのは簡単です。ある言語を他の複数の言語にコンパイルしたい場合は、試してみてください。