2011-08-18 6 views
5

आप एक भाषा का EBNF वर्णन को देखते हैं, तो आप अक्सर पूर्णांकों और वास्तविक संख्या की परिभाषा देखने:क्या संख्याओं की पहचान स्कैनर में या पार्सर में है?

integer ::= digit digit* // Accepts numbers with a 0 prefix 
real  ::= integer "." integer (('e'|'E') integer)? 

(परिभाषाएँ मक्खी पर किए गए थे, मैं शायद उन में कोई त्रुटि हुई है)।

हालांकि वे संदर्भ मुक्त व्याकरण में दिखाई देते हैं, संख्याओं को अक्सर व्याख्यात्मक विश्लेषण चरण में पहचाना जाता है। क्या वे इसे और अधिक पूर्ण करने के लिए भाषा परिभाषा में शामिल हैं और यह कार्यान्वयनकर्ता पर निर्भर है कि उन्हें वास्तव में स्कैनर में होना चाहिए?

उत्तर

3

कई आम पार्सर जनरेटर उपकरण - जैसे कि एएनटीएलआर, लेक्स/वाईएसीसी - अलग-अलग पार्सिंग दो चरणों में: पहला, इनपुट स्ट्रिंग टोकननाइज्ड है। दूसरा, टोकन एक ठोस वाक्यविन्यास पेड़ बनाने के लिए प्रोडक्शंस में संयुक्त होते हैं।

हालांकि, वैकल्पिक तकनीकें हैं जिन्हें टोकननाइज़ेशन की आवश्यकता नहीं है: बैकट्रैकिंग recursive-descent parsers देखें। ऐसे पार्सर के लिए, टोकन को गैर-टोकन के समान तरीके से परिभाषित किया जाता है। pyparsing ऐसे पार्सर्स के लिए एक पार्सर जनरेटर है।

दो-चरणीय तकनीक का लाभ यह है कि यह आमतौर पर अधिक कुशल पार्सर्स का उत्पादन करता है - टोकन के साथ, बहुत कम स्ट्रिंग मैनिपुलेशन, स्ट्रिंग सर्चिंग और बैकट्रैकिंग होती है।

"निश्चित ANTLR संदर्भ" (टेरेंस पार) के अनुसार

,

[lexers और पारसर्स] के बीच फर्क सिर्फ इतना है कि पार्सर टोकन की एक धारा में व्याकरण संरचना पहचानता है, जबकि lexer में संरचना पहचानता है पात्रों की एक धारा।

1

व्याकरण वाक्यविन्यास सटीक होने के लिए पूर्ण होने की आवश्यकता है, इसलिए निश्चित रूप से इसमें पहचानकर्ताओं के सटीक प्रारूप और ऑपरेटरों की वर्तनी के विवरण शामिल हैं।

हां, कंपाइलर इंजीनियर निर्णय लेता है लेकिन आम तौर पर यह बहुत स्पष्ट है। आप लेक्सर को सभी चरित्र-स्तर के विस्तार को कुशलतापूर्वक संभालना चाहते हैं।

Is it a Lexer's Job to Parse Numbers and Strings?

पर लंबा उत्तर है
संबंधित मुद्दे