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

From Vigyanwiki
Revision as of 11:51, 16 July 2023 by alpha>Aashvani
सोर्स कोड के तत्वों को पहचानने में प्रोग्रामर की सहायता के लिए अक्सर वाक्य - विन्यास पर प्रकाश डालना और इंडेंट शैली का उपयोग किया जाता है। यह पायथन (प्रोग्रामिंग भाषा) कोड रंग कोडित हाइलाइटिंग का उपयोग करता है।

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

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

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

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

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

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

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

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

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

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

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

(_ 1 1) शाब्दिक त्रुटि: '_' मान्य नहीं है
(1 1 पार्सिंग त्रुटि जोड़ें: समापन गायब है ')'

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

टाइप त्रुटियों और अघोषित परिवर्तनीय त्रुटियों को कभी-कभी सिंटैक्स त्रुटियां माना जाता है जब उन्हें संकलन-समय पर पता लगाया जाता है (जो आमतौर पर दृढ़ता से टाइप की गई भाषाओं को संकलित करते समय होता है), हालांकि इस प्रकार की त्रुटियों को प्रोग्रामिंग भाषा # शब्दार्थ विज्ञान के रूप में वर्गीकृत करना आम है इसके बजाय त्रुटियाँ।[3][4][5] उदाहरण के तौर पर, पायथन कोड

'ए' + 1

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

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

ए + बी

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

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

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 व्याकरण का उपयोग करके निर्दिष्ट किया जा सकता है, यानी, वे संदर्भ-मुक्त व्याकरण हैं,[6] हालाँकि समग्र सिंटैक्स संदर्भ-संवेदनशील है (परिवर्तनीय घोषणाओं और नेस्टेड स्कोप के कारण), इसलिए टाइप-1। हालाँकि, अपवाद हैं, और कुछ भाषाओं के लिए वाक्यांश व्याकरण टाइप-0 (ट्यूरिंग-पूर्ण) है।

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

वाक्य-विन्यास बनाम शब्दार्थ

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

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

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

निम्नलिखित सी भाषा खंड वाक्य रचना की दृष्टि से उचित है, लेकिन ऐसा ऑपरेशन करता है जो शब्दार्थ की दृष्टि से परिभाषित नहीं है (क्योंकि 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);

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

यह भी देखें

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

संदर्भ

  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. Aho, Alfred V.; Monica S. Lam; Ravi Sethi; Jeffrey D. Ullman (2007). Compilers: Principles, Techniques, and Tools (2nd ed.). Addison Wesley. ISBN 0-321-48681-1.Section 4.1.3: Syntax Error Handling, pp.194–195.
  4. Louden, Kenneth C. (1997). Compiler Construction: Principles and Practice. Brooks/Cole. ISBN 981-243-694-4. Exercise 1.3, pp.27–28.
  5. 5.0 5.1 Semantic Errors in Java
  6. Michael Sipser (1997). संगणना के सिद्धांत का परिचय. PWS Publishing. ISBN 0-534-94728-X. Section 2.2: Pushdown Automata, pp.101–114.
  7. The following discussions give examples:
  8. "An Introduction to Common Lisp Macros". Apl.jhu.edu. 1996-02-08. Archived from the original on 2013-08-06. Retrieved 2013-08-17.
  9. "कॉमन लिस्प कुकबुक - मैक्रोज़ और बैककोट". Cl-cookbook.sourceforge.net. 2007-01-16. Retrieved 2013-08-17.
  10. Issue of syntax or semantics?


बाहरी संबंध