برگزاری کلاس های کنکور درس اصول طراحی کامپایلر


 
با توجه به تقاضای دانشجویان بسیاری مبنی بر برگزاری کلاس کنکور درس اصول طراحی کامپایلر برای آزمون کارشناسی ارشد امسال، متقاضیان می توانند از طریق ایمیل با اینجانب در تماس باشند.
در صورت آزاد بودن وقت اینجانب در خدمت دوستان متقاضی خواهم بود. 
 
پیروز باشید
 

Comments (1) Posted to حل تمرین درس کامپایلر 11/30/2011 Edit

پروژه نهایی درس کامپایلر بهار 90


به اطلاع دانشجویان عزیز می رساند:

 نحوه تحویل پروژه:

سه شنبه 7 تیرماه - ساعت 11 الی 14 ظهر

سایت کامپیوتر دانشکده مهندسی

 

چند پروژه متفاوت در ذیل تعریف می گردد که دانشجویان می توانند با توجه به امتیاز هر پروژه ، هر کدام را که مایلند انجام دهند و به عنوان پروژه ی نهایی تحویل دهند.

پروژه اول:طراحی اسکنر و پارسر به کمک Lex و Yacc به طور کامل - (انفرادی - 50 درصد نمره)

  دانلود صورت پروژه

   پروژه دوم: طراحی اسکنر به طور کامل با توجه به گرامر فرضی موجود و موارد خواسته شده - تبدیل عبارات منظم به NFA  و سپس تبدیل آن به DFA  نیز برای انجام پروژه نیز مشکلی ندارد.(گروهی 2 نفره - 80 درصد نمره)

  دانلود صورت پروژه 

  پروژه سوم: طراحی Lexical Analyzer و Parser به همراه ویژگی Error Handling - (گروهی 3 نفره - 100 درصد نمره)

دانلود صورت پروژه

     پروژه چهارم: طراحی اسکنر و پارسر با توجه به صورت پروژه  و موارد خواسته شده از جمله طراحی یک زبان mini c و تشکیل پارسر گرامربه دو روش LALR1 و SLR1 و همچنین اسکنر   - (گروهی حداکثر 4 نفره  - 100 درصد نمره بعلاوه نمره ی اضافه)

دانلود صورت پروژه  

ضمیمه ی موجود: 

  دانلود گرامر فرضی ساده شده مورد نظر

چند نمونه کد ساده برای تست عملکرد اسکنر و پارسر

شدیدا و اکیدا توصیه می گردد که از کپی برداری و گرفتن پروژه ی سایر دوستانتان خودداری نمایید و در صورت عدم توانایی انجام پروژه های دشوارتر، پروژه ی راحت تری را انتخاب نمایید و صرفا اعضای گروه ، روند تکمیل پروژه را انجام دهند.

تمامی مستندات و توضیحات پروژه به طور کامل به همراه کد پروژه و نرم افزارهای به کار رفته می بایست در قالب یک سی دی تحویل داده شود. حضور تمامی اعضای گروه در روز تحویل پروژه الزامی است و تمامی اعضا بایستی روند تکمیل پروژه ، کدها و الگوریتم های به کار رفته در پروژه را تشریح نمایند.

چون زیاد از من درباره ی جزئیات انجام پروژه ها سوال میشه بد نیست به این نکته اشاره کنم که انتخاب پروژه و نحوه ی انجام اون کاملا اختیاریست و شما آزادی عمل زیادی در مورد جزئیات پروژه دارید. بدیهیه که هر چقدر پروژتون دشوارتر، بهینه تر و همچنین کامل تر باشه و در انجام اون ابتکار و نوآوری به خرج بدید، نمره ی بیشتری هم بهتون تعلق میگیره...

 

در صورت تغییر مکان تحویل پروژه ، متعاقبا در همین وبلاگ اعلام خواهد گردید.


در ضمن برای هماهنگی قبلی برای تحویل پروژه می توانید از طریق ایمیل یا تلفن با بنده در تماس باشید.

 

Ahmad_estiry@yahoo.com

 

پیروز و سربلند باشید

   

شرکت در نظرسنجی ارزیابی اساتید حل تمرین

 
 

Comments (1) Posted to حل تمرین درس کامپایلر 06/20/2011 Edit

شرکت در نظرسنجی ارزیابی اساتید حل تمرین

 

به اطلاع کلیه ی دانشجویان عزیز می رساند برای شرکت در نظرسنجی ارزیابی اساتید حل تمرین دروس، می توانید با وارد شدن به سایت آموزش مجازی به آدرس  http://vu.um.ac.ir/login.php  و کلیک کردن بر روی گزینه ی نظرسنجی کلاس حل تمرین به ارزیابی اساتید حل تمرین خود بپردازید.

 

پیشاپیش از همکاری و توجه شما سپاسگزاریم ... 

 

Comments (0) Posted to حل تمرین درس کامپایلر 06/12/2011 Edit

تعریف نهایی پروژه درس اصول طراحی کامپایلر


 
 
 صورت نهایی پروژه به صورت زیر تعریف گردید که دانشجویان عزیز می بایست طی چندین مرحله، بخش های مختلف پروژه را انجام داده و تحویل دهند و نمره ی هر بخش به صورت مجزا بوده و فقط در تاریخ های مقرر شده تحویل گرفته خواهد شد.
 
فازهای  تعیین شده برای پروژه به قرار زیر می باشد:
 
1. تحویل یک فایل شامل عبارات منظم (Regular Expression) قابل تولید توسط گرامر با توجه به کلمات کیدی و توکن های موجود.
تحویل: تا 4 خرداد 1390 
 
2. برنامه ی تبدیل فایل شامل عبارات منظم به درخت (برنامه ی درخت ساز) که ممکن است به همان صورت قبلی و به صورت تبدیل عبارات منظم به DFA  تبدیل گردد...
تحویل: ( موعد تحویل تکالیف و پروژه ها متعاقبا اعلام خواهد گردید...)
  
3. تبدیل خروجی مرحله ی قبل به DFA (برنامه ی تبدیل درخت به DFA )
تحویل: ( موعد تحویل تکالیف و پروژه ها متعاقبا اعلام خواهد گردید...)
 
 4. خروجی نهایی پروژه که یک برنامه ی ورودی را به عنوان ورودی دریافت نموده و توکن های آن را شناسایی می نماید.
