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

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

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

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

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

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

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

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

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

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

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

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

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

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

लेक्सर प्रकार त्रुटि की पहचान करने में असमर्थ है - वह केवल इतना जानता है कि, टोकन 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);

वाक्य रचना की दृष्टि से मान्य है, परन्तु शब्दार्थ की दृष्टि से परिभाषित नहीं है, क्योंकि यह अप्रारंभीकृत चर का उपयोग करता है। भले ही कुछ प्रोग्रामिंग भाषाओं (उदाहरण के लिए, जावा और सी#) के कंपाइलर इस प्रकार की अप्रारंभीकृत परिवर्तनीय त्रुटियों का पता लगाएंगे, उन्हें सिंटैक्स त्रुटियों के अतिरिक्त प्रोग्रामिंग भाषा#सिमेंटिक्स त्रुटियों के रूप में माना जाना चाहिए।[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?


बाहरी संबंध