Transcript Document
تجزیه کنندگان LR
روش تجزیه نحوی پایین به باالی کارآمدی که برای تجزیه ی رده ی بزرگی از گرامرهای
مستقل از متن می باشد که تجزیه کننده ی ) LR(Kمی نامند .که Lبه معنی پویش
ورودی از چپ به راست R ،به معنی ایجاد سمت چپ ترین اشتقاق به صورت معکوس ،و
Kبرای تعداد نمادهای ورودی پیشنگر می باشد که در تصمیم گیری تجزیه استفاده می
شوند .هنگامی که Kحذف می شود فرض بر این است که مقدار Kبرابر 1است.
تجزیه ی LRبه دالیل گوناگون دارای جاذبه است:
•به منظور تشخیص تمام ساختارهایی از زبانهای برنامه سازی ایجاد گردند که برای آنها
گرامر مستقل از متن می توانند نوشته شوند.
•عمومی ترین روش تجزیه ی غیر بازگشتی انتقال-کاهش شناخته شده است.
•زیر مجموعه ی محض از رده ی گرامر هایی است که می توانند با تجزیه کننده های پیشگو،
تجزیه شوند.
•می تواند خطای نحوی را در زودترین زمان ممکن ،در پویش چپ به راست ورودی تشخیص
دهد.
1
نقطه ضعف اصلی روش LR
ساخت یک تجزیه کننده ی LRبرای گرامر زبان برنامه نویس ی متداوب به صورت دستی،
نیاز به کار خیلی زیادی دارد .ایجاد آن نیازمند یک ابزار خاص ی به نام مولد تجزیه کننده ی
LRمی باشد.طراحی و نحو استفاده ی یکی از آنها ، Yacc ،است.با چنین مولدی ،هر
فرد می تواند گرامر مستقل از متنی بنویسد و این مولد به طور خودکار تجزیه کننده ای
برای آن گرامر تولید می کند.
سه روش برای ایجاد جدول تجزیه ی LRوجود دارد:
LR (1ساده(، ) SLRساده ترین روش برای پیاده سازی است با کمترین توانایی.
LR (2متعارف ،که قدرتمندترین و گرانترین می باشد.
LR (3پیش نگر( ،) LALRاز نظر توانمندی و هزینه در حد متوسط می باشد.
2
الگوریتم تجزیه ی LR
نمودار تصویری LRدر زیر آمده است ،که شامل ورودی ،خروجی ،پشته ،برنامه محرک و
جدول تجزیه ای است که دارای دو قسمت می باشد( actionو ) goto
3
ادامه....
هر نماد حالت ،اطالعاتی را که در پشته و در زیر آن قرار دارد بطور خالصه مشخص می
نماید ،و ترکیب حالت باالی پشته و نماد ورودی جاری ،به منظور اندیس گذاری جدول
تجزیه و تعیین نوع تصمیم تجزیه کننده ی انتقال-کاهش استفاده می شوند .در یک پیاده
سازی ،ظاهر شدن نمادهای گرامر در پشته ضروری نیست ،در هر حال ،همواره آنها در بحث
ها به منظور توضیح رفتار تجزیه کننده ی LRمنظور می نماییم.
جدول تجزیه شامل دو بخش است:
تابع عملکرد تجزیه ، actionو تابع انتقالی به نام . gotoبرنامه ای که تجزیه کننده ی
LRرا هدایت می کند به این ترتیب عمل می نماید Sm .را که حالت باالی پشته است ،و
aiرا که نماد ورودی جاری می باشد ،مشخص می نماید .سپس به ]action[Sm ,ai
مراجعه می کند ،وارده ی actionدر جدول تجزیه برای حالت Smو ورودی ،aiیکی از
این چهار مقدار را دارد:
S -1که یک حالت است به پشته منتقل شود.
-2با مولد گرامر A→βکاهش انجام گیرد.
- 3قبول() accept
- 4 4خطا() error
ادامه....
تابع ، gotoیک حالت و نماد گرامر را به عنوان نشانوندهاف دریافت کرده و یک حالت
دیگر را تولید می کند .خواهیم دید که تابع gotoدر جدول تجزیه ی بدست آمده از گرامر
Gبا استفاده از روش ، LALR، LR، SLRتابع تغییر حالت از یک ماشین خودکار
متناهی قطعی می باشد که پیشوندهای قابل وقوع Gرا تشخیص می دهد .بخاطر آورید که
پیشوندهایی از شبه جمله های راست می باشند که می توانند در پشته ی انتقال-کاهش ظاهر
شوند ،زیرا آنها هرگز از سمت راست ترین دستگیره عبور نمی کنند .حالت اولیه ی این DFA
،حالتی است که در ابتدا در باالی پشته ی تجزیه کننده ی LRقرار داده شده است.
5
پیکربندی های بدست آمده پس هز هر یک از آن چهار نوع حرکت به این ترتیب است:
6
الگوریتم تجزیه LR
ورودی :
رشته ورودی wو جدول تجزیه ی LRبه همراه توابع actionو gotoبرای گرامر
.G
خروجی:
اگر wدر ) L(Gقرار داشته باشد ،یک تجزیه ی پایین به باال برای ، wدر غیر این
صورت نمایش خطا.
روش:
در ابتدا تجزیه کننده S0 ،را در پشته دارد که S0حالت اولیه است و w$در میانگیر
ورودی قرار دارد.
7
شکل زیر توابع actionو gotoاز یک جدول تجزیه ی LRرا برای گرامر زیر برای
عبارت های محاسباتی با عملگرهای دودویی +و * نشان می دهد.
8
حرکت های تجزیه کننده LRبا id*id+id
9
گرامر های LR
10
ساخت جداول تجزیه ی SLR
گرامری را که بتوان برای آن تجزیه کننده ی LRایجاد نمود ،گرامر SLRنامیده می شود.
روش دیگر ،به روش SLRاطالعات پیش نگر را نیز اضافه می نمایند .یک قلم برای
) LR(0از گرامر ، Gمولدی از Gبا یک نقطه در مکانی در سمت راست آن است .بنابراین
مولد A→XYZچهار قلم را ایجاد می کند:
مولد A→λتنها یک قلم به صورت A→.را تولید می نماید .یک قلم می تواند با یک زوج
عدد صحیح نشان داده شود ،اولین عدد شماره ی مولد و دومین عدد ،موقعیت نقطه را
مشخص می نماید .در نتیجه قلم مشخص می نماید که چه مقداری از مولد ،در یک نقطه از
فرآیند تجزیه ،دیده شده است.
11
ادامه.....
12
عمل closure
اگر Iمجموعه ای از اقالم برای گرامر Gباشد ،آنگاه ) closure(Iمجموعه اقالم
ایجاد شده از Iبا استفاده از دو قانون زیر است:
13
مثال:
گرامر افزوده ی عبارت زیر را در نظر بگیرید.
اگر Iمجموعه ای دارای یک قلم به صورت }] {[E’→.Eباشد ،آنگاه )closure(I
شامل اقالم زیر است:
14
ادامه.....
15
goto عمل
16
مثال:
اگر Iمجموعه ای دوقلم به صورت}][E→E.+Tو] {[E’→E.باشد ،آنگاه
)goto(I.+شامل اقالم زیر است:
E→E+T
T →.T*F
T →.F
)F →.(E
F →.id
17
مثال:
گروه متعارف ) LR(0برای گرامر مقابل در شکل زیر آمده است:
18
نمودار تغییر حالت DFAمربوط به Dبرای پیشوندهای قابل وقوع
19
اقالم معتبر
20