تحویل: تا 5 تیر 1390 
 
 
 
هر گونه ابهامی در مورد پروژه را میتوانید از طریق ایمیل با بنده در جریان بگذارید. 
پیروز باشید 
 

Comments (1) Posted to حل تمرین درس کامپایلر 05/16/2011 Edit

نمونه سوالات امتحانی درس اصول طراحی کامپایلر

 

 

نمونه سوالات امتحانی درس اصول طراحی کامپایلر از دانشگاه های مختلف گرد آوری شده توسط جناب آقای نام آور در فایل ضمیمه موجود می باشد.

دانشجویان عزیز می توانید فایل مربوطه را دانلود نمایید.

نمونه سوالات امتحانی درس اصول طراحی کامپایلر

پیروز باشید و سربلند

Comments (9) Posted to حل تمرین درس کامپایلر 04/29/2011 Edit

صورت پروژه درس اصول طراحی کامپایلر

 

  چهارشنبه ی این هفته 31 فروردین ماه

کلیه ی دانشجویان بایستی تکالیف خود را تحویل دهند.
 
تحویل پروژه درساعات 11 الی 12 و همچنین 13 الی 14 می باشد.
 
مکان تحویل تکالیف : سایت گروه کامپیوتر
 
 
 
 

 طراحی Lexical Analyzer و Parser

1.  تحیقق در مورد نحوه ی عملکرد اسکنر و پارسر 

2. نحوه ی کار با LEX

3. نحوه ی کار با YACC

 صورت پروژه:

- گرامری را به عنوان گرامر یک زبان فرضی در نظر می گیریم .

. برای هر توکن ، یک کد انتخاب نمایید.

 یک  Lexical Analyzer بنویسید که :

    - Commentها را حذف نماید.

    - بتواند بوسیله ی پارسر صدا زده شود و هر بار پس از شناسایی، یک جفت "token value" , "token type"  را برگرداند.

    - در صورت برخورد با خطا ، با صدا زدن یک روتین Error Handling مناسب، پیغام مناسب را چاپ نماید.

    - خطوط را برای چاپ پیغام مناسب، شماره گذاری نماید.

================================================================

 برنامه ی پارسر را بنویسید.

این برنامه با صدا زدن Lexical Analyzer و روتین های Error Handling ، ساختمان جملات را تشخیص داده و

در خروجی، درخت پارسر را ایجاد و چاپ نماید.

 

نکات مهم پروژه :

- تشخیص توکن ها به صورت یک جدول و در قالب یک فایل ذخیره گردد.

- Error Handler برای اسکنر و پارسر جدا طراحی گردیده و با رسیدن به هر خطا ، پیغام مناسب با خطای مورد نظر را چاپ نماید.

- مراحل تست برنامه به طور کامل و مستند باشد.

- گرامر C مورد نظر را میتوانید از لینک زیر دانلود نمایید. 

 

دانلود گرامر ساده زبان C

 

- مراحل طراحی اسکنر بدین صورت هست که شما بایدابتدا روی کاغذ توکن ها رو تبدیل به عبارت منظم کنید.

اون ها رو تبدیل به  NFA کنید و سپس اون ها رو تبدیل به  DFA کنید. و سپس از اون در طراحی اسکنرتون استفاده کنید. البته با توجه به وجود الگوریتم تبدیل عبارات منظم به  NFA بایستی همین روند رو کدنویسی کرده و برنامتون به طور خودکار این روند رو نیز انجام بده...

 

کلیه ی مراحل انجام پروژه بایستی مستندسازی شده و در قالب یک فایل  WORD یا بر روی کاغذ تحویل داده بشه... در ضمن کلیه ی فایل ها، نرم افزارها و هر اون چیزی رو که در طی انجام پروژه ازش استفاده می کنید به علاوه ی پروژه نهایی خوتون که بایستی همراه با نمونه های ورودی و خروجی برنامه تستش کنید رو باید در قالب یک سی دی به من تحویل بدید.

 

  چهارشنبه ی این هفته 31 فروردین ماه کلاس حل تمرین برگزار خواهد گردید.

کلیه ی دانشجویان بایستی پروژه های خود را تحویل دهند. 
 

موعد اول تحویل پروژه که اسکنر هستش: نیمه ی اردیبهشت ماه

موعد دوم تحویل پروژه که پارسر هستش: آخر ترم

پیروز باشید و سربلند

استیری

 

Comments (1) Posted to حل تمرین درس کامپایلر 04/20/2011 Edit

اولین کلاس در سال 1390

 

 

سلام به همه ی دانشجویان عزیز

امیدوارم سال نو برای همتون فرخنده و میمون باشه و امسال، سال آغاز آرزوهایی باشه که مدت هاست در فکر رسیدن به اونها هستید و خلاصه براتون آرزو میکنم امسال بهترین سال و سال برآورده شدن بهترین آزوهاتون باشه ... همون سالی که مذت هاست منتظر رسیدن اون هستید...

 بگذریم....

چهارشنبه 17 فروردین اولین جلسه ی کلاس حل تمرین درس کامپایلرمون برگزار میشه و شما که میدونم تمام تعطیلات عیدتون رو وقت گذاشتید!!! و همه ی فکر و ذکرتون درس و مشقتون بوده!!! باید تکلیفی که براتون مشخص کردم رو به صورت حضوری سر کلاس تحویل بدید....

تشریح نحوه ی عملکرد LEX  و YACC  به طور کامل و عملی همراه با مثال ورودی به هر یک و دریافت خروجی ...

دوستانی که هنوز کاری نکردند لااقل LEX رو باید به طور کامل تحویل بدن...

در ضمن تحویل این قسمت از پروژه حضوریه و باید توسط خودتون انجام بشه. لذا اگه با ساعت کلاس مشکل دارید حتما من رو در جریان بذارید تا در ساعت دیگه ای ازتون تحویل بگیرم.

در ضمن توضیحات بیشتر در مورد پروژه رو میتونید توی همین وبلاگ پیدا کنید....

پس کلاسمون شد: چهارشنبه 17 فروردین ساعت 14   کلاس 312

به امید دیدار

