LR (0) और SLR पार्सिंग में क्या अंतर है?


82

मैं अपने संकलक अवधारणाओं पर काम कर रहा हूं लेकिन मैं थोड़ा भ्रमित हूं ... Googling ने मुझे एक निश्चित उत्तर कहीं नहीं मिला।

एसएलआर और एलआर (0) पार्सर्स एक और एक ही है? यदि नहीं, तो अंतर क्या है?

जवाबों:


249

एलआर (0) और एसएलआर (1) पार्सर दोनों नीचे-ऊपर, दिशात्मक, भविष्य कहनेवाला पार्सर हैं । इस का मतलब है कि

  • पार्सर्स इनपुट वाक्य को वापस प्रारंभ चिह्न ( नीचे-ऊपर ) को कम करने के लिए प्रोडक्शंस को रिवर्स में लागू करने का प्रयास करते हैं।
  • पार्सर्स इनपुट को बाएं से दाएं ( दिशात्मक ) स्कैन करते हैं
  • पार्सर्स यह अनुमान लगाने का प्रयास करते हैं कि क्या कमी को लागू करने के लिए जरूरी है कि सभी इनपुट ( पूर्वसूचक ) देखे बिना।

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

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

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

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

एसएलआर (1) ("सरलीकृत एलआर (1)") में, पार्सर को यह देखने का एक टोकन देखने की अनुमति है कि क्या यह बदलाव करना चाहिए या कम करना चाहिए। विशेष रूप से, जब पार्सर ए → डब्ल्यू (नॉनटर्मिनल ए और स्ट्रिंग डब्ल्यू के लिए) फॉर्म के कुछ को कम करने की कोशिश करना चाहता है, तो यह इनपुट के अगले टोकन को देखता है। अगर वह टोकन कानूनी रूप से गैर व्युत्पन्न ए के बाद किसी व्युत्पत्ति में दिखाई दे सकता है, तो पार्सर कम हो जाता है। नहीं तो नहीं। यहाँ अंतर्ज्ञान यह है कि कुछ मामलों में इसे कम करने का प्रयास करने का कोई मतलब नहीं है, क्योंकि हमने अब तक और आगामी टोकन को देखते हुए टोकन दिया है, कोई भी संभव तरीका नहीं है कि कमी कभी भी सही हो सकती है।

LR (0) और SLR (1) के बीच एकमात्र अंतर यह तय करने में मदद करने की अतिरिक्त क्षमता है कि संघर्ष होने पर क्या कार्रवाई की जाए। इस वजह से, कोई भी व्याकरण जिसे LR (0) पार्सर द्वारा पार्स किया जा सकता है, SLR (1) पार्सर द्वारा पार्स किया जा सकता है। हालांकि, एसएलआर (1) पार्स एलआर (0) की तुलना में बड़ी संख्या में व्याकरणों को पार्स कर सकते हैं।

व्यवहार में, हालांकि, एसएलआर (1) अभी भी काफी कमजोर पार्सिंग विधि है। अधिक सामान्यतः, आप एलएएलआर (1) ("लाहदहेड एलआर (1)") पार्सर का उपयोग करते हुए देखेंगे। वे एलआर (0) पार्सर में संघर्षों को हल करने की कोशिश करके भी काम करते हैं, लेकिन वे संघर्षों को सुलझाने के लिए जिन नियमों का उपयोग करते हैं, वे एसएलआर (1) में उपयोग किए जाने की तुलना में कहीं अधिक सटीक हैं, और परिणामस्वरूप व्याकरणों की एक बड़ी संख्या एलएएलआर (1) है। की तुलना में एसएलआर (1) हैं। थोड़ा और अधिक विशिष्ट होने के लिए, एसएलआर (1) पार्सर्स व्याकरण की संरचना को देखते हुए और स्थानांतरित करने के लिए और कम करने के बारे में अधिक जानकारी जानने के लिए संघर्ष को हल करने का प्रयास करते हैं। LALR (1) पार्सर व्याकरण और LR (0) दोनों को देखता है कि शिफ्ट कब करना है और कब कम करना है। क्योंकि एलएएलआर (1) एलआर (0) पार्सर की संरचना को देख सकता है, यह अधिक सटीक रूप से पहचान कर सकता है जब कुछ संघर्षों में गड़बड़ है।yaccऔर bison, डिफ़ॉल्ट रूप से, एलएएलआर (1) पार्सर्स का उत्पादन करें।

