2012-11-05 7 views
5

私は、アプリケーションのソースコードをリファクタリングするための簡単なツールを作成しています。 GUIを定義してXMLを生成するwxWidgetsライブラリに基づいてC++コードを解析したいと思います。.ui Qtで使用するファイルです。私はすべての関数呼び出しと引数の値を取得する必要があります。Pythonバインディングを使用してClangに単一のファイルを解析する方法は?

現在、以下のサンプルコードを使用して、ClangのPythonバインディングを使用しています。トークンとその種類と場所を取得しますが、カーソルの種類は常にCursorKind.INVALID_FILEです。

import sys 
import clang.cindex 

def find_typerefs(node): 
    """ Find all references to the type named 'typename' 
    """ 

    for t in node.get_tokens(): 
     if not node.location.file != sys.argv[1]: 
      continue 
     if t.kind.value != 0 and t.kind.value != 1 and t.kind.value != 4: 
      print t.spelling 
      print t.location 
      print t.cursor.kind 
      print t.kind 
      print "\n" 

index = clang.cindex.Index.create() 
tu = index.parse(sys.argv[1]) 
print 'Translation unit:', tu.spelling 
find_typerefs(tu.cursor) 

カーソルの種類を判別する正しい方法は何ですか?

は、私はいくつかのブログの記事を除く任意のドキュメントを見つけることができませんでしたが、彼らは古いか、このトピックをカバーしませんでした。私はClangに付属している例からそれを取り除くこともできませんでした。

+0

あなたは 'リスト(tu.get_includesでfに対するf.source.name())'の出力が得られませんでしたか?ちょうど別の他のCコンパイラのように、含まれたフォルダがindex.parse(sys.argvの[1]、引数= [ 'I./path/to/、適切に設定する必要があります – forivall

+3

(ちょうどあなたのスクリプトの最後にそれを印刷) http:あなたのコードは何とかイーライのページの最初の例と非常によく似ています:それはちょうどそれを言及するのを忘れないでください、誰かの他の仕事に置くことを恥ではありません –

+0

)「、 『I./another/include』]次のとおりです。 //eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang –

答えて

4

カーソルオブジェクトの場合、それだけでcursor.kindを使用しても大丈夫でなければなりません。たぶん問題は、子カーソルオブジェクトの代わりにトークンを歩いていることです(それについてはわかりません)。 get_tokensの代わりに、get_childrenを使用してASTを歩くことができます。 https://gist.github.com/2503232:ASTは、私はASTの歩行機能を書きたいとき、私はこのスクリプトを使用して、どのように見えるかを確認するために

。 これは私のシステム上でcursor.kindを表示し、分かりやすい出力を与えます。いいえCursorKind.INVALID_FILE.

関連する問題