Lexer hack
कंप्यूटर प्रोग्रामिंग में, संदर्भ व्याकरण के संदर्भ-संवेदनशील होने के कारण, ए. एन. एस. आई. सी. को विश्लेषित करने में समस्याओं का एक सामान्य समाधान लेक्सर हैक है। सी में, वर्णों के अनुक्रम को एक चर नाम या एक प्रकार के नाम के रूप में वर्गीकृत करने के लिए वाक्यांश संरचना की प्रासंगिक जानकारी की आवश्यकता होती है, जो किसी को संदर्भ-मुक्त लेक्सर होने से रोकती है। समस्या यह है कि निम्नलिखित कोड में, ए के शाब्दिक वर्ग को आगे की प्रासंगिक जानकारी के बिना निर्धारित नहीं किया जा सकता हैः (ए) * बी यह कोड दो चरों का गुणन हो सकता है, जिस स्थिति में ए एक चर है; स्पष्ट रूप से लिखा गया हैः ए * बी वैकल्पिक रूप से, यह बी के संदर्भित मूल्य को ए प्रकार में डाल सकता है, जिस स्थिति में ए एक टाइपडेफ नाम है; स्पष्ट रूप से लिखा गया हैः (ए) (* बी) अधिक विस्तार से, एक संकलक में, लेक्सर स्रोत कोड को एक प्रोग्राम में परिवर्तित करने के शुरुआती चरणों में से एक का प्रदर्शन करता है। यह शब्दों, संख्याओं और तारों जैसे सार्थक टोकन निकालने के लिए पाठ को स्कैन करता है। पार्सर उन टोकन के अनुक्रमों का विश्लेषण करता है जो उन्हें भाषा संरचनाओं का प्रतिनिधित्व करने वाले वाक्यविन्यास नियमों से मिलान करने का प्रयास करते हैं, जैसे कि लूप और परिवर्तनीय घोषणाएं। यहाँ एक समस्या तब उत्पन्न होती है जब टोकन का एक एकल अनुक्रम अस्पष्ट रूप से एक से अधिक वाक्यविन्यास नियम से मेल खा सकता है। यह अस्पष्टता सी में हो सकती है यदि लेक्सर चर और टाइपडेफ पहचानकर्ताओं के बीच अंतर नहीं करता है। उदाहरण के लिए, सी अभिव्यक्तिः (ए) * बी में लेक्सर को ये टोकन मिल सकते हैंः बाएं कोष्ठक पहचानकर्ता 'ए' दाएं कोष्ठक प्रचालक '*' पहचानकर्ता 'बी' समस्या यह है कि ए के शाब्दिक वर्ग को आगे के संदर्भ के बिना निर्धारित नहीं किया जा सकता हैः पार्सर इसे चर ए को बी से गुणा करने या बी के अनिर्दिष्ट मूल्य को डालने वाले प्रकार ए के रूप में व्याख्या कर सकता है। समस्याग्रस्त उत्पादन नियम के नाम के कारण इसे "टाइपडेफ-नाम-पहचानकर्ता" समस्या के रूप में जाना जाता है। हैक समाधान समाधान में आम तौर पर शब्दार्थ प्रतीक तालिका से जानकारी को वापस लेक्सर में फीड करना शामिल होता है। अर्थात्, लेक्सर से पार्सर तक एक शुद्ध एकतरफा पाइपलाइन के रूप में काम करने के बजाय, शब्दार्थ विश्लेषण से लेक्सर तक एक बैक चैनल है। पार्सिंग और शब्दार्थ विश्लेषण के इस मिश्रण को आम तौर पर अपरिवर्तनीय माना जाता है, यही कारण है कि इसे "हैक" कहा जाता है। अतिरिक्त संदर्भ के बिना, लेक्सर अन्य पहचानकर्ताओं से प्रकार पहचानकर्ताओं को अलग नहीं कर सकता है क्योंकि सभी पहचानकर्ताओं का प्रारूप समान होता है। उपरोक्त उदाहरण में हैक के साथ, जब लेक्सर को पहचानकर्ता ए मिलता है तो उसे टोकन को एक प्रकार पहचानकर्ता के रूप में वर्गीकृत करने में सक्षम होना चाहिए। भाषा के नियमों को यह निर्दिष्ट करके स्पष्ट किया जाएगा कि टाइपकास्ट के लिए एक प्रकार पहचानकर्ता की आवश्यकता होती है और अस्पष्टता गायब हो जाती है। समस्या सी + + में भी मौजूद है और पार्सर उसी हैक का उपयोग कर सकते हैं। वैकल्पिक समाधान लेक्सेरलेस पार्सिंग तकनीकों का उपयोग करते समय यह समस्या उत्पन्न नहीं होती है (और इसलिए इसे हल करने के लिए किसी "हैक" की आवश्यकता नहीं है), क्योंकि ये आंतरिक रूप से प्रासंगिक हैं। हालाँकि, इन्हें आम तौर पर कम सुरुचिपूर्ण डिज़ाइनों के रूप में देखा जाता है, क्योंकि उनमें पाइपलाइन में समवर्ती लेक्सर और पार्सर होने की मॉडुलरिटी की कमी होती है। कुछ पार्सर जनरेटर, जैसे कि बाईएसी-व्युत्पन्न बीटीवाईएसी ("बैकट्रैकिंग यैक"), उत्पन्न पार्सर को टोकन को पार्स करने के लिए कई प्रयासों का प्रयास करने की क्षमता देते हैं। यहाँ वर्णित समस्या में, यदि पहचानकर्ता के बारे में शब्दार्थ जानकारी के कारण कोई प्रयास विफल हो जाता है, तो वह पीछे हट सकता है और अन्य नियमों का प्रयास कर सकता है। क्लैंग पार्सर स्थिति को पूरी तरह से अलग तरीके से संभालता है, अर्थात् एक गैर-संदर्भ शाब्दिक व्याकरण का उपयोग करके। क्लैंग का लेक्सर प्रकार के नामों और चर नामों के बीच अंतर करने का प्रयास नहीं करता हैः यह केवल वर्तमान टोकन को एक पहचानकर्ता के रूप में रिपोर्ट करता है। पार्सर तब पहचानकर्ता की प्रकृति निर्धारित करने के लिए क्लैंग के शब्दार्थ विश्लेषण पुस्तकालय का उपयोग करता है। यह चिंताओं के बहुत अधिक स्वच्छ पृथक्करण और लेक्सर और पार्सर के कैप्सूलेशन की अनुमति देता है, और इसलिए कुछ संकलक डेवलपर्स द्वारा द लेक्सर हैक की तुलना में बहुत अधिक सुरुचिपूर्ण समाधान माना जाता है। यह अधिकांश अन्य आधुनिक भाषाओं में भी उपयोग किया जाने वाला दृष्टिकोण है, जो शाब्दिक व्याकरण में पहचानकर्ताओं के विभिन्न वर्गों को अलग नहीं करते हैं, बल्कि पर्याप्त जानकारी उपलब्ध होने पर उन्हें पार्सिंग या शब्दार्थ विश्लेषण चरण में टाल देते हैं। डेंगलिंग एल्स संदर्भ उद्धरण भी देखें http://www.cs.berkeley.edu ~ smcpeak/elkhound/आकर/एलखाउंड/सूचकांक. एच. टी. एम. एल. http://cs.nyu.edu/rgrimm/papers/pldi06.pdf http://cens.ioc.ee/local/man/CompaqCompilers/ladebug/ladebug-manual-details.html DOI.org http://groups.google.com/group/comp.compilers/browse_frm/thread/db7f68e9d8b49002/fa20bf5de9c73472?lnk=st&q=%2B%22the + lexer + hack% 22 & rnum = 1 और एच. एल. = en#fa20bf5de9c73472 सी (प्रोग्रामिंग भाषा) सी + + पार्सिंग लेख उदाहरण सी कोड के साथ