एसएलआर, एलएएलआर और एलआर पार्सर सभी को एक ही टेबल-संचालित मशीनरी का उपयोग करके लागू किया जा सकता है।
मौलिक रूप से, पार्सिंग एल्गोरिथ्म अगले इनपुट टोकन टी एकत्र करता है, और वर्तमान स्थिति एस (और संबद्ध लुकहेड, गोटो और कमी तालिकाओं) को निर्धारित करता है कि क्या करना है:
- 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 अभी भी बिल्ली की म्याऊ है।]