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

106
1 2 a #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); }

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

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

Page 1: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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);}

Page 2: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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);}

Page 3: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 4: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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]

Page 5: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

• 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;• }

Page 6: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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;

Page 7: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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;

Page 8: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 9: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 10: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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);

}

Page 11: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 12: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

تحليلگر لغوي

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

Page 13: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 14: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

r*

r+

r?

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

r1r2

If/( r1/r2

r1|r2

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

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

خط سر بجز .

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

Page 15: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 16: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

مثال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 “);}%%

Page 17: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 18: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 19: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 20: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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;}%}

Page 21: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 22: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

حالت به حساس

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

Page 23: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

• {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);

Page 24: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 25: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 26: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 27: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

مثال• 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

Page 28: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 29: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 30: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 31: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 32: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 33: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 34: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 35: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

مثال

Page 36: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 37: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 38: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 39: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 40: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 41: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

مي شود.

Page 42: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 43: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

ذيل • گرامر به توجه . 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 }

• 

Page 44: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 45: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

• آنگاه بتواند اگر -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 |

Page 46: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 47: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 48: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

follow(A

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

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

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

Page 49: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

X aXAad | aA Ac | Af |

محاسبهXaXAadXaXAad aXAcadXaXAad aXAcad aXAfcad

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

Page 50: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

قوانین

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

می شود.

Page 51: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 52: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

. مي شود اضافه

Page 53: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 54: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 55: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

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

Page 56: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 57: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 58: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

A→ aR

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

Page 59: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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);}}

Page 60: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

B→ bB|c

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

Page 61: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 62: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 63: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

first/followبرخورد

A→ BedB → e|a|

Page 64: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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 . چیست

Page 65: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

first/followبرخورد •

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

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

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

•first() follow(A)

Page 66: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

 A→ BedB→ e|a|

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

Page 67: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

A B | C B bB | fC cC | e

Page 68: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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)={$}

Page 69: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 70: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 71: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

• A aB | aad• B bB | c

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

Page 72: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

Page 73: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 74: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 75: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

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

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

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

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

Page 76: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 77: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

• SbcA• AaA|c

bdcc رشته

Page 78: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 79: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 80: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 81: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 82: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 83: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

Page 84: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 85: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 86: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

SbBCfBBcd|cCe

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

SbBCfbBefbBcdefbccdef

Page 87: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 88: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 89: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

E→E+T | TT→id

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

Page 90: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 91: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 92: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

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

  . است ضعيفتر

Page 93: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

LR(0)روش

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

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

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

Page 94: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

عنص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ت ازدست آيد.

Page 95: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

E→E+T E→TT→id

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

Page 96: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

Page 97: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 98: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 99: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 100: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 101: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 102: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 103: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

E→E+T |TT→id

Page 104: #inlcude #inlcude #inlcude int main(){ int state; char   ch;
Page 105: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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

Page 106: #inlcude #inlcude #inlcude int main(){ int state; char   ch;

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

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