#inlcude #inlcude #inlcude int main(){ int state; char ch;

Preview:

DESCRIPTION

#inlcude #inlcude #inlcude int main(){ int state; char ch; state=1; switch(state){ case 1: ch= getc(stdin); if (ch==’a’) state=2; else { cout

Citation preview

12a

#inlcude<iostream.h>#inlcude<stdlib.h>#inlcude<stdio.h>int main(){int state;char ch;state=1;switch(state){

case 1: ch= getc(stdin);if (ch==’a’)

state=2;else {

cout<<"Failed";exit(0);

}break;

case 2: ch=getc(stdin);if(ch=='\n')

cout<<"Accepted";else

cout<<"Failed";

exit(0); }return(0);}

12

b

a

#inlcude<iostream.h>#inlcude<stdlib.h>#inlcude<stdio.h>int main(){int state;char ch;state=1;while(1){switch(state){

case 1: ch = getc(stdin);if (ch==’a’) state=1;else if(ch == 'b') state=2;

else {cout<<"Failed";exit(0);

}break;

case 2: ch=getc(stdin);if(ch=='\n') cout<<"Accepted";else cout<<"Failed";exit(0);

}}return(0);}

12

[a-zA-Z]

[a-zA-Z0-9]

#inlcude<iostream.h>#inlcude<stdlib.h>#inlcude<stdio.h>int main(){int state;char ch;state=1;while(1){switch(state){

case 1: ch = getc(stdin);if ((ch>=’a’ && 'z'>=ch )|| (ch>=’A’ && 'Z'>=ch) )

state=2;else {

cout<<"Failed";exit(0);

}break;

case 2:ch = getc(stdin); if(ch=='\n'){

cout<<"Accepted";exit(0);}

else if ((ch>=’a’ && 'z'>=ch )|| (ch>=’A’ && 'Z'>=ch) || (ch>=’0’ && '9'>=ch)) state=2;

else {cout<<"Failed";exit(0);

}exit(0);

break; }return(0);}

