2012-01-26 11 views
12

मैं सी ++ के लिए एएसटी प्राप्त करना चाहता हूं जिसे मैं बाहरी प्रोग्राम के साथ पार्स कर सकता हूं। सी ++ के लिए एएसटी उत्पन्न करने के लिए कौन से प्रोग्राम हैं? मुझे परवाह नहीं है कि यह किस भाषा में लागू किया गया है या आउटपुट प्रारूप (जब तक यह आसानी से पारदर्शी है)।सी ++ के लिए एएसटी प्राप्त करना?

मेरा समग्र लक्ष्य सी ++ इकाई परीक्षण बिस्तर को इसके संबंधित सी # रैपर परीक्षण बिस्तर में बदलने के लिए है।

+1

"रचनात्मक नहीं के रूप में बंद?" ओपी का एक बहुत स्पष्ट अनुरोध है, और स्पष्ट रूप से बहुत सारे जवाब नहीं हैं इसलिए बहुत बहस नहीं हो सकती है। अब तक दिए गए उत्तरों विशिष्ट तथ्यों द्वारा समर्थित हैं। –

+0

इसे देखें: http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ –

+0

और [libcang पर आधारित किसी भी सी/सी ++ रिफैक्टरिंग टूल? (यहां तक ​​कि सबसे सरल "खिलौना उदाहरण")] (http://stackoverflow.com/q/7969109/309483) –

उत्तर

12

आप clang और विशेष रूप से libclang का उपयोग सी ++ कोड को पार्स करने के लिए कर सकते हैं। यह सी ++ कोड को लेक्सिंग, पार्सिंग और संकलन के लिए एक बहुत ही उच्च गुणवत्ता, हाथ लिखित लाइब्रेरी है लेकिन यह एएसटी भी उत्पन्न कर सकता है।

बजना भी C++, ऑब्जेक्टिव-सी और ऑब्जेक्टिव-सी का समर्थन करता है। क्लैंग स्वयं सी ++ में लिखा गया है।

+0

"spoiler" -type blockquote के लिए कोई कारण? – Bart

+0

ओपी को इसकी परवाह नहीं थी। –

+0

मैं यह नहीं समझ सकता कि एएसटी को क्लैंग से कैसे प्राप्त किया जाए। क्या ऐसा करने के बारे में कोई ट्यूटोरियल है? –

6

दरअसल, जीसीसी सामान्य और जिंपल रूपों सहित आपकी रुचि रखने वाली पाइपलाइन में किसी भी चरण में एएसटी उत्सर्जित करेगा। -fdump- के साथ शुरू होने वाली कमांड लाइन स्विच (कृपया) की जांच करें - उदा। -fdump-tree-original-raw

यह काम करने के आसान (...) तरीकों में से एक है, क्योंकि आप इसे मनमाने ढंग से कोड पर उपयोग कर सकते हैं; बस उपयुक्त CFLAGS या CXXFLAGS पारित सबसे Makefiles में: "। काम करता है"

make CXXFLAGS=-fdump-tree-original-raw all 

... और आप मिल

अपडेट किया गया: मेरी झंडा नाम की जाँच के दौरान इस साफ थोड़ा रेखांकन जीसीसी एएसटी के आधार पर प्रणाली देखा :-) Google एफटीडब्ल्यू।

http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast

2

हमारे C++ Front End, हमारे DMS Software Reengineering Toolkit के ऊपर एक बने सी की एक किस्म ++ बोलियों (सहित सी ++ 11 और ObjectiveC) और निर्यात पार्स कर सकते हैं कि एएसटी एक कमांड लाइन स्विच के साथ एक XML दस्तावेज़ के रूप में। example ASTs produced by this front end.

