2010-11-03 14 views
28

क्या फायदे डालूँगा पारसर्स today's parser generator tools में अपने रिश्तेदार लोकप्रियता वारंट एलआर पारसर्स से अधिक है?एलएल पार्सर्स पर एलएल पार्सर्स के क्या फायदे हैं?

Wikipedia के अनुसार, एलआर पार्स डालूँगा का लाभ होता है करने के लिए प्रकट होता है:

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

नोट: यह होमवर्क नहीं है। मैं जब मुझे पता चला कि antlr एक डालूँगा पार्सर जेनरेटर है सिर्फ हैरान था (जैसा कि इसके नाम में "एलआर" होने के बावजूद!)।

+0

के बारे में * पारसर्स * (और नहीं व्याकरण) बात कर रहे: डालूँगा (*) एक सरल पुनरावर्ती में लिखा जा सकता है - दृष्टिकोण दृष्टिकोण। यह मेरी किताब में एक +1 है। –

+0

@pst: सच है, मैं बस उम्मीद कर रहा था कि "क्योंकि उन्हें लागू करना आसान है" प्राथमिक लाभ नहीं था। :) –

+3

ध्यान दें कि "एलआर" ANTLR में सिर्फ "भाषा मान्यता", व्याकरण के वर्ग यह स्वीकार करता है के बारे में कुछ भी नहीं के लिए खड़ा है। –

उत्तर

26

GLR महान यदि आप एक पार्स पेड़/वन चाहते हैं और ब्लैक बॉक्स से परहेज नहीं करते है। यह आपको CFG में टाइप करने देता है, जो आप एलआर/एलएएलआर विवादों को स्थिर रूप से हल करने के बजाय, संपूर्ण परीक्षण के माध्यम से पार्स समय पर अस्पष्टताओं की जांच करने की लागत पर चाहते हैं। कुछ कहते हैं कि यह एक अच्छा व्यापार बंद है। ईरा बैक्सटर के डीएमएस उपकरण या एल्खाउंड, जिसमें एक मुफ्त सी ++ व्याकरण है, इस समस्या के वर्ग के लिए उपयोगी हैं। ANTLR भाषा अनुप्रयोगों की एक बड़ी कक्षा के लिए भी उपयोगी है, लेकिन एलएल (*) नामक पुनरावर्ती मूल पार्सर्स उत्पन्न करने वाले शीर्ष-नीचे दृष्टिकोण का उपयोग करता है जो अर्थपूर्ण भविष्यवाणियों की अनुमति देता है। मैं यहां सबूत के बिना बताऊंगा कि भविष्यवाणी आपको सीएफजी से परे संदर्भ-संवेदनशील भाषाओं का विश्लेषण करने की अनुमति देती है। प्रोग्रामर व्याकरण में क्रियाएं डालना पसंद करते हैं, जैसे कि अच्छी त्रुटि हैंडलिंग, और एकल-चरण डीबग की तरह।एलएल तीनों में अच्छा है। एलएल वह है जो हम हाथ से करते हैं ताकि समझना आसान हो। wikipedia nonsense about LR being better at handling errors पर विश्वास न करें। उस ने कहा, यदि आप एएनटीएलआर के साथ बहुत पीछे हटते हैं, तो एलएल (*) (पीईजी में यह समस्या है) के साथ त्रुटियां वास्तव में बदतर हैं।

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

GLR O(n^3) सबसे खराब स्थिति है। पैक्रेट/पीईजी O(n) सबसे खराब मामला है। ANTLR के O(n^2) हैं चक्रीय अग्रदर्शी DFA की वजह से, लेकिन व्यवहार में O(n)। वास्तव में कोई फर्क नहीं पड़ता। जीएलआर पर्याप्त तेज़ है।

ANTLRहै एक अन्य टीएल आंग आर ecognition नहीं विरोधी एलआर के लिए ool, लेकिन मुझे पसंद है कि एक भी;)

