शाब्दिक विश्लेषण

From alpha
Jump to navigation Jump to search

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

अनुप्रयोग

एक लेक्सर आधुनिक प्रसंस्करण में एक कंपाइलर फ्रंटेंड का पहला चरण बनाता है। विश्लेषण आम तौर पर एक पास में होता है।

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

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

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

प्राकृतिक भाषा प्रसंस्करण में लेक्सिकल विश्लेषण भी एक महत्वपूर्ण प्रारंभिक चरण है, जहां पाठ या ध्वनि तरंगों को शब्दों और अन्य इकाइयों में विभाजित किया जाता है। इसके लिए विभिन्न प्रकार के निर्णयों की आवश्यकता होती है जो पूरी तरह से मानकीकृत नहीं हैं, और टोकन सिस्टम की संख्या 1/2, कुर्सी की, नहीं हो सकती, और/या, 1/1/2010, 2x4, ..., जैसे तारों के लिए भिन्न होती है। और बहुत सारे। यह प्रोग्रामिंग और समान भाषाओं के लिए शाब्दिक विश्लेषण के विपरीत है जहां सटीक नियम आमतौर पर परिभाषित और ज्ञात होते हैं।

शब्दिम

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

टोकन

एक लेक्सिकल टोकन या केवल टोकन एक स्ट्रिंग (कंप्यूटर साइंस) है जिसमें एक असाइन किया गया है और इस प्रकार पहचाना गया अर्थ है। यह एक जोड़ी के रूप में संरचित है जिसमें एक टोकन नाम और एक वैकल्पिक टोकन मान होता है। टोकन नाम शाब्दिक इकाई की एक श्रेणी है।[2]सामान्य टोकन नाम हैं

  • पहचानकर्ता (कंप्यूटर भाषाएँ): प्रोग्रामर द्वारा चुने गए नाम;
  • आरक्षित शब्द: प्रोग्रामिंग भाषा में पहले से ही नाम;
  • सीमांकक (विराम चिह्नक के रूप में भी जाना जाता है): विराम चिह्न वर्ण और युग्मित-सीमांकक;
  • ऑपरेटर (कंप्यूटर प्रोग्रामिंग): प्रतीक जो तर्कों पर काम करते हैं और परिणाम उत्पन्न करते हैं;
  • शाब्दिक (कंप्यूटर प्रोग्रामिंग): संख्यात्मक, तार्किक, शाब्दिक, संदर्भ शाब्दिक;
  • टिप्पणी (कंप्यूटर प्रोग्रामिंग): लाइन, ब्लॉक (कंपाइलर पर निर्भर करता है अगर कंपाइलर टिप्पणियों को टोकन के रूप में लागू करता है अन्यथा इसे छीन लिया जाएगा)।
