2009-04-27 4 views
5

いくつかの引数の前に置くことができるいくつかの追加のキーワード(例えば、 "署名されていない"または "登録"と同じ方法)を使用して、Cのような言語で書かれた関数定義があります。これらの行だけでなく、いくつかの関数スタブを生成し、実際のCコードを生成します。Cのような定義文字列を解析する最も効果的な方法は?

  • Flex/Yaccが最適な方法ですか?

  • regexpsを使ってシェルスクリプトやPythonスクリプトを書くよりも遅くなるでしょう(追加キーワードの数が増え、その効果がかなり異なる場合、大きな苦痛になるかもしれません)アナライザー/パーサーの経験(私はLALRがどのように仕事をしているのか知っていますが)?

  • 同様の問題をカバーするLex/Yaccの資料はありますか?私が見つけることができるすべての論文は、 "おもちゃ"計算機の同じ原始的な例を使用しています。

助けてください。

答えて

3

ANTLR(Lex \ Yaccのように)が一般的に使用されます。

ANTLR、言語 認識のための別のツールは、 は、ターゲット言語の 様々なアクションを含む文法 記述から 認識装置、通訳、コンパイラ、 や翻訳を構築するためのフレームワークを提供言語ツールです。

+2

あなたのビジョンは... – LB40

+0

@Mitch小麦私は考えて少し制限的である:私は、彼はANTLRはレックス\ Yaccのを取っについてコメントを参照していると信じています。 –

+0

ANTLRはレックス/ Yaccの "代わら" されていません。実行可能な代替手段であることが証明されています。 LALRの解析は、長時間の撮影では死んでいません。 –

1

これは「有効」という定義に完全に依存します。あなたが世界のすべての時間を持っているなら、最も速いパーサーは手書きのパーサーです。彼らはデバッグと開発に長い時間がかかりますが、今日、パーサージェネレータは、実行時のパフォーマンスの面で手書きのコードに勝るものはありません。

1週間ほどで有効なCを解析できるものが必要な場合は、パーサージェネレータを使用してください。コードは十分に速く、ほとんどのパーサジェネレータにはCのための文法が用意されています(これは一般的な間違いの90%を避けています)。

regexpsは再帰構造の解析には適していないことに注意してください。このアプローチは、ジェネレータを使用するよりも遅く、手書きのプル・パーサよりもエラーが発生しやすくなります。

+0

と最後の10%があるため、Cのコンテキスト感度の別の年間行くことができます。 GNUの人に尋ねる。 –

3

Lemon Parserもあり、制限の少ない文法があります。欠点は、あなたがレモンに結婚していることです。いくつかの制限があることを発見すると、パーサの文法を何かに書き直します。上の方は本当に使いやすく、自己完結型です。あなたはそれを木に落とすことができ、他人の存在を確認することを心配する必要はありません。

SQLite3は、他の人気プロジェクトと同様に使用します。私はSQLiteがそうしているのでそれを使うと言っているわけではありませんが、時間が許せば試してみてください。

1

実際に、それはまだ、あなたも、正規表現のための最初のステップとしてのlexを使用することができ

...どのように複雑な言語であり、それがCには本当に近いですかどうかによって異なり....

私はlex + menhirとo'camlに行きます....

が、どのフレックス/ yaccの組み合わせは大丈夫だろう。..

定期バイソン(YACCのGNU実装)との主な問題は、Cタイピングから茎..あなたは、あなたのツリー全体を記述する必要がある(およびすべての操作機能)... o'camlを使用することは本当に簡単です...

-1

私たちのDMS Software Reengineering Toolkitは非常に効果的な解決策です。

DMSは、顧客・アナライザ/あなたが議論されているタイプのコードジェネレータをサポートするために特別に設計されています。これは、(C、C++、Javaの、C#、およびCOBOLのいくつかの完全な方言を含め、実際の言語30+上でテスト)、任意の言語のパーサ/アナライザを定義するための非常に強力な機能を提供します。

DMSは、ASTの構築を自動化します(つまり、文法を使用してASTを使用できるようにする必要はありません)。指定したパターン指向の検査のカスタム解析を構築できます。生成するコードを表す新しいC固有のASTをコンパイル可能なCソーステキストとして吐き出します。 DMSのためのCの既存の定義は、あなたのCのような言語をカバーするように曲がっている可能性があります。

+2

これは、あなたが現金の負荷を取り除く必要がある製品のための恥知らずのプラグ/プロモーションのように思えます....面白い、あなたはここでまったく同じことを言及している... http://stackoverflow.com/questions/526797/作成するための良いツール - パーパーサ - アナライザこれは商用ソフトウェアを促進するのではなく、質問をプログラミングするための場所です。 – t0mm13b

+0

質問は "これを行うには最高の方法"でした。回答には、合理的に役立つ、商業的な、またはそうでないソフトウェアが含まれていなければなりません。私は質問のまさにこの種に対応するために15年以上前にこの答えをconcievedので、はい、私は、偏ったです。 –

関連する問題