c++ सी/सी++ पार्सर/विश्लेषक बनाने के लिए अच्छे उपकरण




parsing yacc (12)

सी / सी ++ कोड का विश्लेषण और विश्लेषण करने के लिए त्वरित शुरुआत करने के लिए कुछ अच्छे टूल क्या हैं?

विशेष रूप से, मैं ओपन सोर्स टूल्स की तलाश में हूं जो सी / सी ++ प्रीप्रोसेसर और भाषा को संभालते हैं। अधिमानतः, ये उपकरण व्याकरण के लिए लेक्स / yacc (या flex / bison) का उपयोग करेंगे, और बहुत जटिल नहीं होंगे। उन्हें नवीनतम एएनएसआई सी / सी ++ परिभाषाओं को संभालना चाहिए।

यहां तक ​​कि मैंने अभी तक जो पाया है, लेकिन उन्हें विस्तार से नहीं देखा है (विचार?):

  • CScope - ओल्ड स्कूल सी विश्लेषक। हालांकि, एक पूर्ण पार्स नहीं लगता है। सी कार्यों को खोजने के लिए एक गौरवशाली 'grep' के रूप में वर्णित है।
  • GCC - हर किसी का पसंदीदा ओपन सोर्स कंपाइलर। बहुत जटिल है, लेकिन ऐसा लगता है। GEM नामक जीसीसी एक्सटेंशन बनाने के लिए एक संबंधित परियोजना है, लेकिन जीसीसी 4.1 (2006) के बाद से अपडेट नहीं किया गया है।
  • PUMA - पुअर मेनिप्लुलेटर। (पृष्ठ से: "इस परियोजना का उद्देश्य सी / सी ++ स्रोतों के विश्लेषण और हेरफेर के लिए कक्षाओं की पुस्तकालय प्रदान करना है। इस उद्देश्य के लिए PUMA स्कैनिंग, पार्सिंग और निश्चित रूप से सी / सी ++ स्रोतों में हेरफेर करने के लिए कक्षाएं प्रदान करता है।") । यह आशाजनक प्रतीत होता है, लेकिन 2001 से अपडेट नहीं किया गया है। जाहिर है PUMA को AspectC++ में शामिल किया गया है, लेकिन यह प्रोजेक्ट 2006 से अपडेट नहीं किया गया है।
  • विभिन्न सी / सी ++ कच्चे व्याकरण। आप c-c++-grammars-1.2.tar.gz प्राप्त कर सकते हैं, लेकिन यह 1 99 7 से c-c++-grammars-1.2.tar.gz रहा है। एक छोटी सी Google खोज अन्य मूल लेक्स / yacc व्याकरण को खींचती है जो प्रारंभिक स्थान के रूप में कार्य कर सकती है।
  • अन्य कोई?

मैं इसे एक नई खिलौना भाषा में सी / सी ++ स्रोत का अनुवाद करने के लिए प्रारंभिक बिंदु के रूप में उपयोग करने की उम्मीद कर रहा हूं।

धन्यवाद! -मैट

(जोड़ा गया 2/9): बस एक स्पष्टीकरण: मैं सी / सी ++ कोड के अलावा प्रीप्रोसेसर से अर्थपूर्ण जानकारी निकालना चाहता हूं। मैं पूर्णांक "42" में गायब होने के लिए "#define foo 42" नहीं चाहता हूं, लेकिन "foo" नाम से जुड़ा हुआ हूं। दुर्भाग्य से, पहले से प्रोप्रोसेसर चलाने वाले कई समाधान शामिल हैं और केवल सी / सी ++ पार्स पेड़ वितरित करते हैं)


Elsa सबकुछ धड़कता है जिसे मैं सी ++ पार्सिंग के लिए हाथ से जानता हूं, भले ही यह 100% अनुपालन न हो। मैं एक प्रशंसक हूं। एक मॉड्यूल है जो सी ++ प्रिंट करता है, ताकि यह आपके खिलौने प्रोजेक्ट के लिए एक अच्छा प्रारंभिक बिंदु हो।


सी ++ के लिए व्याकरण कुख्यात बालों वाली तरह है। इसके बारे में लैम्ब्डा में एक अच्छा धागा है, लेकिन यह बात यह है कि सी ++ व्याकरण को मनमाने ढंग से बहुत अधिक दिखने की आवश्यकता हो सकती है।

जिस तरह की चीज मुझे लगता है कि आप कर सकते हैं, मैं या तो जीएनयू सीसी, या Splint हैकिंग के बारे में Splint । विशेष रूप से जीएनयू सीसी भाषा उत्पादन के हिस्से को पूरी तरह से अलग करती है, इसलिए आप एक नया जी ++ बैकएंड बनाने से बेहतर हो सकते हैं।