Examples of token values
Token name Sample token values
identifier x, color, UP
keyword if, while, return
separator }, (, ;
operator +, <, =
literal true, 6.02e23, "music"
comment /* Retrieves user data */, // must be negative

सी (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में इस अभिव्यक्ति पर विचार करें:

x = a + b * 2;

इस अभिव्यक्ति का व्याख्यात्मक विश्लेषण टोकन के निम्नलिखित अनुक्रम उत्पन्न करता है:

[(identifier, x), (operator, =), (identifier, a), (operator, +), (identifier, b), (operator, *), (literal, 2), (separator, ;)]

एक सांकेतिक नाम वह है जिसे भाषाविज्ञान में भाषण का एक हिस्सा कहा जा सकता है।

शाब्दिक व्याकरण

एक प्रोग्रामिंग भाषा के विनिर्देश में अक्सर नियमों का एक सेट शामिल होता है, लेक्सिकल व्याकरण, जो लेक्सिकल सिंटैक्स को परिभाषित करता है। लेक्सिकल सिंटैक्स आमतौर पर एक नियमित भाषा होती है, जिसमें व्याकरण के नियम नियमित अभिव्यक्ति होते हैं; वे टोकन के संभावित वर्ण अनुक्रमों (लेक्सेमेस) के सेट को परिभाषित करते हैं। एक लेक्सर स्ट्रिंग्स को पहचानता है, और प्रत्येक प्रकार की स्ट्रिंग के लिए लेक्सिकल प्रोग्राम एक क्रिया करता है, जो कि केवल एक टोकन का उत्पादन करता है।

व्हॉट्सएप कैरेक्टर और कमेंट (कंप्यूटर प्रोग्रामिंग) दो महत्वपूर्ण सामान्य शाब्दिक श्रेणियां हैं। इन्हें व्याकरण में भी परिभाषित किया गया है और लेक्सर द्वारा संसाधित किया गया है, लेकिन इसे छोड़ दिया जा सकता है (किसी भी टोकन का उत्पादन नहीं) और गैर-महत्वपूर्ण माना जाता है, अधिकतम दो टोकन को अलग करना (जैसा कि if x के बजाय ifx). इसके दो महत्वपूर्ण अपवाद हैं। सबसे पहले, ऑफ़-साइड नियम भाषाओं में जो इंडेंटिंग के साथ ब्लॉक (प्रोग्रामिंग) का परिसीमन करते हैं, प्रारंभिक व्हाइटस्पेस महत्वपूर्ण है, क्योंकि यह ब्लॉक संरचना को निर्धारित करता है, और आमतौर पर लेक्सर स्तर पर नियंत्रित किया जाता है; नीचे #वाक्यांश संरचना देखें। दूसरे, लेक्सर्स के कुछ उपयोगों में, टिप्पणियों और व्हाट्सएप को संरक्षित किया जाना चाहिए - उदाहरण के लिए, एक सुंदरप्रिंटर को भी टिप्पणियों को आउटपुट करने की आवश्यकता होती है और कुछ डिबगिंग टूल मूल स्रोत कोड दिखाते हुए प्रोग्रामर को संदेश प्रदान कर सकते हैं। 1960 के दशक में, विशेष रूप से ALGOL के लिए, लाइन पुनर्निर्माण चरण (कंपाइलर फ्रंटेंड का प्रारंभिक चरण) के हिस्से के रूप में व्हाइटस्पेस और टिप्पणियों को समाप्त कर दिया गया था, लेकिन यह अलग चरण समाप्त कर दिया गया है और अब इन्हें लेक्सर द्वारा नियंत्रित किया जाता है।

टोकनकरण

टोकनाइजेशन इनपुट वर्णों की एक स्ट्रिंग के सीमांकन और संभावित रूप से वर्गीकृत करने की प्रक्रिया है। परिणामी टोकन को फिर प्रसंस्करण के किसी अन्य रूप में भेज दिया जाता है। प्रक्रिया को पार्सिंग इनपुट का उप-कार्य माना जा सकता है।

उदाहरण के लिए, पाठ स्ट्रिंग (कंप्यूटर विज्ञान) में:

The quick brown fox jumps over the lazy dog

स्ट्रिंग को रिक्त स्थान पर स्पष्ट रूप से खंडित नहीं किया गया है, जैसा कि एक प्राकृतिक भाषा बोलने वाला करेगा। अपरिष्कृत इनपुट, 43 वर्ण, स्पष्ट रूप से 9 टोकनों में दिए गए स्थान सीमांकक के साथ विभाजित होना चाहिए (अर्थात, स्ट्रिंग से मेल खाते हुए) " " या नियमित अभिव्यक्ति /\s{1}/).

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

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

टोकन को अक्सर चरित्र सामग्री या डेटा स्ट्रीम के संदर्भ में वर्गीकृत किया जाता है। श्रेणियों को लेक्सर के नियमों द्वारा परिभाषित किया गया है। श्रेणियों में अक्सर डेटा स्ट्रीम में उपयोग की जाने वाली भाषा के व्याकरण के तत्व शामिल होते हैं। प्रोग्रामिंग लैंग्वेज अक्सर टोकन को आइडेंटिफायर, ऑपरेटर्स, ग्रुपिंग सिंबल या डेटा टाइप के रूप में वर्गीकृत करती हैं। लिखित भाषाएं आमतौर पर टोकन को संज्ञा, क्रिया, विशेषण या विराम चिह्न के रूप में वर्गीकृत करती हैं। श्रेणियों का उपयोग या तो पार्सर द्वारा या कार्यक्रम में अन्य कार्यों द्वारा टोकन के पोस्ट-प्रोसेसिंग के लिए किया जाता है।

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

जब एक लेक्सर पार्सर को टोकन खिलाता है, तो इस्तेमाल किया जाने वाला प्रतिनिधित्व आम तौर पर संख्या प्रस्तुतियों की एक गणना सूची है। उदाहरण के लिए, आइडेंटिफ़ायर को 0, असाइनमेंट ऑपरेटर को 1, एडिशन ऑपरेटर को 2, आदि के साथ दर्शाया गया है।

टोकन को अक्सर नियमित अभिव्यक्ति द्वारा परिभाषित किया जाता है, जिसे लेक्सिकल एनालाइज़र जनरेटर जैसे लेक्स (सॉफ्टवेयर) द्वारा समझा जाता है। लेक्सिकल एनालाइज़र (लेक्स, या हैंड-क्राफ्टेड जैसे टूल द्वारा स्वचालित रूप से उत्पन्न) वर्णों की एक धारा में पढ़ता है, स्ट्रीम में #Lexeme की पहचान करता है, और उन्हें टोकन में वर्गीकृत करता है। इसे टोकनिंग कहा जाता है। यदि लेक्सर को एक अमान्य टोकन मिलता है, तो यह एक त्रुटि रिपोर्ट करेगा।

निम्नलिखित टोकनिंग पार्सिंग है। वहां से, व्याख्या किए गए डेटा को सामान्य उपयोग, व्याख्या या संकलन के लिए डेटा संरचनाओं में लोड किया जा सकता है।

स्कैनर

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

मूल्यांकनकर्ता

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

उदाहरण के लिए, एक कंप्यूटर प्रोग्राम के सोर्स कोड में, string

net_worth_future = (assets liabilities);

निम्नलिखित लेक्सिकल टोकन स्ट्रीम में परिवर्तित किया जा सकता है; व्हाइटस्पेस दबा दिया गया है और विशेष वर्णों का कोई मूल्य नहीं है:

पहचानकर्ता net_worth_future
के बराबर होती है
OPEN_PARENTHESIS
पहचानकर्ता संपत्ति
ऋण
पहचानकर्ता देनदारियों
CLOSE_PARENTHESIS
सेमीकोलन

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

रेगुलर एक्सप्रेशन कॉम्पैक्ट रूप से उन पैटर्न का प्रतिनिधित्व करते हैं जो लेक्सेम के वर्ण अनुसरण कर सकते हैं। उदाहरण के लिए, एक अंग्रेजी भाषा-आधारित भाषा के लिए, एक IDENTIFIER टोकन कोई भी अंग्रेजी वर्णमाला वर्ण या एक अंडरस्कोर हो सकता है, जिसके बाद ASCII अल्फ़ान्यूमेरिक वर्णों और/या अंडरस्कोर की संख्या हो सकती है। यह स्ट्रिंग द्वारा कॉम्पैक्ट रूप से प्रदर्शित किया जा सकता है [a-zA-Z_][a-zA-Z_0-9]*. इसका अर्थ है कोई भी वर्ण a-z, A-Z या _, जिसके बाद 0 या अधिक a-z, A-Z, _ या 0-9 हो।

रेगुलर एक्सप्रेशंस और उनके द्वारा उत्पन्न परिमित-राज्य मशीनें पुनरावर्ती पैटर्न को संभालने के लिए पर्याप्त शक्तिशाली नहीं हैं, जैसे कि n प्रारंभिक कोष्ठक, उसके बाद एक कथन, उसके बाद n समापन कोष्ठक। वे गणना करने में असमर्थ हैं, और सत्यापित करते हैं कि n दोनों तरफ समान है, जब तक कि n के लिए अनुमेय मानों का एक परिमित सेट मौजूद न हो। इस तरह के पैटर्न को उनकी पूर्ण व्यापकता में पहचानने के लिए एक पूर्ण पार्सर की आवश्यकता होती है। एक पार्सर स्टैक पर कोष्ठकों को धकेल सकता है और फिर उन्हें पॉप ऑफ करने का प्रयास कर सकता है और देख सकता है कि क्या स्टैक अंत में खाली है (उदाहरण देखें)[5] कंप्यूटर प्रोग्राम पुस्तक की संरचना और व्याख्या में)।

