Syntax (programming languages)
कंप्यूटर विज्ञान में, एक कंप्यूटर भाषा का वाक्यविन्यास वे नियम हैं जो उन प्रतीकों के संयोजन को परिभाषित करते हैं जिन्हें उस भाषा में सही ढंग से संरचित कथन या अभिव्यक्तियाँ माना जाता है। यह प्रोग्रामिंग भाषाओं, जहां दस्तावेज़ स्रोत कोड का प्रतिनिधित्व करता है, और मार्कअप भाषाओं, जहां दस्तावेज़ डेटा का प्रतिनिधित्व करता है, दोनों पर लागू होता है। किसी भाषा का वाक्यविन्यास उसके सतह के रूप को परिभाषित करता है। पाठ-आधारित कंप्यूटर भाषाएँ वर्णों के अनुक्रमों पर आधारित होती हैं, जबकि दृश्य प्रोग्रामिंग भाषाएँ स्थानिक लेआउट और प्रतीकों (जो पाठ या चित्रमय हो सकते हैं) के बीच संबंधों पर आधारित होती हैं। वाक्यविन्यास की दृष्टि से अमान्य दस्तावेजों को वाक्यविन्यास त्रुटि कहा जाता है। किसी भाषा के वाक्यविन्यास को डिजाइन करते समय, एक डिजाइनर इन उदाहरणों से सामान्य नियमों का पता लगाने की कोशिश करने से पहले, कानूनी और अवैध दोनों तारों के उदाहरणों को लिखकर शुरू कर सकता है। इसलिए वाक्यविन्यास कोड के रूप को संदर्भित करता है, और शब्दार्थ के साथ विपरीत है-अर्थ। कंप्यूटर भाषाओं के प्रसंस्करण में, शब्दार्थ प्रसंस्करण आम तौर पर वाक्यविन्यास प्रसंस्करण के बाद आता है; हालाँकि, कुछ मामलों में, पूर्ण वाक्यविन्यास विश्लेषण के लिए शब्दार्थ प्रसंस्करण आवश्यक है, और ये एक साथ या समवर्ती रूप से किए जाते हैं। एक संकलक में, वाक्यविन्यास विश्लेषण में फ्रंटएंड शामिल होता है, जबकि शब्दार्थ विश्लेषण में बैकएंड (और मध्य छोर, यदि इस चरण को अलग किया जाता है) शामिल होता है। वाक्यविन्यास के स्तर कंप्यूटर भाषा वाक्यविन्यास को आम तौर पर तीन स्तरों में विभाजित किया जाता हैः शब्द-शाब्दिक स्तर, यह निर्धारित करता है कि वर्ण टोकन कैसे बनाते हैं; वाक्यांश-व्याकरण स्तर, संकीर्ण रूप से बोलते हुए, यह निर्धारित करता है कि टोकन वाक्यांश कैसे बनाते हैं; संदर्भ-यह निर्धारित करना कि कौन सी वस्तु या चर नाम संदर्भित करते हैं, यदि प्रकार मान्य हैं, आदि। इस तरह से भेद करने से मॉडुलरिटी प्राप्त होती है, जिससे प्रत्येक स्तर को अलग से और अक्सर स्वतंत्र रूप से वर्णित और संसाधित किया जा सकता है। सबसे पहले, एक लेक्सर वर्णों के रैखिक अनुक्रम को टोकन के रैखिक अनुक्रम में बदल देता है; इसे "शाब्दिक विश्लेषण" या "लेक्सिंग" के रूप में जाना जाता है। दूसरा, पार्सर टोकन के रैखिक अनुक्रम को एक पदानुक्रमित वाक्यविन्यास वृक्ष में बदल देता है; इसे संकीर्ण रूप से "पार्सिंग" के रूप में जाना जाता है। तीसरा, प्रासंगिक विश्लेषण नामों को हल करता है और प्रकारों की जाँच करता है। यह प्रतिरूपण कभी-कभी संभव होता है, लेकिन कई वास्तविक दुनिया की भाषाओं में एक प्रारंभिक चरण बाद के चरण पर निर्भर करता है-उदाहरण के लिए, सी में लेक्सर हैक इसलिए है क्योंकि टोकनाइजेशन संदर्भ पर निर्भर करता है। इन मामलों में भी, वाक्यात्मक विश्लेषण को अक्सर इस आदर्श मॉडल को अनुमानित करने के रूप में देखा जाता है। पार्सिंग चरण को स्वयं दो भागों में विभाजित किया जा सकता हैः पार्स ट्री, या "ठोस वाक्यविन्यास ट्री", जो व्याकरण द्वारा निर्धारित किया जाता है, लेकिन आम तौर पर व्यावहारिक उपयोग के लिए बहुत विस्तृत है, और अमूर्त वाक्यविन्यास ट्री (एएसटी), जो इसे एक उपयोग करने योग्य रूप में सरल बनाता है। ए. एस. टी. और प्रासंगिक विश्लेषण चरणों को शब्दार्थ विश्लेषण का एक रूप माना जा सकता है, क्योंकि वे वाक्यविन्यास में अर्थ और व्याख्या जोड़ रहे हैं, या वैकल्पिक रूप से वाक्यविन्यास नियमों के अनौपचारिक, मैनुअल कार्यान्वयन के रूप में जो औपचारिक रूप से वर्णन करने या लागू करने के लिए कठिन या अजीब होंगे। स्तर आम तौर पर चॉम्स्की पदानुक्रम के स्तरों के अनुरूप होते हैं। शब्द एक नियमित भाषा में होते हैं, जो शाब्दिक व्याकरण में निर्दिष्ट होते हैं, जो एक प्रकार-3 व्याकरण है, जिसे आम तौर पर नियमित अभिव्यक्तियों के रूप में दिया जाता है। वाक्यांश एक संदर्भ-मुक्त भाषा (सी. एफ. एल.) में होते हैं, आम तौर पर एक निर्धारक संदर्भ-मुक्त भाषा (डी. सी. एफ. एल.), जो एक वाक्यांश संरचना व्याकरण में निर्दिष्ट होती है, जो एक प्रकार-2 व्याकरण है, जिसे आम तौर पर बैकस-नौर रूप (बी. एन. एफ.) में उत्पादन नियमों के रूप में दिया जाता है। वाक्यांश व्याकरण को अक्सर पूर्ण संदर्भ-मुक्त व्याकरण की तुलना में बहुत अधिक सीमित व्याकरण में निर्दिष्ट किया जाता है, ताकि उन्हें विश्लेषण करना आसान हो; जबकि एल. आर. पार्सर किसी भी डी. सी. एफ. एल. को रैखिक समय में विश्लेषण कर सकता है, सरल एल. ए. एल. आर. पार्सर और इससे भी सरल एल. एल. पार्सर अधिक कुशल हैं, लेकिन केवल उन व्याकरणों का विश्लेषण कर सकते हैं जिनके उत्पादन नियम बाधित हैं। सिद्धांत रूप में, प्रासंगिक संरचना को एक संदर्भ-संवेदनशील व्याकरण द्वारा वर्णित किया जा सकता है, और विशेषता व्याकरण जैसे माध्यमों द्वारा स्वचालित रूप से विश्लेषण किया जा सकता है, हालांकि, सामान्य रूप से, यह चरण नाम संकल्प नियमों और प्रकार की जाँच के माध्यम से मैन्युअल रूप से किया जाता है, और एक प्रतीक तालिका के माध्यम से लागू किया जाता है जो प्रत्येक दायरे के लिए नाम और प्रकार संग्रहीत करता है। ऐसे उपकरण लिखे गए हैं जो स्वचालित रूप से नियमित अभिव्यक्तियों में लिखे गए एक शाब्दिक विनिर्देश से एक लेक्सर और बी. एन. एफ. में लिखे गए वाक्यांश व्याकरण से एक पार्सर उत्पन्न करते हैंः यह किसी को प्रक्रियात्मक या कार्यात्मक प्रोग्रामिंग की आवश्यकता के बजाय घोषणात्मक प्रोग्रामिंग का उपयोग करने की अनुमति देता है। एक उल्लेखनीय उदाहरण लेक्स-यैक जोड़ी है। ये स्वचालित रूप से एक ठोस वाक्यविन्यास वृक्ष का उत्पादन करते हैं; पार्सर लेखक को तब मैन्युअल रूप से कोड लिखना चाहिए जिसमें वर्णन किया गया हो कि इसे एक अमूर्त वाक्यविन्यास वृक्ष में कैसे परिवर्तित किया जाता है। प्रासंगिक विश्लेषण भी आम तौर पर हाथ से लागू किया जाता है। इन स्वचालित उपकरणों के अस्तित्व के बावजूद, पार्सिंग को अक्सर विभिन्न कारणों से मैन्युअल रूप से लागू किया जाता है-शायद वाक्यांश संरचना संदर्भ-मुक्त नहीं है, या एक वैकल्पिक कार्यान्वयन प्रदर्शन या त्रुटि-रिपोर्टिंग में सुधार करता है, या व्याकरण को अधिक आसानी से बदलने की अनुमति देता है। पार्सर अक्सर कार्यात्मक भाषाओं में लिखे जाते हैं, जैसे कि हास्केल, या स्क्रिप्टिंग भाषाओं में, जैसे कि पायथन या पर्ल, या सी या सी + + में। त्रुटियों के उदाहरण एक उदाहरण के रूप में, (1 1 जोड़ें) एक वाक्यात्मक रूप से मान्य लिस्प प्रोग्राम है (यह मानते हुए कि 'ऐड' फ़ंक्शन मौजूद है, अन्यथा नाम रिज़ॉल्यूशन विफल हो जाता है), 1 और 1 जोड़ते हुए। हालाँकि, निम्नलिखित अमान्य हैंः (_ 1 1) शाब्दिक त्रुटिः '_' मान्य नहीं है (1 1 पार्सिंग त्रुटि जोड़ेंः बंद नहीं हो रहा है ')' लेक्सर पहली त्रुटि की पहचान करने में असमर्थ है-यह केवल इतना जानता है कि, टोकन LEFT _ PAREN उत्पन्न करने के बाद, '(' प्रोग्राम का शेष हिस्सा अमान्य है, क्योंकि कोई शब्द नियम '_' से शुरू नहीं होता है। पार्सिंग चरण में दूसरी त्रुटि का पता चलता हैः पार्सर ने '(' टोकन (एकमात्र मिलान के रूप में) के कारण 'सूची' उत्पादन नियम की पहचान की है, और इस प्रकार एक त्रुटि संदेश दे सकता है; सामान्य रूप से यह अस्पष्ट हो सकता है। टाइप त्रुटियों और अघोषित परिवर्तनीय त्रुटियों को कभी-कभी वाक्यविन्यास त्रुटियां माना जाता है जब वे संकलन-समय पर पाए जाते हैं (जो आमतौर पर दृढ़ता से टाइप की गई भाषाओं को संकलित करते समय होता है), हालांकि इस प्रकार की त्रुटियों को शब्दार्थ त्रुटियों के रूप में वर्गीकृत करना आम बात है। उदाहरण के लिए, पायथन कोड 'ए' + 1 में एक प्रकार की त्रुटि होती है क्योंकि यह एक पूर्णांक शाब्दिक में एक स्ट्रिंग शाब्दिक जोड़ता है। इस तरह की प्रकार त्रुटियों का संकलन-समय पर पता लगाया जा सकता हैः उनका पता पार्सिंग (वाक्यांश विश्लेषण) के दौरान लगाया जा सकता है यदि संकलक अलग-अलग नियमों का उपयोग करता है जो "पूर्णांक-शाब्दिक + पूर्णांक-शाब्दिक" की अनुमति देते हैं लेकिन "स्ट्रिंग-शाब्दिक + पूर्णांक-शाब्दिक" की अनुमति नहीं देते हैं, हालांकि यह अधिक संभावना है कि संकलक एक पार्सिंग नियम का उपयोग करेगा जो "शाब्दिक या सूचक + शाब्दिक या सूचक" रूप के सभी अभिव्यक्तियों की अनुमति देता है और फिर प्रासंगिक विश्लेषण के दौरान त्रुटि का पता लगाया जाएगा (जब प्रकार की जाँच होती है)। कुछ मामलों में यह सत्यापन संकलक द्वारा नहीं किया जाता है, और इन त्रुटियों का पता केवल रनटाइम पर लगाया जाता है। एक गतिशील रूप से टाइप की गई भाषा में, जहां प्रकार को केवल रनटाइम पर निर्धारित किया जा सकता है, कई प्रकार की त्रुटियों का पता केवल रनटाइम पर ही लगाया जा सकता है। उदाहरण के लिए, पायथन कोड a + b वाक्यांश स्तर पर वाक्यात्मक रूप से मान्य है, लेकिन a और b के प्रकारों की शुद्धता केवल रनटाइम पर निर्धारित की जा सकती है, क्योंकि चर में पायथन में प्रकार नहीं होते हैं, केवल मान होते हैं। जबकि इस बारे में असहमति है कि क्या संकलक द्वारा पाई गई एक प्रकार की त्रुटि को वाक्यविन्यास त्रुटि कहा जाना चाहिए (एक स्थिर शब्दार्थ त्रुटि के बजाय), प्रकार की त्रुटियां जो केवल कार्यक्रम निष्पादन समय पर पाई जा सकती हैं, उन्हें हमेशा वाक्यविन्यास त्रुटियों के बजाय शब्दार्थ माना जाता है। वाक्यविन्यास परिभाषा पाठ्य प्रोग्रामिंग भाषाओं के वाक्यविन्यास को आमतौर पर नियमित अभिव्यक्तियों (शाब्दिक संरचना के लिए) और बैकस-नौर रूप (व्याकरणिक संरचना के लिए) के संयोजन का उपयोग करके परिभाषित किया जाता है ताकि वाक्यविन्यास श्रेणियों (गैर-अंतिम) और अंतिम प्रतीकों को प्रेरक रूप से निर्दिष्ट किया जा सके। वाक्यविन्यास श्रेणियों को उत्पादन नामक नियमों द्वारा परिभाषित किया जाता है, जो एक विशेष वाक्यविन्यास श्रेणी से संबंधित मूल्यों को निर्दिष्ट करते हैं। अंतिम प्रतीक ठोस वर्ण या वर्णों के तार होते हैं (उदाहरण के लिए परिभाषित, यदि, दें या शून्य जैसे मुख्य शब्द) जिनसे वाक्यात्मक रूप से वैध कार्यक्रमों का निर्माण किया जाता है। एक भाषा में अलग-अलग समतुल्य व्याकरण हो सकते हैं, जैसे कि समतुल्य नियमित अभिव्यक्तियाँ (शाब्दिक स्तरों पर), या अलग-अलग वाक्यांश नियम जो एक ही भाषा उत्पन्न करते हैं। एल. आर. व्याकरण जैसी व्याकरण की एक व्यापक श्रेणी का उपयोग, एल. एल. व्याकरण जैसी अधिक प्रतिबंधित श्रेणियों की तुलना में छोटे या सरल व्याकरण की अनुमति दे सकता है, जिसके लिए अधिक नियमों के साथ लंबे व्याकरण की आवश्यकता हो सकती है। अलग-अलग लेकिन समतुल्य वाक्यांश व्याकरण अलग-अलग पार्स ट्री उत्पन्न करते हैं, हालांकि अंतर्निहित भाषा (वैध दस्तावेजों का सेट) समान है। उदाहरण के लिएः लिस्प एस-अभिव्यक्तियाँ नीचे एक सरल व्याकरण है, जिसे नियमित अभिव्यक्तियों और विस्तारित बैकस-नौर रूप के संकेतन का उपयोग करके परिभाषित किया गया है। यह एस-अभिव्यक्तियों के वाक्यविन्यास का वर्णन करता है, जो प्रोग्रामिंग भाषा लिस्प का एक डेटा वाक्यविन्यास है, जो वाक्यविन्यास श्रेणियों अभिव्यक्ति, परमाणु, संख्या, प्रतीक और सूची के लिए उत्पादन को परिभाषित करता हैः अभिव्यक्ति = परमाणु। सूची परमाणु = संख्या। प्रतीक संख्या = [+-]? ['0'-'9'] + प्रतीक = ['ए'-'जेड'] ['ए'-'जेड' 0 '-' 9 ']। * सूची = '(', अभिव्यक्ति *, ')' यह व्याकरण निम्नलिखित को निर्दिष्ट करता हैः एक अभिव्यक्ति या तो एक परमाणु या एक सूची है; एक परमाणु या तो एक संख्या या एक प्रतीक है; एक संख्या एक या अधिक दशमलव अंकों का एक अखंड अनुक्रम है, वैकल्पिक रूप से एक प्लस या माइनस चिह्न से पहले; एक प्रतीक एक अक्षर है जिसके बाद किसी भी अक्षर का शून्य या अधिक होता है (व्हाइटस्पेस को छोड़कर); और एक सूची कोष्ठकों की एक मेल खाने वाली जोड़ी है, जिसके अंदर शून्य या अधिक अभिव्यक्तियाँ होती हैं। यहाँ दशमलव अंक, ऊपरी और छोटे अक्षर, और कोष्ठक अंतिम प्रतीक हैं। इस व्याकरण में अच्छी तरह से गठित टोकन अनुक्रमों के उदाहरण निम्नलिखित हैंः '12345', '()', '(ए बी सी 232 (1))' जटिल व्याकरण एक प्रोग्रामिंग भाषा को निर्दिष्ट करने के लिए आवश्यक व्याकरण को चॉम्स्की पदानुक्रम में इसकी स्थिति के आधार पर वर्गीकृत किया जा सकता है। अधिकांश प्रोग्रामिंग भाषाओं के वाक्यांश व्याकरण को टाइप-2 व्याकरण का उपयोग करके निर्दिष्ट किया जा सकता है, यानी वे संदर्भ-मुक्त व्याकरण हैं, हालांकि समग्र वाक्यविन्यास संदर्भ-संवेदनशील है (परिवर्तनीय घोषणाओं और नेस्टेड स्कोप के कारण), इसलिए टाइप-1। हालांकि, अपवाद हैं, और कुछ भाषाओं के लिए वाक्यांश व्याकरण प्रकार-0 (ट्यूरिंग-पूर्ण) है। पर्ल और लिस्प जैसी कुछ भाषाओं में भाषा का विनिर्देश (या कार्यान्वयन) उन निर्माणों की अनुमति देता है जो पार्सिंग चरण के दौरान निष्पादित होते हैं। इसके अलावा, इन भाषाओं में ऐसे निर्माण हैं जो प्रोग्रामर को पार्सर के व्यवहार को बदलने की अनुमति देते हैं। यह संयोजन पार्सिंग और निष्पादन के बीच के अंतर को प्रभावी रूप से धुंधला कर देता है, और इन भाषाओं में वाक्यविन्यास विश्लेषण को एक अनिश्चित समस्या बनाता है, जिसका अर्थ है कि पार्सिंग चरण समाप्त नहीं हो सकता है। उदाहरण के लिए, पर्ल में बी. ई. जी. आई. एन. कथन का उपयोग करके पार्सिंग के दौरान कोड को निष्पादित करना संभव है, और पर्ल फ़ंक्शन प्रोटोटाइप वाक्यविन्यास व्याख्या को बदल सकते हैं, और संभवतः शेष कोड की वाक्यविन्यास वैधता भी। बोलचाल की भाषा में इसे "केवल पर्ल ही पर्ल का विश्लेषण कर सकता है" (क्योंकि कोड को विश्लेषण के दौरान निष्पादित किया जाना चाहिए, और व्याकरण को संशोधित किया जा सकता है), या अधिक दृढ़ता से "यहां तक कि पर्ल भी पर्ल का विश्लेषण नहीं कर सकता" (क्योंकि यह अनिर्णायक है) के रूप में संदर्भित किया जाता है। इसी तरह, डेफमैक्रो वाक्यविन्यास द्वारा शुरू किए गए लिस्प मैक्रोज़ भी पार्सिंग के दौरान निष्पादित होते हैं, जिसका अर्थ है कि एक लिस्प संकलक में एक संपूर्ण लिस्प रन-टाइम सिस्टम मौजूद होना चाहिए। इसके विपरीत, सी मैक्रो केवल स्ट्रिंग प्रतिस्थापन हैं, और इन्हें कोड निष्पादन की आवश्यकता नहीं है। वाक्यविन्यास बनाम शब्दार्थ एक भाषा का वाक्यविन्यास एक वैध कार्यक्रम के रूप का वर्णन करता है, लेकिन कार्यक्रम के अर्थ या उस कार्यक्रम को निष्पादित करने के परिणामों के बारे में कोई जानकारी प्रदान नहीं करता है। प्रतीकों के संयोजन को दिया गया अर्थ शब्दार्थ (या तो औपचारिक या संदर्भ कार्यान्वयन में हार्ड-कोडित) द्वारा नियंत्रित किया जाता है। सभी वाक्यात्मक रूप से सही कार्यक्रम शब्दार्थ की दृष्टि से सही नहीं होते हैं। फिर भी कई वाक्यात्मक रूप से सही कार्यक्रम भाषा के नियमों के अनुसार खराब रूप से बनाए गए हैं और (भाषा विनिर्देश और कार्यान्वयन की दृढ़ता के आधार पर) अनुवाद या निष्पादन में त्रुटि हो सकती है। कुछ मामलों में, ऐसे कार्यक्रम अनिर्धारित व्यवहार प्रदर्शित कर सकते हैं। यहां तक कि जब कोई प्रोग्राम किसी भाषा के भीतर अच्छी तरह से परिभाषित होता है, तब भी इसका एक अर्थ हो सकता है जो इसे लिखने वाले व्यक्ति द्वारा अभिप्रेत नहीं है। एक उदाहरण के रूप में प्राकृतिक भाषा का उपयोग करते हुए, व्याकरणिक रूप से सही वाक्य का अर्थ निर्धारित करना संभव नहीं हो सकता है या वाक्य गलत हो सकता हैः "रंगहीन हरे विचार गुस्से में सोते हैं"। व्याकरणिक रूप से अच्छी तरह से गठित है लेकिन इसका कोई आम तौर पर स्वीकृत अर्थ नहीं है। "जॉन एक विवाहित कुंवारा है।" व्याकरणिक रूप से अच्छी तरह से गठित है लेकिन एक ऐसे अर्थ को व्यक्त करता है जो सच नहीं हो सकता है। निम्नलिखित सी भाषा का टुकड़ा वाक्यात्मक रूप से सही है, लेकिन एक ऐसा ऑपरेशन करता है जो शब्दार्थिक रूप से परिभाषित नहीं है (क्योंकि एक शून्य सूचक है, संचालन और इसका कोई अर्थ नहीं है): जटिल * पी = एन. यू. एल. एल.; जटिल एब्स. पी. = एस. क्यू. आर. टी. (पी-> वास्तविक * पी-> वास्तविक + पी-> आई. एम. * पी-> आई. एम.); एक सरल उदाहरण के रूप में, इंट एक्स; प्रिंट. एफ. ("% डी", एक्स); वाक्यात्मक रूप से मान्य है, लेकिन शब्दार्थिक रूप से परिभाषित नहीं है, क्योंकि यह एक शुरुआत न किए गए चर का उपयोग करता है। भले ही कुछ प्रोग्रामिंग भाषाओं (जैसे, जावा और सी #) के लिए संकलक इस तरह की शुरुआत न की गई परिवर्तनीय त्रुटियों का पता लगाएंगे, लेकिन उन्हें वाक्यविन्यास त्रुटियों के बजाय शब्दार्थ संबंधी त्रुटियों के रूप में माना जाना चाहिए। यह भी देखें नामकरण परंपरा (प्रोग्रामिंग) प्रोग्रामिंग भाषाओं की तुलना (वाक्यविन्यास) विभिन्न प्रोग्रामिंग भाषाओं के वाक्यविन्यास की जल्दी से तुलना करने के लिए, "हैलो, वर्ल्ड!" की सूची पर एक नज़र डालें। प्रोग्राम के उदाहरण हैंः प्रोलॉग वाक्यविन्यास और शब्दार्थ पर्ल वाक्यविन्यास PHP वाक्यविन्यास और शब्दार्थ C वाक्यविन्यास C + + वाक्यविन्यास जावा वाक्यविन्यास जावास्क्रिप्ट वाक्यविन्यास पायथन वाक्यविन्यास और शब्दार्थ लुआ वाक्यविन्यास हास्केल वाक्यविन्यास संदर्भ बाहरी लिंक कंप्यूटर प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले विभिन्न वाक्यविन्यास निर्माण पायथन त्रुटि आयात त्रुटिः "क्यों? कैसे? कमांड-लाइन? [सॉल्व्ड 2021] प्रोग्रामिंग भाषा विषय स्रोत कोड