یک لغتپرداز (lexer) ساده بنویسید که یک رشتهی wide-character را دریافت کند و همهٔ شناسهها (identifiers) و اعداد اعشاری (که ممکن است در نماد علمی/exponential مانند 1.23e-4 باشند) را استخراج کرده و تعداد هر نوع را چاپ کند.
3.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 02:50 0.0
از C++ با نوع std::wstring و هدر استفاده کنید؛ برای تشخیص حروف و ارقام از iswalpha و iswdigit و برای تبدیل حروف از towlower بهره ببرید. رشته را با پیمایش کاراکتر به کاراکتر تحلیل کنید: یک شناسه باید با حرف (یا _) آغاز شود و دنبال شود توسط حروف/اعداد، و عدد اعشاری میتواند شامل قسمت صحیح، نقطه اعشاری و بخش نمایی (e/E با علامت +/− اختیاری و ارقام) باشد. نکتهها: قبل از خواندن/نوشتن wide-char مقدار locale را تنظیم کنید (مثلاً setlocale(LC_ALL,"")) تا ورودی/خروجی مناسب کاراکتری داشته باشید، و روی لبههای ساده مثل +/− جلوی نمایه و چند نقطهٔ پیدرپی در عدد بررسی انجام دهید؛ این نوع پردازش پایه برای ساخت مفسرها/کامپایلرها و پردازش دادههای علمی کاربرد دارد.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
یک نکتهٔ کاربردی این است که برای پشتیبانی درست کاراکترهای wide، locale را با setlocale(LC_ALL, "") تنظیم کنید و از توابع wide مانند iswalpha، iswdigit و towlower استفاده کنید. شناسهها باید با حرف یا _ شروع شوند و پس از آنها فقط حروف، اعداد یا _ مجاز است تا شمارش بهدرستی انجام شود. عدد اعشاری میتواند شامل بخش صحیح، نقطهٔ اعشاری و بخش نمایی با e/E و علامت +/− اختیاری باشد، بنابراین هنگام تشخیص باید عبور از یک نقطهٔ پی در پی یا علامت نمایی را بهدقت مدیریت کنید. در نهایت شمارندهها را بهازای یافتن هر شناسه یا عدد افزایش دهید و برای صحت، مجموعهٔ تستی با ورودیهای شامل localeهای مختلف و رشتههای با نویسههای خاص بسازید.
گزارش