नहीं, उनके सभी अलग-अलग अर्थ हैं।
दाएं और बाएं-रिकर्सन उत्पादन नियमों के भीतर रिकर्सन का संदर्भ लें। गैर-टर्मिनल के लिए एक उत्पादन रिकर्सिव है यदि यह उस गैर टर्मिनल के साथ अनुक्रम प्राप्त कर सकता है; यह गैर-टर्मिनल व्युत्पन्न अनुक्रम के प्रारंभ (बाएं किनारे) पर दिखाई दे सकता है, और दाएं-पुनरावर्ती है यदि यह अंत (दाएं किनारे) पर दिखाई दे सकता है तो बाएं-रिकर्सिव है। एक उत्पादन बाएं या दाएं-पुनरावर्ती होने के बिना रिकर्सिव हो सकता है, और यह बाएं और दाएं-रिकर्सिव दोनों भी हो सकता है।
उदाहरण के लिए
:
term: term '*' factor { /* left-recursive */ }
assignment: lval '=' assignment { /* right-recursive */ }
उपरोक्त उदाहरण दोनों प्रत्यक्ष प्रत्यावर्तन कर रहे हैं; गैर टर्मिनल सीधे एक अनुक्रम प्राप्त करता है जिसमें गैर-टर्मिनल होता है। रिकर्सन अप्रत्यक्ष भी हो सकता है; यह अभी भी रिकर्सन है।
सभी सामान्य पार्सिंग एल्गोरिदम प्रक्रिया बाएं से दाएं, जो एलएल और एलआर में पहली एल है। टॉप-डाउन (एलएल) पार्सिंग में बाएं सबसे ज्यादा व्युत्पन्न (दूसरा एल) पाता है, जबकि नीचे-ऊपर (एलआर) पार्सिंग को सही व्युत्पन्न (आर) मिलती है।
प्रभावी रूप से, इनपुट पाठ प्राप्त होने तक वर्तमान अनुक्रम में कुछ गैर-टर्मिनल पर आधारित एक गैर-टर्मिनल (प्रारंभ प्रतीक) और "अनुमान" एक व्युत्पन्न के साथ दोनों प्रकार के पार्सर शुरू होते हैं। बाएं सबसे ज्यादा व्युत्पन्न में, यह हमेशा बाएं सबसे गैर-टर्मिनल होता है जिसे विस्तारित किया जाता है। दाएं व्युत्पन्न में, यह हमेशा सही गैर-टर्मिनल होता है।
तो एक शीर्ष-डाउन पार्सर हमेशा अनुमान लगाता है कि कौन सा उत्पादन पहले गैर-टर्मिनल के लिए उपयोग करना है, जिसके बाद इसे फिर से पहले गैर-टर्मिनल पर काम करने की आवश्यकता है। (यहां "अनुमान लगाएं" अनौपचारिक है। यह इनपुट का उपयोग करने के लिए इनपुट को देख सकता है - या कम से कम अगले के इनपुट के टोकन - यह निर्धारित करने के लिए कि कौन सा उत्पादन उपयोग करना है।) इसे शीर्ष-डाउन प्रोसेसिंग कहा जाता है क्योंकि यह ऊपर से नीचे पार्स पेड़ बनाता है।
रिवर्स में नीचे-नीचे पार्सर की क्रिया को देखने के लिए यह आसान है (कम से कम मेरे लिए); यह कुछ उत्पादन खोजने के लिए पर्याप्त मात्रा में इनपुट को बार-बार पढ़कर पार्स पेड़ नीचे बनाता है, जो व्युत्पन्न श्रृंखला में अंतिम व्युत्पन्न होगा। तो यह एक सही व्युत्पन्न पैदा करता है, लेकिन यह इसे पीछे से आगे बढ़ाता है।
एक ऑपरेटर भाषा के लिए एलआर व्याकरण में (लगभग बोलने वाले, भाषाओं के लिए व्याकरण जो अंकगणितीय अभिव्यक्तियों की तरह दिखता है), बाएं- और दाएं-साझेदारी को क्रमशः बाएं और दाएं-पुनरावर्ती व्याकरण नियमों का उपयोग करके मॉडलिंग किया जाता है। "एसोसिएटिविटी" व्याकरण का एक अनौपचारिक विवरण है, जैसा कि "प्राथमिकता" है।
प्राथमिकता को व्याकरण नियमों की एक श्रृंखला का उपयोग करके मॉडलिंग किया जाता है, जिनमें से प्रत्येक अगले नियम को संदर्भित करता है (और जो आमतौर पर कोष्ठक को संभालने के लिए एक पुनरावर्ती उत्पादन के साथ समाप्त होता है - '(' expr ')'
- जो न तो बाएं- न ही दाएं-पुनरावर्ती है)।
"ऑपरेटर प्राथमिकता पार्सिंग" नामक तल-अप पार्सिंग की एक पुरानी शैली है, जिसमें प्राथमिकता स्पष्ट रूप से भाषा विवरण का हिस्सा है। एक आम ऑपरेटर-प्राथमिकता एल्गोरिदम तथाकथित शंटिंग यार्ड एल्गोरिदम है। लेकिन अगर आपके पास एलएएलआर (1) पार्सर जनरेटर है, जैसे बाइसन, तो आप इसके बजाय इसका उपयोग भी कर सकते हैं, क्योंकि यह दोनों सामान्य और अधिक सटीक है।
यह एक बहुत व्यापक सवाल है। मैं इसे दो या दो से अधिक अलग प्रश्नों में विभाजित करने की अनुशंसा करता हूं, क्योंकि अन्यथा उत्तर वास्तव में लंबे समय तक होने जा रहे हैं। – templatetypedef
इसके बारे में क्षमा करें। मैंने इसे कम कर दिया है। – user3001845