ऐतिहासिक रूप से, एलएएलआर (1) पार्सर का निर्माण आम तौर पर एक अलग विधि के माध्यम से किया गया था जो कि अधिक शक्तिशाली एलआर (1) पार्सर पर निर्भर था, इसलिए आप अक्सर देखेंगे कि एलएएलआर (1) इस तरह वर्णित है। इसे समझने के लिए, हमें LR (1) पार्सर्स के बारे में बात करनी होगी। LR (0) पार्सर में, पार्सर यह ट्रैक रखने के द्वारा काम करता है कि यह उत्पादन के बीच में कहां हो सकता है। एक बार जब यह पता चला कि यह एक उत्पादन के अंत तक पहुँच गया है, तो यह कम करने की कोशिश करना जानता है। हालांकि, पार्सर यह बताने में सक्षम नहीं हो सकता है कि क्या यह एक उत्पादन के अंत में है और दूसरे के बीच में है, जो एक बदलाव / संघर्ष को कम करता है, या दो अलग-अलग प्रस्तुतियों में से एक के अंत तक पहुंच गया है (कम / संघर्ष को कम करना)। एलआर (0) में, यह तुरंत संघर्ष की ओर जाता है और पार्सर विफल हो जाता है। SLR (1) या LALR (1) में,

LR (1) पार्सर में, पार्सर संचालित होते ही अतिरिक्त सूचनाओं पर नज़र रखता है। पार्सर का मानना ​​है कि किस उत्पादन का उपयोग किया जा रहा है, इसका ट्रैक रखने के अलावा, यह इस बात पर नज़र रखता है कि उस उत्पादन के पूरा होने के बाद संभव टोकन दिखाई दे सकते हैं। चूँकि पार्सर प्रत्येक चरण में इस जानकारी पर नज़र रखता है, न कि केवल जब उसे निर्णय लेने की आवश्यकता होती है, तो LR (1) पार्सर LR (0), एसएलआर (1), या किसी भी की तुलना में काफी अधिक शक्तिशाली और सटीक होता है। LALR (1) पार्सर्स हमने अब तक के बारे में बात की है। LR (1) एक अत्यंत शक्तिशाली पार्सिंग तकनीक है, और यह कुछ मुश्किल गणित का उपयोग करके दिखाया जा सकता है कि किसी भी भाषा को किसी भी पाली / कम पार्सर द्वारा निश्चित रूप से पार्स किया जा सकता है जिसमें कुछ व्याकरण होता है जिसे LR (1) ऑटोमेटन के साथ पार्स किया जा सकता है। (ध्यान दें कि इसका मतलब यह नहीं है कि सभी व्याकरणनिर्धारित किया जा सकता है कि नियत रूप से LR (1) हैं; यह केवल यह कहता है कि एक भाषा जिसे निश्चित रूप से निर्धारित किया जा सकता है, उसमें कुछ LR (1) व्याकरण है। हालाँकि, यह शक्ति एक मूल्य पर आती है, और उत्पन्न LR (1) पार्सर को संचालित करने के लिए इतनी जानकारी की आवश्यकता हो सकती है कि इसका उपयोग संभवतः अभ्यास में नहीं किया जा सकता है। एक वास्तविक प्रोग्रामिंग भाषा के लिए एक LR (1) पार्सर, उदाहरण के लिए, सही ढंग से संचालित करने के लिए दसियों सैकड़ों मेगाबाइट अतिरिक्त जानकारी की आवश्यकता हो सकती है। इस कारण से, LR (1) का उपयोग आमतौर पर अभ्यास में नहीं किया जाता है, और कमजोर पार्सल जैसे LALR (1) या SLR (1) का उपयोग किया जाता है।

हाल ही में, जीएलआर (0) ("सामान्यीकृत एलआर (0)") नामक एक नए पार्सिंग एल्गोरिथ्म ने लोकप्रियता हासिल की है। एलआर (0) पार्सर में दिखाई देने वाले संघर्षों को हल करने की कोशिश करने के बजाय, जीएलआर (0) पार्सर इसके बजाय समानांतर में सभी संभव विकल्पों की कोशिश करके काम करता है। कुछ चतुर चाल का उपयोग करते हुए, यह कई व्याकरणों के लिए बहुत कुशलता से चलाने के लिए बनाया जा सकता है। इसके अलावा, जीएलआर (0) किसी भी संदर्भ-मुक्त व्याकरण को पार्स कर सकता है, यहां तक ​​कि व्याकरण जिन्हें किसी भी k के लिए LR (k) पार्सर द्वारा पार्स नहीं किया जा सकता है। अन्य पार्सर भी ऐसा करने में सक्षम हैं (उदाहरण के लिए, अर्ली पार्सर या सीवाईके पार्सर), हालांकि जीएलआर (0) अभ्यास में तेज होता है।

यदि आप अधिक सीखने में रुचि रखते हैं, तो इस गर्मी में मैंने एक परिचयात्मक संकलक पाठ्यक्रम पढ़ाया और केवल दो सप्ताह के भीतर पार्सिंग तकनीकों के बारे में बात की। यदि आप LR (0), SLR (1), और अन्य शक्तिशाली पार्सिंग तकनीकों के एक अधिक कठोर परिचय प्राप्त करना चाहते हैं, तो आप मेरे लेक्चर स्लाइड और होमवर्क असाइनमेंट का आनंद ले सकते हैं। पाठ्यक्रम सामग्री के सभी यहाँ मेरी व्यक्तिगत साइट पर उपलब्ध हैं

उम्मीद है की यह मदद करेगा!


24
यह एक उत्कृष्ट उत्तर है। बिल्कुल स्पष्ट और शैक्षिक तरीके से प्रश्न का उत्तर देता है। एक सबसे अच्छा जवाब मैं एसओ पर आया हूं।
नीलबेल

2
@templatetypedef: मुझे लगता है कि आपको L (AL) R (1) और SLR (1) के बीच के अंतर पर थोड़ा विस्तार करना चाहिए, यही वजह है कि SLR (1) एक दिलचस्प विकल्प के रूप में मौजूद है। लेकिन +1।
इरा बैक्सटर

@ इरा बैक्सटर- मैंने अभी एलएएलआर (1) और एलआर (1) के बारे में कुछ और बात करने के लिए चर्चा को अद्यतन किया। क्या आप इसे देख सकते हैं और मुझे बता सकते हैं कि क्या ऐसा कुछ है जो आपको लगता है कि मुझे जोड़ना चाहिए?
templatetypedef

1
@newbie LR (0) पार्सर्स में एक ऐक्शन टेबल होता है, लेकिन कार्रवाई राज्य पर नहीं बल्कि अगले टोकन पर निर्भर करती है।
templatetypedef

1
@newbie आपके द्वारा दिया गया आइटम कम किया गया आइटम है। इस स्थिति के लिए प्रविष्टि प्रविष्टि कम होगी।
templatetypedef

1

यही मैंने सीखा है। आम तौर पर LR (0) पार्सर में अस्पष्टता हो सकती है, अर्थात तालिका का एक बॉक्स (आप पार्सर बनाने के लिए प्राप्त करते हैं) इसे बेहतर तरीके से रखने के लिए कई मान हो सकते हैं (या): पार्सर एक ही इनपुट के साथ दो अंतिम अवस्थाओं की ओर जाता है। तो इस अस्पष्टता को दूर करने के लिए SLR पार्सर बनाया जाता है। इसके निर्माण के लिए सभी प्रोडक्शंस जो गोटो राज्यों की ओर ले जाते हैं, बाएं हाथ की ओर उत्पादन प्रतीक का अनुसरण करें और केवल उन गोटो राज्यों को शामिल करें, जो अनुसरण में मौजूद हैं। इस इंटर्न का मतलब है कि आप एक उत्पादन को शामिल नहीं करते हैं जो मूल ग्रामर का उपयोग करना संभव नहीं है (coz कि राज्य अनुसरण सेट में नहीं है)

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