LR, SLR और LALR पार्सर में क्या अंतर है?


103

LR, SLR और LALR पार्सर के बीच वास्तविक अंतर क्या है? मुझे पता है कि एसएलआर और एलएएलआर एलआर पार्सर्स के प्रकार हैं, लेकिन जहां तक ​​उनके पार्सिंग टेबल का संबंध है, तब तक वास्तविक अंतर क्या है?

और कैसे दिखाया जाए कि क्या कोई व्याकरण LR, SLR या LALR है? एक एलएल व्याकरण के लिए हमें बस यह दिखाना होगा कि पार्सिंग टेबल के किसी भी सेल में कई उत्पादन नियम नहीं होने चाहिए। LALR, SLR और LR के लिए कोई समान नियम?

उदाहरण के लिए, हम यह कैसे दिखा सकते हैं कि व्याकरण

S --> Aa | bAc | dc | bda
A --> d

LALR (1) है, लेकिन SLR (1) नहीं है?


EDIT (ybungalobill) : LALR और LR में क्या अंतर है, इसके लिए मुझे कोई संतोषजनक जवाब नहीं मिला। इसलिए एलएएलआर की मेजें आकार में छोटी होती हैं लेकिन यह केवल एलआर व्याकरणों के सबसेट को पहचान सकती हैं। क्या कोई LALR और LR कृपया के बीच के अंतर पर अधिक विस्तार कर सकता है? LALR (1) और LR (1) उत्तर के लिए पर्याप्त होगा। वे दोनों 1 टोकन लुक-फॉरवर्ड का उपयोग करते हैं और दोनों टेबल संचालित हैं! वे कैसे अलग हैं?


ठीक है, यहां तक ​​कि मैं इस पर एक उचित उत्तर की तलाश कर रहा हूं, एलएएलआर (1) एलआर (1) का सिर्फ एक मामूली संशोधन है, जहां टेबल का आकार कम किया जाता है ताकि हम स्मृति उपयोग को कम कर सकें ...
vikkyhacks

जवाबों:


64

एसएलआर, एलएएलआर और एलआर पार्सर सभी को एक ही टेबल-संचालित मशीनरी का उपयोग करके लागू किया जा सकता है।

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

  • SHIFT: यदि वर्तमान तालिका टोकन T पर SHIFT को कहती है, तो जोड़ी (S, T) को पार्स स्टैक पर धकेल दिया जाता है, तो वर्तमान टोकन के लिए GOTO तालिका जो कहती है, उसके अनुसार राज्य को बदल दिया जाता है (जैसे, GOTO (T) ), एक और इनपुट टोकन टी 'प्राप्त किया जाता है, और प्रक्रिया दोहराती है
  • REDUCE: हर राज्य में 0, 1, या कई संभावित कटौती होती हैं जो राज्य में हो सकती हैं। यदि पार्सर एलआर या एलएएलआर है, तो टोकन को राज्य के सभी वैध कटौती के लुकहेड सेट के खिलाफ जांचा जाता है। यदि टोकन व्याकरण नियम G = R1 R2 के लिए कमी के लिए एक लुकहेड सेट से मेल खाता है .. Rn, एक स्टैक में कमी और शिफ्ट होती है: G के लिए सिमेंटिक एक्शन को कहा जाता है, स्टैक n (Rn से) बार पॉप होता है, जोड़ी S, G) को स्टैक पर धकेला जाता है, नया राज्य S 'GOTO (G) पर सेट किया जाता है, और चक्र एक ही टोकन T के साथ दोहराता है। यदि पार्सर एक एसएलआर पार्सर है, तो कम से कम एक नियम के लिए है। राज्य और इसलिए कटौती की कार्रवाई आँख बंद करके की जा सकती है ताकि यह पता चले कि कौन सी कमी लागू होती है। एसएलआर पार्सर के लिए यह जानना उपयोगी है कि क्या हैएक कमी या नहीं; यह बताना आसान है कि क्या प्रत्येक राज्य स्पष्ट रूप से इसके साथ जुड़े कटौती की संख्या को रिकॉर्ड करता है, और यह कि वैसे भी एल (एएल) आर संस्करणों के लिए गणना आवश्यक है।
  • त्रुटि: यदि न तो SHIFT और न ही REDUCE संभव है, एक वाक्यविन्यास त्रुटि घोषित की जाती है।

इसलिए, यदि वे सभी एक ही मशीनरी का उपयोग करते हैं, तो क्या बात है?

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

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

