2011-11-15 20 views
5

मैं जानना चाहता हूं कि जीसीसी को पुस्तकालय के रूप में सी/सी ++/जावा/उद्देश्य सी/एडीए कोड को मेरे प्रोग्राम के लिए पार्स करने के लिए कैसे उपयोग करना है। मैं preocix माई के साथ लिखे गए सभी कार्यों को प्रीकॉसिंग करना और उपसर्ग करना चाहता हूं। जैसे Print();MyPrint(); बन जाता है मैं भी चर के साथ ऐसा करना चाहता हूं।पार्सिंग कोड के लिए जीसीसी

+5

यह काफी बड़ी आवश्यकता है। आपने क्या प्रयास किया है आप किस विशिष्ट समस्या का सामना कर रहे हैं? क्या आपने जीसीसी श्रृंखला पर मैन पेज पढ़ा है (प्रीप्रोकैसिंग और व्हाट्नॉट के बिना)? साथ ही, प्रीप्रोकैसिंग शायद आपके प्रोग्राम के अंदर कोड प्राप्त करने के लिए आवश्यक एकमात्र कदम नहीं होगा। वास्तव में यह क्या है कि आप करने की कोशिश कर रहे हैं? – Corbin

+0

मैंने क्लैंग का उपयोग करने की कोशिश की है लेकिन मैं इसे संकलित करने के लिए कभी नहीं मिल सकता। I: paring के साथ अच्छा नहीं है। जीसीसी श्रृंखला क्या है? मैं प्रीप्रोकैसिंग को छोड़ना चाहता हूं क्योंकि मैं फाइलों में हेडर या मैक्रोज़ नहीं चाहता हूं। मूल रूप से जो मैं करने की कोशिश कर रहा हूं वह उपसर्ग के साथ कार्यों और चर का नाम बदल रहा है। – zeitue

+0

आह, मैं जीसीसी उपकरण श्रृंखला कहना चाहता था। और वास्तव में यह एक व्यापक शब्द था जिसका उपयोग मैंने किया था। मुझे बस जीसीसी मैन पेज कहा जाना चाहिए था, और शायद लिंक मैन पेज जो आप वास्तव में कर रहे हैं उसके आधार पर। – Corbin

उत्तर

3

आप यहाँ देख सकते हैं:
http://codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/

यह कैसे जीसीसी प्लगइन इंटरफ़ेस का उपयोग करने के लिए सी ++ कोड पार्स करने के लिए का वर्णन है। अन्य भाषा को उसी तरीके से संभाला जाना चाहिए।

इसके अलावा, आप mozilla से सूअर का मांस की कोशिश कर सकते हैं:
https://wiki.mozilla.org/Pork

जब मैं यह (पोर्क) की कोशिश की, मैं इस तरह घंटे खर्च करते हैं या तो ठीक करने के लिए समस्याओं को संकलित है, लेकिन फिर मैं लिख सकते हैं स्क्रिप्ट:

rewrite SyncPrimitiveUpgrade { 
    type PRLock* => Mutex* 
    call PR_NewLock() => new Mutex() 
    call PR_Lock(lock) => lock->Lock() 
    call PR_Unlock(lock) => lock->Unlock() 
    call PR_DestroyLock(lock) => delete lock 
} 

इसलिए यह सभी प्रकार के PRLock को मिला और इसे म्यूटेक्स के साथ दोहराया गया, यह भी जैसे PR_NewLock की खोज कॉल करें और इसे "नया म्यूटेक्स" से प्रतिस्थापित करें।

+0

मैं अभी इस समस्या का उपयोग कर रहा हूं मेरा कोड संकलन शायद मेरा सिस्टम बहुत नया है। – zeitue

+0

या आपका सिस्टम बहुत पुराना है।gcc के प्लगइन समर्थन को जीसीसी 4.5 में रीमेर के रूप में पेश किया गया था, इसलिए यदि आपका जीसीसी संस्करण <4.5 ... – fghj

+0

मेरा सिस्टम उबंटू 11.10 है जीसीसी जीसीसी-3.3 जीसीसी-3.4 जीसीसी-4.0 जीसीसी-4.2 जीसीसी-4.3 जीसीसी-4.4 जीसीसी- 4.5 जीसीसी-4.6 – zeitue

