質問

次のことを行うJava用のパーサージェネレーターを探しています。私の言語プロジェクトは非常に単純で、トークンの小さなセットのみが含まれています。

変更できるように純粋なREADABLE Javaコードで出力します(これがANTLRを使用しない理由です) 少なくともJava 1.4で実行および動作する成熟したライブラリ

次の項目を確認しましたが、動作する可能性があります:JavaCC、jlex、Ragel?

役に立ちましたか?

解決

ラットを使用する必要があります...このように、レクサーとパーサーを分離する必要はありません。プロジェクトを拡張したい場合は簡単です。それはJavaであり、JavaでASTを処理できます...

他のヒント

おそらく、パーサー generators ではなくパーサー combinators を探していますか? このペーパーおよび JParsec

生成されたパーサーコードを編集するのは非常に悪い考えです。文法ファイルを編集してから再コンパイルする方がはるかに簡単です。教育目的でそれを行っていない限り、その場合、ANTLRはそのような強力なパーサージェネレーターのための非常に読みやすいコードを生成することを誇りにしています。

SableCC で良い経験をしました。

(継承を介して)拡張するAST / Visitorモデルが提供されるという点で、ほとんどのジェネレーターとは異なります。

「品質」についてコメントできないコードの読みやすさの点では(使用してからしばらく経ちましたが)、コードをまったく読む必要のない品質を備えています。サブクラスのコードだけ。

たぶん ANTLR があなたのためにそれを行います。優れた書籍がドキュメントに用意されている、優れたパーサージェネレーターです。

>

SableCC をご覧ください。 Sableccは、アクションコードを混在させることなく、言語の文法をEBNFとして受け入れ、ツリーノードビジターを使用して横断できる構文ツリーを生成するJavaパーサーを生成する、使いやすいパーサージェネレーターです。 SableCCは強力ですが、ANTLR、JavaCC、yaccなどよりもはるかに簡単に使用できます。また、別個のレクサーも必要ありません。言語プロセッサの構築とは、文法から生成されたビジタークラスを拡張し、構文解析構文がパーサーによって検出されたときに呼び出されるメソッドをオーバーライドすることです。文法ルールXYZごとに、訪問者はパーサーがルールに一致したときに呼び出されるメソッドinAXYZ(Node xyz).... outAXYZ(Node xyz)を持ちます。

単純な言語の場合、 JFlex で十分です。 JLexに似ていますが、高速(読みにくいこともありますが、見たことがないJLexの出力)。

これはパーサーではなくレクサーですが、ビルドで簡単にインターフェイスできます CUP または BYacc / J 。繰り返しますが、単純な言語の場合は、独自のパーサーを作成する方が簡単な場合があります(以前にこれを実行しました)。

私たちはJavaCCを(かなり小さな言語でも)使用しており、満足しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top