तो: तीनों एक ही मशीनरी का उपयोग करते हैं। एसएलआर इस अर्थ में "आसान" है कि आप मशीनरी के एक छोटे से हिस्से को अनदेखा कर सकते हैं लेकिन यह परेशानी के लायक नहीं है। LR langauges के एक व्यापक सेट को पार्स करता है लेकिन राज्य की तालिकाओं को बहुत बड़ा माना जाता है। यह LALR को व्यावहारिक विकल्प के रूप में छोड़ता है।

यह सब कहने के बाद, यह जानने योग्य है कि GLR पार्सर किसी भी संदर्भ मुक्त भाषा को पार्स कर सकते हैं, अधिक जटिल मशीनरी का उपयोग करके लेकिन बिल्कुल उसी तालिकाओं (LALR द्वारा उपयोग किए गए छोटे संस्करण सहित)। इसका मतलब यह है कि GLR LR, LALR और SLR की तुलना में अधिक शक्तिशाली है; बहुत ज्यादा अगर आप एक मानक BNF व्याकरण लिख सकते हैं, तो GLR इसके अनुसार पार्स करेगा। मशीनरी में अंतर यह है कि जब GOTO तालिका और लुकहेड सेट के बीच संघर्ष होते हैं, तो GLR कई पर्स की कोशिश करने को तैयार है। (कैसे GLR यह कुशलतापूर्वक करता है सरासर प्रतिभाशाली है [मेरा नहीं] लेकिन इस SO पोस्ट में फिट नहीं होगा)।

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

एक प्रसिद्ध उदाहरण के रूप में, C ++ को पार्स करने के लिए बेहद कठिन माना जाता है ... लोग LALR पार्सिंग करते हैं। C ++ संदर्भ मैनुअल के पीछे दिए गए नियमों का उपयोग करते हुए GLR मशीनरी का उपयोग करते हुए सी ++ को सीधा करने के लिए सीधा है। (मेरे पास इस तरह का एक पार्सर है, और यह न केवल वैनिला सी ++, बल्कि विभिन्न प्रकार की विक्रेता बोलियों को भी संभालता है। यह केवल व्यवहार में संभव है क्योंकि हम जीएलआर पार्सर, आईएमएचओ का उपयोग कर रहे हैं)।

[EDIT नवंबर 2011: हमने C ++ 11 को संभालने के लिए अपने पार्सर को बढ़ाया है। जीएलआर ने बहुत आसान काम किया। EDIT अगस्त 2014: अब सभी C ++ 17 को संभाल रहे हैं। कुछ भी नहीं मिला या खराब हो गया, GLR अभी भी बिल्ली की म्याऊ है।]


AFAIK C ++ को LR के साथ पार्स नहीं किया जा सकता है क्योंकि इसे आगे देखने के लिए अनंत की आवश्यकता है। इसलिए मैं किसी भी हैक के बारे में नहीं सोच सकता जो इसे LR के साथ पार्स करना संभव बना देगा। इसके अलावा LRE पार्सर्स होनहार ध्वनि।
याकॉव गल्का

5
GCC ने Bison == LALR का उपयोग करके C ++ को पार्स किया। आप हमेशा मामलों को संभालने के लिए अतिरिक्त goo के साथ अपने पार्सर को उन्नत कर सकते हैं (लुकहेड, इस-इस-ए-टाइपनेम) जो आपको दिल का दर्द देता है। सवाल "कितना दर्दनाक एक हैक है?" जीसीसी के लिए यह काफी दर्दनाक था, लेकिन उन्होंने इसे काम कर दिया। इसका मतलब यह नहीं है कि यह सिफारिश की है, जो GLR का उपयोग करने के बारे में मेरी बात है।
इरा बैक्सटर

मुझे समझ नहीं आ रहा है कि GLR का उपयोग करने से आपको C ++ में क्या मदद मिलती है। यदि आप नहीं जानते कि कोई चीज एक प्रकार का नाम है या नहीं, तो आप बस यह नहीं जानते कि कैसे पार्सर x * y;- जीएलआर का उपयोग कैसे किया जाता है?
user541686

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

18

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

Btw, मैं अपने एमएलआर (के) पार्स तालिका एल्गोरिथ्म में इस बारे में कुछ बातें उल्लेख यहाँ

परिशिष्ट

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

LALR टेबल छोटी हैं क्योंकि समान (निरर्थक) राज्यों को एक साथ विलय कर दिया जाता है, प्रभावी रूप से दूर संदर्भ / लुकहैड जानकारी फेंकते हैं जो अलग-अलग राज्यों को एनकोड करते हैं। लाभ यह है कि आपको एक ही व्याकरण के लिए बहुत छोटे पार्सिंग टेबल मिलते हैं।

