2009-05-22 20 views
48

या, थोड़ा और सटीक होने के लिए: कौन सी प्रोग्रामिंग भाषाओं को संदर्भ-मुक्त व्याकरण द्वारा परिभाषित किया जाता है?कौन सी प्रोग्रामिंग भाषाएं संदर्भ-मुक्त हैं?

मैं क्या इकट्ठा सी ++ मैक्रो और टेम्पलेट्स जैसी चीजों की वजह से विषय से मुक्त नहीं है से

। मेरा आंत मुझे बताता है कि कार्यात्मक भाषाएं संदर्भ मुक्त हो सकती हैं, लेकिन मेरे पास इसका समर्थन करने के लिए कोई कठिन डेटा नहीं है। :-)

+3

पृथ्वी पर क्यों यह प्रोग्रामिंग से संबंधित नहीं है? – kajaco

+0

मुझे उस टैग के बारे में बहुत यकीन नहीं था, मुझे लगा कि यह वास्तव में प्रोग्रामिंग की प्रक्रिया के बारे में नहीं है। लेकिन आप सही हैं, मैंने टैग हटा दिया। उत्तर के लिए – n3rd

उत्तर

26

प्रोग्राम हैं जो वाक्य रचना सही हैं के सेट संक्षिप्त उदाहरण के लिए

अतिरिक्त प्रतिनिधि लगभग सभी भाषाओं के लिए विषय से मुक्त है।

प्रोग्राम हैं जो संकलन के सेट लगभग सभी भाषाओं के लिए विषय से मुक्त नहीं है। उदाहरण के लिए, अगर सब संकलन सी कार्यक्रमों के सेट संदर्भ मुक्त थे, तो एक नियमित रूप से भाषा (यह भी एक regex के रूप में जाना जाता है), सभी संकलन सी कार्यक्रमों से मेल खाने वाले

^int main\(void\) { int a+; a+ = a+; return 0; }$ 

संदर्भ-होगा सेट के साथ अन्तर्विभाजक द्वारा मुफ़्त, लेकिन यह भाषा^^ केबीए^केबीए^के लिए स्पष्ट रूप से isomorphic है, जो संदर्भ-मुक्त होने के लिए नहीं है।

+2

+1 जो सत्य है। स्वीकृत उत्तर भ्रामक है। –

+0

यदि कोई यह सबूत देखना चाहता है कि भाषा {a^k b a^k b a^k b | k> = 0} नियमित नहीं है, टॉर्बेन मोगेन्सन की कंपाइलर डिज़ाइन अध्याय 2.10.2 की मूल बातें देखें: http://www.diku.dk/~torbenm/Basics –

+3

हम्म वाक्यविन्यास वैध प्रोग्राम और semanticaly मान्य प्रोग्राम के बीच भेद भ्रामक है, चूंकि उत्तरार्द्ध संदर्भ-संवेदनशील व्याकरण (प्रोग्रामिंग भाषाओं में रुचि के मामलों के लिए) में वाक्य रचना व्यक्त करता है। एक कार्यक्रम कहना सिंटैक्टिकल वैध है क्योंकि एक सीएफजी इसे स्वीकार कर सकता है, इस तथ्य के बाद गलत है कि वैध कार्यक्रमों की भाषा को ऐसी स्थितियों की आवश्यकता होती है जो केवल सीएफजी द्वारा स्वीकार किए गए तारों को सीमित करते हैं, इसका मतलब है कि उन्हें सीएफजी द्वारा वर्णित नहीं किया जा सकता है। वैसे भी +1 –

1

वीएचडीएल कुछ हद तक संदर्भ संवेदनशील है।

(गूगल: पार्स-vhdl-है-बहुत कठिन)

+0

मैं एक नया उपयोगकर्ता हूं और मुझे लिंक पोस्ट करने की अनुमति नहीं है। –

+0