बाधाएँ

आमतौर पर, शब्द स्तर पर टोकननाइजेशन होता है। हालांकि, कभी-कभी यह परिभाषित करना मुश्किल होता है कि किसी शब्द का क्या अर्थ है। अक्सर एक टोकननाइज़र सरल अनुमानों पर निर्भर करता है, उदाहरण के लिए:

  • विराम चिह्न और रिक्त स्थान टोकन की परिणामी सूची में शामिल हो भी सकते हैं और नहीं भी।
  • वर्णानुक्रम वर्णों के सभी सन्निहित तार एक टोकन का हिस्सा हैं; इसी तरह संख्याओं के साथ।
  • टोकन खाली स्थान के वर्ण वर्णों द्वारा अलग किए जाते हैं, जैसे कि रिक्ति या पंक्ति विराम, या विराम चिह्न वर्ण।

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

स्क्रिप्टियो कॉन्टुआ में लिखी गई भाषाओं के लिए टोकनाइजेशन विशेष रूप से कठिन है, जो कि प्राचीन ग्रीक, चीनी भाषा, जैसे कोई शब्द सीमा नहीं प्रदर्शित करता है।[6] या थाई भाषा। मिश्रित भाषाएँ, जैसे कि कोरियाई, भी टोकननाइज़ेशन कार्यों को जटिल बनाती हैं।

