ऊपर दिए गए जवाब बहुत अच्छी परिभाषा देते हैं कि यह क्या है। आइए देखें कि क्या मैं इसे अपने शब्दों में रख सकता हूं, ताकि आपके पास 20 के बजाय 23 स्पष्टीकरण होंगे। एक व्याकरण, किसी भी व्याकरण का पूरा उद्देश्य, यह पता लगाना है कि क्या किसी विशेष वाक्य में दी गई भाषा में एक वाक्य है। हालाँकि, हम वास्तव में व्याकरण और पार्सिंग का उपयोग करते हैं, यह पता लगाने के लिए कि वाक्य का क्या अर्थ है। यह एक वाक्य के पुराने आरेख की तरह है जो आपने स्कूल में वापस अंग्रेजी कक्षा में किया हो सकता है या नहीं। एक वाक्य एक विषय भाग और एक विधेय भाग से बना होता है, एक विषय भाग में एक संज्ञा और कुछ विशेषण होते हैं, एक विधेय भाग में एक क्रिया होती है और शायद एक वस्तु संज्ञा होती है, जिसमें कुछ और विशेषण होते हैं, आदि।
यदि अंग्रेजी के लिए एक व्याकरण था (और मुझे नहीं लगता कि कंप्यूटर विज्ञान के अर्थ में नहीं है), तो इसमें निम्नलिखित रूप के नियम होंगे, जिन्हें प्रोडक्शंस कहा जाता है।
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
आदि...
फिर आप एक प्रोग्राम लिख सकते हैं और इसे किसी भी वाक्य को सौंप सकते हैं, और प्रोग्राम व्याकरण का उपयोग यह पता लगाने के लिए कर सकता है कि प्रत्येक शब्द का कौन सा वाक्य है, और उनका एक दूसरे से क्या संबंध है।
यदि प्रत्येक उत्पादन में, बाईं ओर केवल एक चीज होती है, तो इसका मतलब है कि जब भी आप वाक्य में दाईं ओर देखते हैं, तो आपको बाईं ओर स्थानापन्न करने की अनुमति होती है। उदाहरण के लिए जब भी आपने विशेषण संज्ञा को देखा, तो आप उस वाक्यांश के बाहर किसी भी चीज़ पर ध्यान दिए बिना "दैट्स अ सब्जेक्टपार्ट" कह सकते थे।
हालाँकि, अंग्रेज़ी (यहाँ तक कि ऊपर दिया गया अंग्रेजी का सरलीकृत विवरण) भी संदर्भ-संवेदनशील है। "विशेषण संज्ञा" हमेशा एक विषय नहीं है, यह एक PredicatePart में एक NounPhrase हो सकता है। ये संदर्भ पर निर्भर करता है। आइए अपने छद्म अंग्रेजी व्याकरण का थोड़ा विस्तार करें:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
यदि आप VerbPhrase के ठीक बाद आते हैं, तो आप ObjectNounPhrase में केवल "विशेषण संज्ञा" बना सकते हैं।
मूल रूप से, यदि आपके पास एक उत्पादन है और आप इसे किसी भी समय चाहें तो लागू कर सकते हैं, चाहे जो भी इसे घेरता हो, यह संदर्भ-मुक्त है।
आप हमेशा बता सकते हैं कि क्या कोई व्याकरण आसानी से मुक्त है। बस जांचें कि क्या तीर के बाईं ओर एक से अधिक प्रतीक हैं।
किसी भी भाषा को एक से अधिक व्याकरण द्वारा वर्णित किया जा सकता है। यदि किसी भाषा के लिए कुछ व्याकरण संदर्भ-मुक्त है, तो भाषा संदर्भ-मुक्त है। यह कुछ भाषाओं के लिए साबित हो सकता है कि कोई संदर्भ-मुक्त व्याकरण संभव नहीं है। मुझे लगता है कि ऊपर बताए गए सरल छद्म अंग्रेजी सब्मिट के लिए एक संदर्भ-मुक्त व्याकरण हो सकता है।
क्यों यह मायने रखता है के लिए, यह एक संदर्भ मुक्त व्याकरण पार्स करने के लिए एक सरल प्रकार के कार्यक्रम की आवश्यकता है। जैसा कि अन्य उत्तरों में कहा गया है, संदर्भ-मुक्त व्याकरण को पार्स करने के लिए ट्यूरिंग मशीन की पूरी शक्ति की आवश्यकता नहीं होती है। एक विशेष संदर्भ-मुक्त व्याकरण के लिए एक लुकहेड LR (1) पार्सर (जो एक प्रकार की पुशडाउन मशीन है) उस व्याकरण में किसी भी वाक्य को समय और स्थान रैखिक को वाक्य की लंबाई तक पार कर सकता है। यदि वाक्य भाषा में है, तो पार्सर एक संरचना वृक्ष का निर्माण करेगा जिससे यह पता चलेगा कि वाक्य में प्रत्येक प्रतीक का क्या अर्थ है (या कम से कम यह संरचना में कौन सा भाग निभाता है)। यदि वाक्य व्याकरण में नहीं है, तो पार्सर नोटिस करेगा और पहले प्रतीक पर रोक देगा जो व्याकरण और पूर्ववर्ती प्रतीकों (पहले "त्रुटि" पर) के साथ सामंजस्य करना असंभव है।
इससे भी बेहतर यह है कि ऐसे कार्यक्रम हैं जो आप एक व्याकरण का विवरण दे सकते हैं, और प्रत्येक भाग के साथ क्या करना है, इस बारे में निर्देशों की एक सूची (एक अर्थ में प्रत्येक उत्पादन के लिए "अर्थ" संलग्न करना) और कार्यक्रम पार्सर लिख देगा तुम्हारे लिए। कार्यक्रम वाक्य को पार्स करेगा, संरचना को ढूंढेगा, और संरचना के प्रत्येक भाग पर अपने निर्देशों को चलाएगा। इस तरह के कार्यक्रम को पार्सर-जनरेटर या कंपाइलर-कंपाइलर कहा जाता है।
इस तरह के भाषा विश्लेषण का आविष्कार प्राकृतिक भाषा (जैसे अंग्रेजी) के स्वचालित विश्लेषण के लिए किया गया था, लेकिन यह पता चला है कि यह कंप्यूटर भाषाओं के विश्लेषण के लिए सबसे उपयोगी है। एक भाषा डिजाइनर एक व्याकरण लिख सकता है जो अपनी नई भाषा को कैप्चर करता है, फिर एक प्रोग्राम प्राप्त करने के लिए पार्सर-जनरेटर के माध्यम से इसे चलाता है जो अपनी भाषा को पार्स करता है, और यदि वह चाहता है तो अनुवाद, व्याख्या, संकलन, निष्पादन आदि करता है।
वास्तव में, ज्यादातर मामलों में आप वास्तव में ऐसा नहीं कर सकते। उदाहरण के लिए, संतुलित कोष्ठक एक संदर्भ-मुक्त भाषा है, लेकिन एक भाषा जहां आपको संदर्भ के प्रति संवेदनशील होने से पहले सभी चर घोषित करने की आवश्यकता होती है। पार्सर कंपाइलर का एक हिस्सा है, लेकिन इन अन्य आवश्यकताओं को लागू करने के लिए अतिरिक्त तर्क की आवश्यकता होती है। फिर आपको क्या करना है एक व्याकरण लिखें जो आपकी भाषा को जितना संभव हो सके उतना पकड़ता है, कि एक पार्सर-जनरेटर के माध्यम से चलाएं, फिर कोड लिखें जो बाकी आवश्यकताओं (प्रतीक तालिका हैंडलर, आदि) को लागू करता है।
हम आम तौर पर संदर्भ-संवेदनशील व्याकरण का उपयोग नहीं करते हैं क्योंकि वे बहुत अधिक खराब समर्थित हैं। मुझे नहीं पता कि संदर्भ-संवेदनशील भाषाओं के लिए LR (k) पार्सर-जनरेटर के बराबर है या नहीं। हां, ट्यूरिंग मशीन (या लीनियर बाउंड मशीन) एक को पार्स कर सकती है, लेकिन मुझे नहीं पता कि ट्यूरिंग मशीन के लिए एक प्रोग्राम में संवेदी-संवेदनशील व्याकरण को बदलने के लिए एक सामान्य एल्गोरिथ्म है, इस अर्थ में कि एक LR (1) ) जनरेटर एक पुशडाउन मशीन के लिए पार्स टेबल बनाता है। मेरा अनुमान है कि जो टेबल पार्सर से गुजरती हैं वे तेजी से बड़ी होंगी। किसी भी मामले में, सीएस छात्रों (जैसे खुद, दिन में वापस) को आमतौर पर संदर्भ-मुक्त व्याकरण और एलआर (1) पार्सर जनरेटर जैसे कि YACC सिखाया जाता है।