क्या प्रोग्रामिंग भाषाओं विषय से मुक्त कर रहे हैं? [...]
टी एल; डॉ: शायद ही कोई हो, लेकिन Brainfuck और SKI combinator calculus दो, उनके वाक्य विन्यास की सादगी की वजह से कर रहे हैं।
अब संस्करण: आमतौर पर, विषय से मुक्त व्याकरण (CFGs) केवल को मोटे तौर पर एक भाषा की वाक्य रचना को निर्दिष्ट किया जाता है। एक वाक्य रचना सही कार्यक्रमों और प्रोग्राम हैं जो संकलन के बीच भेद करना होगा। आमतौर पर, कंपाइलर्स भाषा विश्लेषण को सिंटैक्स विश्लेषण में विभाजित करता है जो कोड के टुकड़े की सामान्य संरचना बनाता है और सत्यापित करता है, और अर्थात् विश्लेषण जो का अर्थ है प्रोग्राम का।
द्वारा "विषय से मुक्त भाषा" यदि आप मतलब है "... जिसके लिए सभी कार्यक्रमों संकलन", तो जवाब है: शायद ही कोई। इस बिल में फिट होने वाली भाषाओं में शायद ही कोई नियम या जटिल विशेषताएं हों (जैसे चर, अस्तित्व, संवेदनशीलता, या एक प्रकार प्रणाली का अस्तित्व)।
मेरे पेट मुझसे कहता है कि कार्यात्मक भाषाओं विषय से मुक्त हो सकता है [...]
एक भाषा विषय से मुक्त है या नहीं यह कार्यात्मक होने के साथ कोई संबंध नहीं है या नहीं। यह केवल एक बात है कि भाषा नियमों और सुविधाओं को कितना जटिल बनाना है।
यहाँ अनिवार्य भाषा Brainfuck के लिए एक CFG है:
Program → Instr Program | ε
Instr → '+' | '-' | '>' | '<' | ',' | '.' | '[' Program ']'
और यहाँ कार्यात्मक स्की Combinator पथरी के लिए एक CFG है:
Program → E
E → 'S' E E E
E → 'K' E E
E → 'I'
E → '(' E ')'
हैं, तो दूसरी ओर, "विषय से मुक्त भाषा "केवल इसका मतलब है" ... जिसके लिए सभी कार्यक्रम सिंटैक्स विश्लेषण पास करते हैं ", इसका जवाब यह है कि अकेले सिंटैक्स कितना जटिल है। ऐसी कई वाक्य रचनाएं हैं जो अकेले सीएफजी के साथ वर्णन करना मुश्किल या असंभव हैं। इनमें से कुछ काउंटर, लुकअप टेबल, और इसी तरह के ट्रैक रखने के लिए पार्सर्स को अतिरिक्त राज्य जोड़कर दूर हो गए हैं। अजगर और हास्केल तरह खाली स्थान के प्रति संवेदनशील भाषाओं
Indentation- और: यह संभव नहीं हैं वाक्यात्मक सुविधाओं के
उदाहरण एक CFG साथ व्यक्त करने के लिए। मनमाने ढंग से नेस्टेड इंडेंटेशन स्तरों का ट्रैक रखना अनिवार्य रूप से संदर्भ-संवेदनशील है और इंडेंटेशन स्तर के लिए एक अलग काउंटर की आवश्यकता है। (अनुमति दे ही खरोज की एक निश्चित स्तर सैद्धांतिक रूप से खरोज के प्रत्येक स्तर के लिए व्याकरण को दोहराने के लिए काम करेंगे, लेकिन व्यवहार में यह असुविधाजनक है।)
C Typedef Parsing Problem कहता है कि सी प्रोग्राम शब्दावली विश्लेषण के दौरान संदिग्ध हैं क्योंकि यह किसी व्याकरण से नहीं पता हो सकता है अगर कोई नियमित पहचानकर्ता या मौजूदा प्रकार के लिए टाइपेडफ ऊर्फ है।
मैक्रो- और टेम्पलेट-आधारित भाषाओं जैसे लिस्प, सी ++, टेम्पलेट हास्केल, निम, और इसी तरह। चूंकि सिंटैक्स बदलता है क्योंकि इसे पार्स किया जा रहा है, इसलिए एक समाधान पार्सर को स्वयं-संशोधित प्रोग्राम में बनाना है। जैसा कि Is C++ context-free or context-sensitive? प्रश्न के उत्तर में व्यक्त किया गया है, जवाब न तो है।
एक वाक्यात्मक सुविधा का एक उदाहरण है कि एक CFG के रूप में व्यक्त करने के लिए संभव है, लेकिन अक्सर नहीं है:
अक्सर, ऑपरेटर पूर्वता और संबद्धता सीधे CFGs में व्यक्त नहीं कर रहे हैं। उदाहरण के लिए, एक छोटे से अभिव्यक्ति व्याकरण जहां^× अधिक कठोर बांधता है, और × से + तंग बांधता के लिए एक CFG, इस प्रकार दिखाई देंगे:
E → E^E
E → E × E
E → E + E
E → (E)
E → num
यह CFG ambiguous है, तथापि, और अक्सर एक precedence/associativity table के साथ है उदाहरण के लिए वह^सबसे अच्छा बांधता है, × बाइंड्स टिटर से +, वह^सही-सहयोगी है, और वह × और + बाएं-सहयोगी हैं।
पूर्वता और संबद्धता एक व्यवस्थित तरीके से ऐसी है कि वह स्पष्ट है में एक CFG में एन्कोड किया जा सकता है और केवल वाक्य रचना के पेड़ जहां ऑपरेटरों ठीक से व्यवहार पैदा करता है। ऊपर व्याकरण के लिए इस का एक उदाहरण:
E₀ → EA E₁
EA → E₁ + EA
EA → ε
E₁ → EM E₂
EM → E₂ × EM
EM → ε
E₂ → E₃ EP
EP →^E₃ EP
E₃ → num
E₃ → (E₀)
लेकिन अस्पष्ट CFGs + पूर्वता/संबद्धता टेबल आम हैं क्योंकि वे अधिक पठनीय कर रहे हैं और क्योंकि LR parser जनरेटर पुस्तकालयों के विभिन्न प्रकार के बजाय eliminating shift/reduce conflicts से अधिक कुशल पारसर्स उत्पादन कर सकते हैं काम कर रहे हैं एक बड़े आकार के एक स्पष्ट, रूपांतरित व्याकरण के साथ।
सिद्धांत रूप में, तारों के सभी सीमित सेट नियमित भाषाएं हैं, और इसलिए बाध्य आकार के सभी कानूनी कार्यक्रम नियमित हैं। चूंकि नियमित भाषा संदर्भ-मुक्त भाषाओं का एक उप-समूह है, इसलिए बाध्य आकार के सभी कार्यक्रम संदर्भ-मुक्त हैं। तर्क जारी है,
हालांकि यह तर्क दिया जा सकता है कि यह एक स्वीकार्य सीमा होगा एक भाषा में एक लाख से भी कम समय लाइनों की केवल कार्यक्रमों की अनुमति देने के लिए, यह व्यावहारिक नहीं एक नियमित रूप से भाषा के रूप में एक प्रोग्रामिंग भाषा का वर्णन करने के लिए है: विवरण बहुत बड़ा होगा।
- टॉर्बेन Morgensen के Basics of Compiler Design, ch. 2.10.2
ही CFGs के लिए चला जाता है। थोड़ा अलग तरीके से अपने उप प्रश्न को हल करने के लिए,
कौन सा प्रोग्रामिंग भाषाओं एक विषय से मुक्त व्याकरण द्वारा परिभाषित कर रहे?
अधिकांश वास्तविक दुनिया प्रोग्रामिंग भाषाओं को उनके कार्यान्वयन द्वारा परिभाषित किया जाता है, और असली दुनिया प्रोग्रामिंग भाषाओं के लिए अधिकांश पार्सर्स हाथ से लिखे गए हैं या एक पार्सर जनरेटर का उपयोग करते हैं जो संदर्भ मुक्त पार्सिंग को बढ़ाता है।दुर्भाग्यवश यह नहीं है कि आपकी पसंदीदा भाषा के लिए सटीक सीएफजी ढूंढना आम है। जब आप करते हैं, तो आमतौर पर यह Backus-Naur form (बीएनएफ), या एक पार्सर विनिर्देश है जो अधिकतर पूरी तरह संदर्भ-मुक्त नहीं है।
जंगली से व्याकरण विनिर्देशों के उदाहरण:
पृथ्वी पर क्यों यह प्रोग्रामिंग से संबंधित नहीं है? – kajaco
मुझे उस टैग के बारे में बहुत यकीन नहीं था, मुझे लगा कि यह वास्तव में प्रोग्रामिंग की प्रक्रिया के बारे में नहीं है। लेकिन आप सही हैं, मैंने टैग हटा दिया। उत्तर के लिए – n3rd