अधिक कठिन समस्याओं को हल करने के कुछ तरीकों में अधिक जटिल अनुमानों को विकसित करना, सामान्य विशेष-मामलों की एक तालिका को क्वेरी करना, या टोकन को एक भाषा मॉडल में फ़िट करना शामिल है जो बाद के प्रसंस्करण चरण में कोलोकेशन की पहचान करता है।

लेक्सर जनरेटर

लेक्सर्स अक्सर एक लेक्सर जनरेटर द्वारा उत्पन्न होते हैं, पार्सर जनरेटर के अनुरूप होते हैं, और ऐसे उपकरण अक्सर एक साथ आते हैं। सबसे स्थापित लेक्स (सॉफ़्टवेयर) है, जिसे याक पार्सर जनरेटर के साथ जोड़ा जाता है, या बल्कि उनके कई पुनर्कार्यान्वयनों में से कुछ, जैसे फ्लेक्स (लेक्सिकल एनालाइज़र जनरेटर) (अक्सर जीएनयू बाइसन के साथ जोड़ा जाता है)। ये जनरेटर डोमेन-विशिष्ट भाषा का एक रूप हैं, जो एक व्याख्यात्मक विनिर्देश लेते हैं - आम तौर पर कुछ मार्कअप के साथ नियमित अभिव्यक्ति - और एक लेक्सर उत्सर्जित करते हैं।

