c++ - Antlr के लाभ(बनाम कहते हैं, लेक्स/yacc/बाइसन)




bison (4)

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

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


एएनटीआरएल का एक अन्य लाभ यह है कि आप एंटरलॉर्क्स का उपयोग कर सकते हैं, हालांकि मैं यह नहीं कह सकता कि यह एक सख्त लाभ है, क्योंकि अन्य जनरेटर के लिए भी समान उपकरण हो सकते हैं।


एएनटीएलआर के लिए कुछ फायदे:

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

मेरा .02 $


वाईएसीसी / बाइसन और एएनटीएलआर के बीच सबसे महत्वपूर्ण अंतर इन उपकरणों को संसाधित कर सकते हैं व्याकरण का प्रकार है। वाईएसीसी / बाइसन हैंडल एलएएलआर व्याकरण, एएनटीएलआर एलएल व्याकरण संभालती है।

अक्सर, जो लोग लंबे समय से एलएएलआर व्याकरण के साथ काम करते हैं, उन्हें एलएल व्याकरण के साथ और अधिक कठिन और इसके विपरीत काम मिल जाएगा। इसका मतलब यह नहीं है कि व्याकरण या उपकरण स्वाभाविक रूप से काम करना अधिक कठिन हैं। आपको कौन सा टूल उपयोग करना आसान लगता है, वह ज्यादातर व्याकरण के प्रकार से परिचित हो जाएगा।

जहां तक ​​फायदे जाते हैं, ऐसे पहलू हैं जहां एलएएलआर व्याकरण एलएल व्याकरण पर फायदे हैं और ऐसे अन्य पहलू हैं जहां एलएल व्याकरण के एलएएलआर व्याकरण पर फायदे हैं।

वाईएसीसी / बाइसन टेबल संचालित पार्सर्स उत्पन्न करता है, जिसका अर्थ है "प्रसंस्करण तर्क" पार्सर प्रोग्राम के डेटा में निहित है, पार्सर कोड में इतना ज्यादा नहीं है। भुगतान बंद यह है कि एक बहुत ही जटिल भाषा के लिए एक पार्सर अपेक्षाकृत छोटे कोड पदचिह्न है। यह 1 9 60 और 1 9 70 के दशक में अधिक महत्वपूर्ण था जब हार्डवेयर बहुत सीमित था। टेबल संचालित पार्सर जेनरेटर इस युग में वापस जाते हैं और फिर छोटे कोड पदचिह्न को मुख्य आवश्यकता होती है।

एएनटीएलआर रिकर्सिव वंश पार्सर्स उत्पन्न करता है, जिसका अर्थ है "प्रसंस्करण तर्क" पार्सर के कोड में निहित है, क्योंकि व्याकरण के प्रत्येक उत्पादन नियम को पार्सर के कोड में एक फ़ंक्शन द्वारा दर्शाया जाता है। भुगतान बंद यह है कि यह समझना आसान है कि पार्सर अपने कोड को पढ़कर क्या कर रहा है। इसके अलावा, रिकर्सिव वंश पार्सर्स आमतौर पर टेबल संचालित लोगों की तुलना में तेज़ होते हैं। हालांकि, बहुत जटिल भाषाओं के लिए, कोड पदचिह्न बड़ा होगा। 1 9 60 और 1 9 70 के दशक में यह एक समस्या थी। इसके बाद, उदाहरण के लिए पास्कल जैसी अपेक्षाकृत छोटी भाषाएं हार्डवेयर सीमाओं के कारण इस तरह कार्यान्वित की गई थीं।

एएनटीएलआर जेनरेटेड पार्सर्स आम तौर पर कोड की 10.000 लाइनों के आसपास के क्षेत्र में होते हैं। हस्तलिखित रिकर्सिव वंश पार्सर्स अक्सर एक ही बॉलपार्क में होते हैं। विर्थ के ओबेरॉन कंपाइलर शायद कोड की पीढ़ी सहित कोड की लगभग 4000 लाइनों के साथ सबसे कॉम्पैक्ट है, लेकिन ओबेरॉन केवल 40 उत्पादन नियमों के साथ एक बहुत ही कॉम्पैक्ट भाषा है।

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

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


  • बाइसन और फ्लेक्स का परिणाम एक छोटी मेमोरी पदचिह्न में है, लेकिन आपके पास कोई ग्राफिकल आईडीई नहीं है।
  • एंटरलर अधिक मेमोरी का उपयोग करता है, लेकिन आपके पास एंटरलाइक्सेस, एक ग्राफिकल आईडीई है।

बाइसन / फ्लेक्स मेमोरी उपयोग आम तौर पर एक एमबीटी या तो होता है। कंट्रास्ट कि एंटरलर के साथ - यह मानते हुए कि यह उस फ़ाइल में प्रत्येक टोकन के लिए 512 बाइट्स मेमोरी का उपयोग करता है जिसे आप पार्स करना चाहते हैं। 4 मिलियन टोकन और आप 32-बिट सिस्टम पर वर्चुअल मेमोरी से बाहर हैं।

यदि आप जिस फ़ाइल को पार्स करना चाहते हैं वह बड़ा है, तो एंटरलर स्मृति से बाहर हो सकता है, इसलिए यदि आप केवल कॉन्फ़िगरेशन फ़ाइल को पार्स करना चाहते हैं, तो यह एक व्यवहार्य समाधान होगा। अन्यथा, यदि आप बहुत सारे डेटा वाले फ़ाइल को पार्स करना चाहते हैं, तो बाइसन आज़माएं।





bison