सिंटैक्स (प्रोग्रामिंग भाषाएँ): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|Set of rules defining correctly structured programs}}
{{Short description|Set of rules defining correctly structured programs}}
[[Image:Python add5 syntax.svg|thumb|right|292px|सोर्स कोड के तत्वों को पहचानने में प्रोग्रामर की सहायता के लिए अक्सर [[वाक्य - विन्यास पर प्रकाश डालना]] और [[इंडेंट शैली]] का उपयोग किया जाता है। यह [[पायथन (प्रोग्रामिंग भाषा)]] कोड रंग कोडित हाइलाइटिंग का उपयोग करता है।]][[कंप्यूटर विज्ञान]] में, [[कंप्यूटर भाषा]] का वाक्य-विन्यास वे नियम हैं जो प्रतीकों के संयोजन को परिभाषित करते हैं जिन्हें उस भाषा में सही ढंग से संरचित कथन (कंप्यूटर विज्ञान) या [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] माना जाता है। यह [[प्रोग्रामिंग भाषा]]ओं, जहां दस्तावेज़ स्रोत कोड का प्रतिनिधित्व करता है, और मार्कअप भाषाओं, जहां दस्तावेज़ डेटा का प्रतिनिधित्व करता है, दोनों पर लागू होता है।
[[Image:Python add5 syntax.svg|thumb|right|292px|सोर्स कोड के तत्वों को पहचानने में प्रोग्रामर की सहायता के लिए प्रायः [[वाक्य - विन्यास पर प्रकाश डालना]] एवं [[इंडेंट शैली]] का उपयोग किया जाता है। यह [[पायथन (प्रोग्रामिंग भाषा)]] कोड रंग कोडित हाइलाइटिंग का उपयोग करता है।]][[कंप्यूटर विज्ञान]] में, [[कंप्यूटर भाषा]] का '''वाक्य-विन्यास''' वे नियम हैं जो प्रतीकों के संयोजन को परिभाषित करते हैं जिन्हें उस भाषा में उचित प्रकार से संरचित कथन या [[अभिव्यक्ति (कंप्यूटर विज्ञान)|अभिव्यक्ति]] माना जाता है। यह [[प्रोग्रामिंग भाषा]]ओं, जहां दस्तावेज़ स्रोत कोड का प्रतिनिधित्व करता है, एवं मार्कअप भाषाओं, जहां दस्तावेज़ डेटा का प्रतिनिधित्व करता है, दोनों पर प्रस्तावित होता है।


किसी भाषा का वाक्य-विन्यास उसके सतही स्वरूप को परिभाषित करता है।<ref name="eopl">{{cite book|last=Friedman|first=Daniel P.|author2=Mitchell Wand |author3=Christopher T. Haynes |title=प्रोग्रामिंग भाषाओं की अनिवार्यताएँ|publisher=The MIT Press|date=1992|edition=1st|isbn=0-262-06145-7}}</ref> टेक्स्ट-आधारित उपयोगकर्ता इंटरफ़ेस | टेक्स्ट-आधारित कंप्यूटर भाषाएं [[ चरित्र (कंप्यूटिंग) ]] के अनुक्रम पर आधारित होती हैं, जबकि दृश्य प्रोग्रामिंग भाषाएं स्थानिक लेआउट और प्रतीकों के बीच कनेक्शन (जो टेक्स्टुअल या ग्राफिकल हो सकती हैं) पर आधारित होती हैं। जो दस्तावेज़ वाक्यविन्यास की दृष्टि से अमान्य हैं, उनमें वाक्यविन्यास त्रुटि कही जाती है। किसी भाषा के वाक्यविन्यास को डिजाइन करते समय, डिजाइनर इन उदाहरणों से सामान्य नियमों को समझने की कोशिश करने से पहले, कानूनी और अवैध [[स्ट्रिंग (कंप्यूटर विज्ञान)]] दोनों के उदाहरण लिखना शुरू कर सकता है।<ref>{{Cite book|title=रखरखाव योग्य सॉफ़्टवेयर डिज़ाइन करना|last=Smith|first=Dennis|publisher=Springer Science & Business Media|year=1999}}</ref>
किसी भाषा का वाक्य-विन्यास उसके सतही स्वरूप को परिभाषित करता है।<ref name="eopl">{{cite book|last=Friedman|first=Daniel P.|author2=Mitchell Wand |author3=Christopher T. Haynes |title=प्रोग्रामिंग भाषाओं की अनिवार्यताएँ|publisher=The MIT Press|date=1992|edition=1st|isbn=0-262-06145-7}}</ref>टेक्स्ट-आधारित कंप्यूटर भाषाएं [[ चरित्र (कंप्यूटिंग) |वर्णों]] के अनुक्रम पर आधारित होती हैं, जबकि दृश्य प्रोग्रामिंग भाषाएं स्थानिक लेआउट एवं प्रतीकों के मध्य कनेक्शन (जो टेक्स्टुअल या ग्राफिकल हो सकती हैं) पर आधारित होती हैं। जो दस्तावेज़ वाक्यविन्यास की दृष्टि से अमान्य हैं, उनमें वाक्यविन्यास त्रुटि कही जाती है। किसी भाषा के वाक्यविन्यास को डिजाइन करते समय, डिजाइनर इन उदाहरणों से सामान्य नियमों को समझने के प्रयत्न करने से पूर्व, कानूनी एवं अवैध दोनों [[स्ट्रिंग (कंप्यूटर विज्ञान)|स्ट्रिंग]] के उदाहरण लिखना प्रारम्भ कर सकता है।<ref>{{Cite book|title=रखरखाव योग्य सॉफ़्टवेयर डिज़ाइन करना|last=Smith|first=Dennis|publisher=Springer Science & Business Media|year=1999}}</ref>इसलिए वाक्यविन्यास कोड के रूप को संदर्भित करता है, एवं इसकी अपेक्षा [[शब्दार्थ (कंप्यूटर विज्ञान)|सिमेंटिक्स]] अर्थ से की जाती है। कंप्यूटर भाषाओं के प्रसंस्करण में, सिमेंटिक प्रोसेसिंग सामान्यतः वाक्य-विन्यास प्रसंस्करण के पश्चात आती है; चूँकि, कुछ विषयों में वाक्यविन्यास विश्लेषण के लिए सिमेंटिक प्रोसेसिंग आवश्यक है, एवं ये साथ में या [[समवर्ती (कंप्यूटर विज्ञान)|समवर्ती रूप से]] किया जाता है। [[ संकलक |संकलक]] में, सिंटैक्टिक विश्लेषण में [[कंपाइलर फ्रंटएंड]] सम्मिलित होता है, जबकि सिमेंटिक विश्लेषण (कंपाइलर्स) में [[कंपाइलर बैकएंड]] (एवं मध्य अंत, यदि यह चरण को भिन्न किया जाता है) सम्मिलित होता है।
इसलिए सिंटैक्स कोड के रूप को संदर्भित करता है, और इसकी तुलना [[शब्दार्थ (कंप्यूटर विज्ञान)]] - अर्थ से की जाती है। कंप्यूटर भाषाओं के प्रसंस्करण में, सिमेंटिक प्रोसेसिंग आम तौर पर वाक्य-विन्यास प्रसंस्करण के बाद आती है; हालाँकि, कुछ मामलों में, संपूर्ण वाक्यविन्यास विश्लेषण के लिए सिमेंटिक प्रोसेसिंग आवश्यक है, और ये साथ या [[समवर्ती (कंप्यूटर विज्ञान)]] किया जाता है। [[ संकलक ]] में, सिंटैक्टिक विश्लेषण में [[कंपाइलर फ्रंटएंड]] शामिल होता है, जबकि सिमेंटिक विश्लेषण (कंपाइलर्स) में [[कंपाइलर बैकएंड]] (और मध्य अंत, यदि यह चरण प्रतिष्ठित है) शामिल होता है।


==वाक्यविन्यास का स्तर==
==वाक्यविन्यास का स्तर==
कंप्यूटर भाषा सिंटैक्स को आम तौर पर तीन स्तरों में विभाजित किया जाता है:
कंप्यूटर भाषा वाक्यविन्यास को सामान्यतः तीन स्तरों में विभाजित किया जाता है:
* शब्द - शाब्दिक स्तर, यह निर्धारित करता है कि अक्षर कैसे [[टोकन (पार्सर)]] बनाते हैं;
* शब्द - शाब्दिक स्तर, यह निर्धारित करता है कि अक्षर कैसे [[टोकन (पार्सर)|टोकन]] बनाते हैं;
* वाक्यांश - व्[[ हाँ ]]रण का स्तर, संकीर्ण रूप से बोलना, यह निर्धारित करना कि टोकन कैसे वाक्यांश बनाते हैं;
* वाक्यांश - व्याकरण का स्तर, संकीर्ण रूप से बोलना, यह निर्धारित करना कि टोकन कैसे वाक्यांश बनाते हैं;
* संदर्भ - यह निर्धारित करना कि ऑब्जेक्ट या वेरिएबल नाम किन चीज़ों को संदर्भित करते हैं, यदि प्रकार वैध हैं, आदि।
* संदर्भ - यह निर्धारित करना कि ऑब्जेक्ट या वेरिएबल नाम किन चीज़ों को संदर्भित करते हैं, यदि प्रकार वैध हैं, आदि।


