2009-04-27 10 views
5

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

  • क्या यह सही है कि फ्लेक्स/वाईएसी इसे करने का सबसे सही तरीका है?

  • रेगेक्सप्स का उपयोग करके शैल या पायथन लिपि लिखने से धीमा हो जाएगा (जैसा कि मुझे लगता है कि अगर अतिरिक्त कीवर्ड की संख्या बड़ी हो जाती है और उनके प्रभाव अलग होंगे तो) यह शून्य होगा कि मेरे पास शून्य है विश्लेषकों/पार्सर्स के साथ अनुभव (हालांकि मुझे पता है कि एलएएलआर कैसे अपना काम करता है)?

  • क्या लेक्स/वाईएसी पर ऐसी कोई अच्छी सामग्री है जो समान समस्याओं को कवर करती है? सभी कागजात जिन्हें मैं "खिलौना" कैलकुलेटर के समान आदिम उदाहरण का उपयोग कर सकता हूं।

किसी भी मदद की सराहना की जाएगी।

उत्तर

3

ANTLR आमतौर पर उपयोग किया जाता है (जैसा कि लेक्स \ Yacc हैं)।

ANTLR, के लिए भाषा मान्यता एक और उपकरण, कि निर्माण के लिए एक रूपरेखा प्रदान करता है एक भाषा उपकरण है recognizers, दुभाषियों, compilers, लक्ष्य भाषाओं की एक किस्म में कार्रवाई युक्त व्याकरण विवरण से और अनुवादकों।

+2

आपकी दृष्टि थोड़ा सा प्रतिबंधक है मुझे लगता है ... – LB40

+0

@ मिच गेहूं: मेरा मानना ​​है कि वह एएनटीएलआर सुपरक्सिंग लेक्स \ Yacc के बारे में आपकी टिप्पणी का जिक्र कर रहा है। –

+0

एएनटीएलआर ने लेक्स/वाईएसी को "सुपरसीड" नहीं किया है। यह खुद को व्यवहार्य विकल्प साबित कर दिया है। एलएएलआर पार्सिंग एक लंबे शॉट से मर नहीं है। –

1

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

यदि आप ऐसा कुछ चाहते हैं जो एक सप्ताह के भीतर वैध सी को पार्स कर सके, तो एक पार्सर जनरेटर का उपयोग करें। कोड पर्याप्त तेज़ होगा और अधिकांश पार्सर जनरेटर पहले से ही सी के लिए व्याकरण के साथ आते हैं जिसे आप प्रारंभिक बिंदु (सामान्य गलतियों का 9 0% से परहेज) के रूप में उपयोग कर सकते हैं।

ध्यान दें कि regexps रिकर्सिव संरचनाओं को पार्स करने के लिए उपयुक्त नहीं हैं। यह दृष्टिकोण एक जेनरेटर और हाथ से लिखे पुल पार्सर की तुलना में अधिक त्रुटि प्रवण का उपयोग करने से धीमा होगा।

+0

और अंतिम 10% आपको सी की संदर्भ संवेदनशीलता के कारण एक और वर्ष ले जाएगा। जीएनयू दोस्तों से पूछो। –

3

Lemon Parser भी है, जिसमें कम प्रतिबंधक व्याकरण है। नीचे की तरफ आप नींबू से विवाहित हैं, जब आप कुछ सीमा बेकार खोजते हैं तो किसी और चीज के लिए एक पार्सर के व्याकरण को दोबारा लिखना। ऊपर की ओर इसका उपयोग करना वास्तव में आसान है .. और स्वयं निहित है। आप इसे पेड़ में छोड़ सकते हैं और दूसरों की उपस्थिति की जांच के बारे में चिंता न करें।

SQLite3 कई अन्य लोकप्रिय परियोजनाओं के रूप में इसका उपयोग करता है। मैं इसका उपयोग नहीं कर रहा हूं क्योंकि SQLite करता है, लेकिन अगर समय परमिट की अनुमति है तो शायद इसे आज़माएं।

1

वास्तव में, यह निर्भर करता है कि जटिल अपनी भाषा है और क्या यह वास्तव में सी के करीब है या नहीं ...

फिर भी, आप भी नियमित अभिव्यक्ति के लिए पहले कदम के रूप लेक्स इस्तेमाल कर सकते हैं ....

मैं लेक्स + मेनहर और ओ'कॉमल के लिए जाऊंगा ....

लेकिन किसी भी फ्लेक्स/याक संयोजन ठीक होगा ..

नियमित बायसन (याक की gnu कार्यान्वयन) के साथ मुख्य समस्या सी टाइपिंग .. यदि आप अपने पूरे वृक्ष का वर्णन करने के लिए है (और सभी की वजह से उपजी हेरफेर फ़ंक्शन) ... ओ'कैम का उपयोग करना वास्तव में आसान होगा ...

-1

आप जो करना चाहते हैं, उसके लिए हमारे DMS Software Reengineering Toolkit संभावित रूप से एक बहुत ही प्रभावी समाधान है।

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

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

+2

यह उस उत्पाद के लिए एक लापरवाही प्लग/पदोन्नति जैसा लगता है जिसे आपको नकदी के भार को फोर्क करना पड़ता है .... मजाकिया, आपने यहां एक ही चीज़ का उल्लेख किया है ... http://stackoverflow.com/questions/526797/ अच्छे उपकरण-निर्माण-ए-पार्सर-विश्लेषक यह प्रोग्रामिंग सवालों के लिए एक जगह है, वाणिज्यिक सॉफ्टवेयर को बढ़ावा नहीं दे रहा है .... – t0mm13b

+0

सवाल यह था, "ऐसा करने का सबसे अच्छा तरीका क्या है"। उत्तर में उचित रूप से ऐसे सॉफ़्टवेयर शामिल होना चाहिए जो वाणिज्यिक, या नहीं। और हां, मैं पक्षपातपूर्ण हूं, क्योंकि मैंने 15 साल पहले इस जवाब को वास्तव में इस तरह के प्रश्न का जवाब देने के लिए प्राप्त किया था। –