ये उपकरण बहुत तेजी से विकास करते हैं, जो शुरुआती विकास में बहुत महत्वपूर्ण है, दोनों एक कामकाजी लेक्सर प्राप्त करने के लिए और क्योंकि एक भाषा विनिर्देश अक्सर बदल सकता है। इसके अलावा, वे अक्सर उन्नत सुविधाएँ प्रदान करते हैं, जैसे कि पूर्व और बाद की स्थितियाँ जिन्हें हाथ से प्रोग्राम करना कठिन होता है। हालाँकि, स्वचालित रूप से उत्पन्न लेक्सर में लचीलेपन की कमी हो सकती है, और इस प्रकार कुछ मैन्युअल संशोधन, या सभी मैन्युअल रूप से लिखित लेक्सर की आवश्यकता हो सकती है।

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

वाक्यांश संरचना

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

लाइन निरंतरता

लाइन निरंतरता कुछ भाषाओं की एक विशेषता है जहां एक नई लाइन आमतौर पर एक स्टेटमेंट टर्मिनेटर होती है। अक्सर, एक बैकस्लैश के साथ एक पंक्ति को समाप्त करना (तुरंत एक नई पंक्ति के बाद) परिणाम जारी रहता है - निम्न पंक्ति पूर्व पंक्ति में शामिल हो जाती है। यह आमतौर पर लेक्सर में किया जाता है: बैकस्लैश और न्यूलाइन को छोड़ दिया जाता है, न कि न्यूलाइन को टोकन किया जाता है। उदाहरणों में बैश (यूनिक्स शेल) शामिल हैं,[8] अन्य शेल स्क्रिप्ट और Python.[9]


अर्धविराम सम्मिलन

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

अर्धविराम सम्मिलन बीसीपीएल और उसके दूर के वंशज गो (प्रोग्रामिंग भाषा) की एक विशेषता है,[10] हालांकि यह बी या सी में अनुपस्थित है।[11] अर्धविराम प्रविष्टि जावास्क्रिप्ट में मौजूद है, हालांकि नियम कुछ जटिल और बहुत आलोचनात्मक हैं; बग से बचने के लिए, कुछ हमेशा अर्धविरामों का उपयोग करने की सलाह देते हैं, जबकि अन्य प्रारंभिक अर्धविरामों का उपयोग करते हैं, जिन्हें रक्षात्मक अर्धविराम कहा जाता है, संभावित अस्पष्ट बयानों की शुरुआत में।

अर्धविराम सम्मिलन (अर्धविराम-समाप्त कथनों वाली भाषाओं में) और रेखा निरंतरता (नई पंक्ति-समाप्त कथनों वाली भाषाओं में) को पूरक के रूप में देखा जा सकता है: अर्धविराम सम्मिलन एक टोकन जोड़ता है, भले ही नई पंक्तियाँ आमतौर पर टोकन उत्पन्न नहीं करती हैं, जबकि पंक्ति निरंतरता एक टोकन को रोकती है उत्पन्न होने से, भले ही न्यूलाइन आमतौर पर टोकन उत्पन्न करती हैं।

ऑफ़-साइड नियम

ऑफ-साइड नियम (इंडेंटिंग द्वारा निर्धारित ब्लॉक) को लेक्सर में कार्यान्वित किया जा सकता है, जैसे कि पायथन (प्रोग्रामिंग लैंग्वेज) में, जहां इंडेंटिंग परिणाम को बढ़ाने से लेक्सर में इंडेंट टोकन का उत्सर्जन होता है, और लेक्सर में इंडेंटिंग परिणाम घटते हैं, जो डिडेंट का उत्सर्जन करते हैं। टोकन।[12]ये टोकन ओपनिंग ब्रेस के अनुरूप हैं { और समापन ब्रेस } उन भाषाओं में जो ब्लॉक के लिए ब्रेसिज़ का उपयोग करती हैं, और इसका अर्थ है कि वाक्यांश व्याकरण इस बात पर निर्भर नहीं करता है कि ब्रेसिज़ या इंडेंटिंग का उपयोग किया जाता है या नहीं। इसके लिए आवश्यक है कि लेक्सर होल्ड स्टेट, अर्थात् वर्तमान इंडेंट स्तर, और इस प्रकार यह परिवर्तन होने पर इंडेंटिंग में परिवर्तन का पता लगा सकता है, और इस प्रकार लेक्सिकल व्याकरण संदर्भ-मुक्त व्याकरण नहीं है। संदर्भ-मुक्त: इंडेंट-डिडेंट की प्रासंगिक जानकारी पर निर्भर करता है। पूर्व इंडेंट स्तर।