پیروز و سربلند باشید

Comments (1) Posted to حل تمرین درس کامپایلر 04/05/2011 Edit

تشريح نحوه عملکرد کامپايلرها - قسمت چهارم

 

 


توضيحات تکميلی درباره تحليل‌گر نحوی :

تحلیل‌نحوی، Syntax Analyzer یا پارسر (Parser) فازم دوم عمل کامپایل می‌باشد.
گرامر مورد استفاده در این مرحله گرامر مستقل از متن یا Context Free می‌باشد.
در حین این مرحله از کامپایل می‌باشد که خطاهای نحوی تشخیص داده می‌شوند.
- تحلیل واژه‌ای ( Lexical Analysis) نخستین مرحلۀ کامپایل تحلیل واژه‌ای میباشد. به واحدی از کامپایلر که کار تحلیل واژه‌ای را انجام می‌دهد، اسکنر (scanner) میگویند. اسکنر بین رشتۀ ورودی و تحلیلگر نحوی (یا پارسر-parser) واقع است. وظیفۀ اصلی اسکنر این است که با خواندن کاراکترهای ورودی، توکن‌ها را تشخیص داده و برای parser ارسال نماید. رابطۀ scanner و parser بصورت زیر است:
به عنوان مثال در صورتیکه رشتۀ ورودی A:=B+C باشد، توکن‌های زیر تشخیص داده خواهند شد: (آدرسid,C) و (add .op.) و (آدرسid , B) و (ass .op.) و (آدرس id , A) بنابراین اسکنر علاوه بر اینکه تشخیص می‌دهد که توکن یک شناسه‌است، وآدرس آن در جدول نشانه‌ها را نیز برای پارسر میفرستد. علاوه بر این اسکنر میتواند محلهای خالی و توضیحات(comments) موجود در برنامه اصلی را ضمن خواندن برنامه حذف نماید. به آخرین توکنی که اسکنر یافته‌است، علامت پیش بینی(look a head symbol) و یا توکن جاری گفته می‌شود.
1-    الگو (pattern) و واژۀ(Lexem) توکنها:
به فرم کلی که یک توکن میتواند داشته الگوی آن توکن میگویند. به عبارتی دیگر در ورودی، رشته‌هایی وجود دارند که توکنِ یکسانی برای آنها تشخیص داده می‌شود. فرم کلی این رشته‌ها توسط الگوی آن توکن توصیف می‌شود. به دنباله‌ای از نویسه‌ها که تشکیل یک توکن میدهند، واژه(Lexem) آن توکن میگویند.

الگو واژه توکن با حروف الفبا شروع و بدنبال آن حرف ورقم قرار میگیرد A1 id هرثابت عددی 3.14 num هر رشتۀ کاراکتری که بین دو علامت " " قرار گیرد "book" literal < < relation >= >= relation if if if
در بعضی وضعیتها اسکنر قبل از اینکه تصمیم بگیرد که چه توکنی را به پارسر بفرستد، نیاز دارد که چند کاراکتر دیگر را نیز، از ورودی بخواند. مثلاً اسکنر با دیدن علامت < در ورودی نیاز دارد که کاراکتر ورودی بعدی را نیز بخواند. در صورتیکه این کاراکتر = باشد، در نتیجه توکن '<=' و در غیر اینصورت توکن ' < ' تشخیص داده می‌شود. در این مورد باید کاراکتر اضافی خوانده شده مجدداً به ورودی برگردد. یکی دیگر از مشکلاتی که اسکنر با آن روبروست این است که در زبانهایی نظیر فرترن مثلاَ محل خالی یا (space) بجز در رشته‌های کاراکتری ، نادیده گرفته می‌شود. به عنوان مثال کلمۀ Do در زبان فرترن را در دستور زیر در نظر بگیرید: do bi =1.25 تا زمانیکه به نقطۀ اعشار در 1.25 نرسیده باشیم نمیتوان گفت که do در این دستور کلمه کلیدی نیست، بلکه بخشی از متغیری است که نام آن do bi است. به همین ترتیب در دستور do bi=1,25 تا زمانیکه علامت کاما دیده نشود، نمیتوان گفت که این دستور یک حلقۀ do میباشد.
در زبانهایی که کلمات کلیدی آن جزو کلمات رزرو شده نیستند، اسکنر نمیتواند کلمات کلیدی را از شناسه‌های همنام آنها تشخیص دهد. به عنوان مثال در دستور زیر: IF Then THEN then=else;ELSE Else=Then;
جدا کردن کلمۀ کلیدی THEN از متغیری که نام آن Then است بسیار مشکل است. در این موارد معمولاً پارسر تشخیص نهایی را خواهد داد.
2-    خطاهای واژه ای(Lexical Errors):
بطور کلی خطاهای محدودی را اسکنر میتواند بیابد، زیرا اسکنر تمام برنامۀ ورودی را یکجا نمیبیند بلکه هر بار قسمت کوچکی از برنامۀ منبع را. به‌عنوان مثال هرگاه رشتۀ fi در یک برنامۀ C برای بار اول مشاهده شود، اسکنر قادر نیست تشخیص دهد که آیا fi یک املای غلط از کلمۀ کلیدی if است یا نام یک متغیر است: fi (x==3) از آنجایی که fi میتواند نام یک متغیر مجاز باشد، اسکنر این توکن را به‌عنوان یک شناسه به پارسر میفرستد تا اینکه پارسر در اینمورد تصمیم بگیرد. اما ممکن است خطاهایی پیش بیاید که اسکنر قادر به انجام هیچ عملی نباشد. در این مورد، برنامۀ خطا پرداز (error handler) فرا خوانده می‌شودتاآن خطا را به نحوی برطرف کند. روشهای مختلفی برای این کار وجود دارد که ساده ترین آنها روشی است بنام panic mode (وضعیت هراس) . در این روش آنقدر از رشتۀ ورودی حذف می‌شود تا اینکه یک توکن درست، تشخیص داده شود. سایر روشهای تصحیح خطا(error recovery) عبارت‌اند از : a) حذف یک کاراکتر غیر مجاز (تبدیل:$= به  := ) b) وارد کردن یک کاراکتر گم شده (مثلاً تبدیل : به  := ) c) تعویض کردن یک کاراکتر غلط با یک کاراکتر درست ( مثلاً تبدیل  :: به  := ) d) جابجایی دو کاراکتر مجاز ( مانند =: به := )
 3- روشهايی جهت بهبود کار اسکنر :
