क्या यह व्याकरण कार्यक्रमों का सुधार है ? पिछले Vag और टिप्पणीकारों से कई सुझावों के साथ पूछा ।
किस तरह से एक व्याकरण को गणना के मॉडल को निर्दिष्ट करने के रूप में देखा जा सकता है? यदि, उदाहरण के लिए, हम एक सरल संदर्भ-मुक्त व्याकरण लेते हैं
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
यह मानते हुए कि पार्सर टर्मिनल और नॉनटर्मिनल प्रतीकों के बीच अंतर नहीं करता है जैसा कि मैंने यहां प्रदर्शित किया है, फिर 3 तक की संख्या के लिए सरल अंकगणितीय प्रदर्शन करना संभव है।
उदाहरण के लिए, स्ट्रिंग लें
"2 + 0 + 1"
इस स्ट्रिंग पर एक LR (1) पार्सर को चलाने से हमें निम्नलिखित ठोस सिंटैक्स ट्री देना चाहिए जहां गणना का परिणाम पेड़ की जड़ में जमा होता है:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
इस प्रकार, यदि हम एक प्रोग्रामर होने के लिए एक व्याकरण लेते हैं और कंपाइलर होने के लिए एक पार्सर जनरेटर है , तो क्या हम व्याकरण विनिर्देश भाषा को प्रोग्रामिंग भाषा के रूप में देख सकते हैं ?
इसके अलावा, क्या हम व्याकरण को निर्दिष्ट करके ट्यूरिंग-पूर्ण कार्यक्रम बना सकते हैं, जैसे आप सेलेर ऑटोमेटा या लैम्ब्डा कैलकुलस के साथ ट्यूरिंग पूर्ण कार्यक्रम कैसे बना सकते हैं ?
दूसरे शब्दों में, यह ज्ञात है कि किसी भाषा को पहचानने के संदर्भ में , नियमित भाषाएं राज्य ऑटोमेटा के अनुरूप होती हैं , संदर्भ-मुक्त भाषाएं ऑटोमेटा को धक्का देती हैं , और संदर्भ-संवेदनशील भाषाएं रैखिक बाउंड ऑटोमेटा के अनुरूप होती हैं । हालाँकि, अगर हम व्याकरण को कम्प्यूटेशनल डिवाइस के रूप में देखते हैं (अर्थात उपरोक्त उदाहरण के अर्थ में कार्यक्रम ), तो हम चॉम्स्की पदानुक्रम में व्याकरण के प्रत्येक वर्ग की कम्प्यूटेशनल ताकत को कैसे वर्गीकृत करते हैं?
- नियमित व्याकरण
- प्रसंग-मुक्त व्याकरण
- प्रसंग-संवेदी व्याकरण
- अप्रतिबंधित व्याकरण ( पुनरावर्ती असंख्य भाषाओं के लिए )
इसके अलावा, व्याकरण जैसे कम ज्ञात उपवर्गों के बारे में कैसे
- नियतात्मक संदर्भ-मुक्त व्याकरण (भी LR (k) / LL (k) / SLR / LALR आदि)
- शब्द व्याकरण
- व्याकरण से सटे वृक्ष
- अनुक्रमित व्याकरण
संपादित करें: वैसे, यह मेरे स्वयं के प्रश्न पर एक निप्पिक है, लेकिन मैंने उल्लेख नहीं किया कि मैंने उदाहरण के लिए व्याकरण और हाथ से लहराए गए टर्मिनलों और नॉन-माइनर के बीच अंतर करने के लिए कोई प्रारंभिक प्रतीक नहीं दिया है। तकनीकी रूप से या पारंपरिक रूप से मुझे लगता है कि व्याकरण को शायद इस तरह से और अधिक जटिल रूप में लिखा जाना होगा (जहां एस शुरुआती प्रतीक है और $ अंत-धारा टर्मिनल का प्रतिनिधित्व करता है):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... ऐसा नहीं है कि यह वास्तव में कुछ भी बदलता है, लेकिन मुझे लगा कि मुझे इसका उल्लेख करना चाहिए।
संपादित करें: जब मैं गैसचे का जवाब पढ़ता हूं तो कुछ और बात सामने आती है, मेरे उदाहरण में पेड़ की प्रत्येक शाखा एक उप-संकलन का प्रतिनिधित्व करती है। यदि आप प्रत्येक उत्पादन नियम को एक फ़ंक्शन के रूप में देखते हैं जहां एलएचएस परिणाम का प्रतिनिधित्व करता है और आरएचएस अपने तर्कों का प्रतिनिधित्व करता है, तो व्याकरण की संरचना यह निर्धारित करती है कि कार्यों की रचना कैसे की जाती है।
दूसरे शब्दों में, पार्सर के संदर्भ में इसके लुकहेड तंत्र के साथ न केवल यह निर्धारित करने में मदद मिलती है कि कौन से फ़ंक्शंस ('थोरा' जैसे पैरामीट्रिक पॉलीमॉर्फिज़्म) लागू होते हैं बल्कि नए कार्यों को बनाने के लिए उन्हें एक साथ कैसे बनाया जाना चाहिए।
कम से कम, मुझे लगता है कि आप इसे इस तरह से अस्पष्ट सीएफजी के लिए देख सकते हैं, अन्य व्याकरणों के लिए मानसिक जिमनास्टिक मेरे लिए अभी थोड़ा बहुत है।