2010-04-02 24 views
8

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

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

स्पष्ट रूप से इन सभी भाषाओं के लिए पार्सर्स को लिखा गया है, इसलिए ऐसा लगता है कि मुझे उस प्रयास को डुप्लिकेट नहीं करना चाहिए (भले ही पार्सर्स मजेदार हो)। क्या कोई ओपन-सोर्स प्रोजेक्ट है जो स्रोत भाषाओं के समूह के लिए उपयोग में आसान पार्सर पुस्तकालय एकत्र करता है? या क्या मुझे अपना खुद का खरोंच से बनाने के लिए एएनटीएलआर का उपयोग करना चाहिए? (नोट: मुझे एक महान मौजूदा संसाधन का उपयोग करने के लिए परियोजना को दूसरी भाषा में बंद करने में खुशी होगी, इसलिए यदि आप एक के बारे में जानते हैं, इससे कोई फ़र्क नहीं पड़ता कि इसमें कौन सी भाषा लिखी गई है।)

+1

सिंटैक्स-हाइलाइटिंग लाइब्रेरीज़ (पाइगर्स दिमाग में आते हैं) जो कई अलग-अलग भाषाओं को संभालते हैं। मुझे आश्चर्य है कि उनमें से एक आपके मामले के लिए पर्याप्त जानकारी प्रदान करेगा। मुझे संदेह नहीं है, लेकिन यह एक लायक हो सकता है। – Ken

उत्तर

6

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

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

मैंने पिछले 15 वर्षों में प्रोग्राम विश्लेषण और परिवर्तन के लिए नींव मशीनरी को परिभाषित किया है, और DMS Software Reengineering Toolkit नामक ऐसी अन्य लाइब्रेरी का निर्माण किया है। इसमें सी, सी ++, सी #, जावा, कोबोल (आईबीएम एंटरप्राइज़ संस्करण), जेसीएल, पीएचपी, पायथन आदि के लिए उत्पादन गुणवत्ता पार्सर्स हैं। आपकी राय निश्चित रूप से मेरी भिन्नता हो सकती है लेकिन इन्हें दैनिक परिवर्तन कार्यों को करने के लिए डीएमएस के साथ उपयोग किया जाता है कोड के बड़े निकायों पर।

मुझे किसी अन्य व्यक्ति के बारे में पता नहीं है जहां लैंगेज परिभाषाओं का सेट परिपक्व और एक ही नींव पर बनाया गया है ... यह हो सकता है कि आईबीएम के कंपाइलर्स ऐसे सेट हैं, लेकिन आईबीएम मशीनरी या भाषा परिभाषाएं।

यदि आप बस इतना करना चाहते हैं कि सरल मेट्रिक्स की गणना करें, तो आप केवल लेक्सर्स और विज्ञापन के साथ घूमने में सक्षम हो सकते हैं (जैसा आपने वर्णन किया है)। यहां तक ​​कि यह कठिन है कि यह ज्यादातर मामलों में सही काम करने के लिए दिखता है (पाइथन, पर्ल और PHP पागल स्ट्रिंग सिंटैक्स देखें)। जब सब कुछ कहा और किया जाता है, यहां तक ​​कि सी एक सटीक लेक्सर को परिभाषित करने के लिए काम की एक आश्चर्यजनक मात्रा है: हमारे पास माइक्रोसॉफ्ट और/या जीएनयू सी में मिलने वाले सभी अजीब लेक्समेम को कवर करने के लिए परिष्कृत नियमित अभिव्यक्तियों की कई हज़ार लाइनें हैं।

क्योंकि डीएमएस लगातार कई परिभाषित, परिपक्व पार्सर्स कई भाषाओं के लिए है, यह इस प्रकार है कि डीएमएस ने लगातार लैंगुग के लिए परिपक्व लेक्सर्स को परिभाषित किया है। हम वास्तव में Source Code Search Engine (SCSE) बनाते हैं जो कई भाषाओं में कोडों के बड़े निकायों में तेजी से खोज प्रदान करता है जो उन भाषाओं को लेक्सिंग करके काम करता है जो तेजी से लुकअप के लिए उन लेक्समेम को अनुक्रमणित करते हैं। एससीएसई बस उस तरह के मीट्रिक की गणना करने के लिए होता है, जिस पर आप चर्चा कर रहे हैं, क्योंकि यह कोड बेस को अनुक्रमित करता है, जैसा कि आप वर्णन करते हैं, उतना ही यह है कि सिवाय इसके कि इन लंगेज सटीक लेक्सर्स का उपयोग करने के लिए है।

+0

ईरा, एक आकर्षक जवाब के लिए धन्यवाद! डीएमएस सॉफ्टवेयर रीइंजिनियरिंग टूलकिट जो मैं करने की कोशिश कर रहा हूं उसके बजाय एक बड़े (अधिक अच्छी तरह से विचार-विमर्श, कम मीट्रिक-केंद्रित) संस्करण की तरह दिखता है। हम्म। यह दिलचस्प है कि आप PHP का उल्लेख करते हैं, क्योंकि यह वही है जो मुझे इस निर्णय के लिए प्रेरित करता है कि मुझे एक असली पार्सर चाहिए। यदि मैं पूछ सकता हूं, तो क्या आपकी कोई सिफारिशें हैं यदि मैं कई भाषाओं के लिए अपने स्वयं के पार्सर्स लिखने का फैसला करता हूं? (फिर फिर, सेमेन्टिक डिज़ाइन वेबसाइट को देखते हुए, पार्सर्स की ऐसी श्रृंखला लिखने की रणनीतियों व्यापार रहस्यों पर विचार कर सकती हैं! अगर ऐसा है, तो कृपया इस सवाल की उपेक्षा करें।) – Arkaaito

+1

हम कुछ भी नहीं करते जो गुप्त है। पार्सर्स को आसानी से लिखने की रणनीति सबसे मजबूत पार्सिंग तकनीक प्राप्त करना है जिसे आप प्राप्त कर सकते हैं (जीएलआर), सबसे सटीक भाषा परिभाषा (PHP इस परीक्षा को बुरी तरह विफल करता है), एक व्याकरण कोड और असफलताओं की तलाश में लाखों लाइनों को कोड के माध्यम से ढकता है। वास्तविक मुद्दा सिर्फ पसीना है; इस रणनीति के साथ भी, प्रत्येक भाषा के लिए बहुत सारी ऊर्जा लेती है। डीएमएस बनाने का मुद्दा प्रत्येक नई भाषा के लिए सामान्य आधारभूत संरचना को डुप्लिकेट करने से बचाना था (मैं डीएमएस बनाने का फैसला करने से पहले 25 साल तक इस तरह की चीज कर रहा हूं)। –

2

आप शायद यदि आप सी ++ पार्स कर रहे हैं तो gcc-xml में रूचि रखें। Java CUP में जावा भाषा के लिए व्याकरण है।

+0

जीसीसी-एक्सएमएल कार्यों के निकायों, सिर्फ घोषणाओं पर कोई जानकारी नहीं देगा। जब आप केवल फ़ंक्शन हेडर देखते हैं तो उपयोगी मीट्रिक प्राप्त करना मुश्किल होता है। –

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