14
وژه درس پرمتا وتو او کامپایلرها طراحیس: دکتر جابری مدر پورنشگاه دا شریف صنعتی کامپیوتر مهندسیانشکده د آموزشی مهندسی سخت گروه افزار نیم سال اول94 - 95

سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

پروژه درس

طراحی کامپایلرهااوتومتا و

پور مدرس: دکتر جابری

صنعتی شریفدانشگاه

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

افزار گروه آموزشی مهندسی سخت

95-94 اولسال نیم

Page 2: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

و کلیات پروژه مقدمه (پروژه آن را بخوانید! انجامقبل از هرچیز امیدوارم، بتوانید تا پایان این مستند را بخوانید)لطفاً قبل از

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

LULU زبان از نوع ین. اشود یکار م Imperative در رابطه با زبان یشتریب یحات. در ادامه توضباشد یم گرا یءش یو البته تا حدود

.آید یم

شامل سه فاز بجای آنکه اعالم شده بود پروژه یزن تر یشکه پ طور همان

(Lexical Analyzer) یاب واژه -1

(Parser) ساختاریاب -2

(Code Generator + Optimizer)ساز و بهینه کدساز -3

جویی در وقت و کم کردن اندازه پروژه نیازی کنید ولی جهت صرفهباشد، تنها یک فاز خواهد داشت. هر چند شما عمالً باید هر سه فاز را طی

به انجام کار اضافه یا احیاناً تحویل نیست.

شود. ضرب می 6.1و یک نفره در 1.3نفره در 2های نمره گروه .شود انجام می نفره 4یا 3های الب گروهقگروهی و در صورت بهپروژه

کنید. امکان ایمیل ،SUTCompiler94Groupاعالم کنید. نام گروه را به با موضوع ماه ام دی25های خود را تا پایان روز الزم است گروه

پس کنید نیز باید انفرادی بودنتان را اعالم کنید. نفرادی کار میها ثابت هستند. حتی اگر ا هر تغییری تا تاریخ فوق وجود دارد و پس از آن گروه

تمرین مشخص شود. ها و زمان تحویل هر گروه باید توسط گروه حل از گروه

نکته .تبدیل کند 0x86را دریافت کرده و آن را به کد قابل اجرا به زبان LuLuدر واقع شما باید یک کامپایلر بنویسید که یک کد به زبان

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

یعنی باید کامالً قابل استفاده باشد. .به نحو مناسبی این کار را بکندهمکاری کند! اگر هم مجبور به این کار شد باید

بر طبق خروجی برنامه تولیدی شما خواهد دهی، زیرا نمره؛ باید اجرا شود تولیدی، کد کنید که توجه( بخوانیدتاکید با ااین پاراگراف ر)

شما بخش اصلی نمره را تشکیل خواهد داد، بنابراین الزم است برنامه شما بتواند از روی خط فرمان فراخوانده شده، ورودی خروجیبود.

پاسخ محور است؛ در صورتی که پاسخ شما صحیح نباشد، با احتمال فراوان ،شود، نمره شما مجدداً تاکید می دریافت کند و جواب را چاپ کند.

همچنین باید نتیجه ساختاریابی پروژه معلوم باشد. )قابل رویت( ی از نمره را دریافت خواهید کرد.تنها درصد بسیار کم

-100نمره ،ها افزار تشخیص تقلب، پروژه شما را کپی تشخیص دهد، برای آن باشد، در صورتی که نرم تقلب و باهم پروژه زدن، ممنوع می

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

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

شود. های اعضای گروه ارائه بعالوه باید مستندی از فعالیت

استفاده از البتهبرای استفاده از هر ابزاری برای تحلیل لغوی و معنایی آزاد هستید. سازی را انجام دهید. همچنین با هر زبانی پیاده آزاد هستید

مجاز نیست. LLVMابزاری مانند

Page 3: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

سازی کنید، ولی تعریف کامل همه پیاده شود مستند را به صورت کامل بخوانید، هرچند که باید فقط بخشی از زبان را بعالوه، تاکید می

های زبان آورده شده است. بخش

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

باشد؛ که با آنها آشنا هستید! می Javaو ++C/Cهای نشبه به زبا

ای مالحظات واژه

کند؛ همچنین این از متغیرها نیز پشتیبانی می Imperativeهای مانند سایر زبان ای بوده و ثوابت عددی، حقیقی، رشته این زبان دارای

case-sensitiveآید. توجه کنید که زبان ها و... نیز در ادامه می منتنیز هست. بعالوه، تعریف کا یکلمه کلیدزبان شامل تعدادی

باشد. می

کلمات کلیدی

ها یا توابع به کار روند: انواعتوانند به عنوان نام متغیرها و یا اسم محسوب شده و نمی یکلمات زیر در زبان جزء کلمات کلید

allocate, bool, break, case, char, const, continue, declare, default, destruct, double,

else, false, function, float, for, goto, if, input, int, long, output, return, sizeof,

static, string, switch, true, type

رهامتغی تعریف و ، بولیناعداد حقیقی اعداد صحیح،

و یا 2بیتی در قالب مکمل 32این اعداد شامل اعداد باشند. می 9-0یک یا بیشتر از بین کاراکترهای هایی از ، شامل رشتهاعداد صحیح

تر الزم نیست( باشد. )درک اعداد بزرگ می 2بیتی، بازهم در سیستم مکمل 64

0𝑥23نیز بکار روند. مثال: Hexتوانند به صورت همچنین اعداد صحیح می = 35

سازی هستند: به چهار صورت قابل پیاده اعداد حقیقی

.1مثال: شامل یک یا بیشتر رقم باشد. "."ای از ارقام به صورتی که سمت چپ کاراکتر رشته -1

.مثال: شامل یک یا بیشتر رقم باشد. "."ای از ارقام به صورتی که سمت راست کاراکتر رشته -2 1

1.1مثال: شامل یک یا بیشتر رقم باشد. "."ای از ارقام به صورتی که سمت چپ کاراکتر رشته -3

و سپس یک رقم با عالمت e یا Eرقم)به صورت صحیح(، کاراکتر )بیشتر از یکی(ای شامل تعدادی به صورت نماد علمی؛ رشته -4

2𝑒مثبت یا منفی. مثال: + 3 = صورت ، توجه کنید که عالمت + اختیاری است؛ و هر رشته که عالمتی نداشته باشد، به 200

دقتی یا دقت مضاعف استاندارد توجه کنید که اعداد حقیقی یا در بازه تک شود. فرض عالمتش مثبت در نظر گرفته می پیش

IEEE754 گیرند قرار می.

Page 4: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

تواند عالمت منفی باشد. توجه کنید که سمت چپ هریک از ثوابت عددی می

اند. نیز در زبان گنجانده شده falseو true، (boolاز نوع )Booleanهمچنین دو ثابت

کاراکتر است. البته 6000حداکثر اندازه یک رشته باشند؛ EOFبجز ASCIIهای توانند شامل همه کاراکتر می ها(String)های رشته متغیر

، یعنی نباید به هر استباید این سایز به صورت پویا تخصیص داده شود )منظور حافظه پویا نیست، بلکه منظور تخصیص به اندازه مورد نیاز