الف ) استفاده از بافر: در بسیاری از زبانها اسکنر برای تشخیص نهایی توکنها و مطابقت دادن آن با الگوهای موجود، نیاز دارد که چند کاراکتر جلوتر را نیز مورد بررسی قرار دهد. از آنجایی که مقدار زیادی از زمان در جابجایی کاراکترها سپری می‌شود، از تکنیکهای بافرینگ ، برای پردازش کاراکترهای ورودی استفاده میگردد. در یکی از این تکنیکها از یک بافر که به دو نیمۀ n کاراکتری تقسیم شده‌است، استفاده می‌کنند (که در آن n تعداد کاراکترهایی است که در روی یک بلوک از دیسک جای میگیرند). به این ترتیب با یک فرمان read به جای خواندن یک کاراکتر ، میتوان n کاراکتر ورودی را در هر نیمۀ بافر وارد کرد. در صورتیکه ورودی شامل تعداد کاراکترهای کمتر از n باشد، بعد از خواندن این کاراکترها یک کاراکتر خاصِ eof نیز وارد بافر میگردد. کاراکتر eof بیانگر پایان فایل منبع بوده و با سایر کاراکترهای ورودی به نوعی تفاوت دارد.


      C * * 2 eof E = M *
              forward
Lexam –beginning   ابتدای واژه


در بافر ورودی از دو نشانه رو استفاده می‌شود. رشتۀ کاراکتری بین این دو نشانه رو، معرف Lexem (واژه)جاری میباشد. در ابتدا هر دو نشانه رو به اولین کاراکتر Lexem بعدی که باید پیدا شود اشاره می‌کنند. نشانه رویِ forward پیش میرود تا اینکه یک توکن تشخیص داده شود . این نحو استفاده از بافر در بیشتر موارد کاملاً خوب عمل می‌کند . با این وجود در مواردی که جهت تشخیص یک توکن، نشانه روِ forward ناچار است بیشتر از طول بافر جلو برود، این روش درست کار نمیکند. به‌عنوان مثال دستور declare (arg1,arg2, … ,arn n) را در یک برنامۀ pl/1 در نظر بگیرید. در این دستور تا زمانیکه کاراکتر بعد از پرانتز سمت راست را بررسی نکنیم، نمیتوان گفت که declare یک کلمۀ کلیدی است و یا اسم یک آرایه‌است. برای کنترل حرکت نشانه رویِ forward و همچنین کنترل بافر میتوان بصورت زیر عمل کرد:

 


If forward is at end of first half then Begin reload second-half;
                 Forward:=forward+1
End Else
    If  forward is at end of second-half  then
     Begin      reload   first half;
                  Move   forward to begin of first half
     End
   Else       forward:= forward+1;


ب)استفاده از نگهبانها(sentinels):
در حالت قبل با جلو رفتن نشانه رو forward باید چک میشد که آیا این نشانه رو به انتهای یک نیمه از بافر رسیده‌است یا خیر؟ در صورتیکه به انتهای یک نیمه از بافر رسیده باشد، باید نیمۀ دیگر را دوباره بار می‌کردیم. در الگوریتم فوق همان طوریکه مشاهده شد برای هر جلورویِ نشانه رویِ forward ، دو بار عمل مقایسه انجام مشود. میتوان این دو را به یک بار تست، تبدیل کرد. برای این کار باید در انتهای هر نیمۀ بافر، یک کاراکتر نگهبان قرار دهیم( نگهبان به عنوان قسمتی از برنامۀ منبع نخواهد بود). به این ترتیب برای کنترل حرکت نشانه روِ forward میتوانیم از الگوریتم زیر استفاده کنیم:


forward:=forward + 1 ; if (forward = eof) then begin
         if   (forward  is  at   end  of  first   half)     then
         begin
                 reload   second  half;
                 forward := forward+1 ;
        end
        else
             if        (forward at end of second half)   then
             begin
                     reload  first  half;
                     move  forward  to beginning   of  first  half
             end
             else      /*   eof  within  a  buffer  signifying end of input */
            terminate  lexical  analysis       (آنالیز واژه‌ای به پایان برسد)



 

Comments (1) Posted to حل تمرین درس کامپایلر 03/15/2011 Edit

تشريح نحوه عملکرد کامپايلرها - قسمت سوم

 

 

 مراحل کامپايل:
 
8 قسمت زیر یک کامپایلر را برای ما می سازد.(شکل 2)

 


1 – تحلیل گر لغوی
 2 – تحلیل گر نحوی
 3 – تحلیل گر معنایی
 4 – تولید کننده کد میانی
 5 – بهینه ساز کد میانی
 6 – تولید کننده کد نهایی
 7 – جدول سمبل ها
 8 – پردازشگر خطا
 
   توجه: در هر مرحله  ورودی هر مرحله خروجی مرحله قبل است .
 

 


 
1)LEXICAL ANALAYZER
2)SYNTAX ANALAYZER
3)SEMANTIC ANALAYZER
4)INTERMEDATE CODE GENERATOR
5)CODE OPTIMAIZATION
6)CODE GENERATION
7)SYMBOL TABLE
8)ERROR HANDLERING


 
   نکته: هر مرحله با جدول سمبلها یا مدیریت خطاها ارتباط دارد یعنی در هنگام ورود باید حواسمان
  به جدول سمبلها و پردازشگر خطاها باشد.جدول سمبلها و پردازشگر خطاها در هر مرحله کار کنترلی
  انجام می دهد.
 جدول سمبلها اجازه نمی دهد که سمبلی را که نداریم از آن استفاده کنیم.
 

حال به تشریح هر کدام از اجزای کامپایلر می پردازیم :
 الف) تحليل گر لغوی ( Lexer ) :
