শিরোনামে যেমন বলা হয়েছে, কোনও লেক্সারের পার্সারটি কোন ডেটা টাইপের ফিরতি / ফিরিয়ে দেওয়া উচিত? উইকিপিডিয়ায় যে লেজিকাল অ্যানালাইসিস নিবন্ধটি পড়ার সময় , এটি বলেছিল:
কম্পিউটার সায়েন্সে লেক্সিকাল এনালাইসিস হ'ল অক্ষরের ক্রমকে রূপান্তর করার প্রক্রিয়া (যেমন কোনও কম্পিউটার প্রোগ্রাম বা ওয়েব পৃষ্ঠায়) টোকেনের ক্রম ( চিহ্নিত "অর্থ" সহ স্ট্রিং ) রূপান্তরিত করার প্রক্রিয়া ।
তবে উপরোক্ত বক্তব্যের সম্পূর্ণ বিপরীতে, যখন আমি অন্য সাইটে জিজ্ঞাসা করেছি ( আপনি যদি কৌতূহলী হন তবে কোড পর্যালোচনা ) উত্তর দেওয়া হয়েছিল, ব্যক্তি উত্তর দিয়েছিল যে:
লেক্সার সাধারণত স্ট্রিং পড়েন এবং এটিকে লেক্সেমির স্ট্রিমে রূপান্তরিত করুন। লেক্সেমিকে কেবল সংখ্যার স্ট্রিম হওয়া দরকার ।
এবং তিনি এই দৃশ্য দিয়েছেন:
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; }
আমার কাছে মনে হচ্ছে যে ফ্লেক্স লেক্সারটি কীওয়ার্ড-টোকেনের স্ট্রিং ফিরিয়ে দিচ্ছে। তবে এটি নির্দিষ্ট সংখ্যার সমান প্রত্যাবর্তনকারী হতে পারে।
যদি লেক্সার নম্বরগুলি ফেরত দিতে যাচ্ছিল, তবে এটি স্ট্রিং লিটারেলগুলি কীভাবে পড়বে? একটি সংখ্যা ফেরত দেওয়া একক কীওয়ার্ডের জন্য ঠিক আছে, তবে আপনি কীভাবে কোনও স্ট্রিং মোকাবেলা করবেন? লেক্সারের স্ট্রিংটিকে বাইনারি সংখ্যায় রূপান্তর করতে হবে না এবং তারপরে পার্সার সংখ্যাকে আবার স্ট্রিংয়ে রূপান্তর করতে পারে। লেক্সারের স্ট্রিংগুলি ফিরে আসার পক্ষে এটি আরও অনেক যৌক্তিক (এবং সহজ) বলে মনে হয় এবং তারপরে পার্সার যেকোন সংখ্যক স্ট্রিং লিটারেলকে আসল সংখ্যায় রূপান্তর করতে দেয়।
বা লেসচারটি উভয়কেই ফিরিয়ে দিতে পারে? আমি সি ++ তে একটি সাধারণ লেক্সার লেখার চেষ্টা করছি, যা আপনাকে আপনার ফাংশনগুলির জন্য কেবল একটি রিটার্ন টাইপ করতে দেয়। এইভাবে আমাকে আমার প্রশ্ন জিজ্ঞাসা করতে নেতৃত্ব দিচ্ছে।
আমার প্রশ্নটিকে অনুচ্ছেদে ঘনীভূত করার জন্য: যখন কোনও লেক্সার লেখার সময় এবং ধরে নেওয়া যায় যে এটি কেবলমাত্র একটি ডেটা টাইপ (স্ট্রিং বা সংখ্যা) ফেরত দিতে পারে যা আরও যুক্তিযুক্ত পছন্দ হবে?