Description
به نام خدا
فاز سوم پروژه کامپایلرها و زبانهای برنامهنویسی
پاییز 99
مهلت تحویل: 7 دی
در این فاز پروژه، قرار است تحلیل معنایی زبان Sophia را که در فاز قبلی آغاز کردید به اتمام برسانید. بدین منظور شما قوانین بررسی نوع 1را پیادهسازی خواهید کرد. برای تعیین قوانین از اطلاعات بیانشده در ادامه استفاده کنید.
نوع
همانطور که میدانید هر نوع زیرنوع2 خودش است )رابطه انعکاسی میان نوعها وجود دارد(. به عنوان مثال int<:int است. همچنین رابطهی وراثت یک رابطهی زیرنوع میان کلاسها ایجاد میکند. برای مثال اگر B از A ارثبری کرده باشد) B فرزند A باشد( آنگاه B<:A برقرار است.
Overloading
در زبان Sophia تنها عملگرهای == و =! و تابع print به صورت overloaded تعریف شدهاند .در عبارات e1 == e2 و e1 != e2 باید نوع e1 و e2 یکسان باشد. این دو عملگر روی تمام نوعها بجز لیست تعریف شدهاند .توجه داشته باشید در صورتی که یک عملوند آنها از نوع کلاس یا اشارهگر تابع باشد، عملوند دیگر میتواند null نیز باشد.
در فراخوانی print(e) عبارت e میتواند از نوع string،int و یا bool باشد.
عملگرهای دیگر را طبق جدول زیر بررسی کنید:
1 Type check
2 Subtype
نوع عملوند)ها( عملگرها
int ضرب)*(، تقسیم)/(، باقیمانده)%(، جمع)+(، تفریق)-(، منفی تک عملوندی)-(، تک عملوندی پیشوندی و پسوندی)– و ،(++ بزرگتر)<(، کوچکتر(>)
bool عطف منطقی)&&(، فصل منطقی)||(، نقیض منطقی(!)
فراخوانی متدها
با توجه به اینکه در زبان overloading ،Sophia و overriding برای تعریف متدها نداریم ،هنگام فراخوانی یک متد یک کلاس، باید آن کلاس متد فراخوانی شده را داشته باشد و تعداد آرگومانهای فراخوانی با تعریف یکسان و نوع آنها زیرنوعی از آرگومانهای تعریف شده باشد.
تخصیص
تخصیص عبارت e:T فقط به متغیری از نوع S امکان پذیر است که T<:S باشد.
This
this همواره نوع کلاسی که در حوزهی آن فراخوانی شده است را خواهد داشت.
لیست خطاها
در این فاز لازم است در صورتی که در بررسیهای نام 3خطایی وجود نداشت، موارد زیر را بررسی کنید و در صورت خطا، پیام مناسب را به فرمتی که برای هر خطا گفته شده چاپ کنید و به بررسی کد تا انتهای فایل ادامه دهید. برای اینکه خطا در یک قسمت روی تمام قسمتهای دیگر اثر نگذارد ،فرض میکنیم که تمامی متغیرهایی که در نوع خود خطا دارند از یک نوع پیشفرض به نام NoType هستند) NoType زیرنوع تمامی نوعهای دیگر است.( نوع عباراتی که در نوع خود خطا دارند نیز از همان نوع NoType است.
فرمت کلی هر یک از خطاهایی که باید نمایش دهید به شکل زیر است:
Line:<LineNumber>:<ErrorItemMessage>
مثال:
Line:22:Main class is not found
کهErrorItemMessage برای هر یک از موارد زیر تعریف میشود:
1. عدم ارجاع به متغیری که تعریف نشده است
ErrorItemMessage: Variable <VariableName> is not declared
2. عدم ارجاع به کلاسی که تعریف نشده است
ErrorItemMessage: Class <ClassName> is not declared
3. وجود فیلد و متد کلاس در هنگام فراخوانی
توجه داشته باشید ممکن است فیلد یا متد در خود کلاس موجود نباشد و در اجداد آن موجود باشد.
ErrorItemMessage: There is no member named <MemberName> in class <ClassName>
Name Analysis 3
4. مجاز بودن نوع هنگام استفاده از عملگرها
در عملگرهای دوتایی، در صورتی که یک عملوند از نوع NoType باشد، این خطا باید برای عملوند دیگر بررسی شود.
ErrorItemMessage: Unsupported operand type for operator
<OperatorName>
5. استفاده از نوع bool در شرط ساختار تصمیمگیری و ساختار تکرار نوع شرط در عبارت if و عبارت وسط for باید از نوع bool باشد.
ErrorItemMessage: Condition must be bool
6. عدم تخصیص به عملوند rvalue
ErrorItemMessage: Left side of assignment must be a valid lvalue
7. lvalue بودن عملوندهای ++ و – – )چه به صورت پیشوندی چه پسوندی( به عنوان مثال 22++ قابل قبول نیست.
ErrorItemMessage: Lvalue required as <OperatorName> operand
8. قابل فراخوانی بودن در هنگام فراخوانی
فراخوانی باید روی اشارهگر تابع و یا متدهای کلاسها صورت گیرد.
ErrorItemMessage: Calling a non-callable
9. استفاده از break و continue داخل حلقهی تکرار
ErrorItemMessage: Break statement not within loop
یا
ErrorItemMessage: Continue statement not within loop
11. مجاز بودن نوع ورودی تابع print
ErrorItemMessage: Unsupported type for print
11. عدم تعریف لیست خالی تعریف لیست به صورتی که طول آن 0 باشد، مجاز نیست )مانند list(0 # int)(.
ErrorItemMessage: Cannot have empty list
12. عدم استفاده از عبارت به جای مقدار ثابت integer به عنوان اندیس عناصر لیستی که نوع همهی اعضای آن باهم یکسان نیست
ErrorItemMessage: Expression cannot be used as index of multitype list
13. عدم استفاده از مقدار بازگشتی تابعی که نوع بازگشتی آن void تعریف شده است
ErrorItemMessage: Cannot use return value of a method having void return type
14. بررسی نوع مقدار بازگشتی در هنگام استفاده از دستورreturn با نوع بازگشتی تابع نوع مقدار بازگشتی باید زیرنوع نوع بازگشتی تابع باشد.
ErrorItemMessage: Return value does not match with method return type
15. تطابق آرگومانهای متدها )بجز constructor( با تعریف آنها در هنگام فراخوانی در این قسمت و قسمت بعد ،نوع آرگومانهای متناظر باید زیرنوع نوع تعریف شده برای آن در تعریف تابع باشد.
ErrorItemMessage: Args in method call do not match with definition
16. تطابق آرگومانهای constructor با تعریف آن در هنگام فراخوانی
ErrorItemMessage: Constructor args do not match with definition of class <ClassName>
17. تطابق اسم constructor با اسم کلاس
ErrorItemMessage: Constructor name does not match with class name
18. عدم وجود دو شناسهی یکسان برای عناصر لیست
در صورتی که چندین عنصر شناسهی یکسانی داشتند این خطا باید تنها یک بار چاپ شود )به ازای هر لیست این خطا تنها یک بار چاپ میشود.( توجه داشته باشید در صورتی که عنصری از لیست خود یک لیست باشد این بررسی باید برای آن عنصر هم صورت گیرد )و در صورت وجود خطا، چاپ شود.(
ErrorItemMessage: List elements cannot have the same id
19. لیست بودن نوع پیمایششونده در حلقهی foreachنوع سمت راست in باید از نوع لیست باشد.
ErrorItemMessage: Foreach cannot iterate over a non-list
21. یکسان بودن نوع عناصر لیست در حلقهی foreach
توجه داشته باشید که در هنگام بروز این خطا پیمایششونده لیستی است که نوع همه اعضای آن باهم یکسان نیست.
ErrorItemMessage: Foreach list elements do not have the same type
21. یکسان بودن نوع پیمایشکننده با نوع عناصر لیست در حلقهی foreach
نوع سمت چپ in باید با نوع عناصر لیست سمت راست آن برابر باشد. در صورتی که خطای قسمت قبل رخ داده باشد، باید نوع پیمایشکننده با عنصر اول لیست مقایسه شود.
ErrorItemMessage: Foreach variable <VariableName> and list elements types do not match
22. عدم دسترسی به عناصر متغیری که از نوع لیست نباشد
ErrorItemMessage: Access by index on a non-list
23. integer بودن نوع اندیس در هنگام دسترسی به عناصر لیست
ErrorItemMessage: List index is not an integer
24. وجود عنصر لیست با شناسهی استفاده شده
ErrorItemMessage: There is no element named <Name> in the list
25. وجود کلاس Main
ErrorItemMessage: Main class is not found
26. عدم ارثبری کلاس Main از کلاس دیگر
ErrorItemMessage: Main class cannot extend from any class
27. عدم ارثبری کلاسها از کلاس Main
ErrorItemMessage: Classes cannot extend from Main class
28. Main در کلاس constructor وجود
ErrorItemMessage: No constructor found for Main class
29. عدم تعریف آرگومان در constructor کلاس Main
ErrorItemMessage: Main constructor cannot have arguments
31. عدم دسترسی به اعضای متغیری که از نوع کلاس یا لیست نباشد
ErrorItemMessage: Object or list member access on an expression that is neither a list nor an object
31. وجود گزاره return در تابعی که نوع بازگشتی آن void نباشد )امتیازی(
ErrorItemMessage: Method <MethodName> needs return statement
32. عدم وجود گزارههای دسترسناپذیر )امتیازی(
این خطا برای گزارههایی چاپ میشود که در روند اجرای برنامه دسترسناپذیرند که شامل گزارههایی است که در یک حلقه بعد از break و continue میآیند و گزارههایی که بعد از دستور return میآیند. در صورتی که چند گزارهی دسترسناپذیر پشت سر هم آمده باشند، خطا تنها برای اولین گزاره چاپ میشود.
ErrorItemMessage: Statements are unreachable
نکته: در صورت وجود بعضی خطاها در یک متغیر، خطاهای مرتبط نباید بررسی شوند، مانند:
در صورت وجود خطای قسمت 8، خطاهای قسمتهای 13 و 11 برای آن فراخوانی بررسی نمیشوند.
در صورت وجود خطای قسمت 19، خطاهای قسمتهای 20 و 21 برای آن پیمایششونده بررسی نمیشوند.
همچنین در حالتی که پس از پیمایش کامل کد ورودی هیچ خطایی نداشته باشد ،برنامه شما باید خروجی زیر را چاپ کند:
Compilation successful
نکات مهم:
در این فاز شما باید کدهای داده شده را تکمیل کنید .خطاها و visitorها به شما داده شده و باید از آنها استفاده کنید .کلیه فایل ها را به صورت یک فایل P3_<studentID1>_<studentID2>.zip آپلود کنید )کدهای جدول علائم و گرامر و AST و visitor را هم در آن قرار دهید(. توجه شود که تنها یک نفر از هرگروه باید پروژه را آپلود کند. در صورت عدم رعایت این موارد از شما نمره کسر خواهد شد.
در صورت کشف هر گونه تقلب، نمره 100- لحاظ میشود.
دقت کنید که خروجیهای شما به صورت خودکار تست میشوند؛ پس نحوه چاپ خروجی شما باید عیناعیناً مطابق موارد ذکر شده در بالا باشد. تنها موارد خواسته شده را در فایل خروجی نمایش دهید و از قرار دادن خطهای خالی و فاصله و … نیز خودداری کنید. ترتیب چاپ مهم نیست و تنها کافیست تمامی خطاهای موجود چاپ شده باشند و خطای اضافی چاپ نشده باشد.
در صورتی که قبل از کلاسهای رفع اشکال سوالی برایتان پیش آمد، میتوانید زودتر آنها را بپرسید تا ابهامات شما در ابتدای زمان پروژه برطرف شود و به ساعات پایانی موکول نشود .بهتر است سوالات خود را در فروم یا گروه درس مطرح نمایید تا دوستانتان نیز از آنها استفاده کنند؛ در غیر این صورت به مسئولان پروژه ایمیل بزنید:
amir.pma1378@gmail.com امیر پورمحمدعلی shbmobina@gmail.com مبینا شاهبنده




Reviews
There are no reviews yet.