2012-11-05 29 views
5

मैं अपने आवेदन के स्रोत कोड को पुन: सक्रिय करने में सहायता के लिए एक साधारण टूल लिख रहा हूं। मैं WxWidgets लाइब्रेरी के आधार पर C++ कोड को पार्स करना चाहता हूं, जो कि GUI को परिभाषित करता है और Qt के साथ उपयोग करने के लिए XML .ui फ़ाइल का उत्पादन करता है। मुझे सभी फ़ंक्शन कॉल और तर्कों का मूल्य प्राप्त करने की आवश्यकता है।क्लेंग के लिए पाइथन बाइंडिंग का उपयोग करके एकल फ़ाइल को कैसे पार्स करें?

वर्तमान में मैं क्लैंग के लिए पाइथन बाइंडिंग के साथ टॉयइंग कर रहा हूं, नीचे दिए गए उदाहरण कोड का उपयोग करके मुझे टोकन और उनकी तरह और स्थान मिलता है, लेकिन कर्सर प्रकार हमेशा 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) 

कर्सर प्रकार निर्धारित करने का सही तरीका क्या है?

मुझे कुछ ब्लॉग पोस्ट को छोड़कर कोई दस्तावेज नहीं मिला, लेकिन वे पुराने थे या इस विषय को कवर नहीं कर रहे थे। मैं न तो क्लैंग के साथ आए उदाहरणों से इसे काम करने में असमर्थ था।

+0

क्या आप 'सूची के आउटपुट (f.s.get_includes() में f के लिए f.source.name दे सकते हैं? (बस इसे अपनी स्क्रिप्ट के अंत में प्रिंट करें) – forivall

+3

बस एक और अन्य सी कंपाइलर्स की तरह, फ़ोल्डर को ठीक से सेट करना होगा, index.parse (sys.argv [1], args = ['I./path/to/ ',' I/another/include '] शामिल करें) –

+0

किसी और की नौकरी रखना कोई शर्म की बात नहीं है, बस इसका उल्लेख करना न भूलें: आपका कोड किसी भी तरह एली के पृष्ठ में पहले उदाहरण के समान ही है: http: //eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang –

उत्तर

4

कर्सर ऑब्जेक्ट्स के लिए, कर्सर.किंड का उपयोग करना ठीक होना चाहिए। शायद समस्या यह है कि आप बाल कर्सर वस्तुओं के बजाय टोकन चल रहे हैं (इसके बारे में निश्चित नहीं है)। get_tokens के बजाय, आप एएसटी चलने के लिए get_children का उपयोग कर सकते हैं।

यह देखने के लिए कि एएसटी कैसा दिखता है, जब मैं एएसटी पैदल कार्य लिखना चाहता हूं, तो मैं इस स्क्रिप्ट का उपयोग करता हूं: https://gist.github.com/2503232। यह सिर्फ कर्सर.किंड दिखाता है, और मेरे सिस्टम पर समझदार आउटपुट देता है। नहीं CursorKind.INVALID_FILE.

संबंधित मुद्दे