संदर्भ-संवेदनशील लेक्सिंग

आम तौर पर लेक्सिकल व्याकरण संदर्भ-मुक्त होते हैं, या लगभग इतने ही होते हैं, और इस प्रकार पीछे या आगे देखने या बैकट्रैकिंग की आवश्यकता नहीं होती है, जो एक सरल, स्वच्छ और कुशल कार्यान्वयन की अनुमति देता है। यह लेक्सर से पार्सर तक सरल एकतरफा संचार की अनुमति देता है, बिना किसी जानकारी के लेक्सर में वापस जाने की आवश्यकता होती है।

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

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

यह भी देखें

  • पार्सर जनरेटर की सूची

संदर्भ

  1. "एक कंपाइलर और टोकननाइज़र का एनाटॉमी". www.cs.man.ac.uk.
  2. 2.0 2.1 page 111, "Compilers Principles, Techniques, & Tools, 2nd Ed." (WorldCat) by Aho, Lam, Sethi and Ullman, as quoted in https://stackoverflow.com/questions/14954721/what-is-the-difference-between-token-and-lexeme
  3. Perl 5 Porters. "Perlinterp: पर्ल 5 संस्करण 24.0 प्रलेखन". perldoc.perl.org – Official documentation for the Perl programming language. perldoc.perl.org. Retrieved 26 January 2017.
  4. Guy Coder (19 February 2013). "टोकन और लेक्सेम में क्या अंतर है?". Stack Overflow. Stack Exchange Inc. Retrieved 26 January 2017.
  5. "कंप्यूटर प्रोग्राम की संरचना और व्याख्या". mitpress.mit.edu. Archived from the original on 2012-10-30. Retrieved 2009-03-07.
  6. Huang, C., Simon, P., Hsieh, S., & Prevot, L. (2007) Rethinking Chinese Word Segmentation: Tokenization, Character Classification, or Word break Identification
  7. Bumbulis, P.; Cowan, D. D. (Mar–Dec 1993). "RE2C: एक अधिक बहुमुखी स्कैनर जनरेटर". ACM Letters on Programming Languages and Systems. 2 (1–4): 70–84. doi:10.1145/176454.176487. S2CID 14814637.
  8. Bash Reference Manual, 3.1.2.1 Escape Character
  9. "3.6.4 दस्तावेज़ीकरण". docs.python.org.
  10. Effective Go, "Semicolons"
  11. "Semicolons in Go", golang-nuts, Rob 'Commander' Pike, 12/10/09
  12. 12.0 12.1 Cite error: Invalid <ref> tag; no text was provided for refs named 3.6.4 Documentation



स्रोत

  • सी # और जावा, पैट टेरी, 2005 के साथ संकलन, ISBN 032126360X
  • एल्गोरिदम + डेटा संरचनाएं = कार्यक्रम, निकलॉस विर्थ, 1975, ISBN 0-13-022418-9
  • संकलक निर्माण, निकलॉस विर्थ, 1996, ISBN 0-201-40353-6
  • सेबेस्टा, आर. डब्ल्यू. (2006)। प्रोग्रामिंग भाषाओं की अवधारणा (सातवां संस्करण) पीपी। 177। बोस्टन: पियर्सन/एडिसन-वेस्ले।


इस पेज में लापता आंतरिक लिंक की सूची

बाहरी कड़ियाँ

श्रेणी:संकलक निर्माण श्रेणी: प्रोग्रामिंग भाषा कार्यान्वयन श्रेणी:पार्सिंग