Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا...

26
ﮐﺎﻣﭙﺎﯾﻠﺮ ﻃﺮاﺣﯽ اﺻﻮل ﺑﻄﺤﺎﺋﯿﺎن1 اول ﺼﻞ: ﻣﻘﺪﻣﻪ ﺷﻮد ﻣﯽ اراﯾﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﻔﻬﻮم از اﺟﻤﺎﻟﯽ ﺗﻌﺮﯾﻔﯽ ﻓﺼﻞ اﯾﻦ در. ﻫﻤﭽﻨﯿﻦ ﻣﻘﺪﻣﻪ ﮐﻪ زﺑﺎﻧﻬﺎ و ﮔﺮاﻣﺮﻫﺎ ﻣﻔﺎﻫﯿﻢ ﻣﯽ ﮐﺎﻣﭙﺎﯾﻠﺮ ﯾﮏ ﻃﺮاﺣﯽ ﮔﺮدد ﻣﯽ ﯾﺎدآوری ﺑﺎﺷﺪ،. 1 - ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﻔﻬﻮم ﭼﯿﺴﺖ؟ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺗﺮﺟﻤﻪ ﻣﻘﺼﺪ زﺑﺎن ﺑﻪ ﻣﻨﺒﻊ زﺑﺎن از را ﺑﺮﻧﺎﻣﻪ ﯾﮏ ﮐﻪ اﯾﺴﺖ ﺑﺮﻧﺎﻣﻪ ﮐﻨﺪ. ﮐﻨﺪ ﻣﯽ ﺗﻮﻟﯿﺪ ﻧﯿﺰ ﺧﻄﺎ ﭘﯿﻐﺎم ﺑﯿﻦ اﯾﻦ در. ﺷﮑﻞ1 ﺗﺎرﯾﺨﭽﻪ از ای ﮐﺎﻣﭙﺎﯾﻠﺮﻫﺎ دﻫﻪ اواﯾﻞ ﺗﺎ1940 : ﺑﻪ ﻧﻮﯾﺴﺎن ﺑﺮﻧﺎﻣﻪ ﻣﺎﺷﯿﻦ زﺑﺎن ﻧﻮﺷﺘﻨﺪ ﻣﯽ را ﻫﺎ ﺑﺮﻧﺎﻣﻪ. دﻫﻪ اواﺧﺮ1940 : زﻣﺎن اﯾﻦ در اﺳﻤﺒﻠﯽ زﺑﺎن ﺷﺪ ﻣﻌﺮﻓﯽ. ﺑﺎ ﺗﺮﺗﯿﺐ اﯾﻦ ﺑﻪ ﻧﺎﻣﮕﺬا ﺣﺎﻓﻈﻪ ﻣﮑﺎﻧﻬﺎی و دﺳﺘﻮرﻫﺎ ری ﺑﺮﻧﺎﻣﻪ ﮐﺎر ﺷﺪ ﺗﺮ ﺳﺎده ﮐﻤﯽ ﻧﻮﯾﺴﯽ. زﺑﺎن اﯾﻦ اﻣﺎ ﺑﺴﯿﺎر اﻓﺰار ﺳﺨﺖ ﺑﻪ واﺑﺴﺘﻪ اﺳﺖ. 1957 : ﺷﺪ ﻋﺮﺿﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ اوﻟﯿﻦ: FORTRAN دﻫﻪ60 و70 : ﺳﺎﻟﻬﺎ اﯾﻦ در ﮐﺎﻣﭙﺎﯾﻠﺮ ﮐﻨﻮﻧﯽ ﻣﻔﺎﻫﯿﻢ آﻣﺪ ﺑﺎزار ﺑﻪ آن ﻣﺤﺼﻮﻻت و ﮔﺮﻓﺖ ﻗﺮار ﺗﻮﺟﻪ ﻣﻮرد ﻧﻈﺮی دﯾﺪ از. ﻋﻤﻠﮑ ﮐﺎﻣﭙﺎﯾﻠﺮﻫﺎ ﺮد ﯾﮏ ﺑﺎ را ﮐﺎﻣﭙﺎﯾﻠﺮﻫﺎ ﻋﻤﻠﮑﺮد ﻣﺜﺎل ﮐﻨﯿﻢ ﻣﯽ ﺑﺮرﺳﯽ: ﺑﺎﺷﺪ زﯾﺮ ﺟﻤﻠﻪ ﻣﻨﺒﻊ، ﺑﺮﻧﺎﻣﻪ ﮐﻨﯿﺪ ﻓﺮض: a := x + y * 2.5 ; Compiler Source program High-level language Target program Assembly or machine language Error messages