در واقع طولانی ترین پروسه را انجام می دهد ، با زبان مبدا مستقیما در تعامل بوده و مستقل از زبان مقصد می باشد . تحلیل گر لغوی با خواندن زبان ورودی ان را به مجموعه ای از نشانه های قابل فهم برای تجزیه کننده تقسیم بندی می کند . میدانیم که جملات یک زبان از رشته هایی از نشانه ها تشکیل شده است و دنباله ای از این کاراکترهای ورودی که یک نشانه را تشکیل می دهند یک لغت ( Lexeme ) نامیده می شوند . توضیحات ، فضاهای سفید و فاصله ها توسط تحلیل گر لغوی نادیده گرفته می شود ، سپس نشانه های تولیدی را در جدولی به نام جدول نمادها قرار می دهد و اشاره گری برای دسترسی پارسر به آن ها را بر می گرداند . تشخیص شناسه ها و کلمات کلیدی نیز از جمله مواردی است که Lexer باید آن ها را نیز تشخیص دهد و از سایر نشانه ها تمیز دهد . بنابراین به طور خلاصه Lexer کاراکترها را از ورودی می خواند ، آن ها را به صورت لغت دسته بندی می کند و نشانه های ایجاد شده توسط لغت ها را به همراه مقادیر خصیصه آن ها به مرحله های بعدی کامپایلر منتقل می کند.نشانه های تولید شده در پارسر و یا تجزیه کننده مورد استفاده قرار می گیرد . اگر بپذیرید که کامپیوتر تنها قادر به درک مفهوم سیگنال های پذیرش و عدم پذیرش و یا همان سیگنال ها و اعداد صفر و یک است می توانید راحت تر به جواب برسید درواقع سیستم کامپیوتر شامل مدارهایی است که این مدارها فقط به دو سیگنال صفر و یک و یا فعال و غیر فعال و یا روشن و خاموش حساس است و به هیچ وجه قادر به درک الفاظ و زبان طبیعی نمی باشد و حتی از کاری که قرار است انجام بدهد نیز خبر ندارد و مدارهای الکتریکی بر اساس کدهایی که در حافظه قرار می گیرد ( کلمات حافظه ) و در نهایت پردازش هایی که توسط پردازنده در واحد کنترل و ALU بر روی آن ها صورت می دهد اعمالی انجام می شود . اما ان چه که در این جا مورد توجه است همان شکل گیری صفر و یک ها در نتیجه یک برنامه به زبان فرضا C# می باشد . این کاری است که کامپایلرها انجام می دهند .
در واقع در این مرحله از کامپایل متن برنامه  ورودی حرف به حرف خوانده می شود
 و به دنباله ای از نشانه ها یا token تبدیل می شود.
    انواع token ها :
 1)      کلمات کلیدی
 2)      عملگرها
 3)      جدا کننده ها
 4)      ثابت ها
 5)      شناسه ها
    نکته مهم:
 زبان c  یک زبان case sensitive یعنی حساس به  حروف بزرگ و کوچک است مشابه همین
  نشانه ها میرود به جدول سمبلها , در جدول سمبلها مقایسه می شوند اگر کد اسکی چیزی که نوشتیم با
  چیزی که در جدول است یکسان نباشد خطا می دهد.
   وظایف تحلیل گر لغوی:
  1) تولید token 
 2) تشخیص خطاهای لغوی
 3) نادیده گرفتن و حذف توضیحات
 4) پس از تشخیص token آنها را در جدول نشانه قرار می دهد.

ب)تحليل گر ساختار دستور (Parser) :
پارسر بر رسی می کند که ایا می توان دنباله ای از نشانه های ایجاد شده را توسط گرامر زبان مورد نظر تولید نمود یا نه . در واقع پارسر مهم ترین عمل را در طراحی کامپایلر انجام می دهد و آن تولید دنباله از از رشته ها توسط گرامر زبان مبدا می باشد . به طور کل هنگام تحلیل ساختار دستور ، نشانه هایی که در زبان مبدا قرار دارند را به عبارت های گرامری دسته بندی می کنیم به طوری که کامپایلر بتواند مجددا با استفاده از آن ها خروجی را ترکیب بندی کند . عبارت های تولید شده را توسط درخت تجزیه نمایش می دهند که در ختی است که فرزندان هر گره عبارات سمت راست قوانین گرامر و پدر آن ها سمت چپ هر گره می باشد و گره ه های برگ مشتمل بر پایانی ها می باشند و یک دنباله از آن ها یک رشته از گرامر را نشان می دهند .
در واقع در این مرحله خروجی تحلیل گر لغوی از نظر خطاهای نحوی مورد بازرسی قرار می گیرد و با استفاده
  از نشانه های تولید شده درخت نحوی آن ساخته می شودو بعد چک می کند که آیا ساختار جملات درست
 است یا نه؟
 ج ) تحليل گر معنايی:
فاز تحلیل معنایی برنامه مبدا را برای پیدا کردن خطاهای معنایی بررسی کرده و اطلاعات مربوط به نوع داده ها را در درخت تجزیه حاشیه نویسی می کند مثلا بررسی می کند که یک رشته حرفی با یک عدد جمع نزده شده باشد و مانند آن . مجاز بودن نوع داده ها نیز در این بخش بررسی می شود . در واقع در زمان تحلیل معنایی ، کامپایلر ساختارهایی را کشف می کند که از نظر ساختار دستوری صحیح هستند اما در رابطه با عملی که انجام می دهند بی معنی هستند .
در واقع با استفاده از درخت نحوی استفاده شده در مرحله قبل برنامه ورودی از نظر خطاهای مفهومی احتمالی
  بررسی می شود.

د) توليد کننده کد ميانی :
 در این بخش یک شکل میانی قابل فهم اسمبلر و یا یک نمایش میانی صریح از برنامه مبدا تولید می کند که می توان آن را برنامه ای برای یک ماشین انتزاعی در نظر گرفت ( مفهوم انتزاعی به معنای قابل فهم بودن برای انسان است نه ماشین . ) و باید دارای دو ویژگی سهولت تولید و سهولت تبدیل به برنامه مقصد باشد . نمایش میانی می تواند شکل های گوناگونی داشته باشد مانند صفر ، یک ، دو ، سه و چهار آدرسه .در ساختار فرضا سه ادرسه در هر ثبات می توان سه ادرس را شامل عملگر ، عملوند اول و عملوند دوم قرار داد . محاسبه عبارات ، نظارت بر ساختارهای جریان کنترلی و احضار رویه ها نیز در این بخش توسط مولد کد میانی صورت می گیرد .
 ه) بهينه ساز کد(Optimizer) :
