تجزیهکننده: تفاوت میان نسخهها
محتوای حذفشده محتوای افزودهشده
Mardetanha (بحث | مشارکتها) جزبدون خلاصۀ ویرایش |
جز ربات: تبدیل به هٔ |
||
خط ۴:
==تحلیل واژهای==
نخستین
به عنوان مثال در صورتیکه
(آدرسid,C) و (add .op.) و (آدرسid , B) و (ass .op.) و (آدرس id , A)
بنابراین اسکنر علاوه بر اینکه تشخیص میدهد که توکن یک شناسهاست، وآدرس آن در جدول نشانهها را نیز برای پارسر میفرستد. علاوه بر این اسکنر میتواند محلهای خالی و توضیحات(comments) موجود در برنامه اصلی را ضمن خواندن برنامه حذف نماید.
به آخرین توکنی که اسکنر یافتهاست، علامت پیش بینی(look a head symbol) و یا توکن جاری گفته میشود.
2-1- الگو (pattern) و
به فرم کلی که یک توکن میتواند داشته الگوی آن توکن میگویند. به عبارتی دیگر در ورودی، رشتههایی وجود دارند که توکنِ یکسانی برای آنها تشخیص داده میشود. فرم کلی این رشتهها توسط الگوی آن توکن توصیف میشود.
به دنبالهای از نویسهها که تشکیل یک توکن میدهند، واژه(Lexem) آن توکن میگویند. جدول زیر حاوی چند نمونه الگو و واژهاست:
خط ۲۱:
با حروف الفبا شروع و بهدنبال آن حرف ورقم قرار میگیرد A1 id
هرثابت عددی 3.14 num
هر
< < relation
>= >= relation
خط ۲۸:
در بعضی وضعیتها اسکنر قبل از اینکه تصمیم بگیرد که چه توکنی را به پارسر بفرستد، نیاز دارد که چند کاراکتر دیگر را نیز، از ورودی بخواند. مثلاً اسکنر با دیدن علامت < در ورودی نیاز دارد که کاراکتر ورودی بعدی را نیز بخواند. در صورتیکه این کاراکتر = باشد، در نتیجه توکن '<=' و در غیر اینصورت توکن ' < ' تشخیص داده میشود. در این مورد باید کاراکتر اضافی خوانده شده مجدداً به ورودی برگردد.
یکی دیگر از مشکلاتی که اسکنر با آن روبروست این است که در زبانهایی نظیر فرترن مثلاَ محل خالی یا (space) بجز در رشتههای کاراکتری ، نادیده گرفته میشود.
به عنوان مثال
به همین ترتیب در دستور do bi=1,25 تا زمانیکه علامت کاما دیده نشود، نمیتوان گفت که این دستور یک
در زبانهایی که کلمات کلیدی آن جزو کلمات رزرو شده نیستند، اسکنر نمیتواند کلمات کلیدی را از شناسههای همنام آنها تشخیص دهد. به عنوان مثال در دستور زیر:
IF Then THEN then=else;ELSE Else=Then;
جدا کردن
2-2- خطاهای واژه ای(Lexical Errors):
بطور کلی خطاهای محدودی را اسکنر میتواند بیابد، زیرا اسکنر تمام
از آنجایی که fi میتواند نام یک متغیر مجاز باشد، اسکنر این توکن را بهعنوان یک شناسه به پارسر میفرستد تا اینکه پارسر در اینمورد تصمیم بگیرد.
اما ممکن است خطاهایی پیش بیاید که اسکنر قادر به انجام هیچ عملی نباشد. در این مورد،
روشهای مختلفی برای این کار وجود دارد که ساده ترین آنها روشی است بنام panic mode (وضعیت هراس) . در این روش آنقدر از
سایر روشهای تصحیح خطا(error recovery) عبارتاند از :
a) حذف یک کاراکتر غیر مجاز (تبدیل:$= به := )
خط ۵۰:
در بسیاری از زبانها اسکنر برای تشخیص نهایی توکنها و مطابقت دادن آن با الگوهای موجود، نیاز دارد که چند کاراکتر جلوتر را نیز مورد بررسی قرار دهد.
از آنجایی که مقدار زیادی از زمان در جابجایی کاراکترها سپری میشود، از تکنیکهای بافرینگ ، برای پردازش کاراکترهای ورودی استفاده میگردد.
در یکی از این تکنیکها از یک بافر که به دو
در صورتیکه ورودی شامل تعداد کاراکترهای کمتر از n باشد، بعد از خواندن این کاراکترها یک کاراکتر خاصِ eof نیز وارد بافر میگردد.
کاراکتر eof بیانگر پایان فایل منبع بوده و با سایر کاراکترهای ورودی به نوعی تفاوت دارد.
خط ۶۰:
Lexam –beginning ابتدای واژه
در بافر ورودی از دو نشانه رو استفاده میشود.
نشانه رویِ forward پیش میرود تا اینکه یک توکن تشخیص داده شود .
این نحو استفاده از بافر در بیشتر موارد کاملاً خوب عمل میکند . با این وجود در مواردی که جهت تشخیص یک توکن، نشانه روِ forward ناچار است بیشتر از طول بافر جلو برود، این روش درست کار نمیکند.
بهعنوان مثال دستور declare (arg1,arg2, … ,arn n) را در یک
در این دستور تا زمانیکه کاراکتر بعد از پرانتز سمت راست را بررسی نکنیم، نمیتوان گفت که declare یک
برای کنترل حرکت نشانه رویِ forward و همچنین کنترل بافر میتوان بصورت زیر عمل کرد:
If forward is at end of first half then
خط ۷۷:
Else forward:= forward+1;
ب)استفاده از نگهبانها(sentinels):
در حالت قبل با جلو رفتن نشانه رو forward باید چک میشد که آیا این نشانه رو به انتهای یک نیمه از بافر رسیدهاست یا خیر؟ در صورتیکه به انتهای یک نیمه از بافر رسیده باشد، باید
برای این کار باید در انتهای هر
forward:=forward + 1 ;
if (forward = eof) then
|