web-dev-qa-db-ja.com

C / C ++パーサー/アナライザーを作成するための優れたツール

C/C++コードの解析と分析をすばやく開始するための優れたツールは何ですか?

特に、C/C++プリプロセッサと言語を処理するオープンソースツールを探しています。これらのツールは、文法にLex/yacc(またはflex/bison)を使用し、複雑すぎないことが望ましいです。最新のANSI C/C++定義を処理する必要があります。

ここに私がこれまでに見つけたものがありますが、それらを詳細に検討していません(思考?):

  • CScope -昔ながらのCアナライザー。ただし、完全な解析は行わないようです。 C関数を見つけるための栄光の「grep」として説明されています。
  • [〜#〜] gcc [〜#〜] -みんなのお気に入りのオープンソースコンパイラ。非常に複雑ですが、それをすべて行うようです。 [〜#〜] gem [〜#〜] と呼ばれるGCC拡張機能を作成するための関連プロジェクトがありますが、GCC 4.1(2006)以降は更新されていません。
  • [〜#〜] puma [〜#〜] -PUre MAnipulator。 (ページから:「このプロジェクトの目的は、C/C++ソースの分析および操作用のクラスのライブラリを提供することです。この目的のために、PUMAは、C/C++ソースのスキャン、解析、および操作用のクラスを提供します。」) 。これは有望に見えますが、2001年以降更新されていません。明らかにPUMAは AspectC++ に組み込まれていますが、このプロジェクトでさえ2006年以降更新されていません。
  • さまざまなC/C++生文法。 c-c ++-grammars-1.2.tar.gz を取得できますが、これは1997年以降メンテナンスされていません。少しのGoogle検索で、出発点となる他の基本的なLex/yacc文法が検索されます。
  • 他のもの?

これを、C/C++ソースを新しいおもちゃの言語に翻訳するための出発点として使用したいと思っています。

ありがとう! -マット

(2/9を追加):明確化:C/C++コード自体に加えて、プリプロセッサからセマンティック情報を抽出したい。 「#define foo 42」が整数「42」に消えないようにしたいのですが、名前「foo」にアタッチされたままです。残念ながら、これはプリプロセッサを最初に実行し、C/C++解析ツリーのみを配信するいくつかのソリューションを除外します)

50
Matt Ball

文法が決定できないため、C++の解析は非常に困難です。引用するには Yossi Kreinin

非常に複雑な文法

すべての一般的な言語context-free (または「ほぼ」文脈自由)の文法を持っているのに対し、C++は 決定不能な 文法。コンパイラとパーサーが好きなら、おそらくこれが何を意味するか知っているでしょう。この種のことに興味がない場合は、C++の解析に関する問題を示す 単純な例 があります:AA BB(CC);はオブジェクト定義または関数宣言ですか?答えはコードに大きく依存していることがわかりますbeforeステートメント-"コンテキスト"。これは、C++の文法が非常にコンテキスト依存であることを(直感的なレベルで)示しています。

35
Adam Rosenfield

Llvmを使用して解析する clang を見ることができます。

今すぐC++を完全にサポート link

21
epatel

[〜#〜] antlr [〜#〜] パーサージェネレーターには、C/C++およびプリプロセッサー用の grammar があります。私は一度も使ったことがないので、C++の構文解析がどれほど完全になるかは言えません。 ANTLR自体は、もっと簡単な言語を解析するための2、3の機会に役立つツールでした。

17
Sean McCauliff

問題によっては [〜#〜] gccxml [〜#〜] が答えかもしれません。基本的には、GCCを使用してソースを解析し、解析ツリーの簡単に消化可能なXMLを提供します。 GCCXMLを使用すると、一度だけ完了します。

16
Łukasz Lew

pycparser は、Pythonで記述されたC(C99)の完全なパーサーです。完全に構成可能なASTバックエンドがあるため、必要なあらゆる種類の言語処理の基礎として使用されています。

ただし、C++はサポートしていません。確かに、Cよりもmuch難しい.


更新(2012):現時点では、答えは間違いなく Clang です。 C++(多くのC++-11機能を備えた)であり、比較的使いやすいコードベース。また、高レベル言語にバインドするためのC APIもあります(つまり for Python )。

13
Eli Bendersky

doxygen の仕組みをご覧ください。完全なソースコードが利用可能であり、フレックスベースです。

誤解を招く候補は [〜#〜] gold [〜#〜] です。これは、翻訳者を作成するためのWindowsベースの無料のパーサーツールキットです。 サポートされている言語のリストは、サポートされている解析文法のリストではなく、パーサーを実装できる言語を参照しています。

CとC#の文法のみがあり、C++はありません。

8
Andy Dent

C++の解析は非常に複雑な課題です

Boost/Spiritフレームワークがあり、数年前に彼らは C++パーサーを実装するというアイデアで遊びます ですが、それは 完全からはほど遠い です。

ISO C++を完全かつ適切に解析するのは簡単なことではなく、実際には多くの関連する取り組みがありました。しかし、C++andプリプロセッサのすべてを理解する完全なコンパイラフロントエンドを書き直さなければ、簡単に達成できない本質的に複雑な仕事です。 「wave」と呼ばれるプリプロセッサ実装は、Spiritの人々から入手できます。

とはいえ、 pork/oink (elsaベース)は、ソースコード変換の目的で使用することを特に意図したC++パーサーツールキットです。大規模な静的ソースコード分析と自動コード書き換えを行うMozillaプロジェクトの最も興味深い部分は、ほとんどのC++だけでなく、プリプロセッサ自体もサポートしていることです!

一方、実際には1つの独自のソリューションを利用できます。EDGフロントエンドは、ほとんどすべてのC++関連の作業に使用できます。

個人的には、Mozillaで使用されているelsaベースのポーク/ oinkスイートをチェックアウトします。それとは別に、FSFは gcc plugins のランタイムライブラリライセンスを使用して作業を承認しました。バイナリプラグインを使用してそのような目的でgccベースのC++パーサーを簡単に活用できるようになったら、状況は急速に変化すると想定してください。

一言で言えば、あなたがお金を持っているなら:EDG、何かが必要な場合は無料/オープンソースnow:else/oinkはかなり有望です時間があれば、プロジェクトにgccを使用することをお勧めします。

Cコード専用の別のオプションは、 cscout です。

7
none

C++の文法は、ある種悪名高いものです。 それについてのラムダでの良いスレッド がありますが、要点はC++文法が任意の多くの先読みを要求できることです。

私があなたがしていると思うようなことについては、Gnu CCまたは Splint をハッキングすることを考えます。特にGnu CCは言語生成部分をかなり徹底的に分離しているので、新しいg ++バックエンドを構築するのが最善かもしれません。

6
Charlie Martin

実際、PUMAとAspectC++はまだアクティブに維持および更新されています。私はAspectC++の使用を検討していましたが、自分で更新プログラムが不足しているのではないかと考えていました。私はAspectC++とPUMAの両方がまだ開発中であると言った著者に電子メールを送りました。 SVNでソースコードにアクセスできます https://svn.aspectc.org/repos/ または http://akut.aspectc.org で通常のバイナリビルドを入手できます=。最近の多くの優れたC++プロジェクトと同様に、作成者はWebページのメンテナンスに遅れをとる時間がありません。あなたがフルタイムの仕事と人生を持っているなら理にかなっています。

4
Brett Rossier

Elsa 100%準拠ではありませんが、C++の構文解析に私が知っている他のすべてを打ち負かしています。ファンです。 C++を出力するモジュールがあるので、それはあなたのおもちゃプロジェクトの良い出発点かもしれません。

3
user52875

完全な機能を備えたC++パーサーについては、 C++フロントエンド を参照してください。AST、シンボルテーブルを構築し、名前と型の解決を行います。プリプロセッサディレクティブを解析して保持することもできます。 C++フロントエンドは DMS Software Reengineering Toolkit の上に構築されているため、ソースからソースへの変換を使用して、その情報を使用して任意のソースコードの変更を実行できます。

DMSは、このようなトランスレーターを実装するための理想的なエンジンです。

そうは言っても、あなたの想像した仕事にはあまり意味がありません。 C++を置き換えようとしてもあまり価値がありません。特にターゲットが「おもちゃ」言語である場合は、完全な翻訳者を作成するのに膨大な作業が必要になるでしょう。唯一の目的が、解析しやすいC++の同形バージョンを生成することである場合、堅牢なパーサーを使用してC++を解析することにはほとんど意味がありません(待って、堅牢なC++を既に仮定しました!)。

編集2012年5月:DMSのC++フロントエンドがGCC3/GCC4/C++ 11、Microsoft VisualC 2005/2010を処理するようになりました。頑張ります。

編集2015年2月:GCCおよびMSダイアレクトでC++ 14を処理するようになりました。

編集2015年8月:統合されたツリー内のコードとプリプロセッサディレクティブの両方を解析およびキャプチャするようになりました。

2
Ira Baxter

tiny-C または Small C のような理解しやすいものはどうですか

2
Scott Evernden

コードを分析してコールグラフのチャートを作成できるGNUの CFlow のようなツールの使用については、 opengroup (manページ)がcflowについて述べていることは次のとおりです。 GNUバージョンのcflowにはソースが付属しており、オープンソースも...

これがお役に立てば幸いです、よろしく、トム。

1
t0mm13b

しばらく前に、cファイルの単体テストを自動的に生成するツールを作成しようとしました。

前処理のために、GCCを介してファイルを配置します。出力はいですが、前処理されたファイルから元のコードのどこを簡単にトレースできます。しかし、あなたのニーズのために、あなたは他のものを必要とするかもしれません。

Metre をCパーサーのベースとして使用しました。オープンソースであり、Lexとyaccを使用します。これにより、Lex&yaccを完全に理解しなくても、短時間で簡単に起動して実行できました。

また、Lex&yaccソリューションでは機能全体の機能を追跡し、1回のパスで機​​能全体の構造を解析できなかったため、Cアプリも作成しました。短時間で維持できなくなり、放棄されました。

1
Gerhard