@ ग्राहम: नहीं, आप बिल्कुल कर सकते हैं। लिंक पोस्ट करने पर नए उपयोगकर्ताओं के लिए कोई प्रतिबंध नहीं है। –

2

एक गैर विषय से मुक्त व्याकरण के सबसे नाटकीय उदाहरण के लिए जाने के लिए, पर्ल के व्याकरण, के रूप में मैं इसे समझ है, turing-complete

+0

यह * प्रभावशाली है। * – Maxpm

7

इस सवाल के आधार पर कि आप प्रश्न को कैसे समझते हैं, जवाब बदलता है। लेकिन IMNSHO, उचित उत्तर यह है कि सभी आधुनिक प्रोग्रामिंग भाषा वास्तव में संदर्भ संवेदनशील हैं। उदाहरण के लिए कोई संदर्भ मुक्त व्याकरण नहीं है जो केवल सी प्रोग्राम को सही ढंग से सही करता है। जो लोग yacc/bison संदर्भ को इंगित करते हैं, सी के लिए मुफ्त व्याकरण बिंदु खो रहे हैं।

2

मुझे लगता है कि Haskell और ML मुक्त संदर्भ समर्थन कर रहे हैं। हास्केल के लिए यह link देखें।

2

अगर मैं अपने प्रश्न समझ में, आप प्रोग्रामिंग भाषाओं संदर्भ मुक्त व्याकरण (cfg) ताकि cfg सभी वैध कार्यक्रमों और वैध कार्यक्रमों उत्पन्न द्वारा वर्णित किया जा सकता है जिसके लिए देख रहे हैं।

मुझे विश्वास है कि सबसे (यदि सभी नहीं) आधुनिक प्रोग्रामिंग भाषाओं इसलिए संदर्भ मुक्त नहीं हैं। उदाहरण के लिए, एक बार आपके पास उपयोगकर्ता परिभाषित प्रकार (आधुनिक भाषाओं में बहुत आम) हो जाने पर आप स्वचालित रूप से संदर्भ संवेदनशील होते हैं।

वाक्य रचना की पुष्टि करने और एक कार्यक्रम के अर्थ शुद्धता की पुष्टि करने के बीच एक अंतर है। सिंटैक्स की जांच करना संदर्भ मुक्त है, जबकि अर्थपूर्ण शुद्धता की जांच करना (फिर से, अधिकांश भाषाओं में) नहीं है।

हालांकि, इसका मतलब यह नहीं है कि ऐसी भाषा मौजूद नहीं है। Untyped lambda calculus, उदाहरण के लिए, एक संदर्भ मुक्त व्याकरण का उपयोग करके वर्णित किया जा सकता है, और, ज़ाहिर है, ट्यूरिंग पूर्ण है।

1

आधुनिक प्रोग्रामिंग भाषाओं में से अधिकांश नहीं विषय से मुक्त भाषाएं हैं। एक सबूत के रूप में, अगर मैं सीएफएल की जड़ में पहुंचा तो इसकी संबंधित मशीन पीडीए {ww | w is a string} जैसे स्ट्रिंग मिलानों को संसाधित नहीं कर सकती है। इसलिए अधिकांश प्रोग्रामिंग भाषाओं की आवश्यकता होती है।

उदाहरण:

int fa; // w 
fa=1; // ww as parser treat it like this 
26

क्या प्रोग्रामिंग भाषाओं विषय से मुक्त कर रहे हैं? [...]

टी एल; डॉ: शायद ही कोई हो, लेकिन 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 (बीएनएफ), या एक पार्सर विनिर्देश है जो अधिकतर पूरी तरह संदर्भ-मुक्त नहीं है।

जंगली से व्याकरण विनिर्देशों के उदाहरण:

+0

इस बारे में डेव के उत्तर पर प्रासंगिक टिप्पणी को जोड़ा और +1 किया –

संबंधित मुद्दे

 संबंधित मुद्दे