2011-03-15 13 views
21

मैं सेमीकेक और विजुअल स्टूडियो 10 के साथ विंडोज़ के लिए सफलतापूर्वक चिपकने में कामयाब रहा। मैं एक एक्सएमएल फाइल को स्रोत कोड के एएसटी प्रतिनिधित्व के रूप में प्राप्त करना चाहता हूं।क्या मुझे कंपाइलर का उपयोग किये बिना क्लैंग के साथ सी/सी ++ कोड का एक्सएमएल एएसटी डंप मिल सकता है?

clang -cc1 -ast-print-xml source.c 

हालांकि, इस संकलन मंच (जो मैं से बचने के लिए चाहते हैं) लागू किया गया है: वहाँ एक विकल्प है कि लिनक्स के तहत जीसीसी (ubuntu) के साथ बजना के साथ परिणाम प्रदान करता है, लेकिन खिड़कियों बॉक्स पर काम नहीं करता है । स्रोत कोड में खुदाई ने मुझे अब तक मदद नहीं की है क्योंकि मैं झुकाव के लिए काफी नया हूं। मैं का उपयोग करके AST के द्विआधारी संस्करण उत्पन्न करने के लिए प्रबंधन कर सकते हैं:

clang -emit-ast source.c 

दुर्भाग्य से, इस प्रारूप पार्स करने के लिए सीधे व्यर्थ है। क्या क्लैंग में बाइनरी के बजाय सीधे एक्सएमएल पेड़ उत्पन्न करने के लिए कुछ मौजूदा तरीका है?

लक्ष्य .NET पर्यावरण में अन्य उपकरणों में XML प्रस्तुति का उपयोग करना है, इसलिए मुझे बाइनरी एएसटी तक पहुंचने के लिए देशी क्लैंग लिब के आसपास कुछ लपेटना होगा। हो सकता है कि कोई तीसरा विकल्प है अगर किसी ने पहले ही .NET के लिए कुछ बाइनरी क्लैंग एएसटी पार्सर लिखा है?

क्या यह संभव है कि मुझे ऐसा कुछ याद आ रहा है जैसे क्लैंग फ्रंट एंड द्वारा उत्पन्न एएसटी संकलन चरण में उत्पन्न एक के बराबर नहीं है।

+2

मेरी कंपनी सी ++ फ्रंट सिरों का निर्माण करती है, और हम * एएसटी के पूर्ण एक्सएमएल डंप उत्सर्जित कर सकते हैं। हमारे पास यह चेक-बॉक्स आइटम है, क्योंकि लोग इसके लिए पूछते हैं। कोई भी वास्तव में इसका उपयोग नहीं करता है, क्योंकि वास्तविक सी ++ प्रोग्राम (जिसमें सभी हेडर फाइलें शामिल हैं) के आउटपुट की मात्रा बस * विशाल * है, जो इसे धीमा करने के लिए धीमी और बेकार है। वास्तविक सवाल यह है कि आप ऐसा क्यों करना चाहते हैं?क्लेंग संभवतः सी ++ एएसटी को संसाधित करने के लिए बड़ी मात्रा में मशीनरी प्रदान करता है (जैसा कि हमारे संबंधित उपकरण करता है); आप उस काम को दोहराने की कोशिश क्यों करना चाहेंगे? अपने उद्देश्य के लिए क्लैंग का उपयोग क्यों न करें? –

+0

... http://stackoverflow.com/a/17393852/120163 पर एक सी ++ पेड़ डंप देखें यह एक्सएमएल नहीं है, लेकिन टूल एक्सएमएल को सटीक उसी सामग्री के साथ भी उत्पन्न कर सकता है। –

उत्तर

20

आपके लिए जानकारी के लिए, एक्सएमएल प्रिंटर को डगलस ग्रेगोर (क्लांग फ्रंटएंड के जिम्मेदार) द्वारा 2.9 संस्करण से हटा दिया गया है।

मुद्दा यह था कि एक्सएमएल प्रिंटर की कमी थी। प्रिंटर में कई एएसटी नोड्स को कभी भी कार्यान्वित नहीं किया गया था, साथ ही साथ कुछ नोड्स के गुण भी थे, जिससे स्रोत कोड का गलत प्रतिनिधित्व हुआ।

डगलस द्वारा उठाए गए एक और बिंदु यह था कि आउटपुट को क्लैंग खुद को डीबग करने के लिए उपयुक्त नहीं होना चाहिए (जो -emit-ast है) लेकिन बाहरी उपकरणों द्वारा खपत के लिए। इसके लिए आउटपुट को एक संस्करण से दूसरे संस्करण में स्थिर होना आवश्यक है। विशेष रूप से यह CLang आंतरिक का 1-ऑन -1 मैपिंग नहीं होना चाहिए, बल्कि स्रोत कोड को मानक भाषा में अनुवादित करना चाहिए।

जब तक प्रिंटर पर महत्वपूर्ण कार्य (जो स्वयंसेवकों की आवश्यकता है) इसे वापस एकीकृत नहीं किया जाएगा ...

+3

मजाकिया हिस्सा यह है कि '-emit-ast' सुंदर-प्रिंट प्रकार उनकी संरचना का प्रतिनिधित्व करने के बजाय, और इस कारण से बिल्कुल बेकार है। एक्सएमएल प्रिंटर को डिबग करने और घोषणाओं में स्वचालित रूप से सत्यापित करने के साथ ही यह संभव था। –

+0

@ एसके-तर्क: चूंकि xml अब एक विकल्प नहीं है, इसलिए हम '-emit-ast' व्यवहार में सुधार देख सकते हैं। –

+0

इस सभी रोचक जानकारी के लिए धन्यवाद। मैं पुराने एक्सएमएल प्रिंटर पर एक नज़र डालेगा और यह देखने की कोशिश करता हूं कि क्या मैं अपने उपयोग के लिए इसके साथ कुछ उपयोगी कर सकता हूं। स्रोत कोड का प्रतिनिधित्व करने के कुछ सार्वभौमिक/मानकीकृत तरीके होने के कारण वास्तव में एक अच्छी बात होगी, लेकिन एक आम संप्रदाय का मतलब है कि सुविधाओं को फेंकना और सभी प्रकार की भाषाओं के लिए विशिष्ट चीजों को रखना बहुत जटिल बनाता है ... कुछ विस्तारणीय दृष्टिकोण अच्छा होगा ... अभी इस जवाब के लिए बहुत बहुत धन्यवाद। – jdehaan

3

मैं बजना के एएसटी से XML निकालने की अपने ही संस्करण पर काम कर रहा है है। एएसटी को पार करने के लिए मेरा कोड libclang के पायथन बाइंडिंग का उपयोग करता है।

मेरे कोड पर https://github.com/BentleyJOakes/PCX

संपादित पाया जाता है: मैं जोड़ने चाहिए कि यह प्रत्येक एएसटी नोड के लिए सही स्रोत कोड टोकन उत्पादन के मामले में काफी अधूरा है। दुर्भाग्य से यह प्रत्येक एएसटी नोड प्रकार के लिए कोड किया जाना चाहिए। हालांकि, कोड को ऐसे किसी भी व्यक्ति के लिए आधार देना चाहिए जो आगे बढ़ना चाहता है।

1

कस्टम एएसटीडम्पर का उपयोग करना किसी भी स्रोत फ़ाइल को संकलित किए बिना नौकरी करेगा। (फ्रंटेंड भाग में झुकाव बंद करो)। लेकिन आपको इसे पूरा करने के लिए llvm के सभी सी और सी ++ कोड स्रोतों से निपटना होगा।