4

system.h次の構造を持つファイルがあるとしましょう

typedef struct Foo {
  int count;
  uint32 world;
  Temp id;
} Foo;

typedef struct Temp {
  uint64 id;
} Temp;

Foo bar;

DUMP_STRUCT(bar)ここで、(Foo 型の) bar のすべてのメンバーを再帰的に出力する、 のようなマクロが必要です。

Cファイルを解析したり、実行可能ファイルからdwarfから情報を取得して、に似た関数を作成したりできるパーサー/スクリプト(できればphp/python)はありますDUMP_STRUCTか?

4

4 に答える 4

2

libclang 用のPython バインディングがあるようです。これで、必要なことを実行できるはずです。また、pycparserプロジェクトもあります。

于 2012-04-18T08:37:14.397 に答える
1

C ヘッダー ファイルに、C ヘッダー ファイルに含まれる典型的なもの (マクロ、プリプロセッサ条件、インクルード、ビット フィールド) が含まれている場合、ヘッダー ファイルを処理するには完全な C パーサーが必要です。

GCC-XML は、さまざまな構造スロットとそのタイプを XML テキストとしてダンプするという意味で、必要なものを生成する可能性があります (「C」を正確に行うのではなく、C++ を行います)。データ構造をたどるコードでそれをマッサージする必要があります。そのためには、型宣言のサブ構造を (興味深い形状/コンテンツの XML サブツリーとして) 一致させる必要があります。

C フロント エンドを備えたDMS ソフトウェア Rengineering Toolkitは、完全な前処理/解析/シンボル テーブルの構築を行います。そこから GCC-XML の出力を生成することもできますが、DMS を単純にカスタマイズして、さまざまなシンボル テーブルと AST をたどって必要なものを抽出する方が簡単です。シンボル テーブルは名前空間の構造、名前空間内のシンボル エントリ、およびそれらの型情報 (データ構造として既に設定されている) に簡単にアクセスできるように設計されているため、照合プロセスは簡単です。DMS は、目的の AST を認識するためにも、構文的に間違っていないコードを生成するためのコード ジェネレーターとしても使用できる表面構文パターン マッチングも提供します。

于 2012-04-18T08:37:56.890 に答える
1

GCCXMLを使用できます。C (いくつかの制限あり) および C++ ヘッダーを XML で出力して解析できます。

于 2012-04-18T08:38:57.147 に答える
1

pstructがどのように機能するかを調べることで、いくらかのマイレージが得られる場合があります。(それはperlだと思いますが、コンパイラのスタブデバッグ情報を使用して、構造レイアウトに関する情報を出力します)。

于 2012-06-09T07:54:45.537 に答える