Transcript Slide 1

‫مشخصه های ‪Lex‬‬
‫یک برنامه ‪ Lex‬شامل سه قسمت زیر می باشد‪:‬‬
‫اعالنات‬
‫‪%%‬‬
‫قواعد ترجمه‬
‫‪%%‬‬
‫توابع کمکی‬
‫قراعد ترجمه شامل دستورات زیر می باشد‪:‬‬
‫}‪{action‬‬
‫}‪{action‬‬
‫…‬
‫}‪{action‬‬
‫‪1‬‬
‫‪P1‬‬
‫‪P2‬‬
‫…‬
‫‪Pn‬‬
‫برای نشانه ها‬Lex ‫برنامه‬
%{
/* definitions of manifest constants
LT,LE,EQ,NE,GT,GE,IF,THEN,ID,NUMBER,RELOP*/
%}
/* regular definitions*/
delim
[ \t\n]
ws
{delim}+
letter
[A-Za-z]
digit
[0-9]
id
{letter}({letter} │ {digit})*
number {digit}=(\.{digit}+)?(E[=\-]?{digit}+)?
%%
{ws}
{/*no action and no return*/}
if
{return (IF);}
then
{return(THEN);}
else
{return(ELSE);}
{id}
{yylval=instsll-id();return(ID);}
{number} {yylval=install-num();return(NUMBER)}
“<”
{yylval=LT;return(RELOP);}
“<=“
{yylval=LE;return(RELOP);}
“=“
{yylval=EQ;return(RELOP);}
“<>”
{yylval=NE;return(RELOP);}
“>”
{yylval=GT;return(RELOP);}
“>=”
{yylval=GE;return(RELOP);}
%%
2
.....‫ادامه‬
install-id (){
/*procedure to install the lexeme,whose first character is pointed to by
yytext and whose length is yyleng,into the symbol table and return a pointer
thereto*/
}
Install-num(){
/*similar procedure to install a lexeme that is a number*/
}
3
‫تحلیلگر نحوی‬
‫از گرامر های مستقل از متن یا ‪ BNF‬که شکلی استاندارد برلی تعریف دستورات زبان می باشد‬
‫برای مشخص نمودن قواعد نحوی زبان استفاده شده است ‪.‬‬
‫تعریف گرامر‬
‫چهار تایی مرتب >‪ G=<V,T,S,P‬را یک گرامر می نامیم هرگاه‬
‫الف)‪ V‬مجموعه ای متناهی و نا تهی از متغیر ها (غیر پایانه ها)است ‪.‬‬
‫ب)‪ T‬مجموعه ای متناهی و نا تهی از حروف الفبایی است که ‪. V∩T=Ø‬‬
‫ج)‪ SЄV‬غیر پایانه(متغیر)شروع می باشد ‪.‬‬
‫د)‪ P‬مجموعه قواعد جایگزینی است که هر قاعده از ‪ P‬بیه شکل ‪ α → β‬است که در آن‬
‫*‪β Є (VυT) * , α Є(VυT)+OR‬‬
‫‪4‬‬
‫گرامر مستقل از متن‬
‫گرامر ‪ G‬را یک گرامر مستقل از متن می نامند هرگاه هر قاعده آن به شکل ‪A→ β‬باشد که‬
‫در آن ‪ AЄV‬و* )‪ β Є (VυT‬می باشد‪ A.‬باید یک غیر پایانه باشد ولی‪ β‬می تواند هر‬
‫چیزی باشد ‪.‬‬
‫زبان پذیرفته شده توسط یک گرامر‬
‫زبان پذیرفته شده توسط گرامر ‪ G‬را به شکل زیر نمایش می دهیم‬
‫}‪│S→W‬‬
‫‪5‬‬
‫*‪L(G)={WЄT‬‬
‫مثالهایی از گرامر مستقل از متن‬
‫‪S→aSb│SS│bSa│λ (1‬‬
‫‪S→AB)2‬‬
‫‪A→aAb│λ‬‬
‫‪B→bBb│λ‬‬
‫‪)3‬گرامر نحوی مربوط به ارقام‪ ،‬عالمت جمع و عالمت منها)‪(9-5+2‬‬
‫درخت تجزیه مربوط به عبارت باال‪:‬‬
‫‪6‬‬
‫‪List→list+digit‬‬
‫‪List→list-digit‬‬
‫‪List→digit‬‬
‫‪digit→0│1 │2 │… │9‬‬
‫درخت های تجزیه‬
‫درخت تجزیه به صورت مصور نشان می دهد که چگونه رشته ای در زبان از نماد شروع گرامر‬
‫مشتق می گردد ‪.‬‬
‫درخت تجزیه مر بوط به ‪A→XYZ‬‬
‫درخت تجزیه مربوط به گرامر مستقل از متن‬
‫‪7‬‬
‫‪.1‬ریشه درخت متناظر با نماد شروع گرامر است‪.‬‬
‫‪.2‬هر برگ درخت با یک نشانه و یا ‪ λ‬نام گذاری می شود ‪.‬‬
‫‪.3‬هر گره داخلی درخت با یک غیر پایانه گرامر متناظر می باشد‪.‬‬
‫‪.4‬اگر ‪ A‬غیر پایانه متناظر با گره داخلی درخت باشد و ‪ X1,X2,…,Xn‬برچسب های فرزندان‬
‫آن گره از چپ به راست باشند آنگاه ‪ A→X1….Xn‬مولدی از گرامر است‪.‬در اینجا‬
‫‪ X1,X2,…,Xn‬نماد هایی از گرامر می باشند که پایانه و یا غیر پایانه هستند ‪ .‬در یک مورد‬
‫خاص اگر ‪A→λ‬آنگاه گره داخلی درخت که ‪ A‬نامیده می شود دارای یک فرزند ‪ λ‬می باشد‪.‬‬
‫‪‬یک گرامر ممکن است برای رشته ای از نشانه ها بیش از یک درخت تجزیه داشته باشد ‪،‬در این‬
‫صورت گویند این گرامر مبهم است ‪.‬بنابراین برای نمایش مبهم بودن گرامر تنها کافی است رشته ای از‬
‫نشانه ها را بیابیم که بیش از یک درخت تجزیه دارد ‪.‬‬
‫‪‬در کامپایلرها نیاز به طراحی گرامر های غیر مبهم می باشد ‪.‬‬
‫‪‬مثالی از گرامر مبهم‪:‬‬
‫‪string→string+string│string-string │0 │1 │… │9‬‬
‫دو درخت تجزیه برای عبارت ‪9 - 5+2‬‬
‫‪8‬‬
‫شرکت پذیری عملگر ها(از راست و یا چپ)‬
‫‪‬چهار عملگر محاسباتی جمع‪،‬تفریق‪،‬ضرب و تقسیم از چپ شرکت پذیر می باشند ‪.‬‬
‫‪‬عملگر هایی از قبیل توان و = از راست شرکت پذیر می باشند ‪.‬‬
‫رشته هایی مانند ‪ a=b=c‬که دارای عملگر شرکت پذیر از راست می باشد توسط گرامر زیر تولید‬
‫می شوند ‪.‬‬
‫‪right→letter=right│letter‬‬
‫‪letter→a │b │c │… │z‬‬
‫‪‬تفاوت بین درخت تجزیه یک عملگر شرکت پذیر از چپ مانند – و یک عملگر شرکت پذیر از‬
‫راست مانند = ‪:‬‬
‫‪9‬‬
‫تقدم عملگر ها‬
‫‪‬دو تفسیر برای عبارت ‪ 9+5*2‬وجود دارد ‪)9+5(*2)1:‬‬
‫‪9+)5*2()2‬‬
‫‪‬در عبارات محاسباتی عملگر های ضرب و تقسیم دارای تقدم بیشتری از جمع و تفریق می باشند‬
‫‪‬نحو عبارات ‪:‬یک گرامر برای عبارات محاسباتی با استفاده از جدولی که شرکت پذیری و تقدم‬
‫عملگر ها را نشان می دهد ساخته می شود ‪.‬‬
‫‪‬دستورات مربوط به عبارات محاسباتی * و ‪ /‬و ‪ +‬و ‪: -‬‬
‫‪expr→expr+term│expr-term │term‬‬
‫‪term→term*factor │term/factor │factor‬‬
‫)‪factor→digit │(expr‬‬
‫‪10‬‬
‫‪‬نحو احکام ‪:‬از کلمات کلیدی در جهت تشخیص احکام در زبانهای برنامه سازی استفاده می‬
‫گردد ‪.‬‬
‫‪‬بعض ی از احکام زبان پاسکال توسط گرامر(مبهم) زیر که در آن شناسه با ‪ id‬نشان داده شده‬
‫است تعریف می گردند ‪.‬‬
‫‪stmt→id:=expr‬‬
‫‪│if expr then stmt‬‬
‫‪│if expr then stmt else stmt‬‬
‫‪│while expr do stmt‬‬
‫‪│begin opt-stmts end‬‬
‫‪‬جهت ترجمه ساختار زبان برنامه سازی ‪،‬یک کامپایلر الزم است که در جریان کار موارد دیگری‬
‫عالوه بر کد تولید شده برای آن ساختار باشد ‪،‬که همان صفات مربوط به ساختارها می باشد‬
‫‪،‬صفت می تواند نمایش دهنده هر کمیتی باشد مانند نوع‪،‬رشته یا هر چیز دیگری‪.‬‬
‫‪11‬‬
‫نشان گذاری ‪،‬تابعی که طرح ترجمه نامیده می شود ‪،‬جهت مشخص نمودن‬
‫کار ترجمه معرفی می گردد ‪.‬از طرح ترجمه برای ترجمه عبارات میانوند به نشان‬
‫گذاری پسوندی استفاده می شود‪.‬‬
‫نشان گذاری پسوند(عبارتی مانند ‪) E‬‬
‫‪ .1‬اگر ‪ E‬متغییر و یا ثابت باشد آنگاه نشان گذاری پسوند برای ‪ E‬خود ٍ‪ E‬می باشد‪.‬‬
‫‪ .2‬اگر ‪ E‬عبارتی به شکل ‪ E1 op E2‬که در آن ‪ op‬یک عملگر دودویی می باشد ‪،‬نشان گذاری‬
‫پسوند برای ‪ E‬عبارت است از ‪. E1 E2 op‬‬
‫‪ .3‬اگر ‪ E‬عبارتی به شکل ‪ E1‬باشد آنگاه نشان گذاری پسوند برای ‪ E1‬همان نشان گذاری‬
‫پسوند برای ‪ E‬می باشد ‪.‬‬
‫‪‬در نشان گذاری پسوندی نیازی به پرانتزها نیست‪.‬‬
‫‪‬برای مثال نشان گذاری پسوندی برای عبارت ‪ (9-5)+2‬برابر است با‪95-2+‬‬
‫‪952+‬‬‫)‪9-(5+2‬‬
‫‪‬‬
‫‪12‬‬
‫نحو گرا‬
‫‪‬تعریف نحو گرا از گرامر مستقل از متن جهت مشخص نمودن ساختار نحوی ورودی استفاده می‬
‫کند ‪.‬‬
‫‪‬عمل ترجمه ‪،‬یک نگاشت ورودی به خروجی می باشد ‪.‬خروجی برای هر ورودی مانند ‪ X‬بدین‬
‫صورت است که ابتدا یک درخت تجزیه برای ورودی ‪ X‬می سازیم ‪.‬فرض کنیم که گره ‪ n‬در درخت‬
‫با نماد ‪ X‬از گرامر متناظر باشد ‪ X.a.‬مقدار صفت ‪ a‬از نماد ‪ X‬در آن گره است ‪.‬‬
‫‪‬درخت تجزیه ای که مقادیر صفات در هر گره همراه داشته باشد درخت تجزیه ‪annotated‬‬
‫گویند ‪.‬‬
‫صفات نحوی‬
‫صفتی را نحوی می گوییم که مقدارش در هر گره درخت تجزیه ‪،‬از مقادیر صفات فرزندان آن گره‬
‫بدست آید ‪.‬‬
‫صفات نحوی ‪،‬خواص ی می باشند که در پیمایش پایین به باال درخت تجزیه ‪،‬ارزشیابی می گردند ‪.‬‬
‫‪13‬‬
‫مثالی از یک تعریف نحوگرا برای ترجمه عبارات حاوی ارقام و عالمت های جمع و‬
‫تفریق به نشان گذاری پسوند ‪:‬‬
‫‪14‬‬
‫مثال ‪:‬‬
‫فرض کنید که یک روبات به نحوی ساخته شده که یک قدم به شرق حرکت نماید و سپس به ترتیب یک قدم‬
‫به شمال ‪،‬به مغرب و در پایان یک قدم به جنوب حرکت نماید‪.‬دنباله ای از چنین دستورالعمل هایی به وسیله‬
‫گرامر زیر تولید می شود ‪:‬‬
‫‪seq→seg instr│begin‬‬
‫‪instr→east│north│west│south‬‬
‫تعییر موقعیت این روبات با توجه به ورودی‬
‫‪Begin west south east east east north north‬‬
‫پیگیری موقعیت یک روبات ‪:‬‬
‫‪15‬‬
begin west south ‫ برای‬annotated ‫درخت تجزیه‬
16
‫تعریف نحوگرای موقعیت روبات‬
‫‪17‬‬
‫پیمایش های عمقی‬
‫ که‬. ‫در این قسمت قوانین معنایی با استفاده از پیمایش عمقی تعریف می شوند‬
: ‫شکل ارزشیابی آن بدین صورت است‬
procedure visit (n : node);
begin
for each child m of n, from left to right do
visit(m);
evaluate semantic rules at node n
end
18
‫الگو های ترجمه‬
‫‪‬الگو ی ترجمه گرامر مستقل از متن است که در آن ‪،‬قطعه برنامه هایی که عملیات معنایی نامیده‬
‫می شوند همراه سمت راست مولد می باشند ‪.‬‬
‫‪‬الگوی ترجمه مانند یک تعریف نحوگرا است ‪،‬بجز اینکه ترتیب ارزشیابی قوانین معنایی صریحا‬
‫داده شده است ‪.‬جایی که در آن عملیات باید اجرا شود ‪،‬با یک جفت کروشه نشان داده شده است‬
‫و در داخل سمت راست مولد نوشته می شود ‪،‬مانند ‪:‬‬
‫‪rest→+term{print(‘+’)} rest1‬‬
‫درخت تجزیه ‪:‬‬
‫‪19‬‬
‫تولید ترجمه‬
‫در این بخش ‪،‬عملیات معنایی در الگو های ترجمه ‪،‬خروجی ترجمه را که یک رشته یا یک کاراکتر می باشد در‬
‫پرونده می نویسد ‪.‬‬
‫عملیاتی که عبارات را به نشان گذاری پسوندی ترجمه می نماید ‪:‬‬
‫})’‪expr→expr+term{print(‘+‬‬
‫})’‪expr→expr-term {print(‘-‬‬
‫‪expr→term‬‬
‫‪term→0‬‬
‫})’‪{print(‘0‬‬
‫‪term→1‬‬
‫})’‪{print(‘1‬‬
‫…‬
‫‪term→9‬‬
‫})’‪{print(‘9‬‬
‫عملیات الزم برای ترجمه ‪ 9-5+2‬به ‪95-2+‬‬
‫‪20‬‬