दोष यह है कि सभी LR व्याकरणों को LALR तालिकाओं के रूप में एन्कोड नहीं किया जा सकता है क्योंकि अधिक जटिल व्याकरणों में अधिक जटिल लुकहैड्स होते हैं, जिसके परिणामस्वरूप एक विलीन अवस्था के बजाय दो या अधिक राज्य होते हैं।

मुख्य अंतर यह है कि एलआर टेबल का उत्पादन करने के लिए एल्गोरिथ्म राज्य से राज्य के बीच के बदलावों के बीच अधिक जानकारी रखता है जबकि एलएएलआर एल्गोरिथ्म नहीं करता है। इसलिए एलएएलआर एल्गोरिदम यह नहीं बता सकता है कि किसी दिए गए मर्ज किए गए राज्य को वास्तव में दो या अधिक अलग-अलग राज्यों के रूप में छोड़ दिया जाना चाहिए।


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

12

फिर भी एक और जवाब (YAA)।

एसएलआर (1), एलएएलआर (1) और एलआर (1) के लिए पार्सिंग एल्गोरिदम समान हैं जैसे इरा बैक्सटर ने कहा,
हालांकि, पार्सर-पीढ़ी एल्गोरिथ्म के कारण पार्सर टेबल अलग हो सकते हैं।

एक एसएलआर पार्सर जनरेटर एक LR (0) स्टेट मशीन बनाता है और व्याकरण (FIRST और FOLLOW सेट) से लुक-अहिदे की गणना करता है। यह एक सरलीकृत दृष्टिकोण है और संघर्षों की रिपोर्ट कर सकता है जो एलआर (0) राज्य मशीन में वास्तव में मौजूद नहीं हैं।

एक LALR पार्सर जनरेटर एक LR (0) स्टेट मशीन बनाता है और LR (0) स्टेट मशीन (टर्मिनल ट्रांज़िशन के माध्यम से) से लुक-अहिदे की गणना करता है। यह एक सही दृष्टिकोण है, लेकिन कभी-कभी ऐसी रिपोर्टें सामने आती हैं जो एक LR (1) राज्य मशीन में मौजूद नहीं होंगी।

एक कैनन एलआर पार्सर जनरेटर एक एलआर (1) राज्य मशीन की गणना करता है और लुक-आहेड्स पहले से ही एलआर (1) राज्य मशीन का हिस्सा हैं। ये पार्सर टेबल बहुत बड़ी हो सकती हैं।

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

LRSTAR 10.0 C ++ में LALR (1), LR (1), CLR (1) या LR (*) पार्सर उत्पन्न कर सकता है, जो भी आपके व्याकरण के लिए आवश्यक है। इस आरेख को देखेंजो एलआर पार्सर्स के बीच अंतर दिखाता है।

[पूर्ण प्रकटीकरण: LRSTAR मेरा उत्पाद है]


5

मान लीजिए कि बिना एक पहरेदार के एक पार्सर खुशी से आपके व्याकरण के लिए तार काट रहा है।

आपके दिए गए उदाहरण का उपयोग करते हुए यह एक स्ट्रिंग में आता है dc, यह क्या करता है? क्या यह इसे कम करता है S, क्योंकि dcइस व्याकरण द्वारा निर्मित एक वैध स्ट्रिंग है? या शायद हम पार्स करने की कोशिश कर रहे थे bdcक्योंकि वह भी एक स्वीकार्य स्ट्रिंग है?

जैसा कि हम जानते हैं कि मनुष्य सरल है, हमें सिर्फ यह याद रखने की आवश्यकता है कि क्या हमने सिर्फ पार्स किया था bया नहीं। लेकिन कंप्यूटर बेवकूफ हैं :)

चूंकि एक SLR (1) पार्सर में LRah (0) पर अतिरिक्त शक्ति होती है, ताकि हम देख सकें कि हमें पता है कि इस मामले में क्या करना है? इसके बजाय, हमें अपने अतीत में वापस देखने की जरूरत है। इस प्रकार बचाव के लिए विहित एलआर पार्सर आता है। यह अतीत के संदर्भ को याद करता है।

जिस तरह से यह इस संदर्भ को याद करता है वह यह है कि यह खुद को अनुशासित करता है, जब भी यह एक मुठभेड़ करेगा b, यह bdcएक संभावना के रूप में, पढ़ने की दिशा में एक रास्ते पर चलना शुरू कर देगा । इसलिए जब यह देखता है तो dयह जानता है कि क्या यह पहले से ही एक रास्ता है। इस प्रकार एक सीएलआर (1) पार्सर चीजों को एक एसएलआर (1) कर सकता है जो पार्सर नहीं कर सकता है!

लेकिन अब, चूंकि हमें बहुत सारे रास्तों को परिभाषित करना था, इसलिए मशीन के राज्य बहुत बड़े हो गए!

