2012-11-05 35 views
5

Uygulamamızın kaynak kodunu yeniden kodlamak için basit bir araç yazıyorum. GUI'yi tanımlayan ve Qt ile kullanılacak XML .ui dosyasını üreten wxWidgets kitaplığına dayalı C++ kodunu ayrıştırmak istiyorum. Tüm fonksiyon çağrılarını ve argümanların değerini almam gerekiyor.Tek bir dosyayı Python bağlamaları Clang ile nasıl ayrıştırılır?

Şu anda, örnek kod kullanılarak belirteçler ve onların tür ve konum, ancak imleç türü her zaman CursorKind.INVALID_FILE olduğunu, Clang için Python bağlamaları ile oynuyor.

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) 

İmleç türünü belirlemenin doğru yolu nedir?

Birkaç blog yayını dışında herhangi bir belge bulamadım, ancak bu konuyla ilgili güncel olmayan ya da güncel değil. Clang'la gelen örneklerden bunu yapamamıştım.

+0

"Listenin (f.source.name for f tu.get_includes())' çıktısını verebilir misiniz? (sadece komut dosyanızın sonunda yazdırabilirsiniz) – forivall

+3

tıpkı başka bir c derleyicisinde olduğu gibi, include klasörünün düzgün ayarlanması gerekir, index.parse (sys.argv [1], args = ['I./path/to/ ',' I. ''/''/'' '' '' '' '' '' '' 'ekleyin. –

+0

Bir başkasının işini bırakmak utanç verici değildir, sadece bahsetmeyi unutmayın: Kodunuz, Eli'nin sayfasındaki ilk örneğe çok benzer: http: //eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang –

cevap

4

İmleç nesneleri için, yalnızca cursor.kind işlevini kullanmanız yeterlidir. Belki de sorun, çocuk imleç nesneleri yerine jetonları gezdirmenizdir (Bundan emin değilim). get_tokens yerine, AST'yi geçmek için get_children'i kullanabilirsiniz.

AST'nin nasıl çalıştığını görmek için AST yürüme işlevi yazmak istediğimde şu komut dosyasını kullanıyorum: https://gist.github.com/2503232. Bu sadece cursor.kind gösterir ve sistemimde mantıklı çıktılar verir.

İlgili konular