نمایش نتایج 1 تا 2 از 2

نام تاپیک: سوالی از کامپایلر

  1. #1

    سوالی از کامپایلر

    با سلام
    کسی نحوه عملکرد پارسینگ بازگشتی پایینگرد رو می دونه برام توضییح بده یعنی می خوام الگوریتمش رو درک کنم
    یه مثال می زنم برای دوستان ببینید , در این مثال من متوجه نمی شم چطوری عمل تطبیق رو انجام میده


    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;


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

  2. #2
    کاربر دائمی آواتار pesar irooni
    تاریخ عضویت
    بهمن 1386
    محل زندگی
    تهران
    سن
    40
    پست
    495

    نقل قول: سوالی از کامپایلر

    فرض کن میخواهیم عبارت زیر رو 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 میداد

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •