Compiler - Session 5

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

‫تحلیلگر لغوی‪ ،‬به عنوان ورودی‪ ،‬متن برنامه مورد کامپایل را کاراکتر به کاراکتر خوانده و سپس اجزاء زبان

را در‬
‫قالب توکن مشخص کرده و در اختیار تحلیلگر نحوی قرار می دهد‪.‬‬
‫ارسال توکن زمانی صورت می گیرد که تحلیلگر نحوی درخواست کند‪.‬‬
‫به هنگام تشخیص توکن‪ ،‬تحلیلگر لغوی از نقطه جاری متن برنامه‪ ،‬کاراکترها را یکی یکی خوانده تا به یک‬
‫جداکننده برسد‪.‬‬

‫این جداکننده ها صرفاً می توانند خاصیت جداکنندگی داشته باشند‪ ،‬مانند کاراکتر جای خالی‪ ،‬تب و یا اینتر؛ چنین‬
‫کاراکترهایی توسط تحلیلگر لغوی کنار گذاشته می شوند و ارزشی برای پارسر یا سایر واحدها ندارند‪.‬‬

‫اما برخی دیگر از جداکننده ها‪ ،‬مانند سمیکالن‪ ،‬عالمت مساوی‪ ،‬به اضافه و ‪ ...‬خود به عنوان یک توکن نیز‬
‫شناخته می شوند‪.‬‬

‫متن برنامه‬ ‫تحلیلگر لغوی‬ ‫تحلیلگر نحوی‬

‫رابطه بین تحلیلگر نحوی و لغوی‬

‫‪© F.Rismanian‬‬ ‫‪1‬‬


‫ساختار توکن ها‬
‫در یک توکن معموالً اطالعات زیر وجود دارد‪:‬‬
‫✓ شماره سطر و ستون‪ ،‬شماره بالک‪ ،‬شماره ترتیب بالک در برگیرنده‪ ،‬نوع لغت‪،‬خود لغت‬
‫شماره سطر و ستون به هنگام تشخیص خطا کاربرد دارد‪.‬‬
‫‪ Blockno‬شماره بالکی است که در آن یک لغت شناسایی شده است‪.‬‬
‫‪ Blockord‬هنگامی که بتوان بالک های تودرتو تعریف کرد مورد استفاده قرار می گیرد‪.‬‬

