Description
به نام خدا
فاز اول پروژه کامپایلرها و زبانهای برنامهنویسی
پاییز 99
مهلت تحویل: 51 آبان
در فاز یکم پروژه، شما باید به کمک ابزار ANTLR4 و زبان برنامهنویسی جاوا، برای زبان Sophia )که سند آن را در اختیار دارید( تحلیلگر لغوی و نحوی بنویسید.
تحلیلگر لغوی : برای این بخش از پروژه، باید به کمک ابزار antlr4، تمامی tokenهای مورد نظر خود را مشخص کرده و پیادهسازی کنید.
تحلیلگر نحوی : در این بخش از پروژه، ابتدا با نوشتن قواعد نحوی صحیح، گرامر زبان Sophia را به کمک ANTLR4 پیاده سازی میکنید. بهتر است برای هر کدام از قواعد گرامر خود نام مناسب انتخاب کنید و سپس با اعمال ورودیهای مناسب و تشکیل درخت Parse، گرامر خود را تست کنید. توجه داشته باشید که در این فاز نیازی نیست که هیچگونه قاعده معنایی را پیادهسازی کنید. برای مثال مواردی از قبیل وجود دو متغیر همنام، ارجاع به متغیری که تعریف نشده، بررسی RValue یا LValue عملوندها، وجود break خارج از حلقه و … همگی از مواردی هستند که مربوط به تحلیل معنایی زبان هستند و در این فاز نیازی نیست برای آنها اقدامی صورت گیرد. اما گرامر شما باید به نحوهای باشد که اولویت عملگرها در آن رعایت شده باشد. همچنین گرامر شما نباید شامل چپگردی یا ابهام باشد. در ادامه، پس از نوشتن تحلیلگر لغوی و نحوی، باید به کمک Actionهایی که با زبان جاوا مینویسید و به گرامر خود اضافه میکنید، خروجیهای زیر را بر اساس پیمایش Pre-order در درخت Parse چاپ کنید:
هنگام رسیدن به تعریف هر کلاس ،نام کلاس را به صورت زیر )قبل از مشاهدهی دستورات داخل آن( چاپ کنید:
ClassDec:ClassName,ParentClassName
در صورتی که یک اکتور parent نداشت، تنها نام آن اکتور را )بدون کاما( چاپ کنید.
با رسیدن به تعریف هر متد Constructor، به صورت زیر نام آن را چاپ کنید:
ConstructorDec:ConstructorName
با رسیدن به تعریف هر متد از نوع غیر Constructor، به صورت زیر نام آن را چاپ کنید:
MethodDec:MethodName
در صورت مشاهدهی دستور return، آن را به صورت زیر نمایش دهید:
Return
با رسیدن به تعریف هر متغیر، نام آن را به صورت زیر چاپ کنید:
VarDec:VarName
توجه کنید که تعریف فیلدهای کلاسها هم از نوع تعریف متغیر هستند اما آرگومانهای توابع از نوع تعریف متغیر به حساب نمیآیند و در نتیجه نباید چاپ شوند.
در صورت مشاهده ی دستورات if یا else، به صورت زیر آنها را چاپ کنید:
Conditional:if یا Conditional:else
در صورت مشاهدهی دستور for، آن را به صورت زیر نمایش دهید:
Loop:for
در صورت مشاهدهی دستور foreach، آن را به صورت زیر نمایش دهید:
Loop:foreach
در صورت مشاهدهی دستور break یا continue، آن را به صورت زیر نمایش دهید:
Control:break یا Control:continue
در صورت مشاهدهی فراخوانی یک متد به عنوان یک گزاره، به صورت زیر آن را چاپ کنید:
MethodCall
توجه داشته باشید که فراخوانی متدها در عبارات و … نباید چاپ شود.
در صورت مشاهدهی دستور print، آن را به صورت زیر نمایش دهید:
Built-in:print
عبارتها را بر اساس پیمایش Post-order در درخت عبارت، به صورت زیر چاپ کنید:
در صورت مشاهده یک عملگر، تنها خود عملگر را به صورت زیر چاپ کنید:
Operator:OperatorSymbol به عنوان مثال برای ;y = x + 2 – z، به صورت زیر عملگر را چاپ کنید:
Operator:+
Operator:-
Operator به درخت عبارت آن توجه کنید:
دقت کنید که عملگرهای() ،[] ، . و , نباید چاپ شوند.
همچنین دقت کنید که عبارتهای قبل از : همگی کلیدواژه هستند و آنها را عینا چاپ کنید. تنها موارد خواسته شده را در فایل خروجی نمایش دهید و از قرار دادن خطهای خالی و فاصله و … نیز خودداری کنید.
نمونهای از یک قطعه کد و خروجی آن در ادامه آمدهاست.
نکات مهم:
کد خود را به صورت یک فایل studentID1_studentID2.g4 آپلود کنید.
در صورت کشف هر گونه تقلب، نمره 100- لحاظ میشود.
دقت کنید که خروجیهای شما به صورت خودکار تست میشوند؛ پس نحوه چاپ خروجی شما باید عیناً مطابق موارد ذکر شده در بالا باشد. علاوه بر آن، درخت parse شما نیز بررسی میشود.
بهتر است سوالات خود را در فروم درس مطرح نمایید تا دوستانتان نیز از آنها استفاده کنند؛ در غیر این صورت به مسئولان پروژه ایمیل بزنید:
amir.pma1378@gmail.com امیر پورمحمدعلی shbmobina@gmail.com مبینا شاهبنده




Reviews
There are no reviews yet.