Transcript of Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا...

Page 1: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

1

مقدمه: صل اولف

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

مفهوم کامپایلر- 1

کامپایلر چیست؟

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

1شکل

کامپایلرها ای از تاریخچه

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

. استوابسته به سخت افزاربسیار اما این زبان . نویسی کمی ساده تر شد FORTRAN : اولین کامپایلر عرضه شد :1957 .از دید نظری مورد توجه قرار گرفت و محصوالت آن به بازار آمدمفاهیم کنونی کامپایلر در این سالها : 70 و 60دهه

رد کامپایلرهاعملک

:بررسی می کنیممثال عملکرد کامپایلرها را با یک

:فرض کنید برنامه منبع، جمله زیر باشدa := x + y * 2.5 ;

Compiler Source program

High-level language

Target program

Assembly or machine language

Error messages

Page 2: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

2

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

CI2F صحیح تبدیل می کند، یک مقدار اعشاری را به I نشان دهنده مقدار صحیح و F ،و در آخر نشان دهنده مقدار اعشاری است LOAD ،MOV ،MUL ،ADD ،STOREضرب، جمع و ذخیره در اری در رجیستر، مقداردهی، گذ، به ترتیب دستورات بار

: نتیجه کار چنین خواهد بود.حافظه می باشند

LOADI R1 = [y] CI2F F1 = R1 MOVF F2 = 2.5 MULF F3 = F1, F2 LOADF F4 = [x] ADDF F5 = F4, F3 STOREF [a] = F5

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

2شکل

