5

いくつかの引数の前に置くことができるいくつかの追加のキーワードを使用してCのような言語で記述された関数定義のセットがあり(たとえば、「unsigned」または「register」と同じ方法)、これらの行を分析する必要がありますいくつかの関数スタブと同様に、それらから実際のCコードを生成します。

  • Flex / Yaccがそれを行うための最も適切な方法であるというのは正しいですか?

  • アナライザー/パーサーの経験がまったくない場合、正規表現を使用してシェルまたはPythonスクリプトを作成するよりも遅くなりますか(追加のキーワードの数が多くなり、その効果がかなり異なる場合、これは大きな苦痛になる可能性があります) (私はLALRがその仕事をする方法を知っていますが)?

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

どんな助けでもありがたいです。

4

5 に答える 5

3

ANTLRが一般的に使用されます(Lex \ Yaccも同様です)。

言語認識のための別のツールであるANTLRは、さまざまなターゲット言語のアクションを含む文法記述から認識機能、解釈機能、コンパイラー、および翻訳者を構築するためのフレームワークを提供する言語ツールです。

于 2009-04-27T06:51:13.667 に答える
3

制限の少ない文法を特徴とするLemon Parserもあります。欠点は、レモンと結婚していて、いくつかの制限がひどいことに気付いたときに、パーサーの文法を別のものに書き直すことです。利点は、本当に使いやすく、自己完結型です。ツリーにドロップすることができ、他の存在をチェックすることを心配する必要はありません。

SQLite3は、他のいくつかの一般的なプロジェクトと同様に、これを使用しています。SQLite が使用するから使用すると言っているわけではありませんが、時間が許せば試してみてください。

于 2009-04-27T08:47:03.420 に答える
1

実際、それはあなたの言語がどれほど複雑であるか、そしてそれが本当にCに近いかどうかに依存します...

それでも、正規表現の場合でも、最初のステップとしてlexを使用できます...。

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

ただし、flex/yaccの組み合わせは問題ありません。

通常のバイソン(yaccのgnu実装)の主な問題は、Cタイピングに起因します。ツリー全体(およびすべての操作関数)を記述する必要があります...o'camlを使用すると非常に簡単になります...

于 2009-06-06T01:57:13.310 に答える
1

それは完全に「効果的」の定義に依存します。世界のすべての時間を持っている場合、最速のパーサーは手書きのプル パーサーになります。デバッグと開発には長い時間がかかりますが、現在、ランタイム パフォーマンスの点で手書きコードに勝るパーサー ジェネレーターはありません。

有効な C を 1 週間ほどで解析できるものが必要な場合は、パーサー ジェネレーターを使用してください。コードは十分に高速で、ほとんどのパーサー ジェネレーターには、出発点として使用できる C 用の文法が既に付属しています (よくある間違いの 90% を回避します)。

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

于 2009-04-27T08:38:39.323 に答える
0

あなたがやりたいことには、DMS Software Reengineering Toolkitが非常に効果的なソリューションである可能性があります。

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

DMS は AST の構築を自動化し (何もする必要がないので、使用可能な AST を持つために文法を正しく取得する必要はありません)、指定したパターン指向のインスペクションのカスタム分析の構築を可能にし、新しい C 固有の構築を行うことができます生成するコードを表す AST をコンパイル可能な C ソース テキストとして出力します。DMS 用の C の既存の定義は、C に似た言語をカバーするように曲げられる可能性があります。

于 2010-01-24T11:30:13.067 に答える