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‬‬