[a-zA-Z

6 7

[1-9]

[0-9]

1 2

[a-zA-Z]

[a-zA-Z0-9]

3

[1-9]

[0-9]

.

45

[0-9]

4 8

[ \n]

• int fail(int start)• {• int nextstart;• switch(start){• case 1:nextstart=3; // اعشاري اعداد• break;• case 3:nextstart=6; // صحيح اعداد• break;• case 6:nextstart=8; // خالي فضاي• break;• }• return nextstart;• }

int main{int state,start,loc;char ch;FILE *fp;fp=fopen("source.txt","r");state=1;start=1;while(1)switch(state){case 1: loc=ftell(fp);

ch=getc(fp);if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z')) state=2;else{

start=fail(start); state=start; fseek(fp,loc,SEEK_SET);

}break;

case 2:ch=getc(fp); if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || (ch>='0' && ch<='9'))

state=2; else if (ch==' '|| ch=='\n'|| ch==EOF){

cout<<"ID "; state=8;

} else{

start=fail(start); state=start; fseek(fp,loc,SEEK_SET);

} break;

case 3: loc=ftell(fp);ch=getc(fp);if(ch>='1' && ch<='9') state=4;else {

start=fail(start);state=start;fseek(fp,loc,SEEK_SET);

}break;

ها اولویتو باقاعده عبارت يك با كاراكترها از دنباله يك از بخشي است ممكن

ديگ . با ریبخش دنباله مثال عنوان به شود منطبق ديگري باقاعده عبارت.و 123.65 گيريم مي نظر در را ذيل قاعده با عبارت دو

[1-9][0-9]*[1-9][0-9]*. [0-9][1-9]*.

است دنباله ترين طوالني پذيرش

) چند ) يا دو با دنباله يك از بخشي نه كاراكترها از دنباله يك ممكنرشته مثال عنوان به شود منطبق باقاعده توسط ifعبارت تواند مي

. شود توليد ذيل باقاعده عبارت دوif

[a-zA-Z][a-zA-Z0-9]*

دارد، بيشتري اولويت كه اي قاعده با عبارتشود مي مقايسه .ابتدا

int fail(int start){int nextstart;switch(start){

case 1:nextstart=6; // صحيح اعداد break;

case 3:nextstart=8; break;

case 6:nextstart=3; // اعشاري اعداد break;

}return (nextstart);

}

لغوي تحليلگر خودكار توليداست • معايبي و مزايا داراي ابزارها از استفاده

: از عبارتند كهتغييرات • ايجاد سرعت افزايشلغوي • تحليلگر ساخت زمان كاهشمحدوديتها • افزايش

وسيله به لغوي تحليلگر سازي پيادهلغوي تحليلگر توليدكننده

FLex برنامه به زبان

Flex كامپايل بوسيله

C كامپايلS بوسيله كامپايلر

تحليلگر لغوي

يا پاسكال C برنامه به زبان

• c:\> flex pascal.l scanner.c• اجرایی فایل تولید و کامپایل از بعد• c:\> scanner.exe< p1• c:\> scanner.exe <p1> result

• c:\> scanner.exe نظر مورد هاي رشته

قاعده با عبارات بيان نحوه

r*

r+

r?

X{2,5} r{m,n}

r1r2

If/( r1/r2

r1|r2

[afk] [ كاراكترها [مجموعه

[^afk] نظر مورد [^كاراكترهاي

خط سر بجز .

[b-f] [ - مقصد كاراكتر[كاراكترمبدا

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

• تعاريف• %%• ها ترجمه• %%• توابع

مثالdigit [0-9]lower [a-z]upper [A-Z]letter lower|uppervar {letter}|({letter}|{digit})* ws [ \n\t]+%%ws {}“if” {printf(“I found ‘IF’ keyword”);}“else” {printf(“I found ‘ELSE’ keyword”);}var {printf(“I found variable “);}%%

تحليلگر • اين به ورودي عنوان به ذيل متن اگر. شود داده• if temp else if id 34

•. بود خواهد ذيل صورت به خروجي• I found ‘if’ keyword• I found variable• I found ‘ELSE’ keyword• I found ‘if’ keyword• I found variable

 %option noyywrap%{int nchar,nline;%}%%[\n] {nline++;}. {nchar++;}}%%int main(void){yylex();printf("%d %d",nchar,nline+1);return (0);}

کلیدی کلماتاول روش

[a-zA-Z]([a-zA-Z0-9])* printf("ID ");"program" printf("PROGRAM ");"var" printf("VAR ");"begin" printf("BEGIN ");"end" printf("END ");

کلیدی کلماتدوم روش

void toupper(char k[]){ int i;for(i=0;i<=strlen(k);++i)if(k[i]<='z' && k[i]>='a')k[i]-=32;}int is_keyword(char id[]) {char keyword[40][20]={"AND",

"ARRAY","BEGIN","CASE","CONST","DIV","DO","DOWNTO","ELSE","END","EXTERNAL","EXTERN","FILE", "FOR","FORWARD","FUNCTION","GOTO","IF","IN","LABEL","MOD","NIL","NOT","OF","OR","OTHERWISE", "PROCEDURE", "PROGRAM","RECORD","REPEAT","THEN","TO","TYPE","UNTIL","VAR","WHILE","WITH"};

int i;for(i=0;i<40;i++) if(strcmp(id,keyword[i])==0) return i; return -1;}%}

[a-zA-Z]([a-zA-Z0-9])* {toupper(yytext); if (is_keyword(yytext)!=-1) printf("keword=%s",yytext); else printf("ID "); }

حالت به حساس

• A [aA]• B [bB]• C [cC]• D [dD]• E [eE]...

• {A}{N}{D} return(AND);• {A}{R}{R}{A}{Y} return(ARRAY);• {C}{A}{S}{E} return(CASE);• {C}{O}{N}{S}{T} return(CONST);• {D}{I}{V} return(DIV);• {D}{O} return(DO);

دوم روش حالت به حساس[a-zA-Z]([a-zA-Z0-9])* {toupper(yytext); if (is_keyword(yytext)!=-1) return (KW); else return(IDENTIFIER ); }

چپ گيري فاكتورانتخابهاي • است ممكن پايانه غير يك براي

شروع طوريكه به باشد داشته وجود مختلفي . به مثال عنوان به باشند داشته يكسان

. كنيد دقت ذيل گرامرهاي• A a B | aD• يا و• A cd B | cdg D

چپ بازگشتی حذف• A 1 | 2 | 3 ... | n

• :مشترك شروع•:i مشترك غير قسمتداد • نشان ذيل صورت به می توان را فوق گرامر

: می كند توليد را زبان همان كه•

A R• R 1 | 2 | 3 | ..

مثال• A cd B | cdg D• BbB | c• DdD | e

به • توجه مشترك AcdB|cdgDبا در cdقسمت استنتيجه:• = cd• 1=gD• 2=B

•. داد نشان ذيل صورت به می توان را گرامر• A cd R• R B | g D• BbB | c• DdD | e

• دنباله به را مبدا برنامه لغوي از تحليلگر ايارسال نشانه نحوي تحليلگر به و كرده تبديل ها

مبدا. زبان گرامر توسط دنباله اين اگر می كندنحوي نظر از مبدا برنامه باشد، توليد قابل

خطاي داراي صورت اين غير در است صحيحاست .نحوي

تجزیه• دنباله آيا می دهد نشان تجزيه از فرايند اي

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

شود ينامكننده می ده .

پايين- • به باال كنندههاي تجزيهباال- • به پايين كننده هاي تجزيه

تجزیه درخت شدن ساخته ترتیب

Preorder پایین به :باالPostorder باال به :پایین

باال روش در تجزیه درخت ساختن ترتیبپایین به

روش در تجزیه درخت ساختن ترتیبباال به پایین

مثال• E E + T | E - T | T• T T * F | T / F | F• F id

• رشته برای تجزیه درخت ساختن : نحوه• Id+id+id

مثال

first()پايانه دنباله گر ا از پايانه اي غSير و باشد، ها ها

به firstمجموعه مشخص پايانه مربوط را هايياز مي شده مشتق رشته هاي كه آنها كند با

مي . شوند شروعكند، بتواند اگر توليد به را اضافه first()نيز

مي شود.

مثالA BCdB bB | e | C aC |

از كه رشته هايي .BCdبه كنيد دقت شده اند مشتقBCddBCdbBCd bBd bdBCdeCd edBCdCd aCd ad

first(BCd)={d,b,e,a}

ذيل • گرامر به توجه . first(aB)و first(aA)با كنيد محاسبه را• A→ a A|a B• B→ b B| c

از • شده مشتق رشته هاي گرامر، به توجه با aAبا و aفقطاز رشته شده مشتق با aBهاي ميS شوند، aفقط شروع

:Sبنابراين• first(aA) = {a }• first(aB) = {a }

• 

first محاسبه قوانین

 آنگاه اگر -1 باشد مجموعه first()پايانه برابر

{}. است :مثال• داريم فوق گرامر در

• first(a)={a}• first(b)={b}

• آنگاه بتواند اگر -2 كند، توليد مجموعه را به

first(). می گردد اضافهو Xاگر- 3 پايانه و XY1Y2Y3...Ynغير باشد

شامل first(Y1),first(Y2),...first(Yn)هاي مجموعههمه يعني . Yiباشند در كنند توليد را تهي بتوانند

می تواند Xنتيجه اين نيز در كه كند توليد رامجموعه صورت )به )first X . می گردد اضافه

first(X):مثال• S AB• A aA | bB | a | • B bB | b |

و Xاگر- 4• پايانه باشد، XY1Y2Y3...Ynغيرجز ( first(Y1)مجموعه مجموعه) به first(X)به

. زيرا می گردد مجموعه first(Y1)اضافهكه رشته هايي شروع در كه هستند پايانه هايي

آنجاييكه Y1توسط از دارند قرار می شوند توليدX باY1 پس می شود، پايانه هاي Xشروع با

first(Y1) نتيجه در مي شوند، به first(Y1)شروعfirst(X). می گردد اضافه

و Xاگر پايانه و XY1Y2Y3...Ynغير در باشدتوليد می تواند Y1باشد (first(Y1)مجموعه را

بر) عالوه صورت اين در جز ( first(Y1)كند ) بهجز ( first(Y2)مجموعه به) به اضافه first(X)نيزمی گردد.

كنيد • دقت ذيل گرامر به• A Bab• B c | d |

follow(A

• مشخص follow(A)مجموعه • را پايانه هايي

اشتقاق در كه در می كند بالفاصله مختلف هايراست می گيرند Aسمت را يا قرار مجموعه ن

ده follow(A)با می م.ينشان

X aXAad | aA Ac | Af |

محاسبهXaXAadXaXAad aXAcadXaXAad aXAcad aXAfcad

: كه گرفت نتيجه می توان باال مراحل به توجه با• follow(A)={a,c,f}

قوانین

باشد Sاگر - شروع آخر $ ($نماد دهنده نشان ( به است ورودي اضافه follow(S)رشته

می شود.

صورت- 2• به توليدي قاعده هر ، MNبرايپايانه در تمام موجود جز ( first()هاي به) به

follow(N). می شود اضافهA AXZ | Z aZ | bZ | c |X afollow(X)= {a,b,c}

صورت • به اي قاعده هر يا MNبراي وMN صورتيكه باشد first()عضو در

يا يعني تهي رشته تمام بتواند كند، توليد رامجموعه پايانه )هاي )follow M بهfollow(N)

. مي شود اضافه

مثالذيل • گرامر به توجه . follow(B)با كنيد محاسبه را

• AAXb• Xd|dB|eBE• Ea|• Bb:جوابfollow(B)={a,b}

 پايين به باال كننده تجزيه

پایین به باال های کننده تجزیه :انواعبازگشتی - های کننده تجزیهبازگشتی - غیر کننده تجزیه

بازگشتی های کننده تجزیهپیشنگر- متغیر یک کننده تجزیه این در

)lookahead (ورودی رشته جاری نماد به هموارهکند می اشاره

به - پیشنگر که نمادی کند می سعی کننده تجزیه. کند تولید را کند می اشاره آن

پیشنگر - شد، تولید پیشنگر نظر مورد نماد هرگاه . کند می اشاره بعدی نماد به

شود - می ایجاد تابع یک پایانه غیر هر برای

مثالA→ aRR→ A|BB→ bB|c

کمکی گرامر: matchتابع انتظار مورد نماد هرگاه)symbol) (ورودی رشته جاری نماد ) lookaheadبا

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

. است خطاvoid match(char symbol){if ( lookahead== symbol) lookahead=getche();else{ cout<<" error"; exit(0); }}

A→ aR

void A(){ match('a'); R(); }

R→ A|BB→ bB|c

first(A)={a}first(B)={b,c}

void R(){if(lookahead=='a') A();else if (lookahead=='b' || lookahead=='c') B();else{ cout<"error";exit(0);}}

B→ bB|c

void B(){if(lookahead=='b'){ match('b'); B();}else if(lookahead=='c'){match('c'); cout<<"Accepted";exit(0); }}

int main(){ lookahead= getche(); A(); return 0;}

غیر پیشگوی روش مشکالتبازگشتی first/firstبرخورد •

. است گرامر از بخشی زیر قانون کنید فرضB→ bB|bc

B→ α1|α2First(α1) ∩first(α2) ≠φ

: چپ گیری فاکتور حل :راهB→ bB|bcB→ bRR→ B|c

first/followبرخورد

A→ BedB → e|a|

char lookahead;void A(){ B(); match('e'); match('d');}void B(){if (lookahead =='e'){ match('e');else if (lookahead =='a') match('a');else ;return ;}int main(){ lookahead=getche(); A(); return 0;}

گرامرA→ BedB → e|a|

رشته دو برای کننده تجزیه و edعملکردeed . چیست

first/followبرخورد •

به • توليدي قاعده شرايط A|صورت در. باشد برقرار ذيل

•1 - بتواند. كند توليد رادر- 2• می تواند هم كه دارد وجود نماد يك حداقل

از شروع بعد هم . Aو ديگر عبارت به يا باشد . باشد برقرار ذيل رابطه

•first() follow(A)

 A→ BedB→ e|a|

باشد، =و =eاگر first(e)={e}follow(B)={e} : نتيجه درfirst(e) follow(B)={e}

غير پيشگوي كننده تجزيهبازگشتي

A B | C B bB | fC cC | e

expr term restrest + expr | - expr | term id

و firstابتدا توليد قواعد راستهاي سمت تمام followتمام . می كنيم محاسبه را پايانه ها غير

first(term rest)=first(term)={id}first(+expr)=first(+)={+}first(-expr)=first(-)={-}first()={}first(id)={id}follow(expr)={$}follow(term)={+,-,$}follow(rest)={$}

غیر پیشگوی کننده تجزیه ساختاربازگشتی

تجزيه id+id-idمراحل

LL(1)گرامرهای

نشانه يك رويت با فقط تجزيه درخت ساخت در اگرراست، به چپ پيمايش در ورودي رشته از بعدي

داد تشخيص گسترش براي را بعدي پايانه غير بتوانرا متن از مستقل گرامر صورت اين LL(1)در

مي ناميم.مثال:

• A aB | aad• B bB | c

گرامر . LL(1)این نیست

چپ -• بازگشتي داراي .LL(1)گرامرهاي نيستند مبهم -• .LL(1)گرامرهاي نيستند از -• بيش با خانه اي داراي پيشگو غيربازگشتي تجزيه جدول اگر

گرامر باشد، وارده تجزيه LL(1)يك جدول اگر عكس به و نيستنباشد، ی پيشگو وارده يك از بيش با خانه اي داراي غيربازگشتي. LL(1)گرامر مهمترين از يكي تجزيه جدول توليد نتيجه در است

تست . LL(1)روشهاي است گرامر بودندارای -• نوع first/firstبرخورد گرامرهای . LL(1)از نیستند دارای • نوع first/followبرخورد گرامرهای .LL(1)از نیستند صورت • به توليدي قاعده گرامر، در به A|اگر باشد داشته وجود

گرامر و طوريكه كنند، توليد را تهي رشته دو .LL(1)هر نيست

•. بگيريد نظر در را ذيل گرامر• ACB | • BbB | • C cC |

• A aCbAB | d• B eA|• C c

- : را می دهد رخ برنامه در كه خطاهايي اگر خطا توليد قوانين از استفادهاين تا كرد اضافه گرامر به توليدي قواعد می توان كرد بيني پيش بتوان

. چنين كاهش با كننده تجزيه صورت اين در گردد شامل نيز را خطا. دهد ادامه نيز تجزيه به می تواند و می كند كشف را خطا گرامري

. دارد قرار كالن سمي دستور هر از بعد كه می دهد نشان ذيل گرامرstmtstmt ; stmt_list | stmt ;

عدم می دهد رخ برنامه در معموال كه خطاهايي از يكي آمار، به توجه بابه نيز ذيل صورت به توليدي قاعده نتيجه در است كالن سمي درج

. می گردد اضافه گرامرstmt_errorstmt stmt_list | stmt

جاي به دستورات نكند درج را كالن سمي نويس برنامه اگر نتيجه stmtدرنمی گردد stmt_errorبا متوقف كننده تجزيه بنابراين می يابد كاهش

. می يابد ادامه تجزيه و صادر را مناسب پيغام بلكه

خطا تصحيح روشهاي مهمتريناز :عبارتند •1 : هنگام- كننده تجزيه روش اين در اضطراري حالت تصحيح

عالمت يك به رسيدن تا را ورودي نمادهاي خطا، يك كشفاست شده معين كامپايلر طراح وسيله به كه كننده هماهنگ

. زبان در كالن سمي عالمت مثال عنوان به می گيرد Cناديده. است كننده هماهنگ عالمت يك

خطا مدیریتپايانه- 1• مانند اگر جاري aاي نماد با كه باشد پشته باالي

خطا، پوشش منظور به مي دهد، رخ خطا نباشد، يكسانمی كنيم aنماد اضافه ورودي به .را

• SbcA• AaA|c

bdcc رشته

هماهنگ first(Aنمادهاي (• مجموعه عنوان به رااز . Aكننده يكي اگر بنابراين می گيريم نظر در

بر first(A)نمادهاي تجزيه شود ظاهر ورودي در.Aاساس می يابد ادامه

نمادهاي follow(A)نمادهاي • عنوان به راكننده .Aهماهنگ می گيريم نظر در

باال به پايين كننده تجزيهاولویت - عملگر های کننده تجزیههای - کننده LRتجزیه

باال به پایین کننده تجزیه عملکرد نحوه از :مثالیexpr expr + term | expr - term | termterm 1|2|3|4

4+1-2term +1-2expr + 1 -2 expr + term -2expr - 2expr - termexpr

• 1+2-+3• term+ 2-+3• expr + 2 -+ 3• expr + term -+3 • expr -+ 3• expr -+ term• expr -+ expr

دستگیره• دنباله سمت دستگيره، بر منطبق كه است اي

به آن كاهش و بوده توليد قاعده يك راستمراحل از مرحله يك توليد قاعده چپ سمت

راست سمت است معكوس اشتقاق ترين .

رشSته دستگيره• Sكاهش در را به bccdefها توجه با. كنيد مشخSص ذيل گرامر

SbBCfBBcd|cCe

رشSته اشتقاق bccdef ابتدا ترين راست سSمت بوسيله را. می كنيم توليد

SbBCfbBefbBcdefbccdef

های کننده تجزیه LRعملکرد

دستگیره - یافتندستگیره - کاهش

های کننده تجزیه LRساختار

مثال. می گيريم نظر در را ذيل گرامر

E→E+T | TT→id

کند تغییرمی زیر شکل به .گرامر1- S → E 2- E→E+T3- E→T4- T→id

رشته تجزيه id+idمراحل

: از عبارتند موجود روشهاي مهمترين1 - :LR(0) . است روش ضعيفترين و ترين ساده2 -SLR(1) LR( :( از روش اين قويتر LR(0)ساده

است.3 -LR(1) ياLR : ساخت روش قويترين متعارف

تجزيه .LRجدول است 4 -LALR(1) :روش از SLR(1)از و CLR(1)قويتر

  . است ضعيفتر

LR(0)روش

:LR(0)عنصريك قاعده توليد است كه نقطه اي در سمت راست آن

LR (. مكان نقطه در عنصر S→α.βقرار دارد) مانند: ميزان پيشرفت، در كاهش غير پايانه سمت

( را نشان می دهد. Sچپ)مانند S→.XYZ S→X.YZ S→XY.Z S→XYZ .

عنصSر كاهشSي: عنصSري كSه نقطSه در آخSر سSمت •راسSSت قاعده توليSSد قرار دارد. ايSSن نوع عنصSSر نشان دهنده يافتSن يSك دسSتگيره اسSت. بSه عنوان

يSك XYZ نشان می دهSد كSه .S→XYZمثال عنصSر كاهش داد. SدسSتگيره اسSت كه می توان آن را به

عنصSSر انتقSالSSي: عنصSSري كSSه كاهشSSي نباشد. بSSه • يSك عنصSر انتقالSي اسSت. هSر S→X.YZعنوان مثال

اي در مورد عنصSSSر انتقSالSSSي نشان دهنده فرضيه S→X.YZدسSSتگيره بعدي اسSSت بSSه عنوان مثال

بSه Yنشان می دهSد كSه دسSتگيره ممكSن اسSت ازدست آيد.

متناهی ماشین ساختE→E+T |TT→id

E→E+T E→TT→id

S→EE→E+T E→TT→id

S→.ES→.EE→.E+T E→.TS→.EE→.E+T E→.TT→.id

E→E+T |TT→id

S→EE→E+T E→TT→idT→id [ E ]

کاهش / انتقال برخورد

S→EE→E+T E→TE→XT→idX→ id

کاهش / کاهش برخورد

Recommended