सच कहूं, युवा कोडर का एक बहुत की तरह 80 के दशक में, मुझे एलएएलआर नहीं समझा और काले बक्से पसंद नहीं आया (अब मैं जीएलआर इंजन की सुंदरता खोदता हूं लेकिन फिर भी एलएल पसंद करता हूं)। मैंने एक वाणिज्यिक एलएल (के) आधारित कंपाइलर बनाया और हाथ से निर्मित किए गए जेनरेट करने के लिए एक टूल बनाने का फैसला किया। एएनटीएलआर हर किसी के लिए नहीं है और सी ++ जैसे बढ़ते मामलों को जीएलआर के साथ बेहतर तरीके से संभाला जा सकता है लेकिन बहुत से लोगों को एएनटीएलआर उनके आराम क्षेत्र में फिट बैठता है। जनवरी 2008 से, एएनटीएलआर के बाइनरी जार के 134,000 डाउनलोड, एएनटीएलआरवर्क्स के भीतर, और स्रोत ज़िप कुल (Google Analytics के अनुसार) रहे हैं। एलएल (*) पर बहुत सारे अनुभवजन्य डेटा के साथ our paper देखें।

+1

मैं निश्चित रूप से लाइन-दर-रेखा डीबग करने की क्षमता की सराहना कर सकता हूं! मैं "संदर्भ" के विचार की भी सराहना कर सकता हूं (यानी, यह जानकर कि अभिव्यक्ति की जा रही अभिव्यक्ति 'if' कथन में निहित है)। उत्तर के लिए धन्यवाद, यह निश्चित रूप से एलएल पार्सर्स की कुछ ताकत दिखाता है! –

+0

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

+3

सब: मैं मानता हूं कि वास्तव में एएनटीएलआर और अधिकांश पार्सर जेनरेटर "मामूली" व्याकरण के लिए पार्सर्स बनाने के लिए अच्छे हैं। व्याकरण तब होता है जब व्याकरण "कठिन" हो जाता है। यदि आप व्याकरण के नियंत्रण में हैं और कठिन मामलों को दूर करने के लिए इसे बदल सकते हैं, तो कोई भी पार्सर जनरेटर करेगा। यदि आप नहीं हैं, तो पार्सर जनरेटर की ताकत वास्तव में मायने रखती है। किसी भी मामले में, उपकरण के समर्थन में इंजीनियरिंग वास्तव में मदद करता है। जीएलआर की ओर मेरी पूर्वाग्रह के बावजूद (वे अभ्यास में ओ (एन) भी हैं!), मैं यह स्वीकार करने वाला पहला व्यक्ति होगा कि टेरेन्स ने एएनटीएलआर को प्रभावी बनाने के लिए एक सुंदर सभ्य नौकरी की है। –

-1

एक कारण यह है कि मन में आता है है, यह है कि एक डालूँगा प्रतिमान में मनमाना बैक ट्रैकिंग (खांसी सी ++) की जरूरत है एक भाषा करने के लिए बहुत आसान है।

+0

* खांसी * सी ++ को मनमाने ढंग से बैकट्रैकिंग की आवश्यकता नहीं है। एक जीएलआर पार्सर यह ठीक है। मेरा जवाब देखें –

+0

मेरा मतलब है, सी ++ घोषणा/अभिव्यक्ति अस्पष्टता के कारण, किसी भी परिमित के लिए एलएल (के) या एलआर (के) नहीं है। – zwol

+1

ठीक है, एक शुद्ध अर्थ में सी ++ को पार्स करना (जीसीसी-रिजल्ट-प्रकार-दौरान-पार्सिंग हैक नहीं) के लिए पार्सर अस्पष्ट पार्स भी उठाता है। एलएल/एलआर पार्स बस ऐसा नहीं करते हैं। जीएलआर पार्सर्स करते हैं। आप प्रतीक तालिका जानकारी के साथ बाद में अस्पष्टता को हल करते हैं, जिससे आप नाम और प्रकार के संकल्प से पार्सिंग को अलग कर सकते हैं, जो आपको अधिक क्लीनर पार्सर्स देता है। –