आप क्लैंग को देख सकते हैं जो पार्सिंग के लिए llvm का उपयोग करता है।

समर्थन सी ++ पूरी तरह से अब link


जीएनयू के CFlow जैसे टूल का उपयोग करने के बारे में क्या, जो कोड का विश्लेषण कर सकता है और कॉल-ग्राफ़ के चार्ट का उत्पादन कर सकता है, यहां opengroup (मैन पेज) को सीएफएलओ के बारे में क्या कहना है। सीएफएलओ का जीएनयू संस्करण स्रोत के साथ आता है, और ओपन सोर्स भी ...

उम्मीद है कि यह मदद करता है, सबसे अच्छा संबंध है, टॉम।


Doxygen कैसे काम करता है, पूर्ण स्रोत कोड उपलब्ध है और यह फ्लेक्स-आधारित है पर एक नज़र डालें।

एक भ्रामक उम्मीदवार GOLD जो अनुवादकों को बनाने के लिए स्पष्ट रूप से एक निःशुल्क विंडोज-आधारित पार्सर टूलकिट है। समर्थित भाषाओं की उनकी सूची उन भाषाओं को संदर्भित करती है जिनमें कोई पार्सर्स लागू कर सकता है, न कि समर्थित पार्स व्याकरण की सूची।

उनके पास केवल सी और सी #, कोई सी ++ के लिए व्याकरण नहीं है।


आपकी समस्या के आधार पर GCCXML आपका जवाब हो सकता है। असल में यह जीसीसी का उपयोग कर स्रोत का विश्लेषण करता है और फिर आपको पार्स पेड़ के आसानी से पचाने योग्य एक्सएमएल देता है। जीसीसीएक्सएमएल के साथ आप एक बार और सभी के लिए कर रहे हैं।


पार्सिंग सी ++ बेहद मुश्किल है क्योंकि व्याकरण अपरिहार्य है। योसी क्रेइनिन उद्धृत करने के लिए:

बकाया जटिल व्याकरण

"आश्चर्यजनक रूप से" का अर्थ शाब्दिक रूप से किया जाना चाहिए, क्योंकि सभी लोकप्रिय भाषाओं में context-free (या "लगभग" संदर्भ मुक्त) व्याकरण होते हैं, जबकि सी ++ में undecidable व्याकरण होता है। यदि आपको कंपाइलर्स और पार्सर्स पसंद हैं, तो शायद आपको पता चलेगा कि इसका क्या अर्थ है। यदि आप इस तरह की चीज में नहीं हैं, तो सी ++ को पार्स करने में समस्या का एक सरल उदाहरण है : AA BB(CC); एक वस्तु परिभाषा या एक समारोह घोषणा? यह पता चला है कि उत्तर कथन से पहले कोड पर भारी निर्भर करता है - "संदर्भ"। यह दिखाता है (एक सहज स्तर पर) कि सी ++ व्याकरण काफी संदर्भ-संवेदनशील है।


पूर्ण सी फीचर्ड सी ++ पार्सर के लिए हमारे सी ++ फ़्रंट एंड देखें: एएसटी, प्रतीक टेबल बनाता है, नाम और प्रकार का संकल्प करता है। आप प्रीप्रोसेसर निर्देशों को भी पार्स और बनाए रख सकते हैं। सी ++ फ्रंट एंड हमारे डीएमएस सॉफ्टवेयर रीइंजिनियरिंग टूलकिट के शीर्ष पर बनाया गया है, जो आपको उस जानकारी का उपयोग स्रोत-टू-सोर्स ट्रांसफॉर्मेशन का उपयोग करके मनमाने ढंग से स्रोत कोड में परिवर्तन करने के लिए करता है।

डीएमएस एक ऐसे अनुवादक को लागू करने के लिए आदर्श इंजन है।

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

मई 2012 को संपादित करें: डीएमएस का सी ++ फ्रंट एंड अब जीसीसी 3 / जीसीसी 4 / सी ++ 11, माइक्रोसॉफ्ट विजुअलसी 2005/2010 को संभालता है। मजबूती के साथ।

फरवरी 2015 संपादित करें: अब जीसीसी और एमएस बोलीभाषाओं में सी ++ 14 को संभालती है।

अगस्त 2015 को संपादित करें: अब एक एकीकृत पेड़ में कोड और प्रीप्रोसेसर निर्देश दोनों को पारदर्शी और कैप्चर करता है।



कुछ समय पहले मैंने एक ऐसा टूल लिखने का प्रयास किया जो स्वचालित रूप से सी फाइलों के लिए यूनिट परीक्षण उत्पन्न करेगा।

प्रीप्रोसेसिंग के लिए मैंने जीसीसी के माध्यम से फाइलें रखीं। आउटपुट बदसूरत है लेकिन प्रीप्रोसेस्ड फाइल से मूल कोड में आप आसानी से पता लगा सकते हैं। लेकिन आपकी जरूरतों के लिए आपको कुछ और चाहिए।