इस तरह से भेद करने से मॉड्यूलरिटी प्राप्त होती है, जिससे प्रत्येक स्तर को अलग से और अक्सर स्वतंत्र रूप से वर्णित और संसाधित किया जा सकता है। सबसे पहले, लेक्सर वर्णों के रैखिक अनुक्रम को टोकन के रैखिक अनुक्रम में बदल देता है; इसे [[शाब्दिक विश्लेषण]] या लेक्सिंग के रूप में जाना जाता है। दूसरा, पार्सर टोकन के रैखिक अनुक्रम को पदानुक्रमित वाक्यविन्यास वृक्ष में बदल देता है; इसे संकीर्ण रूप से [[ पदच्छेद ]] के रूप में जाना जाता है। तीसरा, प्रासंगिक विश्लेषण नामों का समाधान करता है और प्रकारों की जांच करता है। यह मॉड्यूलरिटी कभी-कभी संभव होती है, लेकिन कई वास्तविक दुनिया की भाषाओं में पहला चरण बाद के चरण पर निर्भर करता है - उदाहरण के लिए, सी में [[लेक्सर हैक]] इसलिए होता है क्योंकि टोकननाइजेशन संदर्भ पर निर्भर करता है। इन मामलों में भी, वाक्यात्मक विश्लेषण को अक्सर इस आदर्श मॉडल के सन्निकटन के रूप में देखा जाता है।
इस प्रकार से भेद करने से मॉड्यूलरिटी प्राप्त होती है, जिससे प्रत्येक स्तर को भिन्न से एवं प्रायः स्वतंत्र रूप से वर्णित एवं संसाधित किया जा सकता है। सबसे पूर्व, लेक्सर वर्णों के रैखिक अनुक्रम को टोकन के रैखिक अनुक्रम में परिवर्तित कर देता है; इसे [[शाब्दिक विश्लेषण]] या लेक्सिंग के रूप में जाना जाता है। दूसरा, पासर टोकन के रैखिक अनुक्रम को पदानुक्रमित वाक्यविन्यास वृक्ष में परिवर्तित कर देता है; इसे संकीर्ण रूप से [[ पदच्छेद |पदच्छेद]] के रूप में जाना जाता है। तीसरा, प्रासंगिक विश्लेषण नामों का समाधान करता है एवं प्रकारों का शोध करता है। यह मॉड्यूलरिटी कभी-कभी संभव होती है, किन्तु कई वास्तविक समाज की भाषाओं में प्रथम चरण पश्चात के चरण पर निर्भर करता है - उदाहरण के लिए, सी में [[लेक्सर हैक]] इसलिए होता है क्योंकि टोकननाइजेशन संदर्भ पर निर्भर करता है। इन विषयों में भी, वाक्यात्मक विश्लेषण को प्रायः इस आदर्श मॉडल के सन्निकटन के रूप में देखा जाता है।


पार्सिंग चरण को स्वयं दो भागों में विभाजित किया जा सकता है: [[पार्स वृक्ष]], या कंक्रीट सिंटैक्स ट्री, जो व्याकरण द्वारा निर्धारित होता है, लेकिन आम तौर पर व्यावहारिक उपयोग के लिए बहुत विस्तृत होता है, और अमूर्त सिंटैक्स ट्री (एएसटी), जो इसे सरल बनाता है  प्रयोग करने योग्य रूप. एएसटी और प्रासंगिक विश्लेषण चरणों को सिमेंटिक विश्लेषण का रूप माना जा सकता है, क्योंकि वे वाक्यविन्यास में अर्थ और व्याख्या जोड़ रहे हैं, या वैकल्पिक रूप से वाक्यात्मक नियमों के अनौपचारिक, मैन्युअल कार्यान्वयन के रूप में हैं जिनका औपचारिक रूप से वर्णन करना या लागू करना मुश्किल या अजीब होगा।
पासिंग चरण को स्वयं दो भागों में विभाजित किया जा सकता है: [[पार्स वृक्ष|पास वृक्ष]], या कंक्रीट वाक्यविन्यास ट्री, जो व्याकरण द्वारा निर्धारित होता है, किन्तु सामान्यतः व्यावहारिक उपयोग के लिए अधिक विस्तृत होता है, एवं अमूर्त वाक्यविन्यास ट्री (एएसटी), जो इसे प्रयोग करने योग्य रूप में सरल बनाता है। एएसटी एवं प्रासंगिक विश्लेषण चरणों को सिमेंटिक विश्लेषण का रूप माना जा सकता है, क्योंकि वे वाक्यविन्यास में अर्थ एवं व्याख्या जोड़ रहे हैं, या वैकल्पिक रूप से वाक्यात्मक नियमों के अनौपचारिक, मैन्युअल कार्यान्वयन के रूप में हैं जिनका औपचारिक रूप से वर्णन करना या प्रस्तावित करना कठिन होता है।


स्तर आम तौर पर [[चॉम्स्की पदानुक्रम]] के स्तरों के अनुरूप होते हैं। शब्द [[नियमित भाषा]] में होते हैं, जो [[शाब्दिक व्याकरण]] में निर्दिष्ट होते हैं, जो कि टाइप-3 व्याकरण है, जिसे आम तौर पर [[नियमित अभिव्यक्ति]] के रूप में दिया जाता है। वाक्यांश [[संदर्भ-मुक्त भाषा]] (सीएफएल) में होते हैं, आम तौर पर  नियतात्मक संदर्भ-मुक्त भाषा (डीसीएफएल), [[वाक्यांश संरचना व्याकरण]] में निर्दिष्ट होती है, जो प्रकार -2 व्याकरण है, जिसे आम तौर पर बैकस-नौर में [[उत्पादन (कंप्यूटर विज्ञान)]] के रूप में दिया जाता है। फॉर्म (बीएनएफ)। वाक्यांश व्याकरणों को अक्सर पूर्ण [[संदर्भ-मुक्त व्याकरण]]ों की तुलना में कहीं अधिक सीमित व्याकरणों में निर्दिष्ट किया जाता है, ताकि उन्हें पार्स करना आसान हो सके; जबकि [[एलआर पार्सर]] किसी भी डीसीएफएल को रैखिक समय में पार्स कर सकता है, सरल [[एलएएलआर पार्सर]] और यहां तक ​​कि सरल [[एलएल पार्सर]] अधिक कुशल हैं, लेकिन केवल उन व्याकरणों को पार्स कर सकते हैं जिनके उत्पादन नियम बाधित हैं। सिद्धांत रूप में, प्रासंगिक संरचना को [[संदर्भ-संवेदनशील व्याकरण]] द्वारा वर्णित किया जा सकता है, और [[विशेषता व्याकरण]] जैसे माध्यमों से स्वचालित रूप से विश्लेषण किया जा सकता है, हालांकि, सामान्य तौर पर, यह चरण नाम रिज़ॉल्यूशन (प्रोग्रामिंग भाषाओं) नियमों और प्रकार की जांच के माध्यम से मैन्युअल रूप से किया जाता है, और कार्यान्वित किया जाता है  [[प्रतीक तालिका]] के माध्यम से जो प्रत्येक दायरे के लिए नाम और प्रकार संग्रहीत करती है।
स्तर सामान्यतः [[चॉम्स्की पदानुक्रम]] के स्तरों के अनुरूप होते हैं। शब्द [[नियमित भाषा]] में होते हैं, जो [[शाब्दिक व्याकरण]] में निर्दिष्ट होते हैं, जो कि टाइप-3 व्याकरण है, जिसे सामान्यतः [[नियमित अभिव्यक्ति]] के रूप में दिया जाता है। वाक्यांश [[संदर्भ-मुक्त भाषा]] (सीएफएल) में होते हैं, सामान्यतः नियतात्मक संदर्भ-मुक्त भाषा (डीसीएफएल), [[वाक्यांश संरचना व्याकरण]] में निर्दिष्ट होती है, जो प्रकार -2 व्याकरण है, जिसे सामान्यतः बैकस-नौर में [[उत्पादन (कंप्यूटर विज्ञान)]] के रूप में दिया जाता है। वाक्यांश व्याकरणों को प्रायः पूर्ण [[संदर्भ-मुक्त व्याकरण|संदर्भ-मुक्त व्याकरणों]] की अपेक्षा में कहीं अधिक सीमित व्याकरणों में निर्दिष्ट किया जाता है, जिससे उन्हें पास करना सरल हो सके; जबकि [[एलआर पार्सर|एलआर पासर]] किसी भी डीसीएफएल को रैखिक समय में पास कर सकता है, सरल [[एलएएलआर पार्सर|एलएएलआर पासर]] एवं यहां तक ​​कि सरल [[एलएल पार्सर|एलएल पासर]] अधिक कुशल हैं, किन्तु केवल उन व्याकरणों को पास कर सकते हैं जिनके उत्पादन नियम बाधित हैं। सिद्धांत रूप में, प्रासंगिक संरचना को [[संदर्भ-संवेदनशील व्याकरण]] द्वारा वर्णित किया जा सकता है, एवं [[विशेषता व्याकरण]] जैसे माध्यमों से स्वचालित रूप से विश्लेषण किया जा सकता है, चूँकि सामान्यतः, यह चरण नाम रिज़ॉल्यूशन (प्रोग्रामिंग भाषाओं) नियमों एवं प्रकार की शोध के माध्यम से मैन्युअल रूप से किया जाता है, एवं [[प्रतीक तालिका|प्रतीक सारणी]] के माध्यम से कार्यान्वित किया जाता है, जो प्रत्येक सीमा के लिए नाम एवं प्रकार संग्रहीत करती है।


ऐसे उपकरण लिखे गए हैं जो स्वचालित रूप से नियमित अभिव्यक्तियों में लिखे गए शाब्दिक विनिर्देश से लेक्सर और बीएनएफ में लिखे गए वाक्यांश व्याकरण से पार्सर उत्पन्न करते हैं: यह किसी को प्रक्रियात्मक या कार्यात्मक प्रोग्रामिंग की आवश्यकता के बजाय [[घोषणात्मक प्रोग्रामिंग]] का उपयोग करने की अनुमति देता है। उल्लेखनीय उदाहरण लेक्स (सॉफ़्टवेयर)-yacc जोड़ी है। ये स्वचालित रूप से ठोस वाक्यविन्यास वृक्ष उत्पन्न करते हैं; इसके बाद पार्सर लेखक को मैन्युअल रूप से यह वर्णन करते हुए कोड लिखना होगा कि इसे अमूर्त सिंटैक्स ट्री में कैसे परिवर्तित किया जाता है। प्रासंगिक विश्लेषण भी आम तौर पर मैन्युअल रूप से लागू किया जाता है। इन स्वचालित उपकरणों के अस्तित्व के बावजूद, पार्सिंग को अक्सर विभिन्न कारणों से मैन्युअल रूप से कार्यान्वित किया जाता है - शायद वाक्यांश संरचना संदर्भ-मुक्त नहीं है, या वैकल्पिक कार्यान्वयन प्रदर्शन या त्रुटि-रिपोर्टिंग में सुधार करता है, या व्याकरण को अधिक आसानी से बदलने की अनुमति देता है। पार्सर अक्सर कार्यात्मक भाषाओं में लिखे जाते हैं, जैसे [[हास्केल (प्रोग्रामिंग भाषा)]], या स्क्रिप्टिंग भाषाओं में, जैसे पायथन (प्रोग्रामिंग भाषा) या [[पर्ल]], या [[सी (प्रोग्रामिंग भाषा)]] या [[सी++]] में।
ऐसे उपकरण लिखे गए हैं, जो स्वचालित रूप से नियमित अभिव्यक्तियों में लिखे गए शाब्दिक विनिर्देश से लेक्सर एवं बीएनएफ में लिखे गए वाक्यांश व्याकरण से पासर उत्पन्न करते हैं, यह किसी को प्रक्रियात्मक या कार्यात्मक प्रोग्रामिंग की आवश्यकता के अतिरिक्त [[घोषणात्मक प्रोग्रामिंग]] का उपयोग करने की अनुमति देता है। उल्लेखनीय उदाहरण लेक्स-याक जोड़ी है। ये स्वचालित रूप से ठोस वाक्यविन्यास वृक्ष उत्पन्न करते हैं; इसके पश्चात पासर लेखक को मैन्युअल रूप से यह वर्णन करते हुए कोड लिखना होगा कि इसे अमूर्त वाक्यविन्यास ट्री में कैसे परिवर्तित किया जाता है। प्रासंगिक विश्लेषण भी सामान्यतः मैन्युअल रूप से प्रस्तावित किया जाता है। इन स्वचालित उपकरणों के अस्तित्व के अतिरिक्त, पासिंग को प्रायः विभिन्न कारणों से मैन्युअल रूप से कार्यान्वित किया जाता है। संभवता वाक्यांश संरचना संदर्भ मुक्त नहीं है, या वैकल्पिक कार्यान्वयन प्रदर्शन या त्रुटि-रिपोर्टिंग में सुधार करता है, या व्याकरण को अधिक सरलता से परिवर्तित करने की अनुमति देता है। पासर प्रायः कार्यात्मक भाषाओं में लिखे जाते हैं, जैसे [[हास्केल (प्रोग्रामिंग भाषा)]], या स्क्रिप्टिंग भाषाओं में, जैसे पायथन (प्रोग्रामिंग भाषा) या [[पर्ल]], या [[सी (प्रोग्रामिंग भाषा)]] या [[सी++|C++]] में लिखे जाते हैं।