इसलिए हम समान दिखने वाले रास्तों का विलय करते हैं, लेकिन उम्मीद के मुताबिक यह भ्रम की समस्याओं को जन्म दे सकता है। हालांकि, हम आकार को कम करने की कीमत पर जोखिम लेने के लिए तैयार हैं।

यह आपका LALR (1) पार्सर है।


अब इसे एल्गोरिथम कैसे करें।

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


यह सटीक नहीं है

4

एसएलआर बनाम एलआर के साथ उत्पन्न पार्सर टेबल के बीच मूल अंतर यह है कि एसआरआर टेबल के लिए निर्धारित फॉलो पर आधारित क्रियाएं कम होती हैं। यह अत्यधिक प्रतिबंधात्मक हो सकता है, अंततः एक शिफ्ट-कम संघर्ष का कारण बन सकता है।

दूसरी ओर, एक LR पार्सर, केवल टर्मिनलों के सेट पर निर्णयों को कम करता है जो वास्तव में गैर-टर्मिनल को कम करने का पालन कर सकते हैं। टर्मिनलों का यह सेट अक्सर इस तरह के एक गैर-टर्मिनल के अनुसरण सेट का एक उचित सबसेट होता है, और इसलिए इसमें शिफ्ट एक्शन के साथ संघर्ष की संभावना कम होती है।

एलआर पार्सर इस कारण से अधिक शक्तिशाली हैं। एलआर पार्सिंग टेबल बहुत बड़ी हो सकती हैं, हालांकि।

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

एलएएल पार्सर एलआर पार्सर की तुलना में थोड़ा कम शक्तिशाली होते हैं, लेकिन फिर भी एसएलआर पार्सर की तुलना में अधिक शक्तिशाली होते हैं। YACC और ऐसे अन्य पार्सर जनरेटर इस कारण से LALR का उपयोग करते हैं।

पीएस फॉर ब्रेविटी, एसएलआर, एलएएलआर और एलआर से ऊपर वास्तव में एसएलआर (1), एलएएलआर (1), और एलआर (1) का मतलब है, इसलिए एक टोकन लुकहेड निहित है।


4

एसएलआर पार्सर एलएएलआर (1) पार्सरों द्वारा पहचाने जाने वाले व्याकरणों के उचित उपसमूह को पहचानते हैं, जो बदले में एलआर (1) पार्सरों द्वारा पहचाने जाने वाले व्याकरणों के उचित उपसमूह को पहचानते हैं।

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

LALR (1) व्याकरण का ड्रैगन बुक उदाहरण जो SLR नहीं है, वह है:

S → L = R | R
L → * R | id
R → L

यहाँ इस व्याकरण के लिए राज्यों में से एक है:

S → L•= R
R → L•

संभव प्रस्तुतियों में से प्रत्येक में पार्सर की स्थिति को दर्शाता है। यह पता नहीं है कि यह वास्तव में किस प्रोडक्शन में है जब तक यह अंत तक नहीं पहुंचता और कम करने की कोशिश करता है।

यहाँ, पार्सर या तो शिफ्ट कर सकता है =या कम कर सकता है R → L

एक एसएलआर (उर्फ एलआर (0)) पार्सर यह निर्धारित करेगा कि क्या यह जाँच कर कम कर सकता है कि अगला इनपुट प्रतीक अनुसरण के सेट में है R(यानी, व्याकरण में सभी टर्मिनलों का सेट जो अनुसरण कर सकता है R)। चूंकि =इस सेट में भी है, एसएलआर पार्सर एक शिफ्ट-कम संघर्ष का सामना करता है।

हालांकि, एक एलएएलआर (1) पार्सर सभी टर्मिनलों के सेट का उपयोग करेगा जो आर के इस विशेष उत्पादन का पालन ​​कर सकते हैं , जो केवल $(यानी, इनपुट के अंत) है। इस प्रकार, कोई संघर्ष नहीं।

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

आपके उदाहरण में , निम्न LALR (1) स्थिति SLR कार्यान्वयन में शिफ्ट-कम संघर्ष का कारण बनती है:

S → b d•a / $
A → d• / c

बाद प्रतीक /LALR (1) पार्सर में प्रत्येक उत्पादन के लिए अनुसरण सेट है। एसएलआर में, अनुसरण ( A) शामिल है a, जिसे स्थानांतरित भी किया जा सकता है।


2

उपरोक्त उत्तरों के अलावा, यह आरेख दर्शाता है कि विभिन्न पार्सर किस प्रकार संबंधित हैं:

यहां छवि विवरण दर्ज करें


-2

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

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