1

मेरे व्यक्तिगत अनुभव से (मैंने विभिन्न परिस्थितियों के लिए दोनों का उपयोग किया), सबसे व्यावहारिक अंतर यह है कि, एलएल (के) के साथ, आप व्याकरण को बिना किसी आसान तरीके से परिभाषित कर सकते हैं (क्योंकि यह ऊपर-नीचे है) एलआर पार्सर्स के साथ अक्सर होने वाले कई संभावित कम-कम या कम-से-कम संघर्षों को कम करें। केवल एक चीज जिसकी आपको परवाह है, वह बाएं-रिकर्सन है जिसे सही में बदलना चाहिए।

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

+0

बस इतना मैं समझता हूं ... आप कह रहे हैं कि सबसे व्यावहारिक अंतर यह है कि एलएल पार्सर्स आम तौर पर एलआर पार्सर्स में मिलने वाले संघर्षों से बचते हैं। क्या यह केवल एलआर पार्सर्स पर लागू होगा जो उनके लुकहेड को एक छोटी संख्या तक सीमित कर देगा (उदाहरण के लिए, एलआर (1) या एलएएलआर (1))? मैंने सोचा कि एलआर (के) पार्सर्स के पास कई संघर्षों के करीब नहीं था ... –

10

आप हाथ कोड एक, पुनरावर्ती वंश (एलएल) करने के लिए है, तो आप कुछ वास्तविक कर सकते हैं; लोग व्यावहारिक रूप से हाथ से एल (एएल) आर पार्सर्स का निर्माण नहीं कर सकते हैं।

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

वास्तव में, मैं GLR parsers पसंद करते हैं, जो काफी एक संदर्भ मुक्त व्याकरण के साथ कुछ भी पार्स होगा। कोई बाएं-रिकर्सन चिंता नहीं है। कोई बदलाव/संघर्ष चिंता को कम नहीं करता है। कोई लुकअप सीमा नहीं है।

आप, आप देख सकते हैं here (प्रसिद्धि से मुश्किल से पार्स-का उपयोग कर-डालूँगा/LALR भाषा, C++ सहित) भाषाओं कि एक GLR को पार्स इंजन संभाल कर सकते हैं की सीमा को देखने के लिए चाहते हैं।

+0

आपको व्याकरण बनाम लड़ने की ज़रूरत नहीं है क्योंकि आप सीधे पार्सर परिभाषा के अंदर विशिष्ट आदेशों से भविष्य को परिभाषित करने में सक्षम हैं, न कि एलआर दृष्टिकोण व्याकरण पर कम आवश्यकताओं है .. – Jack

+0

@Ira: बहुत ही रोचक पोस्ट! मैंने पहले जीएलआर पार्सर्स के बारे में भी नहीं सुना था। –

+0

@ जैक: मैं आपके बिंदु से सहमत हूं कि कैसे प्राथमिकता निर्देश एलआर-विशिष्ट लाभ नहीं हैं। हालांकि, क्या आप बाएं रिकर्सन के उन्मूलन के संबंध में ईरा के बिंदु से सहमत होंगे? –

0

केवल लाभ मैंने कभी से परिचित किया गया है है कि आप कर सकते हैं हाथ से आसानी से कोड डालूँगा पारसर्स। एलआर पार्सर्स हाथ से कोड करने के लिए बहुत कठिन हैं (आप आमतौर पर एक पार्सर जेनरेटर का उपयोग करते हैं)।

+1

और जब आपके पास ऐसा जनरेटर होता है, तो उन्हें उत्पादित करना * वास्तव में * आसान है। –

0

डालूँगा Parsings सबसे खराब स्थिति जटिलता हे है (एन^4), जबकि एलआर पार्स के सबसे ज्यादा मामले जटिलता बेहतर है, O (n^3)।

(। लेकिन कोई भी कभी भी हे लिखते थे (एन^4) व्याकरण)

https://en.wikipedia.org/wiki/Top-down_parsing

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