1

ac ファイルがあり、Python を使用して、定義されたすべての変数名のリストを作成したいと考えています。

たとえば、次のcファイルから

int mynum = 12;

// Timers
VAR_IN_SECTION(task_timers, .mem_layout)
timers_t timers[DSP_NUM_TASK_TIMERS];

Python マジックを復活させたい

["mynum", "timers"]

どのようにこれを行うことができますか (適切な c フォーマットに固有ではない方法で)、Python の魔法は何でしょうか?

注: これは、変数宣言のみが含まれるファイルを解析するためのものです。

4

2 に答える 2

2

GCC-XMLツールを使用して、Cソースファイルの宣言をXMLに変換できます。次に、Python XMLパーサー(例lxml.etree)を使用して結果を解析できます。

GCC-XML出力XML構造は、解析が非常に簡単です。変数宣言(タグ:)<Variable>と型定義(、、、などの複数のタグ)を<FundamentalType>提供します。実際の型を再帰的に導出するためにいくつかの処理を実行する必要があります(たとえば、サブ型を参照する-型を指す)が、それに時間を費やすことをいとわない場合は、必要なすべてを提供します。<Pointer><Struct>Pointer

変数名だけが必要な場合は、XMLのタグを解析しVariable、属性を抽出しますname

奇妙なことに、私はプロジェクトの一環としてまさにそのようなパーサーを構築しています。私は(まだ)配布することを許可していませんが、最終的にはオープンソースでリリースされることを望んでいます。

例:

typedef int* myintptr;

myintptr p;   

次のようなXMLを生成します。

<Variable id="_3" name="p" type="_64" context="_1" location="f0:5" file="f0" line="5"/>
<Typedef id="_64" name="myintptr" type="_63" context="_1" location="f0:3" file="f0" line="3"/>
<PointerType id="_63" type="_156" size="64" align="64"/>
<FundamentalType id="_156" name="int" size="32" align="32"/>
于 2013-02-07T13:59:03.917 に答える
1

これはあなたが与えたサンプル入力ファイルで機能しますが、これが一般的なc構文で機能すると言う前に、さらに多くのテストが必要になると確信しています:

>>> s = """int mynum = 12;
... 
... // Timers
... VAR_IN_SECTION(task_timers, .mem_layout)
... timers_t timers[DSP_NUM_TASK_TIMERS];"""
>>>
>>> import re
>>> re.findall(r'\w+[ \t]+(\w+)',s)
['mynum', 'timers']

上記の回答はポインタを拾いません:

int *p;

それらを拾うために、おそらく正規表現を少し調整します:

>>> re.findall(r'\w+[ \t]+(?:\*\s*)?(\w+)',s)
['mynum', 'timers', 'p']

intC では、さまざまな型 ( 、floatdouble、 ...)を探すことはできませんchar。なぜなら、物事は常に typedef される可能性があり、そのように機能するstruct(およびunion?) もあるからです。 、あなたはできます#include "anyfile.c"- これはプログラマーとして行うにはかなり厄介なことですが、可能です。c99変数はどこでも宣言できると思います (例: マクロ)。あなたもそれらを拾いたいですか?つまり、これを正しく行うには、面倒な作業を行う完全な c パーサーが必要です。

于 2013-02-07T13:55:12.433 に答える