एलएल और एलआर पार्सिंग के मुख्य फायदे और नुकसान क्या हैं?


27

एक प्रोग्रामिंग भाषा के लिए एक पार्सर का निर्माण करते समय मैं क्या कमाता हूं और मैंने एक या दूसरे को चुनने में क्या खो दिया?


"LL पार्सर" और "पुनरावर्ती वंश पार्सर" दो अलग-अलग चीजें नहीं हैं? ऐसा लगता है कि LL (k) व्याकरण को RD पार्सर का उपयोग करके पार्स किया जा सकता है, लेकिन इसका अर्थ यह नहीं है कि LL पार्सर RD पार्सर के समान हैं। क्या यह मामला है? देखें: stackoverflow.com/questions/1044600/…
xji

@XiangJi: वे बहुत अलग हैं कि हर एलएल व्याकरण आरडी पार्सर के लिए मैप किया जा सकता है, लेकिन उलटा जरूरी नहीं है (चूंकि आरडी पार्सर्स के विकल्प का आदेश दिया गया है , और एलएल व्याकरण वाले अनारक्षित हैं )।
टिम Timस

जवाबों:


42

मैं कई मानदंडों के लिए LL और LR को पार कर रहा हूँ:

जटिलता

एलएल यहां जीतता है, हाथ नीचे करता है। आप एलएल पार्सर को आसानी से हाथ से लिख सकते हैं। वास्तव में, यह आमतौर पर किया जाता है: Microsoft C # संकलक एक हाथ से लिखा पुनरावर्ती वंश पार्सर है ( यहाँ स्रोत , पैट्रिक क्रिस्टियनसेन द्वारा की गई टिप्पणी के लिए देखें - ब्लॉग पोस्ट बहुत ही रोचक है)।

LR पार्सिंग एक पाठ को पार्स करने के लिए एक नहीं बल्कि सहज ज्ञान युक्त विधि का उपयोग करता है। यह काम करता है, लेकिन मुझे अपना सिर लपेटने में कुछ समय लगा कि यह कैसे काम करता है। इस तरह के पार्सर को हाथ से लिखना इसलिए कठिन है: आप कम से कम LR पार्सर-जनरेटर को लागू करेंगे।

व्यापकता

एलआर यहां जीतता है: सभी एलएल भाषाएं एलआर भाषाएं हैं, लेकिन एलएल भाषाओं की तुलना में अधिक एलआर भाषाएं हैं (एक भाषा एक एलएल भाषा है अगर इसे एलएल पार्सर के साथ पार्स किया जा सकता है, और एक भाषा एलआर भाषा है अगर इसे पार्स किया जा सकता है एक LR पार्सर)।

एलएल में कुछ उपद्रव हैं जो आपको किसी भी प्रोग्रामिंग भाषा के बारे में लागू करते समय परेशान करेंगे । अवलोकन के लिए यहां देखें ।

असंदिग्ध भाषाएं हैं जो एलआर भाषा नहीं हैं, लेकिन वे बहुत दुर्लभ हैं। आप लगभग ऐसी भाषाओं से कभी नहीं मिलते। हालाँकि, LALR में कुछ समस्याएँ हैं।

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

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

कंपाइलर एरर और एरर रिकवरी

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

इसके अलावा, एलएल पार्सिंग में, त्रुटि सुधार बहुत आसान है। यदि कोई इनपुट सही तरीके से पार्स नहीं करता है, तो आप थोड़ा आगे बढ़ने का प्रयास कर सकते हैं और पता लगा सकते हैं कि बाकी इनपुट सही तरीके से पार्स करता है या नहीं। यदि उदाहरण के लिए कुछ प्रोग्रामिंग स्टेटमेंट विकृत है, तो आप आगे स्टेटमेंट को छोड़ सकते हैं और अगले स्टेटस को पार्स कर सकते हैं, जिससे आप एक से अधिक एरर पकड़ सकते हैं।

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

गति

गति वास्तव में आपके इनपुट (एलएल या एलआर) को पार्स करने के तरीके के साथ एक मुद्दा नहीं है, बल्कि इसके परिणामस्वरूप कोड की गुणवत्ता और तालिकाओं का उपयोग (आप एलएल और एलआर दोनों के लिए तालिकाओं का उपयोग कर सकते हैं)। इसलिए एलएल और एलआर इस संबंध में तुलनीय हैं।

लिंक

यहां एलएल और एलआर के विपरीत एक साइट का लिंक भी दिया गया है। नीचे के पास अनुभाग देखें।

यहां आप मतभेदों के बारे में बातचीत पा सकते हैं। यह गंभीर रूप से एक राय नहीं है कि गंभीर रूप से वहां देखी गई राय को देखें, हालांकि वहां पवित्र युद्ध चल रहा है।

अधिक जानकारी के लिए, यहाँ और यहाँ पार्सर्स के बारे में मेरे अपने दो पोस्ट हैं, हालांकि वे एलएल और एलआर के बीच विपरीत के बारे में कड़ाई से नहीं हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.