2009-12-23 20 views
14

क्या कोई पाइथन में सी हेडर फ़ाइलों का उपयोग करने के लिए एक स्पिफी तरीका जानता है? उदाहरण के लिए मैं एक सी प्रोग्राम है जो एक वैश्विक चर शामिल है:सी हेडर फ़ाइल को कैसे पार्स करें?

typedef struct ImageInfo 
{ 
    uint8_t revisionMajor; 
    uint8_t revisionMinor; 
    uint16_t checksum;  

} ImageInfo; 

ImageInfo gImageInfo; /* Placed at a specific address by the linker */ 

मैं सी संकलक/संयोजक द्वारा उत्पन्न द्विआधारी लेने के लिए और इस संरचना को पार्स (और संभवतः इसे संशोधित) एक अजगर के साथ करने में सक्षम होना चाहते हैं स्क्रिप्ट।

+0

संरचना शायद मौजूद नहीं है जैसे कि "बाइनरी में" - यह वास्तव में "मौजूद" नहीं है निष्पादन समय तक के बाद कार्यक्रम ओएस द्वारा रैम में लोड किया गया है। तो आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

जो लोग मैं ग्लोबल वैरिएबल का जिक्र करना भूल गया हूं उसे केवल पढ़ने के लिए रखा गया है (यानी फ्लैश या रॉम) मेमोरी। उपर्युक्त उदाहरण में gImageInfo बाइनरी में ऑफ़सेट 0x1000 पर रखा जाएगा और मैं पाइथन के साथ संरचना को पढ़ने में सक्षम होना चाहता हूं और संशोधन जानकारी को चेकसम को सत्यापित करना चाहता हूं। – waffleman

उत्तर

12

Have a look at this C++ header parser written in Python है। आप इन टूल के किसी भी उपयोग कर अपने खुद पार्सर लिख सकते हैं:

+1

महान संदर्भ: मुझे उन मॉड्यूल के समूह के बारे में पता नहीं था। मैं जानना चाहता हूं कि उन्हें कितने पूर्ण-विशेषताओं की तुलना pygccxml से की जाती है (जो कि जीसीसी द्वारा समर्थित है क्योंकि स्पष्ट रूप से एक पैर-अप है)। एक सी ++ पार्सर लिखना कुख्यात रूप से कठिन है (हालांकि सवाल सी पार्सिंग के बारे में था)। यदि संभव हो तो पूर्ण जीसीसीएक्सएमएल आधारित स्टैक की तुलना में कुछ हल्का वजन का उपयोग करना अच्छा होगा। – jkp

8

pygccxml पर एक नजर डालें। मैं इसे अपने सी/सी ++ स्रोत कोड के इन-मेमोरी ग्राफ बनाने के लिए उपयोग करता हूं जिसे मैं कई कोड जनरेशन कार्यों के आधार के रूप में उपयोग कर सकता हूं।

पुनश्च: जब मैं पहली बार अजगर आधारित कोड पीढ़ी के साथ बाहर शुरू कर दिया मैं वास्तव में एक पार्सर अपने आप को लिखने का प्रयास किया: अपने आप को दर्द बचाने के लिए और यहाँ तक कि वहाँ मत जाओ! (लगता है कि आपका पहले से ही हालांकि ऊपर clued रहे हैं ...) pygccxml सब कुछ आप चाहते हैं और अधिक :)

22

यह इतना कल पर उल्लेख किया गया था ; मुझे अभी तक इसे और अधिक अच्छी तरह से जांचने का मौका नहीं मिला है, लेकिन मेरा मतलब है। pycparser, "सी पार्सर और एएसटी जनरेटर पायथन में लिखा गया"।

https://github.com/eliben/pycparser

+0

स्पष्ट रूप से प्राचीन इतिहास के दौरान, यह उत्तर कम से कम 2 और वोटों के हकदार है - यह मूल पोस्ट अनुरोधों को ठीक करने की क्षमता प्रदान करता है। – synthesizerpatel

+0

जैसा कि http://stackoverflow.com/a/13822683/181772 पर उपयोग किया गया है (उदाहरण कोड के साथ) –

2

एक ही उद्देश्य के लिए मैं pyclibrary, पर विचार कर रहा हूँ यह एक पूरी सी पार्सर नहीं है बल्कि यह सी हेडर फाइल पार्स करने के उद्देश्य से है, तो यह बहुत pycparser या कुछ gccxml- से उपयोग करने के लिए आसान है आधारित पार्सर: हालांकि कमजोर दस्तावेज, बस CParser.py testHeader.h आज़माएं और आप देखेंगे कि यह कैसे काम करता है।

pyparsing पर निर्भर करता है और, जहाँ तक मैं समझता हूँ, यह शुद्ध अजगर है।

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