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

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

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

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

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

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

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

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

त्रुटियों के उदाहरण
उदहारण के लिए,   वाक्यात्मक रूप से मान्य लिस्प प्रोग्राम है (मान लें कि 'ऐड' फलनमौजूद है, अन्यथा नाम रिज़ॉल्यूशन विफल हो जाता है), 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 के प्रकारों की शुद्धता केवल रनटाइम पर निर्धारित की जा सकती है, क्योंकि पायथन में चर के प्रकार नहीं होते हैं, केवल मान होते हैं। जबकि इस बात पर असहमति है कि क्या कंपाइलर द्वारा पाई गई त्रुटि को वाक्यविन्यास त्रुटि कहा जाना चाहिए (स्टेटिक सिमेंटिक्स त्रुटि के अतिरिक्त), त्रुटियां जिन्हें केवल प्रोग्राम निष्पादन समय पर पता लगाया जा सकता है उन्हें सदैव वाक्यविन्यास के अतिरिक्त सिमेंटिक माना जाता है।

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

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

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

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

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

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

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

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

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

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

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

बाहरी संबंध

 * Various syntactic constructs used in computer programming languages
 * Python error “ImportError: No module named” Why? How? Command-Line? [Solved2021 ]