کدی که تولید می کنیم باید دو شرط صرفه جویی در حافظه و در زمان اجرا را برآورده کند . گاهی وقت ها کد ما بسیار پیچیده است و با اعمال جایگزینی ها و حذف و درج ها می توان آن را ساده تر و کاراتر نمود . تغییر ساختارهای آدرس دهی نیز می تواند کد را بهینه تر سازد . سرعت اجرا نیز باید در نظر گرفته شود .
 و) توليد کد :
آخرین فاز کامپایلر ، تولید کد مقصد می باشد که معمولا شامل کد ماشی جابه جا پذیر یا کد اسمبلی است .
کد میانی بهینه شده در مرحله قبل تبدیل به کدی به نام کد زبان ماشین می شود.مولد کد نهایی بسته
  به سخت افزار و معماری کامپیوتر مقصد است .
تخصیص حافظه به هر یک از متغیرهای برنامه در این فاز انجام می شود . آن گاه هر یک از دستورهای میانی به یک دنباله از دستورهای ماشین که همان کار را انجام میدهند ترجمه می شوند . یک جنبه مهم آن ، جایگزینی متغیرها در ثبات ها می باشد . یک نمونه : عبارت Statement :=initial + rate * 60 را در نظر بگیرید . داریم : Statement: =initial + rate * 60àid1:=id2 + id3 *60 حال کد نهایی را می توان به فرم زیر در نظر گرفت که سرانجام در اسمبلر تبدیل به کد قابل فهم ماشین خواهد شد:

 

  MOVE id3, R2
  Mul #60.0, R2 
  MOVE id2, R1
  MOVE R2, R1
  MOVE R1, id1  

 

 

Comments (10) Posted to حل تمرین درس کامپایلر 03/12/2011 Edit

تشريح نحوه عملکرد کامپايلرها - قسمت دوم

 

 

ساختار کامپايلر
 

اکنون شرح مختصری از هر پیمانه را ارائه خواهیم کرد:
پیمانه ورودی متن برنامه ، فایل متن برنامه را می‌یابد، آن را می‌خواند، و آن را به صورت جریانی از کاراکترها تحویل می‌دهد . ممکن است به فایلهای دیگری که به آن فایل ضمیمه شده‌اند . سربزند . این عمل ممکن است نیاز به همکاری سیستم عامل و تحلیل گر لغوی داشته باشد.
پیمانه تحلیل لغوی نشانه‌های موجودی در جریان ورودی را جدا می‌کند ورده و نمایش آنها را تعیین می‌نماید. این پیمانه را می‌توان به صور دستی نوشت یا از توصیف نشانه‌ها تولید نمود. علاوه‌براین , ممکن است تفسیرهای محدودی را بر روی بعضی از نشانه‌ها انجام دهد :به عنوان مثال، تعیین کند که آیا شناسه‌ای یک ماکرو است یا یک واژه کلیدی.

 


 


پیمانه تحلیل نحوی جریانی از نشانه‌ها را به درخت نحوی انتزاعی (AST) تبدیل می‌کند. بعضی از تحلیلگران نحوی حاوی دو پیمانه‌اند: پیمانه اول جریانی از نشانه‌ها را می‌خواند وبرای هر ساختار نحوی که تشخیص داده می‌شود, تابعی را از پیمانه دوم فراخوانی می‌کند. توابع موجود در پیمانه دوم , گرههای AST را ایجاد کرده به هم پیوند می‌دهند. امتیاز این کار این است که می‌توان با جایگزینی پیمانه تولید AST از یک تحلیل گر نحوی, AST دیگری را ایجادکرد , و از طرف دیگر , می‌توان با جایگزینی تحلیل گر نحوی, همان نوع AST را زا زبان دیگر به دست آورد.
پیمانه اداره کننده متن , اطلاعات مربوط به متنها را از نقاط مختلف برنامه جمع آوری می‌کند و گرهها را بر اساس این اطلاعات , حاشیه نویسی می‌کند.  نمونه‌هایی از این اطلاعات عبارتند از: اطلاعات نوع نشای از اعلان عبارات, اتصال دستوارت go to به برچسبهای آنها درزبانهای دستوری و در زبانهای توزیعی , تصمیم گیری در مورد این که کدام فراخوانی روالها ,محلی و کدامها از راه دور هستند. سپس این حاشیه نویسی‌ها برای وارسی متن به کار می‌روند یا به پیمانه‌های دیگری ارسال می‌شوند (مثلا برای تولید کد)
پیمانه تولید کد میانی , ساختار های زبان را که در AST وجود دارند , به ساختارهای کلی تری تبدیل می‌کند این ساختارهای کلی , کد میانی را تولید می‌کنند که به طور خلاصه آن را IC می‌نامیم . طراح کامبایلر تصمیم می‌گیرد کد کدام ساختار , خاص زبان و کدام ساختار کلی است , اما معمولا این انتخاب چندان دشوار نیست . یک معیار برای سطح کد میانی این است که , تولید کد ماشین برای هر نوع ماشینی آسان باشد معمولا کد میانی متشکل از انحصار متقابل عبارات و دستور کنترل جریان است .
نمونه‌هایی از ترجمه‌هایی که توسط پیمانه تولید کد میانی انجام شده ‌اند , عبارتند از : جایگزینی دستور while باشرطها ,برچشبها و پرشها در زبانهای دستوری در زبانهایی با انقیاد پویا کدی را درج می‌کند تا مشخص نماید که چه متدی از یک شیء باید فراخوانی شود, قرار دادن روالی به جای قاعده پرولوگ جستجوی عقبگرد را انجام می‌ده . در هر یک از این موارد , روش دیگر این است که در سیستم زمان اجرا, روالی را با پارامترهای مناسبی فراخوانی کرد (سیستمهای زمان اجرا را در ادامه بررسی خواهیم کرد  .)
قاعده پرولوگ می‌تواند به شکل نمادی باقی بماند و توسط یک روال زمان اجرا تفسیر شود, روال زمان اجرا می‌تواند به طور پویا متدی را پیدا کند که فارخوانی شود. اگر شرط وبدنه دستور while به زیر روالی بی نام تبدیل شوند, این دستور می‌تواند توسط یک روال زمان اجرا انجام شود. پیمانه تولید کد میانی جایی است که در مورد انجام کار توسط کد درونی یا سیستم زمان اجرا تصمیم گیری می‌شود.
پیمانه بهینه سازی کد میانی , پیش پردازشهایی ار بر روی کد میانی انجام می‌دهد تا پیمانه تولید کد میانی کار آمد شود . نمونه‌ای از یک پیش پردزاش ساده , بر چیدن ثوابت است که در ان , تمام عملیات موجود در عبارات که عملوندهای آن مشخص هستند, انجام می‌شوند مثال پیچیده تر , درونی سازی است که در آن , دستور فراخوانی تابع حذف شده به جای آن بدنه تابع قرار می‌گیرد.
پیمانه تولید کد , AST را به صورت یک لیست خطی از دستورات ماشین مقصد بازنویسی می‌کند . برای این کار , دستوراتی را برای بخشهایی از AST انتخاب می‌کند , ثباتهایی را باری نگهداری داده‌ها تخصیص می‌دهد و این دستورات را به ترتیب مناسبی می‌آراید.
پیمانه بهینه سازی که مقصد,لیستی از دستورات نمادی ماشین را در نظر می‌گیرد وسعی می‌کنند آن را بهینه سازی نماید. برای این منظور , به جای دنباله‌ای از دستورات ماشین , دنباله‌های سریعتر یا کوتاهتری را قرار می‌دهد . این پیمانه , از ویژگیهای ماشین مقصد استفاده می‌کند.
مرزهای دقیقی بین بهینه‌سازی کد میانی, تولید کد , وبهینه سازی کدمقصد وجود ندارد . اگر تولید کد به خوبی صورت گیرد, در بهینه سازی کد مقصد کار زیادی انجام نمی‌شود , بر چیدن ثوابت می‌تواند در اثنای تولید کد یا کد مقصد انجام گیرد . علاوه براین بعضی از بهینه سازیها در یک پیمانه نسبت به پیمانه دیگر بهتر انجام می‌شودو تفکیک سه سطح فوق , اهمیت دارد.
پیمانه تولید کد ماشین , دستورات نمادی ماشین را به الگوهای بیتی متناظر تبدیل می‌کند. آدرس ماشین کد برنامه و داده‌ها را تعیین و جداول ثابت و جداول جابه‌جایی را تولید می‌نماید.
پیمانه خروجی کد اجرایی , دستورات ماشین کد شده , جداول ثابت , جداول جابه‌جایی , سرآیندها , پس آیندها و سایر موارد مورد نیاز را توسط سیستم عمل در فایل کد اجرایی ترکیب می‌کند.
 

 

