जैसा कि शीर्षक में कहा गया है कि किस डेटा प्रकार को एक लेक्सर रिटर्न / पार्सर देना चाहिए? विकिपीडिया के पास लेक्सिकल विश्लेषण लेख को पढ़ते समय यह कहा गया है कि:
कंप्यूटर विज्ञान में, शाब्दिक विश्लेषण एक अनुक्रम के पात्रों को बदलने की प्रक्रिया है (जैसे कि कंप्यूटर प्रोग्राम या वेब पेज में) टोकन के अनुक्रम में ( एक पहचाने गए "अर्थ" के साथ तार )।
हालांकि, उपरोक्त कथन के पूर्ण विरोधाभास में, जब मैंने एक अन्य प्रश्न एक अलग साइट पर पूछा ( कोड की समीक्षा करें यदि आप उत्सुक हैं) तो उत्तर दिया गया था, जवाब देने वाले व्यक्ति ने कहा कि:
लेक्सर आमतौर पर स्ट्रिंग को पढ़ता है और इसे एक धारा में परिवर्तित करता है ... लेक्समेस का। Lexemes को केवल संख्याओं की एक धारा होना चाहिए ।
और उसने यह दृश्य दिया:
nl_output => 256
output => 257
<string> => 258
बाद में लेख में उन्होंने उल्लेख किया Flex
, एक पहले से मौजूद लेक्सर, और कहा कि इसके साथ 'नियम' लिखना हाथ से एक लेक्सर लिखने की तुलना में सरल होगा। वह मुझे यह उदाहरण देने के लिए आगे बढ़ा:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
मेरी अंतर्दृष्टि को आगे बढ़ाने और अधिक जानकारी प्राप्त करने के लिए, मैंने फ्लेक्स के बारे में विकिपीडिया लेख पढ़ा । फ्लेक्स लेख से पता चला है कि आप टोकन के साथ सिंटैक्स नियमों के एक सेट को निम्न तरीके से परिभाषित कर सकते हैं:
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
यह मुझे प्रतीत होता है कि फ्लेक्स लेक्सर कीवर्ड्स टोकन के तार लौटा रहा है। लेकिन यह कुछ संख्याओं के बराबर स्थिरांक हो सकता है।
अगर लेक्सर नंबरों को वापस करने जा रहा है, तो यह स्ट्रिंग शाब्दिक कैसे पढ़ेगा? एक नंबर लौटाना एकल कीवर्ड के लिए ठीक है, लेकिन आप एक स्ट्रिंग से कैसे निपटेंगे? क्या लेसर को स्ट्रिंग को बाइनरी नंबर में बदलना नहीं होगा और फिर पार्सर संख्याओं को वापस स्ट्रिंग में बदल देगा। यह बहुत अधिक तार्किक (और आसान) लगता है कि लेक्सर के लिए तार वापस आ गए हैं, और फिर पार्सर को किसी भी संख्या स्ट्रिंग शाब्दिक को वास्तविक संख्या में परिवर्तित करने दें।
या फिर लेक्सर दोनों को वापस लौटा सकता है? मैं सी ++ में एक सरल लेख लिखने की कोशिश कर रहा हूं, जो आपको अपने कार्यों के लिए केवल एक रिटर्न प्रकार देता है। इस प्रकार मुझे अपना प्रश्न पूछने के लिए प्रेरित किया।
मेरे प्रश्न को एक पैराग्राफ में संक्षेपित करने के लिए: जब एक लेक्सर लिखते हैं, और यह मानते हुए कि यह केवल एक डेटा प्रकार (तार या संख्या) वापस कर सकता है , जो अधिक तार्किक विकल्प होगा?