2012-04-18 15 views
3

が必要私は今、私はタイプfooのバーのすべてのメンバーを印刷し、マクロ、DUMP_STRUCT(bar)のようなものを、(必要な以下の構造はC構造パーサ

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

typedef struct Temp { 
    uint64 id; 
} Temp; 

Foo bar; 

を持っているファイルsystem.hを考えてみましょう)再帰的に。

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

答えて

2

libclangにはPython bindingsがあります。あなたが望むことができるはずです。また、pycparserプロジェクトもあります。

1

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

GCC-XMLは、さまざまな構造体のスロットとその型をXMLテキストとしてダンプするという意味で、必要なものを生成するかもしれません(CではなくC++です)。データ構造を調べるコードでそれをマッサージする必要があります。これを行うには、型宣言の部分構造(興味のある形状/内容のXMLサブツリー)と一致させる必要があります。

私たちのDMS Software Rengineering ToolkitC Front Endであり、完全なプリプロセス/解析/ビルドシンボルテーブルを行います。そこからGCC-XMLの出力を生成することはできますが、DMSをカスタマイズしてさまざまなシンボルテーブルとASTを歩き回り、必要なものを抽出する方が簡単です。シンボルテーブルは、名前空間の構造、シンボルエントリ、およびそれらのタイプ情報(データ構造として既に設定されている)への便利なアクセスのために設計されているため、照合プロセスが簡単です。また、DMSはサーフェス・シンタックス・パターン・マッチングを提供します。このマッチングは、目的のASTを認識するためにも、構文的に間違っていないコードを生成するコード・ジェネレータとしても使用できます。

1

GCCXMLを使用できます.C(制限付き)とC++ヘッダをXMLで出力して解析できます。

1

pstructがどのように機能するかを調べると、いくらかのマイルがかかる場合があります。 (perlで考えていますが、コンパイラのスタブデバッグ情報を使って構造体レイアウトに関する情報を出力します)。