Comments (0) Posted to حل تمرین درس کامپایلر 03/09/2011 Edit

تشريح نحوه عملکرد کامپايلرها - قسمت اول

 

 

مکانيسم کار کامپايلرها

مکانیسم کلی کار کامپایلرها به این صورت است که برنامه مبدا را خوانده و یک شکل میانی از آن ایجاد نموده و سرانجام آن را به زبان دیگری مانند اسمبلی تبدیل می کند و زبان اسمبلی نیز از شکل میانی برنامه شکل قابل فهم سیستم و یا همان صفر و یک ها را ایجاد و آن ها را در قالب Memory Word برای سیستم و سخت افزار مهیا می نماید . لذا تبدیل شکل ابتدایی برنامه مقصد به یک شکل اجرایی سیستمی از وظایف کامپایلر ها می باشد . البته باید توجه کنیم که کامپایلرها بر اساس قواعد و گرامر زبان مبدا اقدام به تولید زبان مقصد می نمایند.

ساختار مفهومی يک کامپايلر:
                                         
1 – ابتدا کامپایلر پردازش اولیه می کند.(راجع به تمام مسایل یکی یکی سوال می کند)
 2 – کنترل ترتیب آیتم ها در این قسمت است .
 3 – چگونگی نحوه اجرا
 
اصولا ترجمه گرها یا مترجم ها را کامپایلر می گویند .کامپایلر برنامه به زبان سطح بالا را به زبان
  سطح پایین تبدیل می کند.
 مفسر برنامه ای است که یک برنامه ورودی به زبان مبدا را می گیرد و آن را اجرا می کند.
 
   تفاوت ميان مفسر و کامپايلر :
 
1 ) مفسر زبان را به صورت مستقیم اجرا می کند ولی کامپایلر ابتدا به زبان مقصد سپس
 توسط مفسر خاصی آنرا ترجمه می کند .
 2 )خطایابی مفسر خط به خط است ولی خطایابی کامپایلر کلی است.
 3 )در کامپایلر می توان یک بار ترجمه کرد و چندین بار از آن استفاده کرد  ولی در مفسر یک بار
 ترجمه و یک بار اجرا داریم مثل VB که فقط یک بار اجرا و کامپایل می کند.
                                  
     سوال ) سرعت اجرا و ترجمه در کامپایلر بیشتر از مفسر می باشد چرا؟
 
در روش تفسیر به دلیل یک مرحله ای بودن ترجمه و اجرا ممکن است کلیه خطاها کشف نشود ولی در
 روش کامپایلر چون در دو فاز مختلف (فاز اول کامپایل و فاز دوم تفسیر) انجام می شود کلیه خطاها قابل
 کشف هستند.
 

 

Comments (0) Posted to حل تمرین درس کامپایلر 03/08/2011 Edit

روند کلاس حل تمرین کامپایلر

 

 

با سلام

روند فعلی کلاس حل تمرین درس اصول طراحی کامپایلر به شرح ذیل می باشد:

کلاس حل تمرین همچنان در روزهای چهارشنبه ساعت 14 الی 16 در کلاس 312 برگزار خواهد گردید. دانشجویانی که برای حضور در کلاس و یا تحویل تکالیف و پروژه های درسی در این ساعت مشکل دارند حتما اطلاع داده و در زمان دیگری بایستی نسبت به این امر اقدام نمایند.

 تکالیف:

چهارشنبه 18 اسفند ماه --->>>  تحویل تحقیق در مورد نحوه عملکرد اسکنر و پارسر و تشریح کامل هر کدام