===त्रुटियों के उदाहरण===
===त्रुटियों के उदाहरण===
{{main|Syntax error}}
{{main|वाक्यविन्यास त्रुटि}}
उदहारण के लिए, <code>(add 1 1)</code>  वाक्यात्मक रूप से मान्य लिस्प प्रोग्राम है (मान लें कि 'ऐड' फ़ंक्शन मौजूद है, अन्यथा नाम रिज़ॉल्यूशन विफल हो जाता है), 1 और 1 जोड़ते हैं। हालाँकि, निम्नलिखित अमान्य हैं:
उदहारण के लिए, <code>(add 1 1)</code>  वाक्यात्मक रूप से मान्य लिस्प प्रोग्राम है (मान लें कि 'ऐड' फलनउपस्थित है, अन्यथा नाम रिज़ॉल्यूशन विफल हो जाता है), 1 एवं 1 जोड़ते हैं। चूँकि, निम्नलिखित अमान्य हैं।
  (_ 1 1) शाब्दिक त्रुटि: '_' मान्य नहीं है
  (_ 1 1)   lexical error: '_' is not valid
  (1 1 पार्सिंग त्रुटि जोड़ें: समापन गायब है ')'
  (add 1 1   parsing error: missing closing ')'
लेक्सर पहली त्रुटि की पहचान करने में असमर्थ है - वह केवल इतना जानता है कि, टोकन LEFT_PAREN का उत्पादन करने के बाद, '(' प्रोग्राम का शेष भाग अमान्य है, क्योंकि कोई भी शब्द नियम '_' से शुरू नहीं होता है। दूसरी त्रुटि का पता चला है पार्सिंग चरण: पार्सर ने '(' टोकन (मात्र मिलान के रूप में) के कारण सूची उत्पादन नियम की पहचान की है, और इस प्रकार त्रुटि संदेश दे सकता है; सामान्य तौर पर यह [[अस्पष्ट व्याकरण]] हो सकता है।
लेक्सर प्रकार त्रुटि की पहचान करने में असमर्थ है, वह केवल इतना जानता है कि, टोकन LEFT_PAREN का उत्पादन करने के पश्चात, '(' प्रोग्राम का शेष भाग अमान्य है, क्योंकि कोई भी शब्द नियम '_' से प्रारम्भ नहीं होता है। दूसरी त्रुटि का ज्ञात हुआ है, पासिंग चरण: पासर ने '(' टोकन (मात्र मिलान के रूप में) के कारण सूची उत्पादन नियम की पहचान की है, एवं इस प्रकार त्रुटि संदेश दे सकता है, सामान्यतः यह [[अस्पष्ट व्याकरण|अस्पष्ट]] हो सकता है।


टाइप त्रुटियों और अघोषित परिवर्तनीय त्रुटियों को कभी-कभी सिंटैक्स त्रुटियां माना जाता है जब उन्हें संकलन-समय पर पता लगाया जाता है (जो आमतौर पर दृढ़ता से टाइप की गई भाषाओं को संकलित करते समय होता है), हालांकि इस प्रकार की त्रुटियों को प्रोग्रामिंग भाषा # शब्दार्थ विज्ञान के रूप में वर्गीकृत करना आम है इसके बजाय त्रुटियाँ।<ref>{{cite book|last=Aho|first=Alfred V.|author2=Monica S. Lam|author3=Ravi Sethi|author4=Jeffrey D. Ullman|title=Compilers: Principles, Techniques, and Tools|publisher=Addison Wesley|date=2007|edition=2nd|isbn=0-321-48681-1|url=https://archive.org/details/compilers00alfr_0}}Section 4.1.3: Syntax Error Handling, pp.194&ndash;195.</ref><ref>{{cite book|last=Louden|first=Kenneth C.|title=Compiler Construction: Principles and Practice|publisher=Brooks/Cole|date=1997|isbn=981-243-694-4}} Exercise 1.3, pp.27&ndash;28.</ref><ref name="uninitialized var">[http://www.dummies.com/how-to/content/semantic-errors-in-java.html Semantic Errors in Java]</ref>
टाइप त्रुटियों एवं अघोषित परिवर्तनीय त्रुटियों को कभी-कभी वाक्यविन्यास त्रुटियां माना जाता है, जब उन्हें संकलन-समय पर प्रकार की त्रुटियों को ज्ञात किया जाता है (जो सामान्यतः दृढ़ता से टाइप की गई भाषाओं को संकलित करते समय होता है), चूँकि इस प्रकार की त्रुटियों को सिमेंटिक त्रुटियों के रूप में वर्गीकृत करना सरल है। उदाहरण के रूप में, पायथन कोड
उदाहरण के तौर पर, पायथन कोड
  'a' + 1
  '' + 1
इसमें प्रकार की त्रुटि है, क्योंकि यह पूर्णांक अक्षरशः में स्ट्रिंग अक्षरशः जोड़ता है। संकलन-समय पर इस प्रकार की त्रुटियों की जानकरी ज्ञात की जा सकती है। उन्हें पासिंग (वाक्यांश विश्लेषण) के समय जानकरी ज्ञात की जा सकती है, यदि कंपाइलर भिन्न-भिन्न नियमों का उपयोग करता है जो integerLiteral + integerLiteral को अनुमति देता है किन्तु stringLiteral + integerLiteral को नहीं, चूँकि यह अधिक संभावना है, कि कंपाइलर इसका उपयोग करता है। पासिंग नियम जो LiteralOrIdentifier + LiteralOrIdentifier फॉर्म की सभी अभिव्यक्तियों की अनुमति देता है एवं तत्पश्चात प्रासंगिक विश्लेषण (जब टाइप चेकिंग होती है) के समय त्रुटि की जानकरी ज्ञात की जाएगी। कुछ विषयों में यह सत्यापन कंपाइलर द्वारा नहीं किया जाता है, एवं इन त्रुटियों की जानकरी केवल रनटाइम पर लगायी जाती है।
इसमें प्रकार की त्रुटि है क्योंकि यह पूर्णांक अक्षरशः में स्ट्रिंग अक्षरशः जोड़ता है। संकलन-समय पर इस प्रकार की त्रुटियों का पता लगाया जा सकता है: उन्हें पार्सिंग (वाक्यांश विश्लेषण) के दौरान पता लगाया जा सकता है यदि कंपाइलर अलग-अलग नियमों का उपयोग करता है जो integerLiteral + integerLiteral को अनुमति देता है लेकिन stringLiteral + integerLiteral को नहीं, हालांकि यह अधिक संभावना है कि कंपाइलर इसका उपयोग करेगा।  पार्सिंग नियम जो LiteralOrIdentifier + LiteralOrIdentifier फॉर्म की सभी अभिव्यक्तियों की अनुमति देता है और फिर प्रासंगिक विश्लेषण (जब टाइप चेकिंग होती है) के दौरान त्रुटि का पता लगाया जाएगा। कुछ मामलों में यह सत्यापन कंपाइलर द्वारा नहीं किया जाता है, और इन त्रुटियों का पता केवल रनटाइम पर लगाया जाता है।


गतिशील रूप से टाइप की गई भाषा में, जहां प्रकार केवल रनटाइम पर निर्धारित किया जा सकता है, कई प्रकार की त्रुटियों का पता केवल रनटाइम पर ही लगाया जा सकता है। उदाहरण के लिए, पायथन कोड
गतिशील रूप से टाइप की गई भाषा में, जहां प्रकार केवल रनटाइम पर निर्धारित किया जा सकता है, कई प्रकार की त्रुटियों की जानकरी केवल रनटाइम पर ही लगायी जा सकती है। उदाहरण के लिए, पायथन कोड
  + बी
  a + b
वाक्यांश स्तर पर वाक्यात्मक रूप से मान्य है, लेकिन ए और बी के प्रकारों की शुद्धता केवल रनटाइम पर निर्धारित की जा सकती है, क्योंकि पायथन में चर के प्रकार नहीं होते हैं, केवल मान होते हैं। जबकि इस बात पर असहमति है कि क्या कंपाइलर द्वारा पाई गई प्रकार की त्रुटि को सिंटैक्स त्रुटि कहा जाना चाहिए (प्रोग्रामिंग भाषा#स्टेटिक सिमेंटिक्स त्रुटि के बजाय), प्रकार की त्रुटियां जिन्हें केवल प्रोग्राम निष्पादन समय पर पता लगाया जा सकता है उन्हें हमेशा सिंटैक्स के बजाय सिमेंटिक माना जाता है त्रुटियाँ.
वाक्यांश स्तर पर वाक्यात्मक रूप से मान्य है, किन्तु a एवं b के प्रकारों की शुद्धता केवल रनटाइम पर निर्धारित की जा सकती है, क्योंकि पायथन में चर के प्रकार नहीं होते हैं, केवल मान होते हैं। जबकि इस कथन पर असहमति है कि क्या कंपाइलर द्वारा पाई गई त्रुटि को वाक्यविन्यास त्रुटि कहा जाना चाहिए (स्टेटिक सिमेंटिक्स त्रुटि के अतिरिक्त), त्रुटियां जिन्हें केवल प्रोग्राम निष्पादन समय पर पता लगाया जा सकता है उन्हें सदैव वाक्यविन्यास के अतिरिक्त सिमेंटिक माना जाता है।


== सिंटेक्स परिभाषा ==
== सिंटेक्स परिभाषा ==


[[Image:Python add5 parse.svg|thumb|right|396px|इनसेट टोकननाइजेशन के साथ पायथन कोड का पार्स ट्री]]पाठ्य प्रोग्रामिंग भाषाओं के वाक्यविन्यास को आम तौर पर [[वाक्यात्मक श्रेणी]] (नॉनटर्मिनल्स) और टर्मिनल प्रतीकों को निर्दिष्ट करने के लिए नियमित अभिव्यक्तियों (शब्दावली विश्लेषण संरचना के लिए) और बैकस-नौर फॉर्म (संदर्भ-मुक्त व्याकरण संरचना के लिए) के संयोजन का उपयोग करके परिभाषित किया जाता है। वाक्य-विन्यास श्रेणियों को प्रोडक्शन नामक नियमों द्वारा परिभाषित किया जाता है, जो उन मानों को निर्दिष्ट करते हैं जो विशेष वाक्य-विन्यास श्रेणी से संबंधित होते हैं।<ref name="eopl"/>टर्मिनल प्रतीक ठोस वर्ण या वर्णों की स्ट्रिंग हैं (उदाहरण के लिए [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] जैसे परिभाषित, यदि, जाने दें, या शून्य) जिनसे वाक्यात्मक रूप से मान्य प्रोग्राम बनाए जाते हैं।
[[Image:Python add5 parse.svg|thumb|right|396px|इनसेट टोकननाइजेशन के साथ पायथन कोड का पास ट्री]]पाठ्य प्रोग्रामिंग भाषाओं के वाक्यविन्यास को सामान्यतः [[वाक्यात्मक श्रेणी]] (नॉनटर्मिनल्स) एवं टर्मिनल प्रतीकों को निर्दिष्ट करने के लिए नियमित अभिव्यक्तियों (शब्दावली विश्लेषण संरचना के लिए) एवं बैकस-नौर फॉर्म (संदर्भ-मुक्त व्याकरण संरचना के लिए) के संयोजन का उपयोग करके परिभाषित किया जाता है। वाक्य-विन्यास श्रेणियों को प्रोडक्शन नामक नियमों द्वारा परिभाषित किया जाता है, जो उन मानों को निर्दिष्ट करते हैं जो विशेष वाक्य-विन्यास श्रेणी से संबंधित होते हैं।<ref name="eopl"/>टर्मिनल प्रतीक ठोस वर्ण या वर्णों की स्ट्रिंग हैं (उदाहरण के लिए परिभाषित, यदि, लेट, या शून्य जैसे [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]]) जिनसे वाक्यात्मक रूप से मान्य प्रोग्राम बनाए जाते हैं।


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


===उदाहरण: लिस्प [[एस-अभिव्यक्ति]]===
===उदाहरण: लिस्प [[एस-अभिव्यक्ति]]===
नीचे सरल व्याकरण है, जिसे नियमित अभिव्यक्तियों और विस्तारित बैकस-नौर फॉर्म के संकेतन का उपयोग करके परिभाषित किया गया है। यह एस-्सप्रेशन के सिंटैक्स का वर्णन करता है, जो प्रोग्रामिंग भाषा [[लिस्प प्रोग्रामिंग भाषा]] का डेटा सिंटैक्स है, जो वाक्यात्मक श्रेणियों अभिव्यक्ति, परमाणु, संख्या, प्रतीक और सूची के लिए प्रस्तुतियों को परिभाषित करता है:
नीचे सरल व्याकरण है, जिसे नियमित अभिव्यक्तियों एवं विस्तारित बैकस-नौर फॉर्म के संकेतन का उपयोग करके परिभाषित किया गया है। यह एस-्सप्रेशन के वाक्यविन्यास का वर्णन करता है, जो प्रोग्रामिंग भाषा [[लिस्प प्रोग्रामिंग भाषा]] का डेटा वाक्यविन्यास है, जो वाक्यात्मक श्रेणियों अभिव्यक्ति, परमाणु, संख्या, प्रतीक एवं सूची के लिए प्रस्तुतियों को परिभाषित करता है:


<syntaxhighlight lang="ebnf">
<syntaxhighlight lang="ebnf">
Line 52: Line 50:
</syntaxhighlight>
</syntaxhighlight>
यह व्याकरण निम्नलिखित निर्दिष्ट करता है:
यह व्याकरण निम्नलिखित निर्दिष्ट करता है:
* अभिव्यक्ति या तो परमाणु या सूची है;
* अभिव्यक्ति या तो परमाणु या सूची है;
*परमाणु या तो संख्या या प्रतीक है;
*परमाणु या तो संख्या या प्रतीक है;
* संख्या  या अधिक दशमलव अंकों का अटूट क्रम है, जिसके पहले वैकल्पिक रूप से प्लस या माइनस चिह्न होता है;
* संख्या  या अधिक दशमलव अंकों का अटूट क्रम है, जिसके पूर्व वैकल्पिक रूप से प्लस या माइनस चिह्न होता है;
* प्रतीक वह अक्षर है जिसके बाद शून्य या अधिक अक्षर (व्हाइटस्पेस को छोड़कर) आते हैं; और
* प्रतीक वह अक्षर है जिसके पश्चात शून्य या अधिक अक्षर (व्हाइटस्पेस को त्यागकर) आते हैं; एवं
* सूची कोष्ठकों की सुमेलित जोड़ी है, जिसके अंदर शून्य या अधिक अभिव्यक्तियाँ हैं।
* सूची कोष्ठकों की सुमेलित जोड़ी है, जिसके अंदर शून्य या अधिक अभिव्यक्तियाँ हैं।
यहां दशमलव अंक, ऊपरी और निचले अक्षर और कोष्ठक टर्मिनल प्रतीक हैं।
यहां दशमलव अंक, ऊपरी एवं निचले अक्षर एवं कोष्ठक टर्मिनल प्रतीक हैं।


इस व्याकरण में सुगठित टोकन अनुक्रमों के उदाहरण निम्नलिखित हैं: '<code>12345</code>', '<code>()</code>', '<code>(A B C232 (1))</code>'
इस व्याकरण में सुगठित टोकन अनुक्रमों के उदाहरण: '<code>12345</code>', '<code>()</code>', '<code>(A B C232 (1))</code>' निम्नलिखित हैं।


===जटिल व्याकरण===
===जटिल व्याकरण===
किसी प्रोग्रामिंग भाषा को निर्दिष्ट करने के लिए आवश्यक व्याकरण को चॉम्स्की पदानुक्रम में उसकी स्थिति के आधार पर वर्गीकृत किया जा सकता है। अधिकांश प्रोग्रामिंग भाषाओं के वाक्यांश व्याकरण को टाइप-2 व्याकरण का उपयोग करके निर्दिष्ट किया जा सकता है, यानी, वे संदर्भ-मुक्त व्याकरण हैं,<ref>{{cite book | author = Michael Sipser | author-link = Michael Sipser | year = 1997 | title = संगणना के सिद्धांत का परिचय| publisher = PWS Publishing | isbn = 0-534-94728-X | url = https://archive.org/details/introductiontoth00sips }} Section 2.2: Pushdown Automata, pp.101&ndash;114.</ref> हालाँकि समग्र सिंटैक्स संदर्भ-संवेदनशील है (परिवर्तनीय घोषणाओं और नेस्टेड स्कोप के कारण), इसलिए टाइप-1। हालाँकि, अपवाद हैं, और कुछ भाषाओं के लिए वाक्यांश व्याकरण टाइप-0 (ट्यूरिंग-पूर्ण) है।
किसी प्रोग्रामिंग भाषा को निर्दिष्ट करने के लिए आवश्यक व्याकरण को चॉम्स्की पदानुक्रम में उसकी स्थिति के आधार पर वर्गीकृत किया जा सकता है। अधिकांश प्रोग्रामिंग भाषाओं के वाक्यांश व्याकरण को टाइप-2 व्याकरण का उपयोग करके निर्दिष्ट किया जा सकता है, अर्थात, वे संदर्भ-मुक्त व्याकरण हैं,<ref>{{cite book | author = Michael Sipser | author-link = Michael Sipser | year = 1997 | title = संगणना के सिद्धांत का परिचय| publisher = PWS Publishing | isbn = 0-534-94728-X | url = https://archive.org/details/introductiontoth00sips }} Section 2.2: Pushdown Automata, pp.101&ndash;114.</ref> चूँकि समग्र वाक्यविन्यास संदर्भ-संवेदनशील है (परिवर्तनीय घोषणाओं एवं नेस्टेड स्कोप के कारण), इसलिए टाइप-1 है। चूँकि, अपवाद हैं, एवं कुछ भाषाओं के लिए वाक्यांश व्याकरण टाइप-0 (ट्यूरिंग-पूर्ण) है।


पर्ल और लिस्प जैसी कुछ भाषाओं में भाषा के विनिर्देश (या कार्यान्वयन) उन निर्माणों की अनुमति देते हैं जो पार्सिंग चरण के दौरान निष्पादित होते हैं। इसके अलावा, इन भाषाओं में ऐसी संरचनाएं होती हैं जो प्रोग्रामर को पार्सर के व्यवहार को बदलने की अनुमति देती हैं। यह संयोजन प्रभावी रूप से पार्सिंग और निष्पादन के बीच अंतर को धुंधला कर देता है, और इन भाषाओं में वाक्यविन्यास विश्लेषण को [[अनिर्णीत समस्या]] बना देता है, जिसका अर्थ है कि पार्सिंग चरण समाप्त नहीं हो सकता है। उदाहरण के लिए, पर्ल में पार्सिंग के दौरान कोड को निष्पादित करना संभव है <code>BEGIN</code> कथन, और पर्ल फ़ंक्शन प्रोटोटाइप वाक्यात्मक व्याख्या को बदल सकते हैं, और संभवतः शेष कोड की वाक्यात्मक वैधता को भी बदल सकते हैं।<ref>The following discussions give examples:
पर्ल एवं लिस्प जैसी कुछ भाषाओं में भाषा के विनिर्देश (या कार्यान्वयन) उन निर्माणों की अनुमति देते हैं जो पासिंग चरण के समय निष्पादित होते हैं। इसके अलावा, इन भाषाओं में ऐसी संरचनाएं होती हैं जो प्रोग्रामर को पासर के व्यवहार को परिवर्तित करने की अनुमति देती हैं। यह संयोजन प्रभावी रूप से पासिंग एवं निष्पादन के मध्य अंतर को धुंधला कर देता है, एवं इन भाषाओं में वाक्यविन्यास विश्लेषण को [[अनिर्णीत समस्या]] बना देता है, जिसका अर्थ है कि पासिंग चरण समाप्त नहीं हो सकता है। उदाहरण के लिए, पर्ल में <code>BEGIN</code> कथन पासिंग के समय कोड को निष्पादित करना संभव है, एवं पर्ल फलन प्रोटोटाइप वाक्यात्मक व्याख्या को परिवर्तित कर सकते हैं, एवं संभवतः शेष कोड की वाक्यात्मक वैधता को भी परिवर्तित कर सकते हैं।<ref>The following discussions give examples:
* [http://www.jeffreykegler.com/Home/perl-and-undecidability Perl and Undecidability]
* [http://www.jeffreykegler.com/Home/perl-and-undecidability Perl and Undecidability]
* [http://lambda-the-ultimate.org/node/3564#comment-50578 LtU comment clarifying that the undecidable problem is membership in the class of Perl programs]
* [http://lambda-the-ultimate.org/node/3564#comment-50578 LtU comment clarifying that the undecidable problem is membership in the class of Perl programs]
* [http://www.modernperlbooks.com/mt/2009/08/on-parsing-perl-5.html chromatic's example of Perl code that gives a syntax error depending on the value of random variable]<!-- chromatic is a published author; see http://www.oreillynet.com/pub/au/176 -->
* [http://www.modernperlbooks.com/mt/2009/08/on-parsing-perl-5.html chromatic's example of Perl code that gives a syntax error depending on the value of random variable]<!-- chromatic is a published author; see http://www.oreillynet.com/pub/au/176 -->
</ref> बोलचाल की भाषा में यह कहा जाता है कि केवल पर्ल ही पर्ल को पार्स कर सकता है (क्योंकि पार्सिंग के दौरान कोड को निष्पादित किया जाना चाहिए, और व्याकरण को संशोधित कर सकता है), या अधिक दृढ़ता से यहां तक ​​कि पर्ल भी पर्ल को पार्स नहीं कर सकता है (क्योंकि यह अनिर्णीत है)। इसी प्रकार, लिस्प मैक्रो निर्देश द्वारा प्रस्तुत किया गया <code>defmacro</code> पार्सिंग के दौरान सिंटैक्स भी निष्पादित होता है, जिसका अर्थ है कि लिस्प कंपाइलर में संपूर्ण लिस्प रन-टाइम सिस्टम मौजूद होना चाहिए। इसके विपरीत, सी मैक्रोज़ केवल स्ट्रिंग प्रतिस्थापन हैं, और उन्हें कोड निष्पादन की आवश्यकता नहीं होती है।<ref>{{cite web |url=http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html |title=An Introduction to Common Lisp Macros
</ref> बोलचाल की भाषा में यह कहा जाता है कि केवल पर्ल ही पर्ल को पास कर सकता है (क्योंकि पासिंग के समय कोड को निष्पादित किया जाना चाहिए, एवं व्याकरण को संशोधित कर सकता है), या अधिक दृढ़ता से यहां तक ​​कि पर्ल भी पर्ल को पास नहीं कर सकता है (क्योंकि यह अनिर्णीत है)। इसी प्रकार, <code>defmacro</code> वाक्यविन्यास द्वारा प्रस्तुत किया गया पासिंग के समय वाक्यविन्यास भी निष्पादित होता है, जिसका अर्थ है कि लिस्प कंपाइलर में संपूर्ण लिस्प रन-टाइम प्रणाली उपस्थित होना चाहिए। इसके विपरीत, सी मैक्रोज़ केवल स्ट्रिंग प्रतिस्थापन हैं, एवं उन्हें कोड निष्पादन की आवश्यकता नहीं होती है।<ref>{{cite web |url=http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html |title=An Introduction to Common Lisp Macros
|publisher=Apl.jhu.edu |date=1996-02-08 |access-date=2013-08-17 |url-status=dead |archive-url=https://web.archive.org/web/20130806054148/http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html |archive-date=2013-08-06 }}</ref><ref>{{cite web|url=http://cl-cookbook.sourceforge.net/macros.html |title=कॉमन लिस्प कुकबुक - मैक्रोज़ और बैककोट|publisher=Cl-cookbook.sourceforge.net |date=2007-01-16 |access-date=2013-08-17}}</ref>
|publisher=Apl.jhu.edu |date=1996-02-08 |access-date=2013-08-17 |url-status=dead |archive-url=https://web.archive.org/web/20130806054148/http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html |archive-date=2013-08-06 }}</ref><ref>{{cite web|url=http://cl-cookbook.sourceforge.net/macros.html |title=कॉमन लिस्प कुकबुक - मैक्रोज़ और बैककोट|publisher=Cl-cookbook.sourceforge.net |date=2007-01-16 |access-date=2013-08-17}}</ref>


== वाक्य-विन्यास बनाम शब्दार्थ ==
== वाक्य-विन्यास के प्रति सिमेंटिक्स ==
किसी भाषा का सिंटैक्स वैध प्रोग्राम के स्वरूप का वर्णन करता है, लेकिन प्रोग्राम के अर्थ या उस प्रोग्राम को निष्पादित करने के परिणामों के बारे में कोई जानकारी प्रदान नहीं करता है। प्रतीकों के संयोजन को दिया गया अर्थ शब्दार्थ विज्ञान (या तो प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थ या [[संदर्भ कार्यान्वयन (कंप्यूटिंग)]] में हार्ड-कोडित) द्वारा नियंत्रित किया जाता है। सभी वाक्यात्मक रूप से सही प्रोग्राम शब्दार्थ की दृष्टि से सही नहीं होते हैं। भाषा के नियमों के अनुसार वाक्य-विन्यास की दृष्टि से कई सही कार्यक्रम फिर भी ख़राब होते हैं; और (भाषा विनिर्देश और कार्यान्वयन की सुदृढ़ता के आधार पर) अनुवाद या निष्पादन में त्रुटि हो सकती है। कुछ मामलों में, ऐसे प्रोग्राम [[अपरिभाषित व्यवहार]] प्रदर्शित कर सकते हैं। यहां तक ​​​​कि जब कोई कार्यक्रम किसी भाषा के भीतर अच्छी तरह से परिभाषित होता है, तब भी इसका  अर्थ हो सकता है जो इसे लिखने वाले व्यक्ति द्वारा अभिप्रेत नहीं है।
किसी भाषा का वाक्यविन्यास वैध प्रोग्राम के स्वरूप का वर्णन करता है, किन्तु प्रोग्राम के अर्थ या उस प्रोग्राम को निष्पादित करने के परिणामों के विषय में कोई जानकारी प्रदान नहीं करता है। प्रतीकों के संयोजन को दिया गया अर्थ सिमेंटिक्स विज्ञान (या तो प्रोग्रामिंग भाषाओं के औपचारिक सिमेंटिक्स या [[संदर्भ कार्यान्वयन (कंप्यूटिंग)]] में हार्ड-कोडित) द्वारा नियंत्रित किया जाता है। सभी वाक्यात्मक रूप से उचित प्रोग्राम सिमेंटिक्स की दृष्टि से उचित नहीं होते हैं। भाषा के नियमों के अनुसार वाक्य-विन्यास की दृष्टि से कई उचित कार्यक्रम व्यर्थ होते हैं; एवं (भाषा विनिर्देश एवं कार्यान्वयन की सुदृढ़ता के आधार पर) अनुवाद या निष्पादन में त्रुटि हो सकती है। कुछ विषयों में, ऐसे प्रोग्राम [[अपरिभाषित व्यवहार]] प्रदर्शित कर सकते हैं। यहां तक ​​​​कि जब कोई कार्यक्रम किसी भाषा के अंदर उचित प्रकार से परिभाषित होता है, तब भी इसका  अर्थ हो सकता है जो इसे लिखने वाले व्यक्ति द्वारा अभिप्रेत नहीं है।


उदाहरण के रूप में [[प्राकृतिक भाषा]] का उपयोग करते हुए, व्याकरणिक रूप से सही वाक्य को अर्थ निर्दिष्ट करना संभव नहीं हो सकता है या वाक्य गलत हो सकता है:
उदाहरण के रूप में [[प्राकृतिक भाषा]] का उपयोग करते हुए, व्याकरणिक रूप से उचित वाक्य को अर्थ निर्दिष्ट करना संभव नहीं हो सकता है या वाक्य त्रुटिपूर्ण हो सकता है:
*रंगहीन हरे विचार प्रचंड नींद में सोते हैं। व्याकरणिक रूप से अच्छी तरह से गठित है लेकिन इसका कोई आम तौर पर स्वीकृत अर्थ नहीं है।
*रंगहीन हरे विचार उग्र रूप से सोते हैं। व्याकरणिक रूप से उचित प्रकार से गठित है किन्तु इसका कोई सामान्यतः स्वीकृत अर्थ नहीं है।
* जॉन विवाहित कुंवारा है। व्याकरणिक रूप से अच्छी तरह से गठित है लेकिन  ऐसा अर्थ व्यक्त करता है जो सत्य नहीं हो सकता।
* जॉन विवाहित कुंवारा है। व्याकरणिक रूप से उचित प्रकार से गठित है किन्तु ऐसा अर्थ व्यक्त करता है जो सत्य नहीं हो सकता।


निम्नलिखित सी भाषा खंड वाक्य रचना की दृष्टि से सही है, लेकिन  ऐसा ऑपरेशन करता है जो शब्दार्थ की दृष्टि से परिभाषित नहीं है (क्योंकि {{code|lang=c|p}}  शून्य सूचक है, संचालन {{code|lang=c|p->real}} और {{code|lang=c|p->im}} कोई मतलब नहीं है):
निम्नलिखित सी भाषा खंड वाक्य रचना की दृष्टि से उचित है, किन्तु ऐसा ऑपरेशन करता है जो सिमेंटिक्स की दृष्टि से परिभाषित नहीं है (क्योंकि {{code|lang=c|p}}  शून्य सूचक है, संचालन {{code|lang=c|p->real}} एवं {{code|lang=c|p->im}} कोई अर्थ नहीं है):
<syntaxhighlight lang=C>
<syntaxhighlight lang=C>
  complex *p = NULL;
  complex *p = NULL;
Line 88: Line 86:
  printf("%d", x);
  printf("%d", x);
</syntaxhighlight>
</syntaxhighlight>
वाक्य रचना की दृष्टि से मान्य है, लेकिन शब्दार्थ की दृष्टि से परिभाषित नहीं है, क्योंकि यह [[अप्रारंभीकृत चर]] का उपयोग करता है। भले ही कुछ प्रोग्रामिंग भाषाओं (उदाहरण के लिए, जावा और सी#) के कंपाइलर इस प्रकार की अप्रारंभीकृत परिवर्तनीय त्रुटियों का पता लगाएंगे, उन्हें सिंटैक्स त्रुटियों के बजाय प्रोग्रामिंग भाषा#सिमेंटिक्स त्रुटियों के रूप में माना जाना चाहिए।<ref name="uninitialized var" /><ref>[https://stackoverflow.com/questions/8803718/issue-of-syntax-or-semantics/8803765#8803765 Issue of syntax or semantics?]</ref>
वाक्य रचना की दृष्टि से मान्य है, किन्तु सिमेंटिक्स की दृष्टि से परिभाषित नहीं है, क्योंकि यह [[अप्रारंभीकृत चर]] का उपयोग करता है। अपितु कुछ प्रोग्रामिंग भाषाओं (उदाहरण के लिए, जावा एवं C#) के कंपाइलर इस प्रकार की अप्रारंभीकृत परिवर्तनीय त्रुटियों को ज्ञात करेंगे, उन्हें वाक्यविन्यास त्रुटियों के अतिरिक्त सिमेंटिक्स त्रुटियों के रूप में माना जाना चाहिए।<ref name="uninitialized var">[http://www.dummies.com/how-to/content/semantic-errors-in-java.html Semantic Errors in Java]</ref><ref>[https://stackoverflow.com/questions/8803718/issue-of-syntax-or-semantics/8803765#8803765 Issue of syntax or semantics?]</ref>


== यह भी देखें ==
== यह भी देखें ==
*[[नामकरण परंपरा (प्रोग्रामिंग)]]
*[[नामकरण परंपरा (प्रोग्रामिंग)]]
*[[प्रोग्रामिंग भाषाओं की तुलना (वाक्यविन्यास)]]
*[[प्रोग्रामिंग भाषाओं की तुलना (वाक्यविन्यास)|प्रोग्रामिंग भाषाओं की अपेक्षा (वाक्यविन्यास)]]
विभिन्न प्रोग्रामिंग भाषाओं के सिंटैक्स की त्वरित तुलना करने के लिए, हैलो, वर्ल्ड! की सूची पर नज़र डालें। कार्यक्रम के उदाहरण:
विभिन्न प्रोग्रामिंग भाषाओं के वाक्यविन्यास की त्वरित अपेक्षा करने के लिए, हैलो, वर्ल्ड! की सूची पर नज़र डालें। कार्यक्रम के उदाहरण:
* [[प्रोलॉग सिंटैक्स और शब्दार्थ]]
* [[प्रोलॉग सिंटैक्स और शब्दार्थ|प्रोलॉग वाक्यविन्यास एवं सिमेंटिक्स]]
* पर्ल भाषा संरचना#बुनियादी वाक्यविन्यास
* पर्ल वाक्यविन्यास
* [[PHP सिंटैक्स और शब्दार्थ]]
* [[PHP सिंटैक्स और शब्दार्थ|PHP वाक्यविन्यास एवं सिमेंटिक्स]]
* [[सी सिंटैक्स]]
* [[सी सिंटैक्स|सी वाक्यविन्यास]]
* [[सी++ सिंटैक्स]]
* [[सी++ सिंटैक्स|C++ वाक्यविन्यास]]
* [[जावा सिंटैक्स]]
* [[जावा सिंटैक्स|जावा वाक्यविन्यास]]
* [[जावास्क्रिप्ट सिंटैक्स]]
* [[जावास्क्रिप्ट सिंटैक्स|जावास्क्रिप्ट वाक्यविन्यास]]
* [[पायथन सिंटैक्स और शब्दार्थ]]
* [[पायथन सिंटैक्स और शब्दार्थ|पायथन वाक्यविन्यास एवं सिमेंटिक्स]]
* [[ लुआ वाक्यविन्यास ]]
* [[ लुआ वाक्यविन्यास |लुआ वाक्यविन्यास]]
* [[हास्केल सिंटैक्स]]
* [[हास्केल सिंटैक्स|हास्केल वाक्यविन्यास]]


== संदर्भ ==
== संदर्भ ==
Line 111: Line 109:
== बाहरी संबंध ==
== बाहरी संबंध ==
* Various syntactic constructs used in [http://merd.sourceforge.net/pixel/language-study/syntax-across-languages/ computer programming languages]
* Various syntactic constructs used in [http://merd.sourceforge.net/pixel/language-study/syntax-across-languages/ computer programming languages]
*Python error “ImportError: No module named” Why? How? Command-Line? [https://usingpython.shodkk.com/python-error-importerror-no-module-named-why-how-command-line-solved2021/ <nowiki>[Solved2021]</nowiki>]
*Python error “ImportError: No module named” Why? How? Command-Line? [https://usingpython.shodkk.com/python-error-importerror-no-module-named-why-how-command-line-solved2021/ <nowiki>[Solved2021]</nowiki>]
[[Category: प्रोग्रामिंग भाषा सिंटैक्स| प्रोग्रामिंग भाषा सिंटैक्स]] [[Category: प्रोग्रामिंग भाषा विषय]] [[Category: सोर्स कोड]]  


 
[[Category:Articles with hatnote templates targeting a nonexistent page]]
 
[[Category: Machine Translated Page]]
[[Category:Created On 07/07/2023]]
[[Category:Created On 07/07/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with broken file links]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:प्रोग्रामिंग भाषा विषय]]
[[Category:प्रोग्रामिंग भाषा सिंटैक्स| प्रोग्रामिंग भाषा सिंटैक्स]]
[[Category:सोर्स कोड]]

Latest revision as of 17:23, 29 July 2023

सोर्स कोड के तत्वों को पहचानने में प्रोग्रामर की सहायता के लिए प्रायः वाक्य - विन्यास पर प्रकाश डालना एवं इंडेंट शैली का उपयोग किया जाता है। यह पायथन (प्रोग्रामिंग भाषा) कोड रंग कोडित हाइलाइटिंग का उपयोग करता है।

कंप्यूटर विज्ञान में, कंप्यूटर भाषा का वाक्य-विन्यास वे नियम हैं जो प्रतीकों के संयोजन को परिभाषित करते हैं जिन्हें उस भाषा में उचित प्रकार से संरचित कथन या अभिव्यक्ति माना जाता है। यह प्रोग्रामिंग भाषाओं, जहां दस्तावेज़ स्रोत कोड का प्रतिनिधित्व करता है, एवं मार्कअप भाषाओं, जहां दस्तावेज़ डेटा का प्रतिनिधित्व करता है, दोनों पर प्रस्तावित होता है।

किसी भाषा का वाक्य-विन्यास उसके सतही स्वरूप को परिभाषित करता है।[1]टेक्स्ट-आधारित कंप्यूटर भाषाएं वर्णों के अनुक्रम पर आधारित होती हैं, जबकि दृश्य प्रोग्रामिंग भाषाएं स्थानिक लेआउट एवं प्रतीकों के मध्य कनेक्शन (जो टेक्स्टुअल या ग्राफिकल हो सकती हैं) पर आधारित होती हैं। जो दस्तावेज़ वाक्यविन्यास की दृष्टि से अमान्य हैं, उनमें वाक्यविन्यास त्रुटि कही जाती है। किसी भाषा के वाक्यविन्यास को डिजाइन करते समय, डिजाइनर इन उदाहरणों से सामान्य नियमों को समझने के प्रयत्न करने से पूर्व, कानूनी एवं अवैध दोनों स्ट्रिंग के उदाहरण लिखना प्रारम्भ कर सकता है।[2]इसलिए वाक्यविन्यास कोड के रूप को संदर्भित करता है, एवं इसकी अपेक्षा सिमेंटिक्स अर्थ से की जाती है। कंप्यूटर भाषाओं के प्रसंस्करण में, सिमेंटिक प्रोसेसिंग सामान्यतः वाक्य-विन्यास प्रसंस्करण के पश्चात आती है; चूँकि, कुछ विषयों में वाक्यविन्यास विश्लेषण के लिए सिमेंटिक प्रोसेसिंग आवश्यक है, एवं ये साथ में या समवर्ती रूप से किया जाता है। संकलक में, सिंटैक्टिक विश्लेषण में कंपाइलर फ्रंटएंड सम्मिलित होता है, जबकि सिमेंटिक विश्लेषण (कंपाइलर्स) में कंपाइलर बैकएंड (एवं मध्य अंत, यदि यह चरण को भिन्न किया जाता है) सम्मिलित होता है।

वाक्यविन्यास का स्तर

कंप्यूटर भाषा वाक्यविन्यास को सामान्यतः तीन स्तरों में विभाजित किया जाता है:

  • शब्द - शाब्दिक स्तर, यह निर्धारित करता है कि अक्षर कैसे टोकन बनाते हैं;
  • वाक्यांश - व्याकरण का स्तर, संकीर्ण रूप से बोलना, यह निर्धारित करना कि टोकन कैसे वाक्यांश बनाते हैं;
  • संदर्भ - यह निर्धारित करना कि ऑब्जेक्ट या वेरिएबल नाम किन चीज़ों को संदर्भित करते हैं, यदि प्रकार वैध हैं, आदि।

इस प्रकार से भेद करने से मॉड्यूलरिटी प्राप्त होती है, जिससे प्रत्येक स्तर को भिन्न से एवं प्रायः स्वतंत्र रूप से वर्णित एवं संसाधित किया जा सकता है। सबसे पूर्व, लेक्सर वर्णों के रैखिक अनुक्रम को टोकन के रैखिक अनुक्रम में परिवर्तित कर देता है; इसे शाब्दिक विश्लेषण या लेक्सिंग के रूप में जाना जाता है। दूसरा, पासर टोकन के रैखिक अनुक्रम को पदानुक्रमित वाक्यविन्यास वृक्ष में परिवर्तित कर देता है; इसे संकीर्ण रूप से पदच्छेद के रूप में जाना जाता है। तीसरा, प्रासंगिक विश्लेषण नामों का समाधान करता है एवं प्रकारों का शोध करता है। यह मॉड्यूलरिटी कभी-कभी संभव होती है, किन्तु कई वास्तविक समाज की भाषाओं में प्रथम चरण पश्चात के चरण पर निर्भर करता है - उदाहरण के लिए, सी में लेक्सर हैक इसलिए होता है क्योंकि टोकननाइजेशन संदर्भ पर निर्भर करता है। इन विषयों में भी, वाक्यात्मक विश्लेषण को प्रायः इस आदर्श मॉडल के सन्निकटन के रूप में देखा जाता है।

पासिंग चरण को स्वयं दो भागों में विभाजित किया जा सकता है: पास वृक्ष, या कंक्रीट वाक्यविन्यास ट्री, जो व्याकरण द्वारा निर्धारित होता है, किन्तु सामान्यतः व्यावहारिक उपयोग के लिए अधिक विस्तृत होता है, एवं अमूर्त वाक्यविन्यास ट्री (एएसटी), जो इसे प्रयोग करने योग्य रूप में सरल बनाता है। एएसटी एवं प्रासंगिक विश्लेषण चरणों को सिमेंटिक विश्लेषण का रूप माना जा सकता है, क्योंकि वे वाक्यविन्यास में अर्थ एवं व्याख्या जोड़ रहे हैं, या वैकल्पिक रूप से वाक्यात्मक नियमों के अनौपचारिक, मैन्युअल कार्यान्वयन के रूप में हैं जिनका औपचारिक रूप से वर्णन करना या प्रस्तावित करना कठिन होता है।

स्तर सामान्यतः चॉम्स्की पदानुक्रम के स्तरों के अनुरूप होते हैं। शब्द नियमित भाषा में होते हैं, जो शाब्दिक व्याकरण में निर्दिष्ट होते हैं, जो कि टाइप-3 व्याकरण है, जिसे सामान्यतः नियमित अभिव्यक्ति के रूप में दिया जाता है। वाक्यांश संदर्भ-मुक्त भाषा (सीएफएल) में होते हैं, सामान्यतः नियतात्मक संदर्भ-मुक्त भाषा (डीसीएफएल), वाक्यांश संरचना व्याकरण में निर्दिष्ट होती है, जो प्रकार -2 व्याकरण है, जिसे सामान्यतः बैकस-नौर में उत्पादन (कंप्यूटर विज्ञान) के रूप में दिया जाता है। वाक्यांश व्याकरणों को प्रायः पूर्ण संदर्भ-मुक्त व्याकरणों की अपेक्षा में कहीं अधिक सीमित व्याकरणों में निर्दिष्ट किया जाता है, जिससे उन्हें पास करना सरल हो सके; जबकि एलआर पासर किसी भी डीसीएफएल को रैखिक समय में पास कर सकता है, सरल एलएएलआर पासर एवं यहां तक ​​कि सरल एलएल पासर अधिक कुशल हैं, किन्तु केवल उन व्याकरणों को पास कर सकते हैं जिनके उत्पादन नियम बाधित हैं। सिद्धांत रूप में, प्रासंगिक संरचना को संदर्भ-संवेदनशील व्याकरण द्वारा वर्णित किया जा सकता है, एवं विशेषता व्याकरण जैसे माध्यमों से स्वचालित रूप से विश्लेषण किया जा सकता है, चूँकि सामान्यतः, यह चरण नाम रिज़ॉल्यूशन (प्रोग्रामिंग भाषाओं) नियमों एवं प्रकार की शोध के माध्यम से मैन्युअल रूप से किया जाता है, एवं प्रतीक सारणी के माध्यम से कार्यान्वित किया जाता है, जो प्रत्येक सीमा के लिए नाम एवं प्रकार संग्रहीत करती है।

ऐसे उपकरण लिखे गए हैं, जो स्वचालित रूप से नियमित अभिव्यक्तियों में लिखे गए शाब्दिक विनिर्देश से लेक्सर एवं बीएनएफ में लिखे गए वाक्यांश व्याकरण से पासर उत्पन्न करते हैं, यह किसी को प्रक्रियात्मक या कार्यात्मक प्रोग्रामिंग की आवश्यकता के अतिरिक्त घोषणात्मक प्रोग्रामिंग का उपयोग करने की अनुमति देता है। उल्लेखनीय उदाहरण लेक्स-याक जोड़ी है। ये स्वचालित रूप से ठोस वाक्यविन्यास वृक्ष उत्पन्न करते हैं; इसके पश्चात पासर लेखक को मैन्युअल रूप से यह वर्णन करते हुए कोड लिखना होगा कि इसे अमूर्त वाक्यविन्यास ट्री में कैसे परिवर्तित किया जाता है। प्रासंगिक विश्लेषण भी सामान्यतः मैन्युअल रूप से प्रस्तावित किया जाता है। इन स्वचालित उपकरणों के अस्तित्व के अतिरिक्त, पासिंग को प्रायः विभिन्न कारणों से मैन्युअल रूप से कार्यान्वित किया जाता है। संभवता वाक्यांश संरचना संदर्भ मुक्त नहीं है, या वैकल्पिक कार्यान्वयन प्रदर्शन या त्रुटि-रिपोर्टिंग में सुधार करता है, या व्याकरण को अधिक सरलता से परिवर्तित करने की अनुमति देता है। पासर प्रायः कार्यात्मक भाषाओं में लिखे जाते हैं, जैसे हास्केल (प्रोग्रामिंग भाषा), या स्क्रिप्टिंग भाषाओं में, जैसे पायथन (प्रोग्रामिंग भाषा) या पर्ल, या सी (प्रोग्रामिंग भाषा) या C++ में लिखे जाते हैं।

त्रुटियों के उदाहरण

उदहारण के लिए, (add 1 1) वाक्यात्मक रूप से मान्य लिस्प प्रोग्राम है (मान लें कि 'ऐड' फलनउपस्थित है, अन्यथा नाम रिज़ॉल्यूशन विफल हो जाता है), 1 एवं 1 जोड़ते हैं। चूँकि, निम्नलिखित अमान्य हैं।

(_ 1 1)    lexical error: '_' is not valid
(add 1 1   parsing error: missing closing ')'

लेक्सर प्रकार त्रुटि की पहचान करने में असमर्थ है, वह केवल इतना जानता है कि, टोकन LEFT_PAREN का उत्पादन करने के पश्चात, '(' प्रोग्राम का शेष भाग अमान्य है, क्योंकि कोई भी शब्द नियम '_' से प्रारम्भ नहीं होता है। दूसरी त्रुटि का ज्ञात हुआ है, पासिंग चरण: पासर ने '(' टोकन (मात्र मिलान के रूप में) के कारण सूची उत्पादन नियम की पहचान की है, एवं इस प्रकार त्रुटि संदेश दे सकता है, सामान्यतः यह अस्पष्ट हो सकता है।

टाइप त्रुटियों एवं अघोषित परिवर्तनीय त्रुटियों को कभी-कभी वाक्यविन्यास त्रुटियां माना जाता है, जब उन्हें संकलन-समय पर प्रकार की त्रुटियों को ज्ञात किया जाता है (जो सामान्यतः दृढ़ता से टाइप की गई भाषाओं को संकलित करते समय होता है), चूँकि इस प्रकार की त्रुटियों को सिमेंटिक त्रुटियों के रूप में वर्गीकृत करना सरल है। उदाहरण के रूप में, पायथन कोड

'a' + 1

इसमें प्रकार की त्रुटि है, क्योंकि यह पूर्णांक अक्षरशः में स्ट्रिंग अक्षरशः जोड़ता है। संकलन-समय पर इस प्रकार की त्रुटियों की जानकरी ज्ञात की जा सकती है। उन्हें पासिंग (वाक्यांश विश्लेषण) के समय जानकरी ज्ञात की जा सकती है, यदि कंपाइलर भिन्न-भिन्न नियमों का उपयोग करता है जो integerLiteral + integerLiteral को अनुमति देता है किन्तु stringLiteral + integerLiteral को नहीं, चूँकि यह अधिक संभावना है, कि कंपाइलर इसका उपयोग करता है। पासिंग नियम जो LiteralOrIdentifier + LiteralOrIdentifier फॉर्म की सभी अभिव्यक्तियों की अनुमति देता है एवं तत्पश्चात प्रासंगिक विश्लेषण (जब टाइप चेकिंग होती है) के समय त्रुटि की जानकरी ज्ञात की जाएगी। कुछ विषयों में यह सत्यापन कंपाइलर द्वारा नहीं किया जाता है, एवं इन त्रुटियों की जानकरी केवल रनटाइम पर लगायी जाती है।

गतिशील रूप से टाइप की गई भाषा में, जहां प्रकार केवल रनटाइम पर निर्धारित किया जा सकता है, कई प्रकार की त्रुटियों की जानकरी केवल रनटाइम पर ही लगायी जा सकती है। उदाहरण के लिए, पायथन कोड

a + b

वाक्यांश स्तर पर वाक्यात्मक रूप से मान्य है, किन्तु a एवं b के प्रकारों की शुद्धता केवल रनटाइम पर निर्धारित की जा सकती है, क्योंकि पायथन में चर के प्रकार नहीं होते हैं, केवल मान होते हैं। जबकि इस कथन पर असहमति है कि क्या कंपाइलर द्वारा पाई गई त्रुटि को वाक्यविन्यास त्रुटि कहा जाना चाहिए (स्टेटिक सिमेंटिक्स त्रुटि के अतिरिक्त), त्रुटियां जिन्हें केवल प्रोग्राम निष्पादन समय पर पता लगाया जा सकता है उन्हें सदैव वाक्यविन्यास के अतिरिक्त सिमेंटिक माना जाता है।

सिंटेक्स परिभाषा

File:Python add5 parse.svg
इनसेट टोकननाइजेशन के साथ पायथन कोड का पास ट्री

पाठ्य प्रोग्रामिंग भाषाओं के वाक्यविन्यास को सामान्यतः वाक्यात्मक श्रेणी (नॉनटर्मिनल्स) एवं टर्मिनल प्रतीकों को निर्दिष्ट करने के लिए नियमित अभिव्यक्तियों (शब्दावली विश्लेषण संरचना के लिए) एवं बैकस-नौर फॉर्म (संदर्भ-मुक्त व्याकरण संरचना के लिए) के संयोजन का उपयोग करके परिभाषित किया जाता है। वाक्य-विन्यास श्रेणियों को प्रोडक्शन नामक नियमों द्वारा परिभाषित किया जाता है, जो उन मानों को निर्दिष्ट करते हैं जो विशेष वाक्य-विन्यास श्रेणी से संबंधित होते हैं।[1]टर्मिनल प्रतीक ठोस वर्ण या वर्णों की स्ट्रिंग हैं (उदाहरण के लिए परिभाषित, यदि, लेट, या शून्य जैसे कीवर्ड (कंप्यूटर प्रोग्रामिंग)) जिनसे वाक्यात्मक रूप से मान्य प्रोग्राम बनाए जाते हैं।

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

उदाहरण: लिस्प एस-अभिव्यक्ति

नीचे सरल व्याकरण है, जिसे नियमित अभिव्यक्तियों एवं विस्तारित बैकस-नौर फॉर्म के संकेतन का उपयोग करके परिभाषित किया गया है। यह एस-्सप्रेशन के वाक्यविन्यास का वर्णन करता है, जो प्रोग्रामिंग भाषा लिस्प प्रोग्रामिंग भाषा का डेटा वाक्यविन्यास है, जो वाक्यात्मक श्रेणियों अभिव्यक्ति, परमाणु, संख्या, प्रतीक एवं सूची के लिए प्रस्तुतियों को परिभाषित करता है:

expression = atom   | list
atom       = number | symbol    
number     = [+-]?['0'-'9']+
symbol     = ['A'-'Z']['A'-'Z''0'-'9'].*
list       = '(', expression*, ')'

यह व्याकरण निम्नलिखित निर्दिष्ट करता है:

  • अभिव्यक्ति या तो परमाणु या सूची है;
  • परमाणु या तो संख्या या प्रतीक है;
  • संख्या या अधिक दशमलव अंकों का अटूट क्रम है, जिसके पूर्व वैकल्पिक रूप से प्लस या माइनस चिह्न होता है;
  • प्रतीक वह अक्षर है जिसके पश्चात शून्य या अधिक अक्षर (व्हाइटस्पेस को त्यागकर) आते हैं; एवं
  • सूची कोष्ठकों की सुमेलित जोड़ी है, जिसके अंदर शून्य या अधिक अभिव्यक्तियाँ हैं।

यहां दशमलव अंक, ऊपरी एवं निचले अक्षर एवं कोष्ठक टर्मिनल प्रतीक हैं।

इस व्याकरण में सुगठित टोकन अनुक्रमों के उदाहरण: '12345', '()', '(A B C232 (1))' निम्नलिखित हैं।

जटिल व्याकरण

किसी प्रोग्रामिंग भाषा को निर्दिष्ट करने के लिए आवश्यक व्याकरण को चॉम्स्की पदानुक्रम में उसकी स्थिति के आधार पर वर्गीकृत किया जा सकता है। अधिकांश प्रोग्रामिंग भाषाओं के वाक्यांश व्याकरण को टाइप-2 व्याकरण का उपयोग करके निर्दिष्ट किया जा सकता है, अर्थात, वे संदर्भ-मुक्त व्याकरण हैं,[3] चूँकि समग्र वाक्यविन्यास संदर्भ-संवेदनशील है (परिवर्तनीय घोषणाओं एवं नेस्टेड स्कोप के कारण), इसलिए टाइप-1 है। चूँकि, अपवाद हैं, एवं कुछ भाषाओं के लिए वाक्यांश व्याकरण टाइप-0 (ट्यूरिंग-पूर्ण) है।

पर्ल एवं लिस्प जैसी कुछ भाषाओं में भाषा के विनिर्देश (या कार्यान्वयन) उन निर्माणों की अनुमति देते हैं जो पासिंग चरण के समय निष्पादित होते हैं। इसके अलावा, इन भाषाओं में ऐसी संरचनाएं होती हैं जो प्रोग्रामर को पासर के व्यवहार को परिवर्तित करने की अनुमति देती हैं। यह संयोजन प्रभावी रूप से पासिंग एवं निष्पादन के मध्य अंतर को धुंधला कर देता है, एवं इन भाषाओं में वाक्यविन्यास विश्लेषण को अनिर्णीत समस्या बना देता है, जिसका अर्थ है कि पासिंग चरण समाप्त नहीं हो सकता है। उदाहरण के लिए, पर्ल में BEGIN कथन पासिंग के समय कोड को निष्पादित करना संभव है, एवं पर्ल फलन प्रोटोटाइप वाक्यात्मक व्याख्या को परिवर्तित कर सकते हैं, एवं संभवतः शेष कोड की वाक्यात्मक वैधता को भी परिवर्तित कर सकते हैं।[4] बोलचाल की भाषा में यह कहा जाता है कि केवल पर्ल ही पर्ल को पास कर सकता है (क्योंकि पासिंग के समय कोड को निष्पादित किया जाना चाहिए, एवं व्याकरण को संशोधित कर सकता है), या अधिक दृढ़ता से यहां तक ​​कि पर्ल भी पर्ल को पास नहीं कर सकता है (क्योंकि यह अनिर्णीत है)। इसी प्रकार, defmacro वाक्यविन्यास द्वारा प्रस्तुत किया गया पासिंग के समय वाक्यविन्यास भी निष्पादित होता है, जिसका अर्थ है कि लिस्प कंपाइलर में संपूर्ण लिस्प रन-टाइम प्रणाली उपस्थित होना चाहिए। इसके विपरीत, सी मैक्रोज़ केवल स्ट्रिंग प्रतिस्थापन हैं, एवं उन्हें कोड निष्पादन की आवश्यकता नहीं होती है।[5][6]

वाक्य-विन्यास के प्रति सिमेंटिक्स

किसी भाषा का वाक्यविन्यास वैध प्रोग्राम के स्वरूप का वर्णन करता है, किन्तु प्रोग्राम के अर्थ या उस प्रोग्राम को निष्पादित करने के परिणामों के विषय में कोई जानकारी प्रदान नहीं करता है। प्रतीकों के संयोजन को दिया गया अर्थ सिमेंटिक्स विज्ञान (या तो प्रोग्रामिंग भाषाओं के औपचारिक सिमेंटिक्स या संदर्भ कार्यान्वयन (कंप्यूटिंग) में हार्ड-कोडित) द्वारा नियंत्रित किया जाता है। सभी वाक्यात्मक रूप से उचित प्रोग्राम सिमेंटिक्स की दृष्टि से उचित नहीं होते हैं। भाषा के नियमों के अनुसार वाक्य-विन्यास की दृष्टि से कई उचित कार्यक्रम व्यर्थ होते हैं; एवं (भाषा विनिर्देश एवं कार्यान्वयन की सुदृढ़ता के आधार पर) अनुवाद या निष्पादन में त्रुटि हो सकती है। कुछ विषयों में, ऐसे प्रोग्राम अपरिभाषित व्यवहार प्रदर्शित कर सकते हैं। यहां तक ​​​​कि जब कोई कार्यक्रम किसी भाषा के अंदर उचित प्रकार से परिभाषित होता है, तब भी इसका अर्थ हो सकता है जो इसे लिखने वाले व्यक्ति द्वारा अभिप्रेत नहीं है।

उदाहरण के रूप में प्राकृतिक भाषा का उपयोग करते हुए, व्याकरणिक रूप से उचित वाक्य को अर्थ निर्दिष्ट करना संभव नहीं हो सकता है या वाक्य त्रुटिपूर्ण हो सकता है:

  • रंगहीन हरे विचार उग्र रूप से सोते हैं। व्याकरणिक रूप से उचित प्रकार से गठित है किन्तु इसका कोई सामान्यतः स्वीकृत अर्थ नहीं है।
  • जॉन विवाहित कुंवारा है। व्याकरणिक रूप से उचित प्रकार से गठित है किन्तु ऐसा अर्थ व्यक्त करता है जो सत्य नहीं हो सकता।

निम्नलिखित सी भाषा खंड वाक्य रचना की दृष्टि से उचित है, किन्तु ऐसा ऑपरेशन करता है जो सिमेंटिक्स की दृष्टि से परिभाषित नहीं है (क्योंकि p शून्य सूचक है, संचालन p->real एवं p->im कोई अर्थ नहीं है):

 complex *p = NULL;
 complex abs_p = sqrt (p->real * p->real + p->im * p->im);

सरल उदाहरण के रूप में,

 int x;
 printf("%d", x);

वाक्य रचना की दृष्टि से मान्य है, किन्तु सिमेंटिक्स की दृष्टि से परिभाषित नहीं है, क्योंकि यह अप्रारंभीकृत चर का उपयोग करता है। अपितु कुछ प्रोग्रामिंग भाषाओं (उदाहरण के लिए, जावा एवं C#) के कंपाइलर इस प्रकार की अप्रारंभीकृत परिवर्तनीय त्रुटियों को ज्ञात करेंगे, उन्हें वाक्यविन्यास त्रुटियों के अतिरिक्त सिमेंटिक्स त्रुटियों के रूप में माना जाना चाहिए।[7][8]

यह भी देखें

विभिन्न प्रोग्रामिंग भाषाओं के वाक्यविन्यास की त्वरित अपेक्षा करने के लिए, हैलो, वर्ल्ड! की सूची पर नज़र डालें। कार्यक्रम के उदाहरण:

संदर्भ

  1. 1.0 1.1 Friedman, Daniel P.; Mitchell Wand; Christopher T. Haynes (1992). प्रोग्रामिंग भाषाओं की अनिवार्यताएँ (1st ed.). The MIT Press. ISBN 0-262-06145-7.
  2. Smith, Dennis (1999). रखरखाव योग्य सॉफ़्टवेयर डिज़ाइन करना. Springer Science & Business Media.
  3. Michael Sipser (1997). संगणना के सिद्धांत का परिचय. PWS Publishing. ISBN 0-534-94728-X. Section 2.2: Pushdown Automata, pp.101–114.
  4. The following discussions give examples:
  5. "An Introduction to Common Lisp Macros". Apl.jhu.edu. 1996-02-08. Archived from the original on 2013-08-06. Retrieved 2013-08-17.
  6. "कॉमन लिस्प कुकबुक - मैक्रोज़ और बैककोट". Cl-cookbook.sourceforge.net. 2007-01-16. Retrieved 2013-08-17.
  7. Semantic Errors in Java
  8. Issue of syntax or semantics?


बाहरी संबंध