220 likes | 464 Views
به نام خدا. طراحی کامپایلرها 414-40. 7. تحلیلگرهای نحوی LR (1). قویترین روش تحلیل نحوی انتقال-کاهش (که کارا هم باشد): تحلیل نحوی LR جالب توجه است، زیرا: تحلیل نحوی LR کلیترین روش تحلیل نحوی انتقال-کاهش، بدون عقبگرد است (که ضمناً کارا هم هست)
E N D
به نام خدا طراحی کامپایلرها 414-40 7
تحلیلگرهای نحوی LR (1) • قویترین روش تحلیل نحوی انتقال-کاهش (که کارا هم باشد): • تحلیل نحوی LR جالب توجه است، زیرا: • تحلیل نحوی LR کلیترین روش تحلیل نحوی انتقال-کاهش، بدون عقبگرد است (که ضمناً کارا هم هست) • مجموعهی زبانهایی (گرامرهایی) که به کمک روش LR قابل تحلیل نحویاند، زیرمجموعهی سرهی زبانهایی (گرامرهایی) است که به کمک تحلیلگرهای نحوی پیشگو (مثلاً LL(1)) قابل تحلیلاند • تحلیلگر نحوی LR خطاها را در زودترین زمان ممکنی که با توجه به پویش چپ به راست میسر است، کشف میکند LR (k) پویش چپ به راست اشتقاق راستگرد k نشانهی بعدی ورودی (اگر 1 k = باشد، k را نمینوینسد) گرامرهای LR(1) گرامرهای LL(1) 1
تحلیلگرهای نحوی LR (2) • تحلیلگرهای نحوی LR: • گروه بزرگی از گرامرها را پوشش میدهند • SLR (Simple LR): تحلیلگر نحوی LR ساده • LR: کلیترین تحلیلگر نحوی LR • LALR(Look-Ahead LR): تحلیلگر نحوی LR میانی (متوسط) • SLR، LR، و LALR مثل هم کار میکنند (الگوریتم تحلیل نحوی آنها یکسان است) و تفاوتشان تنها در جدول تحلیل است 2
الگوریتم تحلیل نحوی LR (1) انباره a1 … ai … an $ ورودی Sm Xm الگوریتم تحلیل نحوی LR Sm-1 خروجی Xm-1 . جدول اعمال (Action Table) جدول Goto (Goto Table) . S1 X1 S0 3
الگوریتم تحلیل نحوی LR (2) • یک پیکربندی تحلیل نحوی LR: • Sm و ai، قدم بعدی تحلیلگر را با رجوع به جدول تحلیل مشخص میکنند (انباره در ابتدا فقط حاوی S0است) • یک پیکربندی تحلیل نحوی LR فرم جملهای راستگرد را نشان میدهد: • X1 … Xmai ai+1 … an $ ( ) S0 X1 S1 ... Xm Sm ai ai+1 … an $ انباره باقیماندهی ورودی 4
عملهای تحلیلگر نحوی LR (1) • (1) انتقال s: ورودی بعدی را به همراه حالت s، روی انباره قرار میدهد • ( S0 X1 S1 … Xm Sm, ai ai+1 … an $ ) → (S0 X1 S1 … Xm Smai s, ai+1 … an $ ) • (2) کاهش A → β (یا کاهش n، که n شمارهی قاعده است): • برداشتن (=r) |β|×2 عنصر از روی انباره • قرار دادن A و s روی انباره، به طوری که s = goto[sm-r, A] • ( S0 X1 S1 … Xm Sm, ai ai+1 … an $ ) → (S0 X1 S1 … Xm-rSm-r A s, ai… an $ ) • خروجی، قاعدهی A → β • (3) پذیرش: تحلیل نحوی با موفقیت به اتمام میرسد • (4) خطا: تحلیلگر نحوی یک خطا را تشخیص میدهد (خانهای خالی در جدول تحلیل) 5
عملهای تحلیلگر نحوی LR (2) • عمل کاهش • برداشتن (=r) |β|×2 عنصر از روی انباره؛ فرض کنید β = Y1 Y2 … Yr • قرار دادن A و s روی انباره، به طوری که s = goto[Sm-r, A] • ( S0 X1 S1 … Xm-rSm-rY1 Sm-r … Yr Sm, ai ai+1 … an $ ) → • (S0 X1 S1 … Xm-rSm-rA s, ai… an $ ) • در حقیقت، Y1 Y2 … Yr یک دستگیره است • X1 … Xm-rA ai … an $ X1 … XmY1 … Yrai ai+1 … an $ 6
جدول تحلیل SLR • مثال: 7
عملهای یک تحلیلگر نحوی (S)LR • مثال: 8
ساخت جدول تحلیل (1) • آیتم LR(0) • یک آیتم LR(0) از گرامر G، قاعدهای از G است که در جایی از سمت راست آن، «نقطه»ای گذاشتهایم • مثلاً اگر داشته باشیم: A → a B b ، آیتمهای LR(0) ممکن، اینها هستند: • مجموعهی آیتمهای LR(0) حالتهای جدول اعمال و Goto را تشکیل میدهند • مجموعهای از مجموعههای آیتمهای LR(0) (موسوم به «مجموعهی کانونی LR(0)») مبنایی برای ساخت تحلیلگرهای نحوی SLR است • گرامر افزوده • گرامر افزودهی G’، همان گرامر G است که به آن قاعدهی S’ → Sافزودهایم که در آن S’ نماد جدید شروع است 9
ساخت جدول تحلیل (2) • عمل بستار (Closure) • اگر I مجموعهای از آیتمهای LR(0) برای گرامر G باشد، بستار I، مجموعهای از آیتمهای LR(0) است که از I با توجه به این دو قانون ساخته شده است: • (1) در ابتدا، هر آیتم LR(0) در I به بستار I اضافه میشود • (2) اگر A → α● B βدر بستار I باشد و B → γنیز یکی از قاعدههای گرامر G، در آن صورت، B → ●γنیز در بستار I خواهد بود (این قانون را تا جایی اعمال میکنیم که دیگر آیتم LR(0) جدیدی به بستار I اضافه نشود) 10
ساخت جدول تحلیل (3) • مثال: آیتمهای هسته (kernel) } = بستار {E’ → ● E} { 11
ساخت جدول تحلیل (4) • تابع Goto • Goto(I, X) بستار مجموعهی همهی آیتمهای به شکل A → α X ●βاست که A → α● X βعضو I باشد • تعریف بالا را شهوداً میتوان به این صورت بیان کرد که Goto(I, X)، مجموعهی همهی آیتمهایی است که (در صورت دیده شدن X) از I «قابل دسترسیاند» • مثلاً فرض کنید باشد، در این صورت: = I { E’ → E ●, E → E ● + T } = Goto(I, +) { E → E + ● T, T → ● T * F, T → ● F, F → ● ( E ), F → ● id } 12
ساخت جدول تحلیل (5) • برای ساخت جدول تحلیل SLRگرامر G، باید مجموعهی کانونی LR(0) گرامر G’ را تشکیل دهیم • الگوریتم: • C بستار { S’ → ● S } است • گامهای زیر را تا جایی که دیگر مجموعهی جدیدی از آیتمهای LR(0) به C اضافه نشود، تکرار کن • به ازای هر I در C، و هر نماد گرامر X • اگر مجموعهی Goto(I, X) تهی نباشد، و در C نیز نباشد، • اعضای Goto(I, X) را به C اضافه کن • تابع Goto یک DFA روی مجموعههای موجود در C است 13
ساخت جدول تحلیل (6) I1 • مثال: I6 I2 I9 I0 I3 I10 I4 I7 I11 I8 I5 14
ساخت جدول تحلیل (7) I1 • DFA مثال قبلی: + E T I6 * I9 I7 T I2 F I3 ( I0 * I4 F I3 I7 id I5 ( F E I4 I8 I10 T ( I2 I4 F id id I5 I3 ( ) I4 I11 id + I5 I6 I5 15
ساخت جدول تحلیل (8) • ساختن جدول تحلیل SLR (برای گرامر افزودهی G’): • (1) ساختن مجموعهی کانونی از مجموعههای آیتمهای LR(0) گرامر G’ • {I0, …, In} ← C • (2) ساختن جدول اعمال به این ترتیب: • اگر a یک پایانه، A → α● a βعضو Ii، و Goto(Ii, a) = Ij باشد، آنگاه action[i, a]را shift j قرار میدهیم • اگر A → α●عضو Ii باشد، آنگاه به ازای همهی a Follow(A)،action[i, a]را reduce A → αقرار میدهیم (در صورتی که A ≠ S’) • اگر S’ → S ●عضو Ii باشد، آنگاه action[i, $] را accept قرار میدهیم • اگر با استفاده از قانونهای بالا تداخلی به وجود آید، گرامر SLR(1) نیست • (3) ساختن جدول Goto به این ترتیب: • به ازای همهی غیرپایانهها (مثلاً A)، اگر Goto(Ii, A) = Ij باشد، Goto[i, A] را j قرار میدهیم • (4) همهی خانههایی که بعد از این مراحل خالی ماندهاند، معرف خطا هستند • (5) حالت اولیهی تحلیلگر، شامل S’ → ● S است 16
ساخت جدول تحلیل (9) • مثال: 17
گرامر SLR(1) • تحلیلگر نحوی LR ای که از جدول تحلیل SLR(1) برای گرامر G استفاده کند، تحلیلگر نحوی SLR(1) گرامر G نامیده میشود • اگر گرامری، جدول تحلیل SLR(1) داشته باشد، گرامر SLR(1) (یا مختصراً گرامر SLR) نامیده میشود • گرامرهای SLR مبهم نیستند، اما هر گرامر نامبهم، الزاماً SLR نیست 18
تداخلها (1) • اگر در حالتی باشیم که ندانیم برای یک پایانه، باید عمل انتقال را انجام دهیم، یا عمل کاهش را، میگوییم «تداخل انتقال-کاهش» رخ داده است • اگر در حالتی باشیم که ندانیم برای یک پایانه، کدامیک از چند قاعدهی ممکن را باید برای کاهش به کار ببریم، میگوییم «تداخل کاهش-کاهش» رخ داده است • اگر جدول تحلیل SLR یک گرامر دارای تداخل باشد، آن گرامر SLR نیست 19
تداخلها (2) I1 • مثال: I0 I2 = Follow(R) { =, $ } = I3 I6 reduce R → L shift 6 I4 تداخل انتقال-کاهش I7 I8 I5 I9 20
تداخلها (3) • مثال: I0 = Follow(A) { a, b } = Follow(B) { a, b } a b reduce A → ε reduce B → ε reduce A → ε reduce B → ε تداخل کاهش-کاهش تداخل کاهش-کاهش 21