2009-03-23 12 views
4

こんにちは私は自分の「パーサー」を作っています。たとえば、コンピューティング(4 +(3-4^2))* 2または java、jsf、htmlコードを解析しています。java/jsfコード用に独自のパーサーを作成するにはどうすればよいですか?

実際、このようなことをしましたが、良くないと感じています。

いいですか?私はもっ​​と読むことを試みましたが、私は少し混乱しています、LL、LR、AST、BNF、javacc yaccなど:)私は...

私は4 +を計算したい場合は、行くためにどの方法かわからないか、私は、java、JSFコードを解析し、このから何か(他のJavaコード)

を生成したい場合

astのように一般的に何か良いことはありますか?私は両方のために使うことができますか?

ありがとうございます。

答えて

2

他のものより前には、構文解析に関するすべてが文法に基づいていることを理解する必要があります。

文法では、基本単位でテキストを分解する方法と、それらの単位をいくつかの意味で十分に積み重ねる方法の観点から、実装したい言語を記述します。 トークン,非端末端末の概念を探すこともできます。

LLとLRの違いは、実装の違いと文法の違いによって異なります。標準ツールを使用する場合は、2番目の部分だけを理解する必要があります。

私は通常、LL(トップダウン)文法を使用します。これらは、カスタムコードを使用しても簡単に記述して実装できます。 LR文法は理論的にはより多くの種類の言語をカバーしますが、通常の状況では、正しいエラー検出が必要なときには障害になります。

いくつかのランダムなポインタ:

  • JavaCCの(javaの、LL)、
  • ANTLR(javaの、LL)、
  • YEPP(smarteiffel、LL)、
  • bison(C、LR、由緒のあるGNU版yacc
+0

ANTLRは決してLRではありません。 v3はLL(*)であり、v2はLL(k)であり、v1は古すぎて考えることさえできない。 –

+0

oops-申し訳ありませんが、私のミス – cadrian

1

パーサーはかなり書くことができます。標準的なツールは、文法の場合はbisonまたはyacc、構文の場合はflexです。これらはすべてCまたはC++の出力コードです。

1

ANTLRは、おそらくJavaのために行く方法です。少し激しいですが、この本は明らかに非常に良い(私はオンラインドキュメントに苦労しています)。

lex/yacc(またはflex/bison)はCの標準ですが、特にこれらの組み合わせのいずれかを推奨しませんが(ちょっとした学習曲線、少し年齢を示しています) 。

Pythonには利用可能なパーサー(SimpleParse、Yapps)があります。また、Ruby用のTreeTopもあります。開発者はあなたの質問と同じように簡単な計算を行うデモもありますが、LALRパーサーが達成することができます。

0

http://antlr.org/をチェックしてください。 Javaコードを出力します。私が思い出すと、彼らのサンプルの1つはあなたの望むものとほとんど同じです。

1

ANTLRですが、The Definitive ANTLR Referenceを必ず読んでください。これにより、パーサーの作成方法がわかります。 ANTLRはトップダウンのLLパーサを使用しているので、LALRやその他のタイプは扱いません。

JavaCC、Yaccは、より伝統的なレクサー/パーサージェネレータであり、それらはもう少し原始的で学習曲線が急であることがわかります。 ANTLRも同様に強力ですが、一度にすべてを学ぶ必要はありません。ウィキペディアには包括的なcomparison of parser generatorsがあります。

BNFは、文法を指定する構文です。 ANTLRは独自のものを使用していますが、私はより美的に見えますが、他の人はしばしばそうではありません。

0

レクサーとパーサーを生成するツールを使用するのは、自分自身をゼロから作成するよりもはるかに簡単です。

すでにリストされているものに加えて、JLexCUPを使用すると、算術式などの簡単なインタープリタを簡単に作成できます。

+0

またはまだ維持されているJFlex(http://jflex.de)。 –

1

学習の練習問題であれば、トップダウンパーサーから始めてみてください。簡単に書くことができ、他のツールを含めたり学習する必要はありません。おそらく、ウィキペディアやコードプロジェクトの基礎を研究するのに最適な場所です。

関連する問題