एक व्याकरण को आमतौर पर एक संदर्भ मुक्त व्याकरण के रूप में परिभाषित किया जाता है - विकिपीडिया पृष्ठ पर एक सटीक परिभाषा दी गई है, लेकिन यह उसी तरह से काम करता है जैसा कि PLY में होता है , जो बाइसन पर आधारित है , जो बदले में याक पर आधारित है ।
यह यहां कहता है कि PLY एक LALR पार्सर का उपयोग करता है । यह अनिवार्य रूप से एक LR पार्सर है जहाँ लुकअप टेबल को संघनित किया जाता है, संभवतः पार्सिंग संघर्षों का परिचय देते हुए, एलआर व्याकरण की अभिव्यंजकता को कम करते हुए (यानी, एक संदर्भ मुक्त व्याकरण जिसे एक LR पार्सर पार्स कर सकता है)। यदि आप पार्सर की इस विशेष शाखा और अन्य पार्सरों की सीमाओं के बारे में जानना चाहते हैं, तो यहां सभी प्रकार की पार्सिंग तकनीकों (एलएल, एलआर और अन्य) का अवलोकन दिया गया है ।
आपके प्रश्न का उत्तर देने के लिए: किसी भी संदर्भ-मुक्त भाषा को पार्स करने में सक्षम पार्सिंग एल्गोरिदम मौजूद हैं, भले ही भाषा अस्पष्ट हो (यानी, इनपुट की व्याख्या करने का एक से अधिक तरीका है):
इस तरह की पहली एल्गोरिथ्म था CYK एल्गोरिथ्म , जो दुर्भाग्य से की एक चलने का समय है , जहां n इनपुट स्ट्रिंग और की लंबाई है | जी | व्याकरण का आकार है और इसलिए पार्सिंग भाषाओं के लिए अव्यावहारिक है।O(n3|G|)n| जी|
दूसरी एल्गोरिथ्म है ईयरली एल्गोरिदम । यह एल्गोरिथम किसी भी संदर्भ मुक्त व्याकरण को पार्स करने में भी सक्षम है। हालाँकि एक अस्पष्ट भाषा को पार्स करने के लिए एल्गोरिथ्म को समय की आवश्यकता होती है, लेकिन इसे एक अस्पष्ट भाषा को पार्स करने के लिए केवल O ( n 2 ) समय की आवश्यकता होती है । इसके अलावा, यह स्पष्ट रूप से अधिकांश एलआर व्याकरणों के लिए रैखिक समय में काम करता है और विशेष रूप से बाएं-पुनरावर्ती व्याकरणों पर अच्छी तरह से काम करता है।ओ (n3)ओ ( एन)2)
यहां आप एक पेपर पा सकते हैं, जो कि इयरली एल्गोरिथ्म के व्यावहारिक कार्यान्वयन (एक अनुकूलन) पर चर्चा कर रहा है। वे निष्कर्ष निकालते हैं: "LALR (1) पार्सिंग ((जो लगभग PLY करता है)) की तुलना में अर्ली पार्सिंग की व्यापकता को देखते हुए, और यह देखते हुए कि पीईपी ((एर्ले के एल्गोरिथ्म का उनका कार्यान्वयन) सबसे खराब समय एक द्वारा ध्यान देने योग्य नहीं होगा। उपयोगकर्ता, यह एक उत्कृष्ट परिणाम है "।
Parser का अंतिम प्रकार GLR पार्सर है । यह LR पार्सिंग का एक सामान्यीकृत संस्करण है, जो किसी भी संदर्भ-मुक्त भाषा को पार्स करने में सक्षम है।
GLR का एक परिपक्व कार्यान्वयन ASF + SDF है । बाइसन एक जीएलआर पार्सर भी उत्पन्न कर सकता है, हालांकि इसका कार्यान्वयन 'मानक' जीएलआर एल्गोरिथ्म से थोड़ा अलग है। Elkhound एल्गोरिथ्म एक GLR / LALR संकर एल्गोरिथ्म है। यह जब संभव हो तो LALR का उपयोग करता है और आवश्यकता पड़ने पर GLR, किसी भी व्याकरण को पार्स करने में तेज और सक्षम दोनों होता है।
संदर्भ मुक्त व्याकरणों से परे , संदर्भ संवेदनशील व्याकरण होते हैं , लेकिन ये सामान्य रूप से पार्स करने के लिए कठिन होते हैं और इतना स्पष्टता नहीं जोड़ते हैं: आप उनके साथ अधिक कर सकते हैं, लेकिन अधिकांश अनुप्रयोगों के लिए अतिरिक्त उपयोग प्रासंगिक नहीं हैं, जब तक कि आप पार्स नहीं कर रहे हैं। एक प्राकृतिक भाषा।
अंतिम चरण के रूप में अप्रतिबंधित व्याकरण हैं । इस बिंदु पर व्याकरण ट्यूरिंग-पूर्ण है, इसलिए कोई भी बाध्य नहीं है कि किसी विशेष भाषा को पार्स करने में कितना समय लगेगा, जो कि अधिकांश पार्सिंग अनुप्रयोगों के लिए अवांछनीय है। अतिरिक्त शक्ति की लगभग कभी आवश्यकता नहीं होती है। यदि आप उस सारी शक्ति का उपयोग करना चाहते हैं, तो भाषा की मशीन उपलब्ध है।
अंत में, अपने स्वयं के पार्सर-जनरेटर को लागू करना एक तुच्छ मामला नहीं है, विशेष रूप से इसे तेजी से प्राप्त करने के लिए। मैंने व्यक्तिगत रूप से फ्लेक्स (लेक्सर जनरेटर) के अपने संस्करण को बनाने के लिए व्यक्तिगत रूप से समाप्त कर दिया है, और जबकि यह अपेक्षाकृत सरल एल्गोरिथम समस्याओं में एक अभ्यास की तरह लग रहा था, यह सही होने के लिए काफी जटिल हो गया, विशेष रूप से जब मैंने यूनिकोड का समर्थन करने की कोशिश की। अपने स्वयं के लेखन के बजाय पहले से मौजूद कार्यान्वयन का उपयोग करने पर विचार करें।