एक व्यावहारिक मामले के रूप में, आपको एएसटी से अधिक की आवश्यकता होगी; आप प्रत्येक पहचानकर्ता के अर्थ और दायरे को समझने के बिना वास्तव में सी ++ (या किसी अन्य आधुनिक भाषा) के साथ बहुत कुछ नहीं कर सकते हैं। सी ++ के लिए, अर्थ/दायरा विशेष रूप से बदसूरत हैं। डीएमएस सी ++ फ्रंट एंड उस सब को संभालता है; यह पहचानकर्ताओं को स्पष्ट सी ++ प्रकारों से जोड़कर पूर्ण प्रतीक सारणी बना सकता है। यह जानकारी एक्सएमएल में कमांड लाइन स्विच के साथ डंप करने योग्य नहीं है, लेकिन यह प्रतीक तालिका चलने और एक्सएमएल को थूकने के लिए डीएमएस में कोड तर्क के लिए "तकनीकी रूप से आसान" है। (इस जानकारी को डंप करने का एक विकल्प है, बस एक्सएमएल प्रारूप में नहीं)।

मैं आपको एक्सएमएल में हेरफेरेट करने (या यहां तक ​​कि विश्लेषण करने) के विचार के खिलाफ सावधानी बरतता हूं। सबसे पहले, एक्सएसएलटी एएसटी के अर्थ को समझने का विशेष रूप से अच्छा तरीका नहीं है, अकेले एएसटी को बदलने दें, क्योंकि एएसटी संदर्भ संवेदनशील भाषा संरचनाओं का प्रतिनिधित्व करता है (यही कारण है कि आप चाहते हैं [nee होना चाहिए] प्रतीक तालिका)। यदि आप इसे अपने हेरफेर करने के लिए अपना खुद का प्रक्रियात्मक कोड पसंद करते हैं और लिखते हैं तो आप एक्सएमएल को एक डोम जैसे पेड़ में पढ़ सकते हैं। लेकिन source-to-source transformations एक आसान तरीका है; आप एक पेड़ डेटा संरचना पर कोड goo चढ़ाई के बाल्टी के बजाय सी ++ नोटेशन का उपयोग कर अपने परिवर्तन लिख सकते हैं।

आपको एक और समस्या होगी: परिवर्तित एक्सएमएल से वैध सी ++ कोड कैसे उत्पन्न करें। यदि आपको कच्चे पाठ को थूकने में कोई फर्क नहीं पड़ता है, तो आप इस समस्या को पूरी तरह से विज्ञापन के तरीकों से हल कर सकते हैं, पसीने के अलावा कोई गौण नहीं होने के कारण उत्पन्न कोड संश्लेषित रूप से मान्य है।यदि आप एएसटी के रूप में अपने अंतिम परिणाम का सी ++ प्रतिनिधित्व उत्पन्न करना चाहते हैं, और उस से वैध पाठ को पुन: उत्पन्न करना चाहते हैं, तो आपको prettyprinter की आवश्यकता होगी, जो कि तकनीकी रूप से कठिन नहीं हैं, लेकिन विशेष रूप से एक भाषा के लिए निर्माण करने के लिए बहुत सारे काम हैं सी ++।

आखिरकार, कारण यह है कि डीएमएस जैसे उपकरण मौजूद हैं, जटिल संरचना जैसे सी ++ एएसटी को संसाधित करने/कुशलतापूर्वक उपयोग करने के लिए कितनी बुनियादी ढांचा प्रदान करते हैं। (पार्स, विश्लेषण, परिवर्तन, सुंदर प्रिंट)। आप स्वयं को इस मशीनरी को दोहराने की कोशिश कर सकते हैं, लेकिन यह आमतौर पर एक खराब समय/लागत/उत्पादकता ट्रेडऑफ होता है। दावा यह है कि उपकरण पारिस्थितिक तंत्र के भीतर रहना और इसके खराब संस्करणों का निर्माण करना सबसे अच्छा है। यदि आपने पहले ऐसा नहीं किया है, तो आप इसे दर्दनाक तरीके से पाएंगे।

एफडब्ल्यूआईडब्ल्यू, डीएमएस का उपयोग सी ++ स्रोत कोड पर बड़े पैमाने पर विश्लेषण और परिवर्तन करने के लिए किया गया है। Publications on DMS देखें और "पुन: इंजीनियरिंग सी ++ घटक मॉडल" पर अकर्स द्वारा दिए गए कागजात देखें।

क्लैंग एक ही तरह के दर्शन पर आधारित है; उपकरण का एक पारिस्थितिकी तंत्र है।

वाईएमएमवी, लेकिन मुझे आश्चर्य होगा।

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