کامپایلر compiler
اسلاید 1: 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;elsecout<<Failed;exit(0); }return(0);}
اسلاید 2: 12ba#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;elsecout<<Failed;exit(0); }}return(0);}
اسلاید 3: 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
اسلاید 4: 67[1-9][0-9]12[a-zA-Z][a-zA-Z0-9]3[1-9][0-9].45[0-9]48[ n]
اسلاید 5: 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;}
اسلاید 6: 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;
اسلاید 7: 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;
اسلاید 8: اولویت ها ممكن است بخشي از يك دنباله از كاراكترها با يك عبارت باقاعده و بخش ديگری با عبارت باقاعده ديگري منطبق شود. به عنوان مثال دنباله 123.65 و دو عبارت با قاعده ذيل را در نظر مي گيريم.[1-9][0-9]*[1-9][0-9]*. [0-9][1-9]*. پذيرش طولاني ترين دنباله است
اسلاید 9: ممكن يك دنباله از كاراكترها (نه بخشي از يك دنباله) با دو يا چند عبارت باقاعده منطبق شود به عنوان مثال رشته if مي تواند توسط دو عبارت باقاعده ذيل توليد شود. if[a-zA-Z][a-zA-Z0-9]*عبارت با قاعده اي كه اولويت بيشتري دارد، ابتدا مقايسه مي شود.
اسلاید 10: 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);}
اسلاید 11: توليد خودكار تحليلگر لغوياستفاده از ابزارها داراي مزايا و معايبي است كه عبارتند از:افزايش سرعت ايجاد تغييرات كاهش زمان ساخت تحليلگر لغوي افزايش محدوديتها
اسلاید 12: پياده سازي تحليلگر لغوي به وسيله توليدكننده تحليلگر لغويبرنامه به زبان FLexكامپايل بوسيله Flexكامپايل بوسيله كامپايلر C تحليلگر لغوي برنامه به زبان C يا پاسكال
اسلاید 13: c:> flex pascal.l scanner.cبعد از کامپایل و تولید فایل اجرایی c:> scanner.exe< p1c:> scanner.exe <p1> resultc:> scanner.exe رشته هاي مورد نظر
اسلاید 14: نحوه بيان عبارات با قاعده r*r+r?X{2,5}r{m,n}r1r2If/(r1/r2r1|r2[afk][مجموعه كاراكترها][^afk] كاراكترهاي مورد نظر[^بجز سر خط.[b-f]] كاراكتر مقصد- كاراكترمبدا[
اسلاید 15: flexساختار برنامه به زبان تعاريف%%ترجمه ها%%توابع
اسلاید 16: مثالdigit [0-9]lower [a-z]upper [A-Z]letter lower|uppervar{letter}|({letter}|{digit})* ws [ nt]+%%ws {}“if” {printf(“I found ‘IF’ keyword”);}“else” {printf(“I found ‘ELSE’ keyword”);}var {printf(“I found variable “);}%%
اسلاید 17: اگر متن ذيل به عنوان ورودي به اين تحليلگر داده شود.if temp else if id 34خروجي به صورت ذيل خواهد بود.I found ‘if’ keywordI found variableI found ‘ELSE’ keywordI found ‘if’ keywordI found variable
اسلاید 18: %option noyywrap%{int nchar,nline;%}%%[n] {nline++;}. {nchar++;}}%%int main(void){yylex();printf(%d %d,nchar,nline+1);return (0);}
اسلاید 19: کلمات کلیدی روش اول[a-zA-Z]([a-zA-Z0-9])* printf(ID );program printf(PROGRAM );var printf(VAR );begin printf(BEGIN );end printf(END );
اسلاید 20: کلمات کلیدی روش دوم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;}%}
اسلاید 21: [a-zA-Z]([a-zA-Z0-9])* {toupper(yytext); if (is_keyword(yytext)!=-1) printf(keword=%s,yytext); else printf(ID ); }
اسلاید 22: حساس به حالت A [aA]B [bB]C [cC]D [dD]E [eE]...
اسلاید 23: {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);
اسلاید 24: حساس به حالت روش دوم[a-zA-Z]([a-zA-Z0-9])*{toupper(yytext); if (is_keyword(yytext)!=-1) return (KW); else return(IDENTIFIER ); }
اسلاید 25: فاكتور گيري چپبراي يك غير پايانه ممكن است انتخابهاي مختلفي وجود داشته باشد به طوريكه شروع يكسان داشته باشند. به عنوان مثال به گرامرهاي ذيل دقت كنيد. A a B | aDو يا A cd B | cdg D
اسلاید 26: حذف بازگشتی چپA 1 | 2 | 3 ... | n: شروع مشترك :i قسمت غير مشترك گرامر فوق را میتوان به صورت ذيل نشان داد كه همان زبان را توليد میكند: A RR 1 | 2 | 3 | ..
اسلاید 27: مثالA cd B | cdg DBbB | cDdD | eبا توجه به AcdB|cdgD قسمت مشترك cd است در نتيجه:= cd1=gD2=B گرامر را میتوان به صورت ذيل نشان داد.A cd RR B | g DBbB | cDdD | e
اسلاید 28: تحليلگر لغوي برنامه مبدا را به دنبالهاي از نشانهها تبديل كرده و به تحليلگر نحوي ارسال میكند. اگر اين دنباله توسط گرامر زبان مبدا قابل توليد باشد، برنامه مبدا از نظر نحوي صحيح است در غير اين صورت داراي خطاي نحوي است.
اسلاید 29: تجزیهفرايند تجزيه نشان میدهد آيا دنبالهاي از نشانهها توسط گرامر قابل توليد است يا خير. روالي كه فرايند تجزيه را انجام میدهد، تجزيه كننده ناميده می شود.
اسلاید 30: انواع تجزيه كنندهها - تجزيه كنندههاي بالا به پايين - تجزيه كنندههاي پايين به بالا
اسلاید 31: ترتیب ساخته شدن درخت تجزیه Preorderبالا به پایین: Postorderپایین به بالا:
اسلاید 32: ترتیب ساختن درخت تجزیه در روش بالا به پایین
اسلاید 33: ترتیب ساختن درخت تجزیه در روش پایین به بالا
اسلاید 34: مثالE E + T | E - T | TT T * F | T / F | FF idنحوه ساختن درخت تجزیه برای رشته : Id+id+id
اسلاید 35: مثال
اسلاید 36:
اسلاید 37:
اسلاید 38:
اسلاید 39:
اسلاید 40:
اسلاید 41: first()اگر دنبالهاي از پايانهها و غير پايانهها باشد، مجموعه first مربوط به پايانههايي را مشخص ميكند كه رشتههاي مشتق شده از با آنها شروع ميشوند. اگر بتواند را توليد كند، نيز به first() اضافه ميشود.
اسلاید 42: مثالA BCdB bB | e | C aC | به رشتههايي كه از BCd مشتق شدهاند دقت كنيد.BCddBCdbBCd bBd bdBCdeCd edBCdCd aCd adfirst(BCd)={d,b,e,a}
اسلاید 43: با توجه به گرامر ذيل first(aA) و first(aB) را محاسبه كنيد. A→ a A|a BB→ b B| c با توجه به گرامر، رشتههاي مشتق شده از aA فقط با a و رشتههاي مشتق شده از aB فقط با a شروع ميشوند، بنابراين: first(aA) = {a }first(aB) = {a }
اسلاید 44: firstقوانین محاسبه 1-اگر پايانه باشد آنگاهfirst() برابر مجموعه {} است.مثال در گرامر فوق داريم:first(a)={a}first(b)={b}
اسلاید 45: 2-اگر بتواند را توليد كند، آنگاه به مجموعه first() اضافه میگردد.3- اگر X غير پايانه و XY1Y2Y3...Yn باشد و مجموعههاي first(Y1),first(Y2),...first(Yn) شامل باشند يعني همه Yi بتوانند تهي را توليد كنند. در نتيجه X نيز میتواند را توليد كند كه در اين صورت به مجموعه first(X) اضافه میگردد. مثال:first(X)S ABA aA | bB | a | B bB | b |
اسلاید 46: 4- اگر X غير پايانه و XY1Y2Y3...Yn باشد، مجموعه first(Y1) (به جز )به مجموعه first(X) اضافه میگردد. زيرا first(Y1) مجموعه پايانههايي هستند كه در شروع رشتههايي كه توسطY1 توليد میشوند قرار دارند از آنجاييكه X با Y1 شروع میشود، پس X با پايانههاي first(Y1) شروع ميشوند، در نتيجه first(Y1) به first(X) اضافه میگردد.
اسلاید 47: اگر X غير پايانه و XY1Y2Y3...Yn باشد و در مجموعه first(Y1) باشد (Y1 میتواند را توليد كند) در اين صورت علاوه بر first(Y1) (به جز) مجموعه first(Y2) (به جز) نيز به first(X) اضافه میگردد.به گرامر ذيل دقت كنيدA BabB c | d |
اسلاید 48: follow(A مجموعه follow(A) پايانههايي را مشخص میكند كه در اشتقاقهاي مختلف بلافاصله در سمت راست A قرار میگيرند اين مجموعه را با follow(A) نشان می دهيم.
اسلاید 49: X aXAad | aA Ac | Af | محاسبه XaXAadXaXAad aXAcadXaXAad aXAcad aXAfcadبا توجه به مراحل بالا میتوان نتيجه گرفت كه:follow(A)={a,c,f}
اسلاید 50: قوانین اگر S نماد شروع باشد $ ($ نشان دهنده آخر رشته ورودي است) به follow(S) اضافه میشود.
اسلاید 51: 2- براي هر قاعده توليدي به صورت MN ، تمام پايانههاي موجود در first() ( به جز ) به follow(N) اضافه میشود.A AXZ | Z aZ | bZ | c |X afollow(X)= {a,b,c}
اسلاید 52: براي هر قاعده اي به صورت MN و يا MN در صورتيكه عضو first() باشد يعني بتواند رشته تهي يا را توليد كند، تمام پايانههاي مجموعه follow(M) به follow(N) اضافه ميشود.
اسلاید 53: مثالبا توجه به گرامر ذيل follow(B) را محاسبه كنيد.AAXbXd|dB|eBEEa|Bbجواب:follow(B)={a,b}
اسلاید 54: تجزيه كننده بالا به پايين انواع تجزیه کننده های بالا به پایین: - تجزیه کننده های بازگشتی - تجزیه کننده غیر بازگشتی
اسلاید 55: تجزیه کننده های بازگشتی - در این تجزیه کننده یک متغیر پیشنگر (lookahead) همواره به نماد جاری رشته ورودی اشاره می کندتجزیه کننده سعی می کند نمادی که پیشنگر به آن اشاره می کند را تولید کند.هرگاه نماد مورد نظر پیشنگر تولید شد، پیشنگر به نماد بعدی اشاره می کند. - برای هر غیر پایانه یک تابع ایجاد می شود
اسلاید 56: مثالA→ aRR→ A|BB→ bB|c
اسلاید 57: تابع کمکی match: هرگاه نماد مورد انتظار گرامر (symbol) با نماد جاری رشته ورودی (lookahead) یکسان شد. یعنی یکی از نمادهای رشته جاری تولید شده است و پیشنگر باید به جلو حرکت کند. وگرنه خطا است. void match(char symbol){if ( lookahead== symbol) lookahead=getche();else{ cout<< error; exit(0); }}
اسلاید 58: A→ aRvoid A(){ match(a); R(); }
اسلاید 59: R→ A|BB→ bB|cfirst(A)={a}first(B)={b,c}void R(){if(lookahead==a) A();else if (lookahead==b || lookahead==c) B();else{ cout<error;exit(0);}}
اسلاید 60: B→ bB|cvoid B(){if(lookahead==b){ match(b); B();}else if(lookahead==c){match(c); cout<<Accepted;exit(0); }}
اسلاید 61: int main(){ lookahead= getche(); A(); return 0;}
اسلاید 62: مشکلات روش پیشگوی غیر بازگشتیبرخورد first/firstفرض کنید قانون زیر بخشی از گرامر است. B→ bB|bcB→ α1|α2First(α1) ∩first(α2) ≠φراه حل: فاکتور گیری چپ:B→ bB|bcB→ bRR→ B|c
اسلاید 63: برخورد first/followA→ BedB → e|a|
اسلاید 64: 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 چیست.
اسلاید 65: برخورد first/followدر قاعده توليدي به صورت A| شرايط ذيل برقرار باشد.1- بتواند را توليد كند.2- حداقل يك نماد وجود دارد كه هم میتواند در شروع و هم بعد ازA باشد. يا به عبارت ديگر رابطه ذيل برقرار باشد. first() follow(A)
اسلاید 66: A→ BedB→ e|a|اگر =e و = باشد،first(e)={e}follow(B)={e}در نتيجه: first(e) follow(B)={e}
اسلاید 67: تجزيه كننده پيشگوي غير بازگشتيA B | C B bB | fC cC | e
اسلاید 68: 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)={$}
اسلاید 69: ساختار تجزیه کننده پیشگوی غیر بازگشتی
اسلاید 70: مراحل تجزيه id+id-id
اسلاید 71: گرامرهای LL(1)اگر در ساخت درخت تجزيه فقط با رويت يك نشانه بعدي از رشته ورودي در پيمايش چپ به راست، بتوان غير پايانه بعدي را براي گسترش تشخيص داد در اين صورت گرامر مستقل از متن را LL(1) ميناميم.مثال: A aB | aadB bB | cاین گرامر LL(1) نیست.
اسلاید 72: -گرامرهاي داراي بازگشتي چپ LL(1) نيستند.- گرامرهاي مبهم LL(1) نيستند.- اگر جدول تجزيه غيربازگشتي پيشگو داراي خانهاي با بيش از يك وارده باشد، گرامر LL(1) نيست و به عكس اگر جدول تجزيه پيشگوی غيربازگشتي داراي خانهاي با بيش از يك وارده نباشد، گرامر LL(1) است. در نتيجه توليد جدول تجزيه يكي از مهمترين روشهاي تست LL(1) بودن گرامر است. - گرامرهای دارای برخورد first/first از نوع LL(1) نیستند. گرامرهای دارای برخورد first/follow از نوع LL(1) نیستند.اگر در گرامر، قاعده توليدي به صورت A| وجود داشته باشد به طوريكه و هر دو رشته تهي را توليد كنند، گرامر LL(1) نيست.
اسلاید 73: گرامر ذيل را در نظر بگيريد.ACB | BbB | C cC |
اسلاید 74: A aCbAB | dB eA|C c
اسلاید 75: استفاده از قوانين توليد خطا: اگر خطاهايي كه در برنامه رخ میدهد را بتوان پيش بيني كرد میتوان قواعد توليدي به گرامر اضافه كرد تا اين خطا را نيز شامل گردد. در اين صورت تجزيه كننده با كاهش چنين گرامري خطا را كشف میكند و میتواند به تجزيه نيز ادامه دهد.گرامر ذيل نشان میدهد كه بعد از هر دستور سمي كالن قرار دارد. stmtstmt ; stmt_list | stmt ; با توجه به آمار، يكي از خطاهايي كه معمولا در برنامه رخ میدهد عدم درج سمي كالن است در نتيجه قاعده توليدي به صورت ذيل نيز به گرامر اضافه میگردد. stmt_errorstmt stmt_list | stmtدر نتيجه اگر برنامه نويس سمي كالن را درج نكند دستورات به جاي stmt با stmt_error كاهش میيابد بنابراين تجزيه كننده متوقف نمیگردد بلكه پيغام مناسب را صادر و تجزيه ادامه میيابد.
اسلاید 76: مهمترين روشهاي تصحيح خطا عبارتند از:1- تصحيح حالت اضطراري: در اين روش تجزيه كننده هنگام كشف يك خطا، نمادهاي ورودي را تا رسيدن به يك علامت هماهنگ كننده كه به وسيله طراح كامپايلر معين شده است ناديده میگيرد. به عنوان مثال علامت سمي كالن در زبان C يك علامت هماهنگ كننده است.
اسلاید 77: مدیریت خطا1- اگر پايانهاي مانند a بالاي پشته باشد كه با نماد جاري يكسان نباشد، خطا رخ ميدهد، به منظور پوشش خطا، نماد a را به ورودي اضافه میكنيم.SbcAAaA|cرشته bdcc
اسلاید 78: نمادهاي (first(A را به عنوان مجموعه هماهنگ كننده A در نظر میگيريم . بنابراين اگر يكي از نمادهاي first(A) در ورودي ظاهر شود تجزيه بر اساس A ادامه میيابد.نمادهاي follow(A) را به عنوان نمادهاي هماهنگ كننده A در نظر میگيريم.
اسلاید 79: تجزيه كننده پايين به بالا تجزیه کننده های عملگر اولویتتجزیه کننده های LR
اسلاید 80: مثالی از نحوه عملکرد تجزیه کننده پایین به بالا:expr expr + term | expr - term | termterm 1|2|3|44+1-2term +1-2expr + 1 -2 expr + term -2expr - 2expr - termexpr
اسلاید 81: 1+2-+3term+ 2-+3expr + 2 -+ 3expr + term -+3 expr -+ 3expr -+ termexpr -+ expr
اسلاید 82:
اسلاید 83: دستگیرهدستگيره، دنبالهاي است كه منطبق بر سمت راست يك قاعده توليد بوده و كاهش آن به سمت چپ قاعده توليد يك مرحله از مراحل معكوس سمت راستترين اشتقاق است.
اسلاید 84:
اسلاید 85:
اسلاید 86: دستگيرهها را در كاهش رشته bccdef با توجه به گرامر ذيل مشخص كنيد.SbBCfBBcd|cCeابتدا رشته bccdef را بوسيله سمت راست ترين اشتقاق توليد میكنيم.SbBCfbBefbBcdefbccdef
اسلاید 87: عملکرد تجزیه کننده های LRیافتن دستگیرهکاهش دستگیره
اسلاید 88: ساختار تجزیه کننده های LR
اسلاید 89: مثالگرامر ذيل را در نظر میگيريم.E→E+T | TT→idگرامر به شکل زیر تغییرمی کند.1- S → E 2- E→E+T3- E→T4- T→id
اسلاید 90: مراحل تجزيه رشته id+id
اسلاید 91:
اسلاید 92: مهمترين روشهاي موجود عبارتند از: 1- : LR(0) ساده ترين و ضعيفترين روش است. 2- SLR(1) LR) ساده): اين روش از LR(0) قويتر است.3- LR(1) يا LR متعارف: قويترين روش ساخت جدول تجزيه LR است.4- LALR(1): از روش SLR(1) قويتر و از CLR(1) ضعيفتر است.
اسلاید 93: روش LR(0)عنصرLR(0) :يك قاعده توليد است كه نقطه اي در سمت راست آن قرار دارد( مانند: S→α.β ). مكان نقطه در عنصر LR ميزان پيشرفت، در كاهش غير پايانه سمت چپ(مانند S) را نشان میدهد. S→.XYZ S→X.YZS→XY.ZS→XYZ.
اسلاید 94: عنصر كاهشي: عنصري كه نقطه در آخر سمت راست قاعده توليد قرار دارد. اين نوع عنصر نشان دهنده يافتن يك دستگيره است. به عنوان مثال عنصر S→XYZ. نشان میدهد كه XYZ يك دستگيره است كه میتوان آن را به S كاهش داد. عنصر انتقالي: عنصري كه كاهشي نباشد. به عنوان مثال S→X.YZ يك عنصر انتقالي است. هر عنصر انتقالي نشان دهنده فرضيهاي در مورد دستگيره بعدي است به عنوان مثال S→X.YZ نشان میدهد كه دستگيره ممكن است ازY به دست آيد.
اسلاید 95: ساخت ماشین متناهی
اسلاید 96:
اسلاید 97:
اسلاید 98:
اسلاید 99:
اسلاید 100:
اسلاید 101:
اسلاید 102:
اسلاید 103: E→E+T|T T→id
اسلاید 104:
اسلاید 105: S→EE→E+TE→TT→idT→id [ E ] برخورد انتقال /کاهش
اسلاید 106: S→EE→E+TE→TE→XT→idX→ idبرخورد کاهش /کاهش
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.