2

आप sparse सी पार्सर की जांच करना चाहेंगे। यह बहुत सी समझता है (सभी सी लिनक्स कर्नेल स्रोतों में उपयोग किया जाता है, जो कानूनी एएनएसआई-सी और जीएनयू-सी एक्सटेंशन का काफी अच्छा सबसेट है) और कुछ नमूना संकलक बैकएंड प्रदान करता है ताकि lint-स्थिर विश्लेषण टूल प्रकार की जांच के लिए। example.csparse स्रोत दर्शाता है कि एक संकलक 1955 लाइनों लंबा है के साथ शामिल -

कोड बहुत साफ है और पूरी तरह से लग रहा है, वहीं अपने कार्य को आसान एक और तंत्र के माध्यम से किया जा सकता है।

+0

स्पैस अच्छा लग रहा है लेकिन यह सी ++ समर्थन के लिए सीम नहीं है। – zeitue

+0

और निश्चित रूप से कोई जावा/उद्देश्य सी/एडीए नहीं। :) यह सी और केवल सी – sarnold

+0

करता है क्योंकि टेलर ने कहा, स्पैस अच्छा लग रहा है, लेकिन उस विकी पर डाउनलोड लिंक या गिट रेपो लिंक में से कोई भी काम नहीं करता है: | – Necrolis

2

सी के लिए, आप विश्वसनीय रूप से ऐसा नहीं कर सकते हैं। यदि आप प्रीप्रोकैसिंग को छोड़ देते हैं तो आप सामान्य रूप से - वैध सी कोड को पार्स नहीं किया जाएगा। जैसे

#define FOO 
#define BAR 
#define BAZ 

FOO void BAR qux BAZ(void) { } 

पार्सर को preprocessing किए बिना qux की फ़ंक्शन परिभाषा को कैसे पहचानना चाहिए?

+0

मेरा मतलब है कि मैं प्रीप्रोसेसिंग को छोड़ना चाहता हूं कि मैं नहीं चाहता कि मैक्रोज़ का विस्तार किया जाए और मैं हेडर को अंतिम कोड में नहीं चाहता हूं। – zeitue

2

सबसे पहले, जीसीसी पुस्तकालय नहीं है, और इसे एक (एलएलवीएम के विपरीत) के लिए संरचित नहीं किया गया है।

क्यों (यानी क्या) क्या आप सी, सी ++, एडा स्रोत कोड का विश्लेषण करना चाहते हैं?

मैं विचार करेगा जीसीसी का विस्तार या तो सी में लिखे प्लगइन्स, या अधिमानतः MELT, एक उच्च स्तरीय डोमेन विशिष्ट भाषा का प्रयोग जीसीसी विस्तार करने के लिए के माध्यम से (अस्वीकरण (एक जीसीसी 4.6 संस्करण कल्पना करते हुए): मैं के मुख्य लेखक हूँ पिघल)।

लेकिन पुस्तकालय के रूप में जीसीसी का उपयोग यथार्थवादी नहीं है।

मुझे सच में लगता है कि आप जो हासिल करना चाहते हैं, उसके लिए एमईएलटी सही उपकरण है। हालांकि, यह खराब दस्तावेज है। प्रश्न पूछने के लिए कृपया [email protected] सूची का उपयोग करें।

और जागरूक रहें कि जीसीसी का विस्तार कुछ काम (शायद एक सप्ताह से अधिक) लेता है, क्योंकि आपको आंशिक रूप से जीसीसी आंतरिक प्रतिनिधित्वों को समझने की आवश्यकता है।

+0

एमईएलटी ऐसा लगता है कि यह काम करेगा लेकिन मैं सी/सी ++ कोड में रहने की कोशिश कर रहा हूं क्योंकि मेरी बाकी परियोजना उसमें लिखी गई है, हालांकि मैं जावा को भी जानता हूं और पाइथन और वाला सीख रहा हूं। – zeitue

2

जीसीसी, के बारे में भूल इसकी एक संकलक के पार्सर, नहीं एक विश्लेषण पार्सर के रूप में किया जाता है, तो आप जिस तरह से बेहतर कर होता libclang, clang करने के लिए एक सी इंटरफ़ेस है, जो संसाधित कर सकते हैं की तरह कुछ का उपयोग कर दोनों सी & सी ++