‫{‪struct token‬‬
‫;‪int row,col‬‬
‫;‪int blockno‬‬
‫;‪int blockord‬‬
‫;‪enum symbolType‬‬
‫};]‪char Name[40‬‬

‫‪© F.Rismanian‬‬ ‫‪2‬‬


.‫ بالک وجود دارد‬3 ‫در قطعه کد مقابل‬

void f()
{ int i=1;
Block No = 1
printf(“%d” , i); Block Ord = 0
}

void g()
Block No = 2
{ int i=2; Block Ord = 0
{ int i=3;
printf (“%d” , i);
} Block No = 3
printf (“%d” , i); Block Ord = 2

}
‫در مثال زیر‪ j ،‬در بالک دوم تعریف نشده اما مورد استفاده قرار گرفته است‪ .‬در چنین‬
‫مواردی ترتیب بالک در فازهای بعد مفید است‪:‬‬

‫;‪{ int i=1,j=2‬‬


‫;‪{ int i=2‬‬

‫;)‪printf(“%d%d”,i,j‬‬
‫}‬
‫;)‪printf(“%d”,i‬‬
‫}‬
Lexical Analyzer Generator – Lex
Lex+ yacc

Lex Source program Lexical Compiler lex.yy.c


lex.l

C
lex.yy.c a.out
compiler

Input stream a.out Sequence of tokens


‫تولیدکننده تحلیلگر لغوی ‪Lex -‬‬
‫روش ایجاد تحلیلگر توسط ‪Lex‬‬

‫‪ -1‬آماده شدن پرونده ای حاوی مشخصه تحلیلگر برای ‪Lex‬‬


‫‪Lex.yy.c‬‬
‫‪Lex.l‬‬ ‫‪Yacc‬کامپایلر‬

‫‪ -2‬تبدیل محتوای پرونده به برنامه در زبان ‪C‬‬


‫‪a.out‬‬
‫‪Lex.yy.c‬‬ ‫‪C‬کامپایلر‬

‫‪ -3‬کامپایل برنامه تولیدی همراه کتابخانه برنامه تحلیل لغوی‬


‫ورودی‬ ‫خروجی‬
‫‪a.out‬‬
‫دنباله نشانه ها‬
‫‪ -4‬خروجی‪ :‬برنامه تحلیلگر لغوی‬
‫‪- Lex‬اجزای برنامه‬
‫تعاریف‬

‫قواعد ترجمه‬ ‫بخش های برنامه مبدا ‪Lex‬‬

‫توابع‬

‫ترتیب در متن برنامه مبدا ‪Lex‬‬

‫تعاریف‬
‫‪declarations‬‬
‫‪%%‬‬ ‫‪%%‬‬
‫‪translation rules‬‬ ‫‪Pattern‬‬ ‫}‪{Action‬‬ ‫قواعد ترجمه‬
‫‪%%‬‬
‫‪auxiliary functions‬‬ ‫‪%%‬‬
‫توابع‬
Example
%{ Int installID() {/* funtion to install the
/* definitions of manifest constants lexeme, whose first character is
pointed to by yytext, and whose
LT, LE, EQ, NE, GT, GE,
length is yyleng, into the symbol
IF, THEN, ELSE, ID, NUMBER, RELOP */ table and return a pointer thereto
%} */
}
/* regular definitions
delim [ \t\n] Int installNum() { /* similar to
ws {delim}+ installID, but puts numerical
letter [A-Za-z] constants into a separate table */
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 = (int) installID(); return(ID); }
{number} {yylval = (int) installNum(); return(NUMBER);}

‫تولیدکننده تحلیلگر لغوی‬
‫اعالن متغیرها‬
‫اعالن ثوابت صریح‬ ‫بخش اعالن برنامه‬
‫تعاریف باقاعده (اجزای عبارات باقاعده مورد استفاده در قواعد ترجمه)‬

