एक "tokenizer", "parser" और "lexers" क्या हैं की स्पष्ट परिभाषा के लिए देख रहे हैं और वे कैसे एक दूसरे से संबंधित हैं और उपयोग किया जाता है?


151

मैं एक "tokenizer", "parser" और "lexer" क्या हैं और वे एक-दूसरे से कैसे संबंधित हैं (जैसे, क्या parser एक tokenizer या इसके विपरीत का उपयोग करता है) की स्पष्ट परिभाषा के लिए देख रहा हूँ? मुझे डाटा डिक्लेरेशन और परिभाषाएँ निकालने के लिए c / h स्रोत फ़ाइलों के माध्यम से एक प्रोग्राम बनाना होगा।

मैं उदाहरणों की तलाश में हूं और कुछ जानकारी पा सकता हूं, लेकिन मैं वास्तव में व्याकरण नियमों, पार्स पेड़ों और अमूर्त सिंटैक्स ट्री जैसी अंतर्निहित अवधारणाओं को समझने के लिए संघर्ष कर रहा हूं और वे एक दूसरे से कैसे संबंधित हैं। आखिरकार इन अवधारणाओं को एक वास्तविक कार्यक्रम में संग्रहीत करने की आवश्यकता होती है, लेकिन 1) वे क्या दिखते हैं, 2) आम कार्यान्वयन हैं।

मैं इन विषयों और कार्यक्रमों जैसे कि लेक्स और याक पर विकिपीडिया को देख रहा हूं, लेकिन एक कंपाइलर क्लास (ईई मेजर) के माध्यम से कभी नहीं गया था, मुझे पूरी तरह से समझना मुश्किल हो रहा है कि क्या चल रहा है।

जवाबों:


166

एक टोकन टोकन में पाठ की एक धारा को तोड़ता है, आमतौर पर व्हाट्सएप (टैब, स्पेस, नई लाइनें) की तलाश में।

एक लेसर मूल रूप से एक टोकन है, लेकिन यह आमतौर पर टोकन के लिए अतिरिक्त संदर्भ देता है - यह टोकन एक संख्या है, यह टोकन एक स्ट्रिंग शाब्दिक है, यह अन्य टोकन एक समानता ऑपरेटर है।

एक पार्सर लेक्सर से टोकन की धारा लेता है और मूल पाठ द्वारा प्रस्तुत (आमतौर पर) कार्यक्रम का प्रतिनिधित्व करने वाले एक सार वाक्यविन्यास पेड़ में बदल जाता है।

अंतिम बार मैंने जाँच की, इस विषय पर सबसे अच्छी पुस्तक "कम्पाइलर: सिद्धांत, तकनीक और उपकरण" थी, जिसे आमतौर पर "द ड्रैगन" के रूप में जाना जाता है।


8
इसमें कोई शक नहीं कि "द ड्रैगन बुक" एक अच्छी किताब है, लेकिन इसके लिए पाठक को सीएस में अच्छी ग्राउंडिंग की आवश्यकता होती है। अधिक व्यावहारिक अपील वाली कुछ पुस्तक रोनाल्ड मैक द्वारा "राइटिंग कंपाइलर्स एंड इंटरप्रिटर्स", "मॉडर्न कम्पाइलर इम्प्लीमेंटेशन", एंड्रयू एपेल होगी; "कंपाइलर कंस्ट्रक्शन", निकलस विर्थ; "सी # और जावा के साथ संकलन" और "कंपाइलर और कंपाइलर जेनरेटर: पैट टेरी द्वारा एक परिचय सी ++"; और निश्चित रूप से, टेरेंस पर्र द्वारा "द डेफिनिटिव एएनटीएलआर संदर्भ"।
आंद्रे आर्टस

5
बस यह सुनिश्चित करने के लिए, मैं आपकी सिफारिश नहीं कर रहा हूं। संकलक तकनीक पर "द ड्रैगन बुक" मेरी पहली पुस्तक थी, लेकिन यह कहना मुश्किल था, कहते हैं, Wirth की पुस्तक, जो एक ऐसी पुस्तक है जिसे आप कुछ घंटों में पचा सकते हैं। इसके बाद मेरे पास कुछ विकल्प थे क्योंकि यह एकमात्र पुस्तक थी जिस पर मैं अपना हाथ पा सकता था (यह 1991 से पहले, अमेज़ॅन और डब्ल्यूडब्ल्यूडब्ल्यू से पहले)। मेरे पास जैक डब्ल्यू। क्रेंशॉ द्वारा निर्मित पाठ फ़ाइलों का एक संग्रह था, जिसे "LET'S BUILD A COMPILER" (धन्यवाद जैक!) कहा जाता है। यह अभी भी सिद्धांतों की पूरी समझ के लिए प्राप्त करने के लिए पुस्तक है, लेकिन अधिकांश प्रोग्रामर को केवल व्यावहारिक परिचय की आवश्यकता है।
आंद्रे आर्टस

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

2
"चलो एक संकलक बनाएँ" यहाँ है: compilers.iecc.com/crenshaw । मुझे यहाँ से लिंक मिला: prog21.dadgum.com/30.html
रोजर लिप्सकॉम्ब