(تخصیص داده شود. 6000رشته اندازه ثابت

باشد. همچنین هیچ متغیری ( میUnderscore) _هایی از کاراکترهای حروف الفبای زبان انگلیسی، اعداد و کاراکتر شامل رشته متغیرها

.شود نمیبا عدد شروع

دیگر مالحظات، ها ، کامنتای ثوابت رشته

های درونی ای)کاراکتر در مورد ثوابت رشته ++Cهمه قواعد زبان شود. آغاز شده، و به همین کاراکتر نیز ختم می ["]ای، با کاراکتر ثوابت رشته

مثال از رشته : باشد. می [‘]. این مورد در رابطه با ثوابت کاراکتری نیز برقرار است، به جز آنکه کاراکتر آغازی/پایانی آن (باشد آنهـا برقرار می

“this is a\t valid String\”…\n”

مثال: یابد. خاتمه می /#شروع شده و با #/های چندخطی با شوند. همچنین کامنت شروع می ##های تک خطی با عالمت کامنت

##single line comment

/# multi line

Comment #/

نمادها و عملوندها

Equal ==

Not Equal !=

Less or Equal <=

Less than <

Bigger than >

Bigger or equal >=

Assignment =

Not !

Bitwise Negation ~

Arithmetic And &

Logical and &&

Arithmetic Or |

Logical Or ||

Logical/Arithmetic Xor ^

Production *

Add +

Page 5: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

Increment ++

Decrement --

Sub and unary Minus -

Div /

Mod %

Opening and Closing

Curly Brace

{ }

Opening and Closing

Parenthesis

( )

Dot .

Comma ,

Colon :

Semi-Colon ;

Opening and Closing

Brace

[ ]

گرامر زبان

سازی به رود. در حقیقت، زبان برنامه نویسی بکار می های برنامه نوشته شده است. این فرم برای توصیف زبان BNFاین گرامر، )تقریباً!( به فرم

کنیم. شود و در این فرم با قراردادهایی این زبان را توصیف می کمک یک زبان مستقل از متن توصیف می

های گرامر زبان هستند.non-terminalان یا هم Variableهای نحوی یا هستند، واژه ⟨𝑎⟩تمام عالئمی که به فرم -

های زبان هستند. ها یا پایانه𝒇𝒐𝒓 ،Terminalاند مثل نوشته شده درشتتمامی عالئمی که -

در آن عبارت اختیاری است. Xظاهر شد، به معنای آن است که حضور [𝑋]اگر عالمتی به صورت -

)از قواعد عبارات منظم هم استفاده شده هستند. 𝑥، به ترتیب به معنای صفر یا بیشتر و یک یا بیشتر رخداد +𝑥یا ∗𝑥عبارات -

است(

اند. سمت راست قواعد تولید با سمت چپ یکسان از یکدیگر تفکیک شده |همچنین به کمک -

بندی عبارات استفاده شده است. صرفاً جهت گروه {}از نماد -

استفاده شده است. Single Quotationی کمکی باال در زبان استفاده شده، از هر جا که از نمادها -

⟨𝑝𝑟𝑜𝑔𝑟𝑎𝑚⟩ → [⟨𝑓𝑡_𝑑𝑐𝑙⟩] ⟨𝑓𝑡_𝑑𝑒𝑓⟩∗

⟨𝑓𝑡_𝑑𝑐𝑙⟩ → 𝒅𝒆𝒄𝒍𝒂𝒓𝒆 ′{′ ⟨𝑓𝑢𝑛𝑐_𝑑𝑐𝑙⟩ + ⟨𝑡𝑦𝑝𝑒_𝑑𝑐𝑙⟩ + ⟨𝑔𝑙𝑜𝑏𝑙_𝑣𝑎𝑟⟩ ′}′

⟨𝑓𝑢𝑛𝑐_𝑑𝑐𝑙⟩ →′ {′ ⟨𝑓𝑢𝑛𝑐_𝑝𝑟𝑜𝑡⟩ ′; ′ ′}′

⟨𝑓𝑢𝑛𝑐_𝑝𝑟𝑜𝑡⟩ →′ (′ [⟨𝑎𝑟𝑔𝑠⟩]′)′𝒊𝒅 ′( ′ [⟨𝑝𝑎𝑟𝑎𝑚𝑠⟩] ′)′

⟨𝑔𝑙𝑜𝑏𝑙_𝑣𝑎𝑟⟩ → ′{′ [⟨𝑡𝑦𝑝𝑒⟩ 𝒊𝒅; ]∗ ′}′

Page 6: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

⟨𝑎𝑟𝑔𝑠⟩ → ⟨𝑡𝑦𝑝𝑒⟩ , ⟨𝑎𝑟𝑔𝑠⟩ | ⟨𝑡𝑦𝑝𝑒⟩

⟨𝑝𝑎𝑟𝑎𝑚𝑠⟩ → ⟨𝑡𝑦𝑝𝑒⟩ 𝒊𝒅, ⟨𝑝𝑎𝑟𝑎𝑚𝑠⟩ | ⟨𝑡𝑦𝑝𝑒⟩ 𝒊𝒅

⟨𝑡𝑦𝑝𝑒_𝑑𝑐𝑙⟩ →′ {′ 𝒊𝒅 ′; ′ ′}′

⟨𝑓𝑡_𝑑𝑒𝑓⟩ → (⟨𝑓𝑢𝑛𝑐_𝑑𝑒𝑓⟩ + ⟨𝑡𝑦𝑝𝑒_𝑑𝑒𝑓⟩)∗

⟨𝑡𝑦𝑝𝑒_𝑑𝑒𝑓⟩ → 𝒕𝒚𝒑𝒆 𝒊𝒅 ′{′ (⟨𝑓𝑖𝑒𝑙𝑑⟩ ′; ′)+ ′}′

⟨𝑓𝑖𝑒𝑙𝑑⟩ → ⟨𝑡𝑦𝑝𝑒⟩ 𝒊𝒅 ;

⟨𝑓𝑢𝑛𝑐_𝑑𝑒𝑓⟩ → 𝒇𝒖𝒏𝒄𝒕𝒊𝒐𝒏 𝒊𝒅 ′: ′ ⟨𝑖𝑛𝑜𝑢𝑡⟩ ′{′ ⟨𝑏𝑙𝑜𝑐𝑘⟩ ′}′

⟨𝑖𝑛𝑜𝑢𝑡⟩ → [⟨𝑖𝑛𝑝𝑢𝑡_𝑙𝑖𝑠𝑡⟩] [⟨𝑜𝑢𝑡𝑝𝑢𝑡_𝑙𝑖𝑠𝑡⟩]

⟨𝑖𝑛𝑝𝑢𝑡_𝑙𝑖𝑠𝑡⟩ → 𝒊𝒏𝒑𝒖𝒕 ⟨𝑝𝑎𝑟𝑎𝑚𝑠⟩

⟨𝑜𝑢𝑡_𝑙𝑖𝑠𝑡⟩ → 𝒐𝒖𝒕𝒑𝒖𝒕 ⟨𝑝𝑎𝑟𝑎𝑚𝑠⟩

⟨𝑏𝑙𝑜𝑐𝑘⟩ → ′{′ { ⟨𝑣𝑎𝑟_𝑑𝑐𝑙⟩ | ⟨𝑠𝑡𝑎𝑡𝑒𝑚𝑒𝑛𝑡⟩ }∗ ′}′

⟨𝑡𝑦𝑝𝑒⟩ → 𝒊𝒏𝒕 | 𝒃𝒐𝒐𝒍 | 𝒇𝒍𝒐𝒂𝒕 | 𝒍𝒐𝒏𝒈 | 𝒄𝒉𝒂𝒓 | 𝒅𝒐𝒖𝒃𝒍𝒆 | 𝒊𝒅 | 𝒔𝒕𝒊𝒓𝒏𝒈 | ⟨𝑡𝑦𝑝𝑒⟩ ′[′ ′]′

⟨𝑣𝑎𝑟_𝑑𝑐𝑙⟩ → [𝒄𝒐𝒏𝒔𝒕] ⟨𝑡𝑦𝑝𝑒⟩ ⟨𝑣𝑎𝑟_𝑑𝑐𝑙_𝑐𝑛𝑡⟩ [, ⟨𝑣𝑎𝑟_𝑑𝑐𝑙_𝑐𝑛𝑡⟩]∗ ;

⟨𝑣𝑎𝑟_𝑑𝑐𝑙_𝑐𝑛𝑡⟩ → ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ [= {⟨𝑒𝑥𝑝𝑟⟩ | 𝒂𝒍𝒍𝒐𝒄𝒂𝒕𝒆 }]

⟨𝑠𝑡𝑎𝑡𝑒𝑚𝑒𝑛𝑡⟩ → ⟨𝑎𝑠𝑠𝑖𝑔𝑛𝑚𝑒𝑛𝑡⟩ ;

| ⟨𝑓𝑢𝑛𝑐_𝑐𝑎𝑙𝑙⟩ ;

| ⟨𝑐𝑜𝑛𝑑_𝑠𝑡𝑚𝑡⟩

| ⟨𝑙𝑜𝑜𝑝_𝑠𝑡𝑚𝑡⟩

| 𝒓𝒆𝒕𝒖𝒓𝒏;

| ⟨𝑔𝑜𝑡𝑜⟩ ;

| ⟨𝑙𝑎𝑏𝑒𝑙⟩

| ⟨𝑒𝑥𝑝𝑟⟩;

| 𝒃𝒓𝒆𝒂𝒌 ;

| 𝒄𝒐𝒏𝒕𝒊𝒏𝒖𝒆 ;

| 𝒅𝒆𝒔𝒕𝒓𝒖𝒄𝒕 [{′[′′]′}+] 𝒊𝒅 ;

| 𝒔𝒊𝒛𝒆𝒐𝒇(⟨𝑡𝑦𝑝𝑒⟩);

⟨𝑎𝑠𝑠𝑖𝑔𝑛𝑚𝑒𝑛𝑡⟩ → ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ = ⟨𝑒𝑥𝑝𝑟⟩

| ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ = 𝒏𝒆𝒘

| ′(′ ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩[, ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩]∗ ′)′ = ⟨𝑓𝑢𝑛𝑐_𝑐𝑎𝑙𝑙⟩

⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ → 𝒊𝒅 [{ ′[′ ⟨𝑒𝑥𝑝𝑟⟩ ′]′ } +][. ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩]

| − −⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩

| + +⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩

Page 7: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

| ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ − −

| ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ + +

⟨𝑓𝑢𝑛𝑐_𝑐𝑎𝑙𝑙⟩ → 𝒊𝒅 ′(′ [ ⟨𝑝𝑎𝑟𝑎𝑚𝑒𝑡𝑒𝑟𝑠⟩] ′)′

⟨𝑝𝑎𝑟𝑎𝑚𝑒𝑡𝑒𝑟𝑠⟩ → ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩

| ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩ , ⟨𝑝𝑎𝑟𝑎𝑚𝑒𝑡𝑒𝑟𝑠⟩

⟨𝑐𝑜𝑛𝑑_𝑠𝑡𝑚𝑡⟩ → 𝒊𝒇 ′(′ ⟨𝑒𝑥𝑝𝑟⟩′)′ ⟨𝑏𝑙𝑜𝑐𝑘⟩ [ 𝒆𝒍𝒔𝒆 ⟨𝑏𝑙𝑜𝑐𝑘⟩]

| 𝒔𝒘𝒊𝒕𝒄𝒉 (𝒊𝒅) 𝒐𝒇 ∶ ′{′ [{𝒄𝒂𝒔𝒆 𝒊𝒏𝒕_𝒄𝒐𝒏𝒔𝒕 ∶ ⟨𝑏𝑙𝑜𝑐𝑘⟩}∗ ] 𝒅𝒆𝒇𝒂𝒖𝒍𝒕: ⟨𝑏𝑙𝑜𝑐𝑘⟩ ′}′

⟨𝑙𝑜𝑜𝑝_𝑠𝑡𝑚𝑡⟩ → 𝒇𝒐𝒓 ′(′ [⟨𝑣𝑎𝑟_𝑑𝑐𝑙⟩] ; ⟨𝑒𝑥𝑝𝑟⟩ ; [⟨𝑎𝑠𝑠𝑖𝑔𝑛𝑚𝑒𝑛𝑡⟩ | ⟨𝑒𝑥𝑝𝑟⟩] ′)′ ⟨𝑏𝑙𝑜𝑐𝑘⟩

⟨𝑔𝑜𝑡𝑜⟩ → 𝒈𝒐𝒕𝒐 𝒊𝒅

⟨𝑙𝑎𝑏𝑒𝑙⟩ → 𝒊𝒅 ∶

⟨𝑒𝑥𝑝𝑟⟩ → ⟨𝑒𝑥𝑝𝑟⟩ ⟨𝑏𝑖𝑛𝑎𝑟𝑦_𝑜𝑝⟩ ⟨𝑒𝑥𝑝𝑟⟩

| ′(′ ⟨𝑒𝑥𝑝𝑟⟩ ′)′

| ⟨𝑓𝑢𝑛𝑐_𝑐𝑎𝑙𝑙⟩

| ⟨𝑣𝑎𝑟𝑖𝑎𝑏𝑙𝑒⟩

| ⟨𝑐𝑜𝑛𝑠𝑡_𝑣𝑎𝑙⟩

| − ⟨𝑒𝑥𝑝𝑟⟩

| ! ⟨𝑒𝑥𝑝𝑟⟩

⟨𝑏𝑖𝑛𝑎𝑟𝑦_𝑜𝑝⟩ → ⟨𝑎𝑟𝑖𝑡ℎ𝑚𝑎𝑡𝑖𝑐⟩ | ⟨𝑐𝑜𝑛𝑑𝑖𝑡𝑖𝑜𝑛𝑎𝑙⟩

⟨𝑎𝑟𝑖𝑡ℎ𝑚𝑎𝑡𝑖𝑐⟩ → + | − | ∗ | / | % | & | ′|′ | ^ | ′||′ | &&

⟨𝑐𝑜𝑛𝑑𝑖𝑡𝑖𝑜𝑛𝑎𝑙⟩ → == | ! = | >= |<=| < | >

⟨𝑐𝑜𝑛𝑠𝑡_𝑣𝑎𝑙⟩ → 𝒊𝒏𝒕_𝒄𝒐𝒏𝒔𝒕 | 𝒓𝒆𝒂𝒍_𝒄𝒐𝒏𝒔𝒕 | 𝒄𝒉𝒂𝒓_𝒄𝒐𝒏𝒔𝒕 |𝒃𝒐𝒐𝒍_𝒄𝒐𝒏𝒔𝒕 | 𝒔𝒕𝒓𝒊𝒏𝒈_𝒄𝒐𝒏𝒔𝒕 | 𝒍𝒐𝒏𝒈_𝒄𝒐𝒏𝒔𝒕

قوانین زبان

است!! به همین ترتیب، قواعد مشابهی نیز دارد که Pascalو Cی ها این زبان بسیار شبیه به زبانهمانطور که احتماالً تا کنون متوجه شدید،

آیند. در ذیل می

شود. عدم وجود این تابع باعث بروز آغاز می intبا نوع خروجی ، بدون آرگومان ورودی وstart، روند اجرای برنامه از تابع ++Cمشابه زبان

شود. می ی معناییخطا

Page 8: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

ها ساختار برنامه

تابع و متغیر سراسری است. نوع وادی هر برنامه دارای تعد

انواع

است. Cهر نوع مشابه ساختار در زبان

شود. توجه کنید که هر declareبار یک حداکثرو شود. می defineیکبار دقیقاً نوعشوند؛ هر defineیا declareتوانند می عاانو

از یمان تابع یا متغیر بازگشتی یا یکبه عنوان آرگو نوعشود. همچنین استفاده از یک فقط در حوزه سراسری انجام مییک از این دو عمل

defineشده باید declareی که نوعشدن آن امکان پذیر است؛ هر declare( بعد از Compositionدیگر)استفاده از نوعاعضای

نیز بشود.

توابع

. همچنین هر دارد( startتابع )البته هر برنامه دقیقاً یک که نقطه شروع برنامه است باشد startباید شامل یک متد حداقل، هر برنامه

هر تابع تعدادی ورودی و تعدادی خروجی دارد.تواند، تعدادی تابع داشته باشد. برنامه می

ر خارج از تابع نیز کنند. بنابراین تغییرات روی محتوای متغیرها د دریافت می call-by-referenceهایشان را به شیوه همه توابع پارامتر

است. valueاز نوع ای همه انواع داده همچنین خروجی توابع برای گذارد. اثر می

باشد؛ به این نیز مجاز می overloadingشوند. همچنین در این زبان، defineیا declare ها نوعتوانند مانند همچنین توابع نیز می

معنا که توابع با اسامی و نوع خروجی یکسان، پارامترهای متفاوتی داشته باشند.

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

باشند.

گرداند. توجه کنید که ورودی و خروجی تابع در ها را باز می کند و خروجی برسد کار را تمام می returnهمچنین هر تابع هر گاه به گزاره

آیند. ابتدای آن می

ها است، باهم های آن ها و خروجی یکدیگرند اگر و تنها اگر، نام یکسان داشته باشند و امضای آنها که شامل ورودی overloadدو تابع

متفاوت باشد.

متغیرها

توان آرایه شوند، همچنین از هریک از این انواع می ( تقسیم میUser-defined)ای ( و غیرپایهPrimitiveای) متغیرها، به دو بخش پایه

( قابل Block( تعریف، یا سراسری هستند و یا محلی. متغیرهای سراسری از هر بخشی)Scopeت. همچنین متغیرها از نظر حوزه)نیز داش

اند، قابل شناسایی و استفاده هستند؛ همچنین در آن تعریف شده که یBlockفقط در داخل دسترسی هستند. اما متغیرهای محلی

.مقداردهی اولیه ندارند متغیرهای سراسری دیگر قابل دسترسی نیستند. Blockمتغیرهای محلی پس از اتمام

Page 9: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

ها فضا برای آنهستند و باید قبل از استفاده reference، به شکل نویس ع تعریف شده توسط برنامهاانوهای مربوطه به instanceکلیه

ر مراجعه کنید(. همچنین این فضا باید به صورتی تخصیص داده شود؛ به گرام انجام می allocate)این کار با استفاده از در نظر گرفته شود

( فضا آزاد شود.destructشود که تا پایان برنامه، این فضا باقی مانده و فقط در صورت درخواست کاربر)

فظه تخصیص دهیم. )این نکته کافی است برای کل آرایه یک بار حا ها باید با استفاده از حافظه پویا مقدار دهی شوند. به این منظور همه آرایه

.است( Cدر تعارض با زبان

شامل فیلد ثابت نیستند. ها نوعماند. هنگام تعریف مقداردهی شده و این مقدار نیز تا پایان برنامه ثابت می باید )ثابت( constمتغیرهای

بدیهی است متغیر سراسری ثابت نداریم.

باشد، یعنی ترکیبی یا چند اپراتور به پیشوندی و پسوندی نیست؛ هر چند برای تغییر مقدار متغیرها ساده می --یا ++همچنین استفاده از

نداریم. a+(c++)*dیعنی مثالً دهد. گرامر چنین امکانی را می

سایر ساختارها

.در هر نقطه از کد امکان تعریف متغیر وجود دارد -

کند؛ در صورتی که مقدار یک متغیر را برابر عبارتی قرار دهیم، مقدارش سازی کار می نامههای بر اپراتور انتساب، مانند سایر زبان -

وجود دارد؛ به این صورت که مقدار castامکان پایه انواع همهبرای اد.را با یک آرایه انجام د توان این کار نمیکند، اما تغییر می

ارزش ، بایت کمcharبه intشوند. در تبدیل ابتدایی تبدیل میاعداد اعشاری یا صحیح به نزدیکترین مقدار ممکن به مقدار واقعی

به صورت (int, char) ,(float, double) ,(int, double) ,(int, float)های شود. به این ترتیب تبدیل منتقل می

تبدیالت بین ها نیز صادق است(. بقیه موارد به صورت خطا هستند. )این توضیحات در مورد عکس این تبدیل شوند نی انجام میضم

ردهبرابر شئ دیگری از همان ردههمچنین هنگامی که یک شئ از یک کند. ای از قانون زیر تبعیت می با سایر انواع پایه boolانواع

همچنین هر دهد. رخ می Pointerگیرد. همان اتفاقی که هنگام انتساب رابر آدرس شئ دوم قرار میقرار گیرد، آدرس شئ اول ب

تواند به یک آرایه از کاراکترها انتساب داده شود. رشته می

شود. فرض می trueو مقدار غیر صفر falseهر جا که نیاز به عبارت شرطی است، مقدار صفر به معنای -

بر روی اعداد صحیح قابل اجرا هستند.های بیتی، فقط عملگر -

.ها قابل استفاده هستند فقط داخل بدنه حلقه continueو breakعبارات -

ضروری است. defaultشود، همچنین وجود ها اجرا میcase، دقیقاً بدنه یکی از switch-caseدر ساختار -

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

statement دهند مقدار را تغییر می.

gتابع fبازگردد. مثالً اگر callerشود، توجه کنید که این کنترل اجرا در نهایت باید به میکنترل اجرا بین توابع دست به دست -

بازگردد. همچنین، فراخوانی تو در تو و بازگشتی نیز مجاز است. fباید کنترل به gرا صدا زده پس از اتمام

گرداند. یک رشته گرفته و طول آن را باز می ()lenدر این زبان تابع -

Page 10: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

اند. هر یک از توابع یک متغیر را دریافت کرده برای اعمال ورودی/خروجی در نظر گرفته شده writeو readدر این زبان دو تابع -

دهی بر تست و نمره باشد. می stdin/stdoutورودی/خروجی این توابع د.نده کار متناسب را انجام میو بر اساس نوعش

باشد. اساس عملکرد این دو تابع می

سازی توابع دو بند باال اجباری است. پیاده -

ر میان ارزیابی آن دارد، به این معنا که در صورتی که جواب یک عبارت شرطی د Boolean short circuitاین زبان خاصیت -

گردد. مشخص شود، مابقی عبارت بررسی نمی

سازی بخش تابع( )در صورت پیاده فضای همه متغیرهای محلی باید در پشته باشد. -

نقطه مشخص شده توسط یک نیز هست. این دستور بدون انجام هیچ کار اضافه، کنترل اجرا را به gotoاین زبان شامل دستور -

label دهد. نام میlabel ها یکتاست ولی یکlabel تواند هم نام یک متغیر باشد. نیازی نیست که میlabel ها از قبل تعریف

declarationتواند در یک بخش اجرایی و در فضایی که فقط فقط می labelروند. همچنین، هر بکار می Cشوند و مانند زبان

یک تابع است.لزوماً داخل goto. پس مقصد یک قرار گیرد ،وجود دارد

نوع مربوط به هم است. در آرایه این تاکید وجود دارد که ای از عناصر هم داده دانید که آرایه، ساختمان ها!( می )خالصه کار با آرایه -

ر داخل این اپراتوباشد یک آرایه نام دارد. []سرهم باشند. هر متغیری که پس از نامش حاوی تعدادی اپراتور های آرایه پشت خانه

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

آن را نابود نسازد، به destructدستور اتا زمانی که کاربر ب شود. تخصیص داده شده به آرایه به صورت پویا تخصیص داده می

( همچنین سایزی که باید به آرایه تخصیص داده شود در زمان اجرا محاسبه شده و دقیقاً به C)مثل شود. سیستم پس داده نمی

باشد. می Cالزم به ذکر است نحوه دسترسی به هر عضو از آرایه مشابه زبان شود. همان میزان فضا تخصیص داده می

آرایه ییidخود محلی است. فقط idشوند که این ایی میشان شناسidها عمالً یک نوع هستند و با همچنین توجه کنید که آرایه

به عنوان محاسبه آدرس برای هر []گر لتوان از عم نمی Cآرایه تعریف شده باشد. )مانند زبان به شکل است که در زمان تعریف

متغیری استفاده کرد و این خطای معنایی است(

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

( و یک nasmیا gasباشد. برای تبدیل کد به یک برنامه اجرایی، فقط اجازه استفاده از یک اسمبلر) می x86خروجی به زبان اسمبلی

linker های دارید. استفاده از همه کتابخانهراC همچنین ابزار شما باید از طریق خط فرمان قابل فراخوانی باشد. این باشد. مجاز مینیز

پارامتر اول یک فایل به شود( بینی حاالت خاص نیست، حتماً دو آرگومان داده می برنامه باید دو پارامتر ورودی را دریافت کند )نیازی به پیش

(. پارامتر دوم هم یک فایلی است که باید خروجی در آن ریخته شود. نوع این فایل از دو حالت خارج نیست؛ a.luluاست )مثالً LuLuزبان

که باید خروجی اسمبلی داخل آن نوشته شود یا فایلی بدون پسوند که فایل اجرایی برنامه است. به عنوان مثال اگر نام s.یک فایل با پسوند

کامپایل شود، دو حالت وجود دارد: a.luluباشد و قرار باشد فایل compilerبرنامه

compiler a.lulu out1.s

compiler a.lulu out1

دهد. دهد و دومی همین کار را با فایل اجرایی انجام می که اولی کد اسمبلی تولید شده را در مسیر برنامه قرار می

Page 11: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

آید، مثالً در دو دستور باال فایل می ParseReport.txtهمچنین به ازای هر دستور یک فایل با نام کد منبع که به دنبال آن عبارت

«aParseReport.txt» شود. تولید می

تحویل پروژه ایمیلاز طریق 23.59ماه بهمن16مهلت تحویل:

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

روز( 8درصد، کسر خواهد شد. )حداکثر تاخیر 5ساعت به ازای هرجریمه تاخیر:

lcompilerنام برنامه:

ام 17دقیقه است. هر یک ساعت کامل تاخیر در ارسال کد باعث کسر نمره خواهد شد. انشاءاهلل روز 23.59بهمن ساعت 16زمان تحویل نهایی

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

انجام داده مچنین حضور همه اعضا نیز ضروری است. بعالوه همراه تحویل باید یک گزارش ارائه شود که در آن کاری که هرکس باشید. ه

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

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

در این رابطه ایمیل نزنید! وجود ندارد!با توجه به مهلت ارسال نمرات، امکان تمدید، به هیچ وجه

روز تحویل درافزار تشخیص کپی، انشاءاهلل ماشین خواهد بود! برای ارزیابی صحت کار نرم عهدهاز کپی کردن خودداری کنید؛ تشخیص کپی بر

تست صحت عملکرد برنامه، در صورت اعتراض، به اعتراض شما رسیدگی شود و در صورت بروز خطا در روند تصحیح و بر وری عالوهحض

شود که تسلط شما بر کد مهم است و ضریب تسلط شما در نمره شما تاثیر مستقیم دارد. مجدداً تاکید میدهی این خطا رفع شود. نمره

توجهی بر عهده خود شماست. عواقب هر گونه بیبه تذکرات توجه کنید!

ها باید به صورت زیر باشد: گذاری فایل نامدر آورید، zip.ها را باید قبل از ارسال به قالب همه فایل

[SUTCompiler94aProject][Group No]

[SUTCompiler94aProject][3]

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

داده شده به زبان مبدا است.

ای بنویسید، که هر کد زبان داده شده )منطبق بر گرامر و تعریف( را ساختاریابی باید خودتان یا به کمک یکی از ابزارهای داده شده، برنامه

تغییر آن را بایدکردن مناسب نیست؛ Parseبرای توجه کنید که گرامر داده شده آید(. )طبق قالبی که مینتیجه را گزارش کند کرده و

ای را که منطبق بر توضیحات ارائه شده است را بپذیرد. دهید؛ البته این تغییر باید به صورتی باشد که زبان آن عوض نشود و بتواند هر رشته

که با این قوانین منافات نداشته باشد؛ ایرادی ندارد(.ای باشد )اگر تغییر زبان، بگونه

Page 12: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

صحیح نیست. برنامه شما باید برای هر Semanticو Syntaxشود که لزوماً از نظر یک فایل دلخواه به کامپایلر شما داده میبنابراین

ای باشد خروجی دهد. این کد اسمبلی باید به گونهای که صحت هر دو جنبه را داشت، یک فایل اجرایی و کد اسمبلی آن فایل اجرایی را برنامه

باشد؛ کد باید توسط که بعد از اسمبل شدن برنامه اجرایی را خروجی دهد. همچنین استفاده هر ابزاری که تولید کد را انجام دهد، مجاز نمی

خود شما تولید شود.

یا nasmتوانید از یکی از دو اسمبلر تر نیز اشاره شد می طور که از پیشسازگار باشد. همان Linux برنامه اجرایی و کد اسمبلی باید با پلتفرم

gas اولی به شیوه( استفاده کنیدIntel و دومی به شیوهAT&T در صورتی که می می )های دیگر مبتنی بر خواهید از اسمبلر باشدx86

عامل برنامه اجرایی شما بر روی سیستم بیتی قابل اجرا باشد.32های همچنین کد باید بر روی پردازنده استفاده کنید، از قبل هماهنگ کنید.

Ubuntu .اجرا خواهد شد

با این حال، اگر در مورد هر تست، کاشف به عمل آید که برنامه شما اتفاقی گیرد ، نمره به صحت عملکرد کد تولیدی شما تعلق میدر این پروژه

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

( اگر noیا yes) اید را نوشته Parseتوید کنید که در آن نتیجه ParseReportهمانطور که اشاره شد، برای هر فراخوانی باید یک فایل

اشد.بود، فایل درخواستی خروجی باید خالی ب noنتیجه

برنامه تولیدی ورودی و خروجی

شوند. پذیرفته می readیا writeتوسط تابع Primitiveکار کند. همچنین فقط انواع stdoutو stdinبا تولیدی الزم است برنامه

رقم چاپ شود. )در صورتی 6 حداکثرتنها نکته در مورد خروجی اعداد اعشاری است؛ بخش صحیح باید کامل چاپ شود و بخش اعشاری تا

(1.250000نه 1.25شد، بقیه ارقام نباید چاپ شوند مثال: رقم با 2که نیازی به

Page 13: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

توزیع نمرات

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

.دارد

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

های امتیازی بخشتمرین اطالع دهید. ام بهمن به گروه حل15همچنین الزم است اگر قصد دارید بخش امتیازی را انجام دهید تا تاریخ

بدست آورید. آنهانمره از 82توانید حدود اند و می مشخص شده

هر سوالی داشتید در اسرع وقت بپرسید.

Point Phase

20 Parser

80 Code Generator

100 Total

امتیازی امتیاز نسبی مورد تولید کد

4 خواندن از ورودی

4 نوشتن در خروجی

1 ای همگن)غیر تابع( انتساب صحیح انواع داده

4 محاسبات ساده صحیح )جمع و تفریق(

5 محاسبات ساده صحیح )ضرب و تقسیم(

6 محاسبات صحیح )همه محاسبات + تقدم عملگرها(

* long 4محاسبات صحیح با حضور نوع

2 محاسبات صحیح بیتی

1 (cast) تبدیل انواع در محاسبات و انتساب

1 و کاراکتر Booleanمتغیر

3 ، انتساب به آرایه کاراکتری و کارهای مرتبطlenرشته، تابع

* 7 محاسبات ممیز شناور

* 5 محاسبات ترکیبی

7 ساختار شرطی

2 تعریف صحیح متغیر سراسری

4 سازی صحیح متغیر محلی تعریف و پیاده

* 2 متغیرهای ثابت )پیش نیاز: متغیر محلی و سراسری(

3 و طول عمر متغیرها Blockساختار صحیح

Inc & Dec 2

for 5حلقه

Page 14: سرد هژورپ اهریاپماک یحارط و اتمتواce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Project/Compiler... · 1.1 لاثم دشاب مقر رتشیب

4 سازی نوع‎پیاده

3 سازی نوع( سازی صحیح اعالن نوع )پیش نیاز: پیاده پیاده

* 8 (+ تابع بازگشتی سازی تابع )فراخوانی و اجرا پیاده

* 5 سازی تابع )بازگشت مقادیر خروجی( پیاده

* 4 سازی تابع)هر دو(( سازی اعالن تابع)پیش نیاز: پیاده پیاده

* 4 )پیش نیاز: اعالن تابع( function overloadingسازی کامل پیاده

start 1نیاز به تابع

3 عملکرد صحیح جدول نمادها )متغیر هم نام، کلمات کلیدی و...(

4 تعریف و استفاده از آرایه یک بعدی + تخصیص حافظه

* 5 تعریف و استفاده آرایه چند بعدی + تخصیص حافظه

2 تخصیص مناسب حافظه پویا

2 آزاد سازی صحیح حافظه پویا

1 سازی حلقه( )پیش نیاز: پیاده breakدستور

1 سازی حلقه( )پیش نیاز: پیاده continueدستور

* 7 هاlabelو تعریف gotoدستور

* switch-case 4دستور

* 6 با جدول پرش switch-caseدستور

* 8 (Dead-Code Eliminationهای غیر قابل دسترس) حذف کد

Constant Folding 3 *

Constant Propagation 5 *