0% found this document useful (0 votes)
9 views

Compiler - Session 2

Uploaded by

MohamadHajmosavi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views

Compiler - Session 2

Uploaded by

MohamadHajmosavi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 40

‫❖ تحلیل لغوی )‪:Lexical analysis (Scanning‬شناسایی قطعات منطقی کد‬

‫❖ تحلیل نحوی )‪ :Syntax analysis (parsing‬شناسایی این که چگونه این قطعات با هم مربوطند‪.‬‬
‫❖ تحلیل معنایی )‪ :(Semantic Analysis‬شناسایی معنای ساختار کلی‬
‫❖ تولید کد میانی ‪ :IR(intermediate representation) Generation‬طراحی یک ساختار ممکن‬
‫❖ بهینه سازی کد میانی ‪ :IR Optimization‬ساده کردن کد مقصد‬
‫❖ تولید ‪ :Generation‬ایجاد ساختار‬
‫❖ بهینه سازی ‪ :Optimization‬بهبود ساختار نتیجه‬

‫‪© F.Rismanian‬‬ ‫‪1‬‬


© F.Rismanian 2
© F.Rismanian 3
© F.Rismanian 4
© F.Rismanian 5
© F.Rismanian 6
© F.Rismanian 7
© F.Rismanian 8
‫عمليات كامپايلر‬

‫تجزیه برنامه مبدا به اجزای تشکیل دهنده اش‬


‫بخش تحليل‬
‫تولید کد میانی از برنامه مبدا‬

‫تبدیل کد میانی به برنامه مقصد در زبان دیگر‬


‫بخش سنت‬
‫نیاز به بیشترین روشهای خاص‬
‫سيستم پردازش زبان‬
‫اجزای سیستم‬

‫❖ پیش پردازشگر‬
‫❖ کامپایلر‬
‫❖ اسمبلر‬
‫❖ویرایشگر الحاق‬
‫❖ بارکننده‬
‫پيش پردازشگر‬
‫جمع آوری ماژولهای برنامه مبدا موجود در فایلهای جداگانه‬

‫اسكلت برنامه مبدا‬ ‫تبدیل بخشهای خالصه شده بنام درشت دستورات به احکام زبان مبدا‬

‫پيش پردازشگر‬

‫برنامه مبدا‬

‫كامپايلر‬

‫اسمبل مقصد‬
‫ي‬ ‫برنامه‬

‫اسمبلر‬

‫كد ماشي جابجاپذير‬


‫كتابخانه فايل هاي‬
‫باركننده ‪ /‬ويرايشگر الحاق‬ ‫مقصد جابجاپذير‬

‫كد ماشي‬
‫سه فاز تحليل در عمل كامپايل‬

‫تشخيص نشانه ها‬


‫تحليل خطي(تحليل لغوي يا پويش)‬

‫گروه بندي نشانه هاي برنامه مبدا به‬


‫جمالت گرامري‬ ‫تحليل سلسله مراتبي(تحليل نحوي يا تجزيه)‬

‫بررسي خطاهاي معنايي برنامه‬ ‫تحليل معنايي‬


‫ابزارهاي ساخت كامپايلر‬
‫مولدهای تجزیه کننده‬
‫تولید کننده های پویشگر‬
‫موتورهای ترجمه نحوگرا‬
‫مولدهای کد خودکار‬
‫موتورهای جریان داده‬
‫طبقه بندي كامپايلرها‬
‫دسته بندی کامپایلرها بر اساس چگونگی ساخت و عملیات‪:‬‬
‫‪Single Pass Compilers‬‬ ‫❑ تک گذره‬
‫‪Two Pass Compilers‬‬ ‫❑ دو گذره‬
‫‪Multipass Compilers‬‬ ‫❑ چند گذره‬

‫كامپايلر هاي تک گذره‬


‫وقتی تمامی فازهای طراحي كامپايلر که در قسمت قبل بررسی شد را درون تنها یک ماژول قرار دهیم‪ ،‬در واقع‬
‫کامپایلر تک گذره ساختهایم‪ .‬کامپایلر های تک گذره سورس کد را دریافت کرده و مستقیما به کد های ماشین‬
‫تبدیل میکنند‪.‬‬
‫كامپايلر هاي دو گذره‬
‫این کامپایلرها طی دو مرحله سورس کد را به کد مقصد ترجمه میکنند‪ ،‬در مرحلهی اول سورس کد از‬
‫طریق الیه ‪Front End‬به یک ‪Intermediate Representation‬که در واقع یک نوع كد مياني است‬
‫و تنها توسط كامپايلر مورد استفاده قرار میگیرد تبدیل شده و سپس از طریق الیهی دوم یا ‪Back End‬‬
‫تبدیل به كد نهايي يعني كد ماشين میشود‪.‬‬

‫‪© F.Rismanian‬‬ ‫‪15‬‬


‫كامپايلر هاي چند گذره‬
‫در این نوع از کامپایلرها‪ ،‬سورس کدها یا در واقع همان درخت سینتکس چندین بار توسط کامپایلرها‬
‫پردازش میشوند‪ .‬این کامپایلر ها در واقع یک برنامه ی خيلي بزرگ را به چندین برنامهی کوچکتر‬
‫تقسیم کرده و این برنامههاي كوچک را به طور همزمان اجرا میکنند‪ .‬خروجی این رویکرد‪ ،‬چندین کد‬
‫میانی یا ‪Intermediate Code‬است که توسط کامپایلر تولید شده است‪ .‬همچنین در هر مرحله یا هر‬
‫فاز‪ ،‬خروجی آن مرحله میتواند به عنوان ورودی فاز بعدی مورد استفاده قرار گیرد‪ ،‬این کار باعث میشود‬
‫نیازمان به حافظه یا ‪Memory‬کمتر شود‪ .‬نام دیگر این کامپایلر ها ‪Wide Compiler‬نیز است‪.‬‬

‫‪© F.Rismanian‬‬ ‫‪16‬‬


‫تکامل زبانهاي برنامهنويسي‬

‫‪© F.Rismanian‬‬ ‫‪17‬‬


‫فصل دوم‪ :‬تحليلگر لغوي‬

‫✓ آشنایی با تحلیلگر لغوی‬


‫✓ عبارات و گرامر باقاعده‬
‫✓ تحلیلگر لغوی ‪Lex‬‬
‫✓ ماشین خودکار قطعی و غیر قطعی و تبدیل آنها به یکدیگر‬

‫‪© F.Rismanian‬‬ ‫‪18‬‬


‫وظايف تحليل گر لغوي‬
‫‪ -1‬خواندن نمادهای ورودی‬

‫‪ -2‬تولید دنبالهای از نشانه ها‬

‫‪ -3‬ثبت نشانه ها در جدول نمادها‬


‫‪ -4‬حذف توضیحات برنامه‪ ،‬جای خالی و کاراکتر مربوط به سطر جدید‬

‫‪ -5‬ارتباط دادن پیامهای خطای تولید شده کامپایلر با برنامه مبدا‬


‫ارتباط با تجزيه كننده‬
‫نشانه‬
‫برنامه مبدا‬
‫تحلیل گر نحوی‬
‫تحلیل گر لغوی‬
‫نشانه بعدی را بده‬ ‫(تجزیه کننده)‬

‫‪ -‬دریافت یک رشته کاراکتری از ورودی‬


‫‪ -‬استخراج نشانه ها از آن‬
‫‪ -‬تحویل نشانه ها به تجزیه کننده‬
‫‪-‬ارتباط دادن پیامهای خطای تولید شده کامپایلر با برنامه مبدا‬
‫‪ -‬حذف فضاهای خالی بین عبارات و توضیحات برنامه‬ ‫جدول نماد‬
‫‪ -‬تشخیص شناسه ها و کلمات کلیدی زبان‬

‫ارتباط تحلیل گر لغوی با تجزیه کننده‬


‫داليل جدايي فازهاي تحليل لغوي و تجزيه‬

‫‪ -1‬ساده تر بودن طراحی دو فاز‬

‫‪ -2‬افزایش کارایی کامپایلر به دلیل استفاده از‬


‫میانگیر بین دو فاز‬

‫‪ -3‬قابلیت حمل کامپایلر و محدود شدن تغییرات به‬


‫تحلیلگر لغوی‬
‫مثال‬

Count
Count==count
count++increment
increment ‫تحلیل لغوی عبارت دستوری‬

‫تحليل گر لغوي‬

idid==idid++idid ‫تجزيه كننده‬


‫رابط تحليلگر لغوي‬
‫مرصف نشانه ها براي‬
‫ورودي‬ ‫ميانگت‬
‫تعيي ساختار دستورات‬

‫تحليل گر لغوي‬
‫تحليل گر نحوي‬
‫( تجزيه كننده)‬

‫‪ -1‬در هر زمان حاوی یک بلوك از کاراکترها‬


‫ميانگت‬
‫‪ -2‬اشاره گری به مکان نشانه بعدی پردازش نشده‬
© F.Rismanian 24
‫‪Error Recovery‬‬ ‫خطاي مرحله تحليل لغوي‬
‫منطبق نبودن هیچ کدام از الگوهای مربوط به تشخیص نشانه ها در زبان مبدا با پیشوندی از ورودی‬

‫روشهاي پوشش خطا‬


‫‪Panic Mode-1‬‬
‫‪ -2‬حذف کاراکتر اضافی‬
‫‪ -3‬درج کاراکتر از قلم افتاده‬
‫‪ -4‬جایگزینی یک کاراکتر بجای کاراکتر غلط‬
‫‪ -5‬جابجا نمودن دو کاراکتر مجاور هم‬

‫‪Panic mode‬‬
‫✓ ساده ترین شیوه پوشش خطا‬
‫✓ حذف کاراکترهای متوالی از باقیمانده ورودی تا پیدا شدن نشانه قابل قبول توسط تحلیل گر لغوی‬
‫✓ کافی بودن برای یک سیستم محاسباتی محاوره ای‬
‫‪Symbol Table‬‬ ‫تشکيل جدول نماد‬
‫جدولی ساخته شونده توسط فازهای تحلیل‪ ،‬مورد استفاده فازهای تولید کد‬

‫ذخیره رشته کاراکتری تشکیل دهنده شناسه در جدول‪.‬‬ ‫فاز تحليل لغوي‬

‫اضافه کردن نوع شناسه‪ ،‬مورد استفاده(رویه‪ ،‬متغیر و‪)..‬‬ ‫فاز تحليل نحوي‬

‫درج مکان شناسه در حافظه در جدول‬ ‫معناي‬


‫يي‬ ‫فاز تحليل‬

‫استفاده از اطالعات جدول برای دسترسی به متغیر و تولید کد‬ ‫فاز توليد كد‬
‫جدول نماد‪ -‬روالها‬

‫‪Lookup ( s ) :‬‬ ‫‪Insert ( s , t) :‬‬

‫اگر ‪ s‬در جدول است‪ ،‬اندیس آن بر می گردد اگر نه‪ ،‬صفر بر میگردد‬ ‫اندیس وارده جدید مربوط به رشته ‪ s‬نشانه ‪ t‬را بر می گرداند‪.‬‬

‫عمل ‪ Lookup‬تعیین وجود شناسه در جدول نماد‬


‫‪ Insert‬در صورت عدم وجود شناسه ‪ ،‬درج آن در جدول‬ ‫عمل‬
‫جدول نماد‪ -‬پياده سازي‬
‫کلمات دستوری‬ ‫‪mod‬‬
‫‪ : ptr‬اشاره گر‬ ‫‪: attributes‬صفات ‪: token‬نشانه‬
‫در متن برنامه‬ ‫‪div‬‬
‫‪div‬‬
‫‪mod‬‬

‫‪id‬‬

‫‪d‬‬ ‫‪i‬‬ ‫‪v‬‬ ‫‪m‬‬ ‫‪o‬‬ ‫‪d‬‬ ‫‪a‬‬


‫دنباله کاراکترهای ورودی‬
‫تحلیلگر لغوی – پیاده سازی‬

‫استفاده از تولید کننده تحلیلگر لغوی مانند کامپایلر ‪Lex‬‬

‫نوشتن تحلیلگر لغوی به زبانهای متداول برنامه نویسی‬ ‫روشهای پیاده سازی‬
‫سیستم و خواندن رشته ورودی با تسهیالت ‪I/O‬‬

‫نوشتن تحلیلگر لغوی به اسمبلی و مدیریت‬


‫صریح خواندن رشته ورودی‬
30
31
‫پویش فایل مبدأ‬

‫‪32‬‬
‫این بخش از برنامه اصلی‪ ،‬که توکن‬ ‫◼‬
‫بر اساس آن ساخته می شود‪ ،‬لغت‬
‫)‪ (Lexeme‬گفته می شود‪.‬‬

‫توکن‪ :‬یک نوع عددی شده است که‬ ‫‪‬‬


‫نشان میدهد چه موجودیت منطقی‬
‫از کد مبدأ خوانده شده است‪.‬‬

‫‪33‬‬
‫گاهی اوقات یک لغت ذخیره نمیشود و‬ ‫‪‬‬
‫نادیده گرفته میشود‪ .‬فضای خالی هیچ‬
‫معنایی برای برنامه ندارد‪ .‬بنابراین نادیده‬
‫گرفته می شود‪.‬‬

‫‪34‬‬
‫برخی از توکن ها خصیصه ای دارند که‬ ‫◼‬
‫اطالعات اضافه درباره توکن را نگهداری‬
‫میکند‪.‬‬
‫‪35‬‬
‫هدف از تحليل لغوي‬

‫تبدیل از توصیف فیزیکی برنامه به دنباله ای از توکنها‬ ‫◼‬

‫هر توکن یک بخش منطقی از فایل مبدأ را نشان میدهد مثل یک کلمه کلیدی‪ ،‬نام متغیر و ‪...‬‬ ‫‪‬‬

‫هر توکن با یک لغت مرتبط است‪.‬‬ ‫◼‬

‫متن واقعی توکن مثل …‪137, “int”,‬‬ ‫‪‬‬

‫هر توکن میتواند خصیصهای داشته باشد که از متن به دست می آید مثل مقدار عدد‬ ‫◼‬

‫دنباله توکنها در مرحله بعد در پارسر به کار می رود‪.‬‬ ‫◼‬

‫‪36‬‬
‫انتخاب توكن‬
‫چه توکنهایی مفید هستند؟‬ ◼
for (int k = 0; k < myArray[5]; ++k) {
cout << k << endl;
}
For {
int }
<< ;
= <
( [
) ]
++
Identifier
IntegerConstant

37
‫انتخاب توكن هاي خوب‬

‫بسیار وابسته به زبان است‪.‬‬ ‫◼‬

‫معموال‪:‬‬ ‫◼‬

‫کلمات کلیدی‪ ،‬توکن خودشان را دارند‪.‬‬ ‫‪‬‬

‫هر نماد نقطه گذاری‪ ،‬توکن خودش را دارد‪.‬‬ ‫‪‬‬

‫لغتهای نمایشگر شناسه ها‪ ،‬ثابتهای عددی‪ ،‬رشته ها و غیره با هم گروه بندی میشوند‪.‬‬ ‫‪‬‬

‫اطالعات نامربوط کنارگذاشته می شوند (فضای خالی‪ ،‬توضیحات)‪.‬‬ ‫‪‬‬

‫‪38‬‬
‫پيچيدگيها‬
‫در ‪ fortran‬همه فضاهای خالی حذف می شوند‪.‬‬ ‫◼‬

‫◼‬ ‫‪DO 5 I = 1.25‬‬

‫◼‬ ‫‪DO5I = 1,25‬‬


‫تعیین این که ورودی کجا تفکیک شود‪ ،‬مشکل است‪.‬‬ ‫◼‬

‫در زبان ‪ PL/1‬کلمات کلیدی می توانند به عنوان شناسه استفاده شوند‪.‬‬ ‫◼‬

‫◼‬ ‫‪IF THEN THEN THEN = ELSE; ELSE ELSE = IF‬‬

‫◼‬ ‫‪IF THEN THEN THEN = ELSE; ELSE ELSE = IF‬‬

‫برچسب گذاری لغات مشکل است‪.‬‬ ‫◼‬

‫‪39‬‬
‫چالش ها‬

‫چگونه تعیین کنیم‪ ،‬کدام لغات با هر توکن مرتبط هستند؟‬ ‫◼‬

‫اگر چند روش برای پویش ورودی وجود دارد‪ ،‬چگونه بدانیم کدام را انتخاب کنیم؟‬ ‫◼‬

‫چگونه میتوان موارد فوق را با کارایی درنظر گرفت؟‬ ‫◼‬

‫‪40‬‬

You might also like