1
@Pithkos: यदि वे एकमात्र बाधाएं हैं, तो आपने कहा है कि फ़ंक्शन एक अनाम (गणितीय) डोमेन में एक इनपुट लेता है और किसी अन्य अनाम डोमेन, जैसे, एफ (एक्स) में उत्पादन और उत्पादन करता है -> Y बहुत ज्यादा इसका मतलब है आप इसे केवल एक "फ़ंक्शन" कह सकते हैं। यदि आप जोर देकर कहते हैं कि X का डोमेन <StreamOfCharacter, Grammar> है और Y का डोमेन इस प्रॉपर्टी के साथ ट्री है कि यह व्याकरण के आकार को दर्शाता है, तो F (X, G) -> T कुछ ऐसा होगा जिसे मैं कॉल करूंगा पार्सर। अक्सर हम G के संबंध में F की करी करते हैं क्योंकि G अक्सर बदलता नहीं है, इसलिए F [G] (X) -> T वह है जिसे आप आमतौर पर एक पार्सर के रूप में देखते हैं।
इरा बैक्सटर

18

उदाहरण:

int x = 1;

एक लेसर या टोकनर टोकन को 'int', 'x', '=', '1', ';' में विभाजित करेगा।

एक पार्सर उन टोकन को ले जाएगा और उन्हें किसी तरह समझने के लिए उपयोग करेगा:

  • हमारे पास एक बयान है
  • यह एक पूर्णांक की परिभाषा है
  • पूर्णांक को 'x' कहा जाता है
  • 'x' का मान 1 से शुरू किया जाना चाहिए

9
एक लेसर नोट करेगा कि "int", "=", और ";" आगे के अर्थ के बिना टोकन हैं, कि "x" एक पहचानकर्ता नाम या कुछ और है, "x", और "1" एक पूर्णांक या संख्या है, "1" मान। एक टोकन आवश्यक रूप से ऐसा नहीं करेगा।
डेविड थॉर्नले

5

मैं कहूंगा कि एक लेक्सर और एक टोकन मूल रूप से एक ही बात है, और यह कि वे पाठ को इसके घटक भागों ('टोकन') में तोड़ते हैं। तब पार्सर एक व्याकरण का उपयोग करके टोकन की व्याख्या करता है।

हालांकि, मैं सटीक शब्दावली के उपयोग पर लटका नहीं हूँ - लोग अक्सर पाठ की एक व्याख्या की किसी भी कार्रवाई का वर्णन करने के लिए 'पार्सिंग' का उपयोग करते हैं।


1
पीईजी पार्सर्स के साथ टोकन और पार्सर के बीच का अंतर और भी कम स्पष्ट है।
आंद्रे आर्टस

0

( दिए गए उत्तरों को जोड़ते हुए )

  • Tokenizer होगा भी कोई टिप्पणी हटाने, और केवल वापसी टोकन Lexer करने के लिए।
  • लेक्सर उन टोकन (चर / कार्यों) के लिए स्कोप को भी परिभाषित करेगा।
  • पार्सर तब कोड / प्रोग्राम संरचना का निर्माण करेगा

1
नमस्ते @downvoter, क्या आप इस बारे में विस्तार से बता सकते हैं कि आपने वास्तव में डाउनवोट क्यों किया?
कोरा तुगे

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

1) मैं "लेक्सर" और "टोकन" के बीच के अपने अंतर को नहीं समझता। मैंने 50+ भाषाओं के लिए पार्सर्स बनाए हैं और मेरे पास कभी भी दो अलग-अलग तंत्र नहीं हैं जो स्रोत पाठ को परमाणुओं में तोड़ते हैं, इसलिए मेरे लिए ये केवल समानार्थक शब्द हैं। 2) यदि आप संकलन कर रहे हैं, तो टिप्पणियों और व्हाट्सएप को हटाने से लेक्सर में समझ में आता है। यदि आप स्रोत-से-स्रोत परिवर्तन उपकरण बना रहे हैं, तो आप टिप्पणियों को नहीं खो सकते क्योंकि उन्हें परिवर्तित पाठ में फिर से प्रकट होना चाहिए। तो हमेशा टिप्पणी को हटाना गलत है; हम इस बारे में बहस कर सकते हैं कि व्हाट्सएप को संरक्षित करने के लिए कैसे प्रबंधन करता है। ...
इरा बैक्सटर

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

... 3) लेक्सर्स केवल निराशाजनक रूप से अजीब पार्सर्स में "स्कोप्स" को परिभाषित करते हैं, जो एक कठिन समय है जो वाक्यात्मक अस्पष्टताओं से निपटते हैं। सी और सी ++ पार्सर विहित उदाहरण हैं; मेरी चर्चा देखें stackoverflow.com/a/1004737/120163 पर )। किसी को यह (बदसूरत) तरीके से करने की ज़रूरत नहीं है। तो मुझे लगता है कि आपका जवाब सिर्फ गुमराह है।
इरा बैक्सटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.