चूंकि आप सीखना चाहते हैं कि कैसे लेक्सर्स काम करते हैं, तो मुझे लगता है कि आप वास्तव में जानना चाहते हैं कि कैसे लेक्सर जनरेटर काम करते हैं।
एक lexer जनरेटर एक lexical विनिर्देश लेता है, जो नियमों (नियमित-अभिव्यक्ति-टोकन जोड़े) की एक सूची है, और एक lexer उत्पन्न करता है। इसके परिणामस्वरूप लेक्सर इस नियम के अनुसार एक इनपुट (वर्ण) स्ट्रिंग को टोकन स्ट्रिंग में बदल सकता है।
जिस विधि का आमतौर पर सबसे अधिक उपयोग किया जाता है, उसमें एक नियमित अभिव्यक्ति को एक नियत परिमित ऑटोमेटा (DFA) में एक nondeterministic automata (NFA) के माध्यम से परिवर्तित किया जाता है, साथ ही कुछ विवरण भी।
इस परिवर्तन को करने का एक विस्तृत मार्गदर्शिका यहाँ पाया जा सकता है । ध्यान दें कि मैंने इसे स्वयं नहीं पढ़ा है, लेकिन यह काफी अच्छा है। इसके अलावा, कंपाइलर निर्माण पर किसी भी पुस्तक के बारे में पहले कुछ अध्यायों में यह परिवर्तन होगा।
यदि आप विषय पर पाठ्यक्रमों के व्याख्यान स्लाइड में रुचि रखते हैं, तो संकलक निर्माण पर पाठ्यक्रम से उनमें से कोई भी अंतहीन संदेह नहीं है। मेरे विश्वविद्यालय से, आप यहां और यहां ऐसी स्लाइड पा सकते हैं ।
कुछ और चीजें हैं जो आमतौर पर लेक्सर्स में नियोजित नहीं हैं या ग्रंथों में इलाज की जाती हैं, लेकिन फिर भी काफी उपयोगी हैं:
सबसे पहले, यूनिकोड को संभालना कुछ हद तक nontrivial है। समस्या यह है कि एएससीआईआई इनपुट केवल 8 बिट्स चौड़ा है, जिसका अर्थ है कि आप आसानी से डीएफए में हर राज्य के लिए एक संक्रमण तालिका रख सकते हैं, क्योंकि उनके पास केवल 256 प्रविष्टियां हैं। हालाँकि, यूनिकोड, 16 बिट्स चौड़ा (यदि आप UTF-16 का उपयोग करते हैं), तो DFA में प्रत्येक प्रविष्टि के लिए 64k तालिकाओं की आवश्यकता होती है। यदि आपके पास जटिल व्याकरण है, तो यह काफी कुछ जगह लेना शुरू कर सकता है। इन तालिकाओं को भरने में भी काफी समय लगने लगता है।
वैकल्पिक रूप से, आप अंतराल के पेड़ उत्पन्न कर सकते हैं। एक श्रेणी के पेड़ में टुपल्स ('ए', 'जेड'), ('ए', 'जेड') उदाहरण के लिए हो सकते हैं, जो कि पूर्ण तालिका होने की तुलना में बहुत अधिक मेमोरी कुशल है। यदि आप गैर-अतिव्यापी अंतराल बनाए रखते हैं, तो आप इस उद्देश्य के लिए किसी भी संतुलित बाइनरी ट्री का उपयोग कर सकते हैं। चलने का समय बिट्स की संख्या में हर वर्ण के लिए रैखिक होता है, इसलिए यूनिकोड मामले में हे (16)। हालांकि, सबसे अच्छे मामले में, यह आमतौर पर थोड़ा कम होगा।
एक और मुद्दा यह है कि आमतौर पर उत्पन्न होने वाले लेक्सर्स में सबसे खराब स्थिति होती है। हालांकि यह सबसे खराब स्थिति वाला व्यवहार आमतौर पर नहीं देखा जाता है, यह आपको काट सकता है। यदि आप समस्या में भाग लेते हैं और इसे हल करना चाहते हैं, तो यह बताने के लिए कि रैखिक समय कैसे प्राप्त किया जा सकता है, एक कागज यहां पाया जा सकता है ।
आप शायद स्ट्रिंग रूप में नियमित अभिव्यक्तियों का वर्णन करने में सक्षम होना चाहते हैं, क्योंकि वे सामान्य रूप से दिखाई देते हैं। हालांकि, एनएफए (या संभवतः एक पुनरावर्ती मध्यवर्ती संरचना) में इन नियमित अभिव्यक्ति विवरणों को पार्स करना चिकन-अंडे की समस्या का एक सा है। नियमित अभिव्यक्ति विवरण को पार्स करने के लिए, शंटिंग यार्ड एल्गोरिथ्म बहुत उपयुक्त है। लगता है कि विकिपीडिया एल्गोरिथम पर एक व्यापक पृष्ठ है ।