‫عبارت باقاعده‬
‫بخش قوانین ترجمه‬
‫بالفاصله پس از ‪%%‬‬
‫‪P1‬‬ ‫} عمل معنایی ‪: {1‬‬ ‫عمل مناسب‬

‫‪P2‬‬ ‫} عمل معنایی ‪: {2‬‬

‫}عمل معنایی ‪: { 3‬‬


‫مورد استفاده دراجرای اعمال‬
‫‪.‬‬
‫‪.‬‬ ‫رویه های کمکی ‪C‬‬
‫‪.‬‬
‫فصل سوم ‪ :‬تحلیل نحوی‬
‫◼ گرامر‬
‫◼اشتقاق و تجزيه‬
‫◼تعريف نحوگرا‬
‫◼ درخت نحوی‬
‫◼ تجزيه باال به پايین و پايین به باال‬
‫◼تحلیل گر نحوی و خطاهای نحوی‬
‫◼ گرامر و گرامر مستقل از متن‬
‫◼ تجزيه باال به پايین و پايین به باال‬
‫◼ تجزيه پیشگو‬
‫تعريف رياضي گرامر‬
‫تعریف‪ :‬ابزار توصیف ساختار جمله و رشتههای يک زبان‬
© F.Rismanian 12
‫گرامر با قاعده‬
‫فرم قوانین گرامر باقاعده‬
A → Bx | x ‫ عنصری از الفبا و پایانه‬x
‫ غیر پایانه‬A ‫ و‬B
A → xB | x

ID → letter A | A Int-Num → 1A | 2A | … | 9A
A → letter A | digit A | A | λ A → 0A | 1A | 2A | …| 9A | λ

‫مثال چند گرامر با قاعده‬

G: S → abSA G: S → bS|cS|aB
A → Aa B → aB|cS |bC
C → aB | bS
‫𝜆 |‪S → aS | Sb‬‬ ‫این گرامر منظم نیست‪.‬‬

‫‪© F.Rismanian‬‬ ‫‪14‬‬


‫مثال از ‪DFA‬‬

‫‪a‬‬ ‫‪b‬‬
‫تبدیل به‬
‫‪S → aS | aA‬‬ ‫ماشین قطعی‬

‫‪A → bA | b‬‬ ‫‪a‬‬ ‫‪b‬‬


‫‪S‬‬ ‫‪A‬‬ ‫‪Z‬‬

‫اشتقاق‬ ‫محاسبه‬ ‫رشته پردازش شده‬

‫‪S → aS‬‬ ‫]‪[S , aabb] → [S , abb‬‬ ‫‪a‬‬


‫‪→ aaA‬‬ ‫]‪[A,bb‬‬ ‫‪aa‬‬
‫‪→ aabA‬‬ ‫]‪[A , b‬‬ ‫‪aab‬‬
‫‪→ aabb‬‬ ‫] ‪[Z,‬‬ ‫‪aabb‬‬
‫پذیرفته توسط ماشین‬
Context free grammars

Terminals ‫پایانه‬ expression -> expression + term


Nonterminals ‫غیرپایانه‬ expression -> expression – term
Start symbol ‫نماد شروع‬ expression -> term
Productions ‫ قوانین‬،‫مولدها‬ term -> term * factor
term -> term / factor
term -> factor
factor -> (expression)
factor -> id

© F.Rismanian 16
‫مثال از یک گرامر‬
V = { E, F }
T = { +, * , / ,id }
S=E
P = { E → F * id , F → F | E , F → F + F }

id * id+ id ‫رشته تولیدی نمونه‬

E→E+T|T ‫استفاده از گرامرها‬


T→T*F|F
F → (E) | id
‫ورودی‬ X*(Y+Z)

© F.Rismanian 17
‫فوايد گرامرها‬
‫‪ -1‬نمایش دقیق و قابل فهمی برای زبان‬

‫‪ -2‬امکان ایجاد پارسرهای کارآمد با قابلیت تشخیص ساختارهای نحوی درست و دقیق‬

‫‪ -3‬ایجاد ساختاری مناسب برای زبان جهت ترجمه صحیح و آشکارسازی خطا توسط گرامر درست طراحی شده‬

‫‪ -4‬سادگی اضافه نمودن ساختارهای جدید به زبان‬

‫عبارات باقاعده‪ -‬داليل استفاده برای لغوی زبان‬


‫‪ -1‬عدم نیاز به نمایش نوع قوی مانند گرامر برای توصیف قوانین ساده لغوی زبان‬
‫‪ -2‬امکان نمایش مختصرتر و قابل فهم تری برای نشانه ها نسبت به گرامر‬
‫‪ -3‬ایجاد تحلیلگرهای لغوی کاراتر به صورت خودکار‬
‫‪ -4‬راه مناسبی برای پیمانه سازی جلوبندی کامپایلر به دو بخش قابل مدیریت با تقسیم ساختار زبان به لغوی و غیرلغوی‬
‫تجزيه کننده‬

‫دریافت رشته ای از نشانه ها از تحلیل گر لغوی و بررسی تعلق رشته به زبان توسط گرامر‬

‫انجام بررسی طبق ساختارهای نحوی زبان و هر مرحله گزارش خطاهای نحوی به اداره کننده خطا‬

‫رفع خطا برای پردازش ادامه ورودی بر اساس خطاهای متداول‬

‫تجزيه کننده‪ -‬ارتباطات‬

‫موقعیت تجزیه کننده در مدل کامپایلر‬

You might also like