मैंने एक सी पार्सर के लिए आधार के रूप में Metre उपयोग किया। यह खुला स्रोत है और लेक्स और yacc का उपयोग करता है। इसने लेक्स और वाईएसीसी को पूरी तरह समझने के बिना थोड़े समय में उठना और दौड़ना आसान बना दिया।

मैंने एक सी ऐप भी लिखा क्योंकि लेक्स और वाईएसी समाधान मुझे कार्यों में कार्यक्षमता का पता लगाने में मदद नहीं कर सकता था और पूरे कार्य की संरचना को एक पास में पार्स कर सकता था। यह थोड़े समय में अनजान हो गया और त्याग दिया गया।


पार्सिंग सी ++ एक बहुत जटिल चुनौती है

बूस्ट / स्पिरिट फ्रेमवर्क है, और कुछ साल पहले उन्होंने सी ++ पार्सर को लागू करने के विचार के साथ खेला था, लेकिन यह पूरी तरह से दूर है

पूरी तरह से और सही ढंग से पार्सिंग आईएसओ सी ++ तुच्छ से बहुत दूर है, और वास्तव में कई संबंधित प्रयास थे। लेकिन यह एक स्वाभाविक रूप से जटिल नौकरी है जिसे आसानी से पूरा नहीं किया जाता है, बिना किसी पूर्ण कंपाइलर फ्रंटएंड को सी ++ और प्रीप्रोसेसर को समझने के बिना। "लहर" नामक एक प्री-प्रोसेसर कार्यान्वयन आत्मा लोगों से उपलब्ध है।

उस ने कहा, हो सकता है कि आप pork/oink (एल्सा-आधारित) पर एक नज़र डालना चाहें, जो एक सी ++ पार्सर टूलकिट है जिसका विशेष रूप से स्रोत कोड रूपांतरण उद्देश्यों के लिए उपयोग किया जाना है, इसका उपयोग मोज़िला प्रोजेक्ट द्वारा बड़े पैमाने पर करने के लिए किया जा रहा है स्थैतिक स्रोत कोड विश्लेषण और स्वचालित कोड पुनर्लेखन, सबसे दिलचस्प हिस्सा यह है कि यह न केवल अधिकांश सी ++ का समर्थन करता है, बल्कि प्रीप्रोसेसर भी!

दूसरी ओर वास्तव में एक एकल मालिकाना समाधान उपलब्ध है: ईडीजी फ्रंटएंड, जिसका उपयोग सी ++ से संबंधित सभी प्रयासों के लिए किया जा सकता है।

निजी तौर पर, मैं एल्सा-आधारित पोर्क / ओंक सूट की जांच करता हूं जिसका उपयोग मोज़िला में किया जाता है, इसके अलावा, एफएसएफ ने अब रनटाइम लाइब्रेरी लाइसेंस का उपयोग कर जीसीसी प्लगइन पर काम को मंजूरी दे दी है, इस प्रकार मैं मानता हूं कि चीजें बदलने जा रही हैं तेजी से, एक बार लोग बाइनरी प्लगइन्स का उपयोग करके ऐसे उद्देश्यों के लिए जीसीसी-आधारित सी ++ पार्सर का आसानी से लाभ उठा सकते हैं।

तो, संक्षेप में: यदि आप रुपये: ईडीजी, अगर आपको अब कुछ मुफ्त / मुक्त स्रोत की आवश्यकता है: अन्यथा यदि आपके पास कुछ समय है, तो आप काफी हद तक आशाजनक हैं, तो आप अपने प्रोजेक्ट के लिए जीसीसी का उपयोग करना चाहेंगे।

सी कोड के लिए सिर्फ एक और विकल्प cscout


pycparser पायथन में लिखित सी (सी 99) के लिए एक पूर्ण पार्सर है। इसमें पूरी तरह कॉन्फ़िगर करने योग्य एएसटी बैकएंड है, इसलिए इसे किसी भी प्रकार की भाषा प्रसंस्करण के लिए आधार के रूप में उपयोग किया जा रहा है।

हालांकि, सी ++ का समर्थन नहीं करता है। अनुमोदित, यह सी से बहुत कठिन है।

अपडेट (2012) : इस समय उत्तर, बिना किसी संदेह के, Clang होगा - यह मॉड्यूलर है, पूर्ण सी ++ का समर्थन करता है (कई सी ++ - 11 फीचर्स के साथ) और इसका अपेक्षाकृत अनुकूल कोड बेस है। इसमें उच्च स्तरीय भाषाओं (यानी पायथन के लिए ) के लिए बाइंडिंग के लिए एक सीपीआई भी है।







lex