PDA

View Full Version : آموزش: سوالی از کامپایلر



armiya
پنج شنبه 10 تیر 1389, 15:59 عصر
با سلام
کسی نحوه عملکرد پارسینگ بازگشتی پایینگرد رو می دونه برام توضییح بده یعنی می خوام الگوریتمش رو درک کنم
یه مثال می زنم برای دوستان ببینید , در این مثال من متوجه نمی شم چطوری عمل تطبیق رو انجام میده



type-> simple|^id|array[simple]of type
simple->integer|char|num dot dot num


شبه کدش هم اینه :


procedure match(t:token);
begin
if lookahead:=t then
lookahead:=nexttoken;
else
error
end;
procedure type;
begin
if lookahead is in {integer,char,num} then simple;
else if lookahead is array then begin
match(array);
match('[');
simple;
match(']');
match(of);
type;
end;
else error;
end;
procedure simple ;
begin
if lookahead=integer=then match(integer);
else if lookahead=char then match(char);
else if lookahead=num then begin
match(num);match(dotdot);match(num);
end;
else error;
end;


تو تحلیلش گیر دارم کمکم کنید
با تشکر

pesar irooni
چهارشنبه 16 تیر 1389, 12:17 عصر
فرض کن میخواهیم عبارت زیر رو pars کنیم
array [1..3] of integer
این ورودی رو به تحلیلگر لغوی دادیم و به ما داده

{ 'array' , '[' , '1' , '.' , '.' , '3' , ']' , 'of' , 'integer' }

با رویه type شروع میکنیم
lookahead = array
تو else if اول میگه اگه look ahead برابر با first (simple) e یعنی {integer,char,num} بود حالا simple رو مچ کن (parsکن)
اگه ^ بود قانون دوم رو مچ کن
تو else if سوم میگه اگه look ahead برابر با array بود (در اصل همون مجموعه first (array [simple] of type) e ) (که هست) این کار رو انجام بده
match('array') ; match('['); simple; match('['); match('of'); type
حالا میاد این 6 تا رویه رو پشت سرهم اجرا میکنه اگه همش اجرا بشه که pars با موفقیت تموم میشه و کد اجرایی میره که تولید بشه وگرنه هرجا گیر کنه یه syntax error میده که اگه برنامه نویسی کرده باشی میدونی چیه
حالا میره سراغ match('array') e
lookahead که برابر array بود و با ورودی match یکییه (یعنی مچه) پس میاد تابع next token از تحلیلگر لغوی فراخونی میکنه (تحلیلگر لغوی مقدار ']' برای این تابع پس میده) و جواب رو توی lookahead میزاره و برمیگرده
پس در این لحظه خواهیم داشت lookahead = ']'
و میریم تا تابع match('[') e رو اجرا کنیم. همینطور الی آخر
فرض کن به عنوان ورودی میدادیم arry [1..3] of integer
اون وقت تو تابع match('array') e نمیتونست arry رو با array مچ کنه و error میداد