.در ادامه با در نظر گرفتن مثال ذکر شده، عملکرد هر یک از فازها را بررسی می کنیم

)1 لغویگرتحلیل( سکنر فاز ا

.ها ذخیره می شوند1 موجود در برنامه شناسایی می شوند و در جدول نماد2لغتهایدر این فاز، 1 Lexical analyzer 2 Token

Page 3: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

3

a := x + y * 2.5 ; a id (identifier) := assign op x id (identifier) + add op y id (identifier) * mul op 2.5 literal (float num) ; semi

)2 نحویگرتحلیل(فاز پارسر

درخت نوع 2جمالت و عبارات موجود در برنامه بر اساس گرامر زبان بررسی می شوند و بر این اساس ممکن است در این فاز، Syntax tree , Parse tree: ممکن است ساخته شود

.لغات از فاز قبل گرفته می شوند برای ساخت درخت،

3 معناییگرفاز تحلیل

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

:چنین خطاهایی می تواند موارد زیر باشند. می شود• Declarations of variables before use • Calling functions that exist • Passing parameters properly • Type checking

1 Symbol table 2 Syntax analyzer 3 Semantic analyzer

Page 4: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

4

1فاز تولید کد میانی

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

:انی می توان از این نوع کدها نام برداز انواع کدهای می . ماشین است تبدیل می کنند• P-code • Tree • DAG • Three Address Code

: تبدیل کنیم نتیجه کار چنین خواهد شد2 آدرسه3اگر بخواهیم مثال قبل را به کد میانی temp1 := int2real(y) temp2 := temp1 real* 2.5 temp3 := x real+ temp2 a := temp3

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

:نام برد تبدیل به زبان اسمبلی یا زبان ماشین • انتخاب رجیسترها • آدرس دهی نسبی: مکانهای حافظه •

3نوع فراخوانی توابع و رویه ها • :نتیجه این فاز چنین خواهد شدبرای مثال داده شده

LOADI R1 = [y] CI2F F1 = R1 MOVF F2 = 2.5 MULF F3 = F1, F2 LOADF F4 = [x] ADDF F5 = F4, F3 STOREF [a] = F5

1 Intermediate code generator 2 Three address code 3 procedures

Page 5: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

5

CI2F ،یک مقدار اعشاری را به صحیح تبدیل می کند I نشان دهنده مقدار صحیح و F نشان دهنده مقدار اعشاری است، و در آخر LOAD ،MOV ،MUL ،ADD ،STORE به ترتیب دستورات بارگذاری در رجیستر، مقداردهی، ضرب، جمع و ذخیره در ،

.حافظه می باشند

1فازهای بهینه سازی

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

:کدام شکلی از بهینه سازی را نشان می دهند زیر هرهایمثال

)Loop(حلقه ها

آیا حلقه زیر حتما یک اشتباه از طرف برنامه نویس بوده است؟ for ( i=0 ; i< 10000; i++);

2فراخوانی تابعها

چگونه می توان کدهای زیر را از لحاظ سرعت اجرای برنامه بهینه کرد؟

a = f(2) * 9; b = f(2) * 2;

3دهای غیر قابل دسترسک

if ( a > 2 ) b++; else if (a<-2) b--; else if (a>10) b=b*23;

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

) TOKEN( لغت • ) Symbol Table(جدول نماد • ) Literal Table(جدول رشته ها • )Syntax or Parse Tree(درخت نحو یا تجزیه •

1 Optimizer 2 function call 3 unreachable

Page 6: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

6

) Temporary files(فایلهای موقتی •

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

:مانند ویرایشگرها •

VLSI: ی سخت افزار راحط •

1گذروم مفه

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

:چند نمونه

• Pascal & C : one pass • Modula2 : two passes

2تحلیل و ترکیبمفهوم

:فازهایی که در آن کد منبع تحلیل می شوند، عبارتند از• Scanner • Parser • Semantic Analyser • Code optimization

: عبارتند ازآمده منجر به ساختن کد نهایی می شوندفازهایی که در آنها براساس تحلیلهای بدست • Intermediate code generation • Code generation • Code optimization

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

. شده است ممکن است در ماشین دیگری اجرا نشود :ن مشکل در جاواحل ای

1 pass 2 Analysis & Synthesis

Page 7: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

7

Java Compiler JVM Bytecode Machine code Source

Page 8: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

8

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

تعاریف اولیه

) Letter ε Tو الفبا : T. ( می باشدحروفمجموعه ای از :الفبا ) String : a sequence of letters. (حروف می باشددنباله ای از :رشته ) Language is a set of strings(. مجموعه ای از رشته هاست:زبان

. ها رشته های یک زبان می باشندphrase ها نقش حروف را دارند و Tokenدر کامپایلر

G = (N; T; S; P): تایی است4یک : گرامر

N : مجموعه عنوانphraseها T : مجموعهTokenها S : phrase شروع )S ε N( P : مجموعه قواعد گرامر) α −> β (

دسته بندی زبانها براساس چامسکی

و حروف Nحروف انگلیسی بزرگ زیر مجموعه ای از . هستندT و Nحروف یونانی زیر مجموعه ای از در انواع دسته بندی زیر . هستندTانگلیسی کوچک زیر مجموعه ای از

Type 0 α β Type 1 (context sensitive)

αΑβ αγβ Type 2 (context free)

Α α Type 3 (finite-state)

Α a or Α aB

. می باشند2 و 1زبانهای برنامه نویسی عموما از نوع

Page 9: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

9

مثال از یک زبان برنامه نویسی

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

phraseهای زبان می باشند .phrase شروع programاست .

توصیف گرامر یک زبان : روش گرامر یک زبان توصیف می شود4عموما به

BNFروش • .BNFیافته ای از روش نوع توسعه : EBNFروش • 1روش نموداری •

BNFروش

:در این روش هنگام نوشتن قواعد گرامر باید استانداردهای زیر را رعایت کنیم . را از تعریفش جدا می کندphraseعنوان یک =:: عالمت . را از هم جدا می کندphrase تعاریف مختلف یک |عالمت در صورتی که . است phrase نشان دهنده عنوان یک <>عالمت

. چند قسمتی باشدphraseعنوان

:مثال<simple expression> ::= term

| <simple expression> add_op term term ::= factor

| term mul_op factor factor ::= id | num

روش نموداری . زبان توصیف می شود2با نمودارهایی شبیه نمودارهای حالت متناهی

:مثالdeclarations

1 Syntax diagram 2 Finite state diagram

declarations

;

Page 10: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

10

تحلیلگر لغوی: فصل دوم

.در این فصل به فاز اول یک کامپایلر یعنی تحلیلگر لغوی می پردازیم

تحلیلگر لغوی -3

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

. هم گفته می شود2اسکنربه آن :مثال

: اسکنر لغات زیر را تولید خواهد کرد; a := x + y * 2.5 برای رشته • a identifier • := assign op • x identifier • + add op • y identifier • * mul op • 2.5 float num • ; semi

وظایف اسکنر :بطور کلی می توان وظایف اسکنر را به این صورت دسته بندی کرد

) TOKEN( پیدا کردن لغات • ) Symbol Table(ساختن جدول نماد • ) Literal Table(ساختن جدول رشته ها • )white spaces( حذف فضاهای خالی • ان حروفنگه داشتن شماره خط و مک •

o برای تولید پیغام خطا .تبدیل حروف کوچک و بزرگ به یکدیگر در زبانهایی که به بزرگی و کوچکی حروف حساس نیستند •

o برای یکسانسازی و سرعت دادن به جستجو

Lexeme و Tokenتعریف Token است اما نوع کلی لغت Lexeme تحلیلگر نحویبرای فاز . استمقدار واقعی لغت , Token الزم است و برای فاز

. الزم استLexeme, تولید کد :مثال

. استa آن lexeme است و Token ،identifier یک aدر مثال قبل

1 Lexical analyzer 2 Scanner

Page 11: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

11

عملکرد اسکنر :انواع لغاتی که اسکنر تشخیص می دهد

… ,if , while, for , endمانند . کلمات رزرو شده • ....و % ^/ × = + مانند ). operators(عملگرها • 423/7891 890 2/45مانند . قادیر عددیم • “hello world”مانند . رشته های ثابت • ....و . : مانند . عالمات ویژه • a func3 rem x1مانند . متغیرها و نام توابع • /*this a test*/مانند . )comment(توضیحات •برای بقیه . استفاده کرد چون کلمات ثابت و مشخصی هستندستجونگهداری و ج می توان از روش تشخیص کلمات رزرو شدهبرای

.لغت ارائه کنیملغات که مقادیر متفاوتی هر زمان به خود می گیرند باید به گونه ای یک تعریف کلی از آن :مثال

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

. است1یک راه برای تعریف کلی لغات عبارات باقاعده عبارات با قاعده -3-1

:باشند) re( هر دو عبارات باقاعده s و r یک حرف از حروف الفبا و aاگر o a is a re o ε is a re o r+s or r|s is a re o r.s or rs is a re o (r) is a re o r* is a re

:مثال : کنیمفرض

digit = [0-9], letter = [A-Za-z], eol = \n, and neol = [^\n] • Integer Literal = digit+ • Fixed-Point Literal = digit+ "." digit+ • Floating-Point Literal = digit+ "." digit+(e|E)(+|-)?digit+ • Identifier = letter(letter|digit)* • Ada Comment = -- neol* eol

. است2DFA عبارات باقاعده ماشین تشخیصهمانطور که می دانیم

DFA از دو جزء اصلی state و transition است و حافظه ندارد تشکیل شده. :مثال

1 Regular expressions 2 Deterministic finite automata

Page 12: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

12

.شان می دهد را ن*(abcc*(a|ε)) زیر مراحل تشخیص رشته DFAماشین

Narges S. Bathaeian

1((abcc*(a|ε))*

Narges S. Bathaeian

2(abcccabc

Narges S. Bathaeian

3(

abcccabc

Narges S. Bathaeian

4(

abcccabc

Narges S. Bathaeian

5(

abcccabc

Narges S. Bathaeian

6(

abcccabc

Narges S. Bathaeian

7(

abcccabc

Narges S. Bathaeian

8(abcccabc

Error

DFAتبدیل عبارات باقاعده به -3-2

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

: مرحله باید طی شود41) RE NFA-ε 2) NFA-ε NFA 3) NFA DFA

Page 13: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

13

4) DFA minimized DFA : قانون زیر استفاده کنیم3برای مرحله اول باید از

Narges S. Bathaeian

RE NFA-ε

a

ε

Narges S. Bathaeian

RE NFA-ε

rs

r|s

Narges S. Bathaeian

RE NFA-ε

r*

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

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

.اعضای یک گروه با ورودیهای یکسان به گروههای یکسان روندهنگامی که همه جدول تا

:مثال : مراحل را طی می کنیم abb*(a|b)برای رشته :مرحله اول

Narges S. Bathaeian

RE NFA-ε

:مرحله دوم

Page 14: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

14

Narges S. Bathaeian

1(

Narges S. Bathaeian

2(

8776

8*

2655453

4322 , 51

εba

Narges S. Bathaeian

3(

8776

8*

2246 , 355453

4322,52,51εba

Narges S. Bathaeian

4(

8776

8*

46,355453

4322 , 52 , 543,61

εba

Narges S. Bathaeian

5(

8776

8*

46 , 35545546 , 33

43243 , 61

εba

Narges S. Bathaeian

6(

8776

8*

46 , 355546 , 34

46 , 3343243 , 61

εba

:مرحله سوم

Narges S. Bathaeian

1(

8776

8*

46 , 3546 , 3446 , 3343243 , 61ba

4

36

4361

ba

Narges S. Bathaeian

2(

8776

8*

46 , 3546 , 3446 , 3343243 , 61ba

4364

47

473636

4361

ba

Narges S. Bathaeian

3(

8776

8*

46 , 3546 , 3446 , 3343243 , 61ba

483647

4364

48

473636

4361

ba

Narges S. Bathaeian

4(

8776

8*

46 , 3546 , 3446 , 3343243 , 61ba

483647

4364

43648*

473636

4361

ba

Page 15: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

15

:مرحله چهارم

Narges S. Bathaeian

1(

4836474364

43648*

4736364361ba تقسيم جدول به دو گروه -1

final و غير final تقسيم متوالي جدول -2

تاهنگامي آه همه اعضاي یك گروه با ورودیهاي یكسان به

.گروههاي یكسان روند

Narges S. Bathaeian

2(

4836474364

43648*

4736364361ba

Narges S. Bathaeian

3(

483647473636

43648*

43644361ba

Narges S. Bathaeian

4(

483647473636

43648*

43644361ba

ABD*DBCCBBABAba

Narges S. Bathaeian

5(

ABD*DBCCBBABAba

A B

CD

a

b a

ab

b

ab

بدست آوردن ماشین مربوط به اسکنر یک زبان برنامه نویسی -3-3

های بدست آمده را با DFAسپس تمام . گفته شده بدست می آوریم را براساس الگوریتمDFAابتدا برای هر نوع لغت ماشین . تبدیل می کنیمDFA کلی را به یک NFAحاال . جدید بدست آیدNFAیکدیگر اجتماع می گیریم تا یک

:مثال . نوع لغت شناسه، توضیحات، عملگر نسبت دهی و عملگر مساوی ماشین اسکنر را بدست آوریم4می خواهیم برای

ها بطور جداگانهToken هر یک از DFA: اولمرحله

Narges S. Bathaeian

1(Identifier:

L=[a-zA-Z]D=[0-9]

1 2L

LD

_

Narges S. Bathaeian

2(Comment:

A={/}B={*}notBA=?

3 4A

5B

notBA

6 7B

A

Page 16: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

16

Narges S. Bathaeian

3(Assign_op:

8 9=

Narges S. Bathaeian

4(Eq_op:

10 12= =

11

کلNFAبدست آوردن : مرحله دوم

Or هر يك از DFAها

1 2L

LD

_0

3 4A

5B

6 7B

A

notBA

8 9=…

ε

ε

εεdelim

delim=[ \t\n]

کلDFAبدست آوردن : مرحله سوم

1L

L D

_0

4A

5B

6 7B

A

notBA

8 9=…

=delim

Stateکه مثال در ولی یک سوال مطرح می شود . باید نوع لغت را برگرداند پایانی جاییست که اسکنرstate 1 باید به خواندن

: روش برای حل این مشکل داریم2. حروف یا ارقام ادامه دهد یا نوع لغت را برگرداند ها با فاصلهtokenمجزا کردن ) الف

Look ahead ولی با در نظر گرفتن ها بدون فاصلهtokenمجزا کردن ) ب

:حل مثال با استفاده از روش اول

Page 17: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

17

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

delim

Return id

Return div

4delim

:حل مثال با استفاده از روش دوم

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_Look ahead

Return id

Return div

4notB

Lookahead حرفی را از ورودی رد کنیم در مورد کاری که باید انجام است که به ما کمک می کند بدون اینکه حرف پیش روی م

.را از دست می دهیم= استفاده نکنیم حرف lookaheadمثال در مثال زیر اگر از . دهیم تصمیم گیری کنیم

Narges S. Bathaeian

1(A2=A2/fxy;

12

L

L D

_0

3A

5B

6 7B

A

notBA

delim

notLD_

Return id

Return comment

Return div

4notB

Narges S. Bathaeian

2(A2=A2/fxy;

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_

Return id

Return comment

Return div

4notB

Narges S. Bathaeian

3(A2=A2/fxy;

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_

Return id

Return comment

Return div

4notB

Narges S. Bathaeian

4(A2=A2/fxy;

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_

Return id

Return comment

Return div

4notB

Page 18: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

18

Narges S. Bathaeian

5(A2=A2/fxy;

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_

Return id

Return comment

Return div

4notB

. را از دست داديم=

Page 19: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

19

پیاده سازی اسکنر- 4

روش برای 3. ه سازی کنیمپیاد توانیم آن را با یک زبان برنامه نویسی بعد از اینکه ماشین مربوط به اسکنر را بدست آوردیم، می :اینکار داریم

پیاده سازی عمومی-الف پیاده سازی اختصاصی–ب پیاده سازی با استفاده از ابزار-ج پیاده سازی عمومی-4-1

. زیر ارائه شده استDFAیک پیاده سازی عمومی برای جدول در شبهه کد زیر

12

L

L D

_0

3A

5B

6 7B

A

notAB

delim

notLD_Look ahead

Return id

Return div

4notB

L D _ notLD_ A B …

0 1 3

1 1 1 1 2

2*

3 5

4*

5 6

state := 0; input(ch); while not eof next_state := T[state][ch]; if next_state = undefined then exit while;

Page 20: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

20

end if ; state := next_state; input(ch); end while; if final(state) then unput(ch); -- extra char return token; else error; end if ;

پایانی رسیده باشیم متوجه می شویم که حرف stateاگر به . از فایل منبع یک حرف می خواندinputدر شبهه کد فوق، تابع . مانع جلو رفتن اشاره گر فایل می شودunput تابع پس،تساوده تعریف شده بlookaheadعنوان خوانده شده قبلی

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

باید از بنابراین . حرکت در آن نیز بسیار زمانبر خواهد بود است و بسیار بزرگ است 1 یک ماتریس خلوتDFAچون اصوال جدول .صوص نگهداری ماتریسهای خلوت استفاده کردالگوریتمهای مخ

اختصاصی پیاده سازی -4-2

. یک برنامه اختصاصی برای آن می نویسیمDFAدر این حالت با توجه به state := 0; input(ch); while not eof do

case state of 0: case ch of

L: state := 1; input(ch); A: state := 3; input(ch); … else return lexical_error;

end case; 1: case ch of

L: state := 1; input(ch); D: state := 1; input(ch); _ : state := 1; input(ch); else unput(ch); return id;

end case; 3: case ch of … end case; …

end case; 1 Sparse matrix

Page 21: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

21

end while;

تعریف lookaheadدر صورتی که حرف خوانده شده به عنوان . حرف می خواند از فایل منبع یکinputدر شبهه کد فوق، تابع . مانعع جلو رفتن اشاره گر فایل می شودunputشده باشد، تابع

پیاده سازی با استفاده از ابزار-4-3

می compiler-compilerبه این ابزارها .مختلفی موجود است که برنامه مربوط به اسکنر را به طور خودکار می سازندابزارهای است که به عنوان ورودی عبارات باقاعده lexیکی از این ابزارها برنامه . برای این ابزارها تنها کافیست لغات زبان تعریف شوند.گویند

. تولید می کندCمربوط به تعریف لغات را دریافت می کند و برنامه اسکنر را به زبان

: به این صورت استlexز نوشتن یک برنامه طر

:مثال :گرامر روبرو را در نظر بگیرید

S -> REAL IDLIST IDLIST -> IDLIST , ID IDLIST -> ID ID -> A | B | C | D

: آن به این صورت خواهد بودlexبرنامه %{

Page 22: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

22

#include<stdlib.h> %} ws [ \t\n]+ ID [A-D] %% "REAL" printf("real-kw\n"); {ID} printf("identifier\n"); "," printf("cama\n"); {ws} . printf("lexical error : %s\n",yytext); %% int yywrap() { return 1; } int main() { char fname[30]; printf("please enter the name of your source code : \n"); scanf("%s",fname); yyin = fopen(fname,"r"); yylex(); return 0; }

Page 23: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

23

تحلیلگر نحوی: فصل سوم

.در این فصل به فاز دوم یک کامپایلر یعنی تحلیلگر نحوی می پردازیم

عملکرد تحلیلگر نحوی- 5

تعاریف اولیه نیز گفته می 1 به آن پارسر. را به عهده دارد ها براساس گرامر زبانTokenبررسی درستی چینش بین نحوی تحلیلگر: تعریف

.شود

اسکنر در مقابل پارسر :اسکنر دارای خصوصیات زیر است

.خطی است • .گرامر آن باقاعده است • . پیاده سازی میشودDFAبا •

:در مقابل پارسر دارای خصوصیات زیر است .خطی استغیر • . استمستقل از متنگرامر آن • )DFA + Stack ( . پیاده سازی میشودPDAبا •

جمالت و عبارات موجود در برنامه بر اساس گرامر زبان بررسی می شوند و بر این اساس ممکن اسکنر می گیرد و از را لغات پارسر Syntax tree , Parse tree: نوع درخت ممکن است ساخته شود2است :مثال

Syntax tree شده نوع خالصهparse treeشد که در آن عملگرها روی برگهای درخت قرار نمی گیرند می با.

1 parser

Parse tree exp

exp ap num exp ap num num

exp exp ap num | num

Scanner (Lexical Analyser)

Parser (Syntax Analyser )

3+4+5

num ap num ap num

Page 24: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

24

. می باشد2+3 عبارت :مثال

1ابهام . برای آن بدست آوردparse tree ای پیدا شود که بتوان بیش از یک رشته, زباندر یک : تعریف

:خصوصیات .ل تصمیم گیری استئ مسایل غیر قاب اثبات غیر مبهم بودن یک گرامر جز • . شدن نمی باشدparseگرامری که مبهم است قابل • .از بعضی از گرامرهای مبهم می توان رفع ابهام کرد • . هستند2بعضی از گرامرها ذاتا مبهم •

:روشهای رفع ابهام

تغییر زبان • تغییر گرامر • کردن parseاعمال قوانین اضافی هنگام • :مثال

. کشیدparse درخت 2 می توان 5*4+3شکل برای عبارت در گرامر نشان داده شده در

1 Ambiguity 2 inherently ambiguous

exp exp ap exp | num

num ap

exp

exp ap exp

num num

ap

num num 3 2

+

Page 25: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

25

رفع ابهام با استفاده از تغییر زبان اضافه کردن پرانتز: مثال

گرامررفع ابهام با استفاده از تغییر عملگرهای ریاضی2 و شرکت پذیری1رعایت اولویت: مثال

1 precedence 2 associativity

exp exp op exp |n op +| - | *

exp exp op exp exp op exp * n n + n

exp exp op exp n + exp op exp n * n

(3+4)*5=35

3+(4*5)=23

exp f op f | ff (exp) | n op +| - | *

exp f op f n + exp f op f

n * n

3+(4*5)=23

Page 26: Source program Compiler Target program · .ﺪﻨﺷﺎﺑ ﯽﻣ 2 و 1 عﻮﻧ زا ﺎﻣﻮﻤﻋ ﯽﺴﯾﻮﻧ ﻪﻣﺎﻧﺮﺑ یﺎﻬﻧﺎﺑز . نﺎﯿﺋﺎﺤﻄﺑ

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

26

کردن parseرفع ابهام با استفاده از اعمال قوانین اضافی هنگام

.در بخشهای بعدی به این موضوع اشاره می شود

Precedence ‘(‘ > ‘*’ > ‘+’ , ‘-’exp exp addop exp | term term term mulop term | fact fact (exp) | n addop +| - mulop *

3+(4*5)

exp exp addop exp term + term fact term mulop term n fact * fact n n