چهارشنبه 25 اسفند ماه --->>> در صورت برگزاری کلاس، توضیح و راهنمایی در مورد چگونگی انجام پروژه های LEX  و  YACC .

 اولین جلسه سال 1389 --->>> تحویل پروژه های LEX  و  YACC

دومین جلسه سال 1389 --->>> تحویل پروژه های LEX  و  YACC به طور کامل و بدون نقص...

اواسط اردیبهشت سال 1389 --->>> تحویل پروژه اسکنر برای گرامر داده شده با توجه به ویژگی های خواسته شده در پروژه

اواخر خرداد سال 1389 --->>> تحویل کامل پروژه اسکنر و پارسر برای گرامر داده شده با توجه به ویژگی های خواسته شده در پروژه به طور کامل و به صورت ترکیبی بدون نقص همراه با خصوصیت خطایابی ...

 

پیروز باشید

Comments (1) Posted to حل تمرین درس کامپایلر 03/04/2011 Edit

کلاس حل تمرین کامپایلر

 

 

با سلام

قابل توجه دانشجویان درس اصول طراحی کامپایلر ترم دوم سال 1389

زمان و مکان برگزاری کلاس حل تمرین، چهارشنبه ساعت 14 الی 16  کلاس شماره 312 می باشد.

 با توجه به تعریف پروژه ها و تعیین روند کلاس حل تمرین در جلسه ی اول، حضور دانشجویان در کلاس الزامی می باشد.

بدیهی است که توضیحات مربوط به پروژه ها در جلسات آتی تکرار نخواهد گردید و صرفا توضیحات تکمیلی ارائه خواهد گردید.

در ضمن این هفته کلاس حل تمرین برگزار نخواهد گردید.

حل تمرین اصول طراحی کامپایلر

 

چهارشنبه 14-16: کلاس شماره 312 

اولین جلسه کلاس حل تمرین در مورخه 11 اسفند ماه خواهد بود.

پیروز باشید

 

 

Comments (5) Posted to حل تمرین درس کامپایلر 02/19/2011 Edit

تعیین ساعت حل تمرین درس کامپایلر

 

 

 با سلام

قابل توجه دانشجویان درس اصول طراحی کامپایلر ترم دوم سال 1389

لطفا هر کدام از ساعاتی را که برای کلاس حل تمرین مشکلی ندارید در قسمت نظرات همراه با شماره دانشجویی خود وارد نمایید.

میتوانید چندین ساعت را که در آنها مشکلی ندارید انتخاب نمایید.(فقط عدد مقابل هر ساعت را ذکر نمایید.)

 

شنبه ساعت 12 الی 14 --> 1

شنبه ساعت 18 الی 20 --> 2

دوشنبه ساعت 12 الی 14 --> 3

دوشنبه ساعت 16 الی 18 --> 4

چهارشنبه ساعت 14 الی 16 --> 5


 

به عنوان نمونه :

8812431188

1 و 3 و 4

 

لازم به ذکر است که کلاس حل تمرین تنها در یکی از ساعات فوق برگزار خواهد گردید.

پس خواهشا با صداقت زمانهای خالی خود را اعلام نمایید.

پیروز باشید

احمد استیری

Comments (6) Posted to حل تمرین درس کامپایلر 02/13/2011 Edit

برنامه کاری ترم جدید

 

 

با سلام

این ترم هم در خدمت شما دانشجویان عزیز درس اصول طراحی کامپایلر هستم.

لطفا هر چند مدت یک بار وبلاگ رو برای آگاهی از زمان و مکان برگزاری کلاس، تکالیف تحویلی و دریافت صورت پروژه ها و همچنین راهنمایی های لازم برای انجام پروژه چک کنید. (الان بگم که بعدا نگید نگفتم و نمیدونستم و ندیدم و ...!!!)

روال کار این ترم با ترم قبل متفاوت خواهد بود.

شما توی این ترم سه تا پروژه خواهید داشت که در مجموع بیشتر نمره حل تمرین شما رو به خودش اختصاص خواهد داد.

پروژه اول : طراحی یک اسکنر هست که یحتمل تا قبل نوروز باید تحویل بدید.

پروژه دوم : طراحی یک پارسر هست که حدودا تا آخر فروردین یا اوایل اردیبهشت باید تحویل بدید.

پروژه سوم : که در واقع پروژه اصلی شماست و قسمت اصلی نمره رو به خودش اختصاص میده تلفیق دو پروژه اول برای یک گرامر فرضی و اعمال روالهای تصحیح خطا و یک سری موارد دیگه هست که به موقع توی همین وبلاگ براتون میذلرم و موعد تحویل اون هم یحتمل یا تا روز امتحان یا چند روز بعد ازاتمام امتحانات پایان ترمتون هست.

 

پیروز باشید و سربلند

احمد استیری

 

Comments (1) Posted to حل تمرین درس کامپایلر 02/06/2011 Edit


درباره من

احمد استیری

احمد استیری هستم. بنده فارغ التحصیل مقطع کارشناسی ارشد رشته مهندسی کامپیوتر - گرایش نرم افزار از دانشگاه فردوسی مشهد می باشم. دوره کارشناسی ارشد را زیر نظر جناب دکتر کاهانی در آزمایشگاه فناوری وب دانشگاه فردوسی گذرانده ام. در این مدت در حوزه های مرتبط با پردازش متن از جمله وب معنایی و به طور ویژه متن کاوی بر روی متون زبان فارسی فعالیت داشتم. طراحی و پیاده سازی ابزارهای پایه ای پردازش زبان فارسی و به خصوص طراحی نخستین ابزار پارسر زبان فارسی و ابزار ارزیابی خودکار خلاصه سازهای فارسی و همچنین تولید پیکره قرآنی فرقان از جمله کارهای من در دوره کارشناسی ارشد می باشد.
در صورت نیاز به توضیحات تکمیلی و یا هر گرونه سوال و ابهام در مورد موضوعات مطرح شده در وبلاگ با ایمیل زیر مکاتبه نمایید.

پست الکترونیکی من:
UniversityDataInfo{@}yahoo.com

آخرين مطالب بروز شده

موضوعات

پيوندها

کلی

Feeds