تجزیه‌کننده: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
ZxxZxxZ (بحث | مشارکت‌ها)
جز ZxxZxxZ صفحهٔ تجزیه کننده را به تجزیه‌کننده منتقل کرد
خط ۲۴:
 
در بعضی وضعیتها اسکنر قبل از اینکه تصمیم بگیرد که چه توکنی را به پارسر بفرستد، نیاز دارد که چند کاراکتر دیگر را نیز، از ورودی بخواند. مثلاً اسکنر با دیدن علامت <در ورودی نیاز دارد که کاراکتر ورودی بعدی را نیز بخواند. در صورتیکه این کاراکتر = باشد، در نتیجه توکن '<=' و در غیر اینصورت توکن ' <' تشخیص داده می‌شود. در این مورد باید کاراکتر اضافی خوانده شده مجدداً به ورودی برگردد.
یکی دیگر از مشکلاتی که اسکنر با آن روبروست این است که در زبانهایی نظیر فرترن مثلاَمثلاً محل خالی یا (space) بجز در رشته‌های کاراکتری، نادیده گرفته می‌شود.
به عنوان مثال کلمهٔ Do در زبان فرترن را در دستور زیر در نظر بگیرید: do bi =1.25 تا زمانیکه به نقطهٔ اعشار در 1.25 نرسیده باشیم نمی‌توان گفت که do در این دستور کلمه کلیدی نیست، بلکه بخشی از متغیری است که نام آن do bi است.
به همین ترتیب در دستور do bi=1،25 تا زمانیکه علامت کاما دیده نشود، نمی‌توان گفت که این دستور یک حلقهٔ do می‌باشد.
خط ۳۳:
جدا کردن کلمهٔ کلیدی THEN از متغیری که نام آن Then است بسیار مشکل است. در این موارد معمولاً پارسر تشخیص نهایی را خواهد داد.
2-2- خطاهای واژه ای(Lexical Errors):
بطور کلی خطاهای محدودی را اسکنر می‌تواند بیابد، زیرا اسکنر تمام برنامهٔ ورودی را یکجا نمیبیندنمی‌بیند بلکه هر بار قسمت کوچکی از برنامهٔ منبع را. به‌عنوان مثال هرگاه رشتهٔ fi در یک برنامهٔ C برای بار اول مشاهده شود، اسکنر قادر نیست تشخیص دهد که آیا fi یک املای غلط از کلمهٔ کلیدی if است یا نام یک متغیر است: fi (x==3)
از آنجایی که fi می‌تواند نام یک متغیر مجاز باشد، اسکنر این توکن را به‌عنوان یک شناسه به پارسر میفرستد تا اینکه پارسر در اینمورد تصمیم بگیرد.
اما ممکن است خطاهایی پیش بیاید که اسکنر قادر به انجام هیچ عملی نباشد. در این مورد، برنامهٔ خطا پرداز (error handler) فرا خوانده می‌شودتاآن خطا را به نحوی برطرف کند.
خط ۶۳:
به‌عنوان مثال دستور declare (arg1،arg2، … ،arn n) را در یک برنامهٔ pl/1 در نظر بگیرید.
در این دستور تا زمانیکه کاراکتر بعد از پرانتز سمت راست را بررسی نکنیم، نمی‌توان گفت که declare یک کلمهٔ کلیدی است و یا اسم یک آرایه‌است.
برای [[کنترل حرکت]] نشانه رویِ forward و همچنین کنترل بافر می‌توان بصورت زیر عمل کرد:
If forward is at end of first half then
Begin reload second-half;
خط ۱۰۰:
[[رده:ساختار مترجم (رایانه)]]
[[رده:مترجم (رایانه)]]
[[رده:ویکی‌سازی رباتیک]]