+0

कई जीसीसी प्लगइन कुछ विश्लेषण करने में सक्षम हैं, इसलिए मुझे लगता है कि यह एक प्रासंगिक उपकरण हो सकता है। –

+0

बेसिल: समस्या यह है कि वे प्लगइन हैं, क्लैंग जमीन से एक विश्लेषक और पार्सर के रूप में बनाया गया है, हालांकि मुझे लगता है कि एक प्लगइन टूलचैन की लंबाई को कम करेगा, लेकिन टीबीएच, मैं इन दिनों – Necrolis

+0

होने पर एलएलवीएम + क्लैंग का उपयोग करने की सलाह दूंगा एक ** कंपाइलर प्लगइन ** को किसी समस्या के रूप में नहीं देखा जा सकता है, लेकिन ** निर्णायक लाभ ** के रूप में: प्लगइन बिल्कुल कंपाइलर आंतरिक पर काम करता है, इसलिए यह देख रहा है कि संकलक क्या देखता है और संकलक क्या काम करता है। साथ ही, एक कंपाइलर प्लगइन का उपयोग कुछ बाहरी उपकरण से कम विघटनकारी होता है: आप मूल रूप से केवल अपने मेकफ़ाइल के CFLAGS या CXXFLAGS पर तर्कों का अनुक्रम जोड़ते हैं। –

2

हमारे DMS Software Reengineering Toolkit विभिन्न प्रकार की बोलीभाषाओं में सी, सी ++, जावा और एडा कोड (इस समय उद्देश्य सी नहीं) को पार्स कर सकते हैं और कोड पर रूपांतरण कर सकते हैं। डीएमएस के C and C++ फ्रंट सिरों में एक प्रीप्रोसेसर शामिल है, ताकि आप पार्स से पहले प्रीप्रोकैसिंग कर सकें।

मुझे शायद यह समझ में नहीं आ रहा है कि आप क्या करना चाहते हैं, क्योंकि यह हर समारोह और (वैश्विक?) चर का नाम बदलकर अजीब लगता है "माई ...." उपसर्ग। लेकिन तुम कर सकते हो कि कुछ डीएमएस नियम (GCC3 के लिए उपयोगकर्ता कार्यों का renames का एक स्केच के साथ:

domain C~GCC3. 

rule rewrite_function_names(t: type_designator, i: IDENTIFIER, p: parameter_list, s: statements): 
     function_header->functionheader 
"\t \i(\p) { \s } " -> "\t \renamed\(\i\) (\p) { \s }" ; 

और एक सहायक समारोह "का नाम बदलता है" कि एक पहचानकर्ता युक्त एक पेड़ नोड लेता है, और के साथ एक पेड़ नोड रिटर्न नाम बदलकर पहचानकर्ता।

क्योंकि डीएमएस पैटर्न केवल पार्स पेड़ के खिलाफ मेल खाते हैं, तो आप जैसे किसी भी झूठे सकारात्मक नहीं मिलेगा।

आप प्रत्येक भाषा के भीतर विभिन्न विभिन्न वाक्य रचना मामलों को संभालने के लिए कुछ अतिरिक्त पैटर्न आवश्यकता होगी (, सी, "शून्य" रिटर्न प्रकार के लिए, क्योंकि "शून्य" वाक्यविन्यास में एक प्रकार का डिज़ाइनर नहीं है, और वैश्विक परिवर्तनीय घोषणाएं), एक अलग-अलग भाषाओं के लिए अलग-अलग नियम (एडी का वाक्यविन्यास सी के समान नहीं है)।

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

आपका विकल्प किसी प्रकार का स्ट्रिंग हैकिंग समाधान है, जो 95% समय काम कर सकता है। यदि आप इसके साथ रह सकते हैं, तो पर्ल या कुछ ऐसा ही आपके उत्तर की संभावना है।

+0

एक अच्छा समाधान की तरह लग रहा है लेकिन यह मालिकाना सॉफ्टवेयर लगता है। मेरे पास सॉफ़्टवेयर खरीदने के लिए अभी पैसे नहीं हैं और मैं विंडोज़ का उपयोग भी नहीं करता हूं, तब मैं इसका इस्तेमाल करता। – zeitue

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