260 likes | 449 Views
به نام خدا. طراحی کامپایلرها 414-40. 6. تحلیل نحوی پایین به بالا. تحلیل نحوی « انتقال-کاهش » کاهش یک رشته به نماد شروع گرامر در هر گام یک زیررشتهی مشخص (از چپ به راست) با سمت راست یکی از قاعدهها منطبق، و با سمت چپ همان قاعده جایگزین میشود اشتقاق راستگرد ( Rightmost ):. 3.
E N D
به نام خدا طراحی کامپایلرها 414-40 6
تحلیل نحوی پایین به بالا • تحلیل نحوی «انتقال-کاهش» • کاهش یک رشته به نماد شروع گرامر • در هر گام یک زیررشتهی مشخص (از چپ به راست) با سمت راست یکی از قاعدهها منطبق، و با سمت چپ همان قاعده جایگزینمیشود • اشتقاقراستگرد (Rightmost): 3 a b b c d e 2 a A b c d e 4 a A d e a A B e 1 S 4 1 2 3 S a A B e a A d e a A b c d e a b b c d e 1 rm rm rm rm
دستگیرهها (1) • دستگیرهی یک رشته، زیررشتهای از آن است که با سمت راست یکی از قواعد انطباق دارد، و کاهش آن به سمت چپ قاعده، بخشی از معکوس یک انبساط راست است • به شکل رسمیتر: • یک «عبارت» زیررشتهای از یک فرم جملهای است که دقیقاً از یک غیرپایانه مشتق شده باشد • یک عبارت ساده عبارتی است که در یک گام ایجاد شده باشد • دستگیره، عبارت سادهی است که در یک فرم جملهای راست ظاهر شود • مثلاً A → βدستگیرهای برای α β x است (xرشتهای از پایانههاست) اگر: • یک فرم جملهایمیتوانددستگیرههای متفاوتی داشته باشد • اما فرم جملهایراستگرد یک گرامر نامبهم، یک دستگیره یکتا دارد (هرچند چندین زیررشته ممکن است دستگیره به نظر آیند) * S α A x αβ x rm rm 2
دستگیرهها (2) • مثال 1: • به این ترتیب: • (S →) a A B e دستگیرهای برای a A B e است • (B →) d دستگیرهای برای a A d e است • (A →) A b c دستگیرهای برای a A b c d e است • (A →) b دستگیرهای برای a b b c d e است S a A B e a A d e a A b c d e a b b c d e rm rm rm rm 3
دستگیرهها (3) • مثال 2: • a A b c d e را در نظر بگیرید (فرم جملهای راست). آیا[A → b, a Ab c d e] یک دستگیره است؟ • اگر چنین باشد باید داشته باشیم: • اما به هیچوجه امکان ندارد در هیچ مرحلهای به دو A متوالی برسیم. بنابراین پاسخ سوال بالا منفی است. S … a A A b c d e a A b c d e rm rm rm 4
دستگیرهها (4) • مثال 3: • a A b c d e را در نظر بگیرید (فرم جملهای راستگرد). آیا[B → d, a A b c d e] یک دستگیره است؟ • اگر چنین باشد باید داشته باشیم: • پس میخواهیم a A b c B e را به دست آوریم: • اما این یک فرم جملهای راستگرد نیست. S … a A b c B e a A b c d e rm rm rm ? S a A B e a A b c B e rm 5
تحلیل نحوی انتقال-کاهش با انباره (1) • چالش اصلی: یافتن دستگیره در یک فرم جملهایدادهشده • ایدهی کلی تحلیل نحوی انتقال-کاهش به کمک انباره: • (1) در «انتقال»، نشانههای ورودی روی انباره قرار میگیرند، تا زمانی که یک دستگیره روی انباره یافت شود • (2) در «کاهش»، دستگیره با غیرپایانهی مربوط جایگزینمیشود • (3) پذیرش ورودی زمانی میسر خواهد بود که نشانههای ورودی تمام شوند، و تنها نماد شروع گرامر در انباره باقی مانده باشد • (4) در صورت بروز خطا، مدیر خطا فراخوانی میشود • پیشوند معتبر (Viable Prefix): پیشوندی از یک فرم جملهای راست است که روی انبارهی یک تحلیلگر نحوی انتقال-کاهش ظاهر میشود 6
تحلیل نحوی انتقال-کاهش با انباره (2) • اگر گرامر مبهم باشد چه؟ • مثلاً در: • رشتهیid + id * id از طریق دو انبساط راست متفاوت میتواند به دست آید 7
تحلیل نحوی انتقال-کاهش با انباره (3) • مثال: هم کاهش از طریق E → E + E و هم انتقال میتواند رخ دهد. بنابراین میگوییم «تداخلانتقال-کاهش» اتفاق افتاده است. 8
تداخلها (1) • تداخلها (که در صورت مبهمبودن گرامر رخ میدهند) یا از نوع «انتقال-کاهش» اند یا از نوع «کاهش-کاهش» • مثال دیگری از تداخل انتقال-کاهش: 9
تداخلها (2) • مثالی از تداخل کاهش-کاهش: • رشتهی ورودی A(I,J)را در نظر بگیرید. رشتهینشانههایمتناظر آن id(id,id) خواهد بود. • بعد از 3 بار انتقال، ورودی و انباره به صورت زیر در خواهند آمد: • تداخل کاهش-کاهش: از کدام قاعده (پنجم یا هفتم) باید استفاده کنیم؟ (در واقع انتخاب درست وابسته است به این که A یک آرایه است یا یک تابع) انباره ورودی id ( id , id ) 10
تداخلها (3) • حذف تداخلها • یک راه حل، تغییر گرامر است • مشابه کاری که در رویکرد تحلیل نحوی بالا به پایین، برای تبدیل یک گرامر به LL(1) انجام دادیم • در غیر این صورت، همانطور که بعدا خواهیم دید، با این تداخلها، پس از شناسایی آنها، بهتر میتوان برخورد کرد • حتی ممکن است سبب شود تحلیلگر نحوی کاراتری به دست آید 11
تحلیل نحوی تقدم عملگر (Operator Precedence) • مشکلاتی که تا اینجا به آنها برخوردیم: • مشخصکردندستگیرهها • حذف تداخلها (در صورت وجود) • گرامرهایعملگر: دستهای از گرامرها که مشخصکردندستگیرهها و مواجهه با تداخلها در آنها ساده است • گرامرهایعملگر: سمت راست هیچیک از قواعد ε نیست و دو غیرپایانهی پشت سر هم ندارد؛ مثلاً: • این گرامرها معمولاً مبهماند. 12
تحلیل نحوی تقدم عملگر (2) • ایدهی اولیه: بین هر دو پایانهی گرامر، رابطههایی به شکل <.و .>و .=.تعریف میکنیم • a <. b به این معنی است که a از b تقدم کمتری دارد • a .=. b به این معنی است که تقدم a با bبرابر است • a .> b به این معنی است که a از b تقدم بیشتری دارد • مثلاً فرض کنید که تعریف کنیم * .> + یا به طور مشابه + <. * • در هر مرحله از تحلیل نحوی به این روش، دستگیرههای مختلفی ممکن است وجود داشته باشند. برای یافتن دستگیرهی صحیح، از روابط <. و .> و .=. استفاده میکنیم (دستگیرهای را انتخاب میکنیم که این روابط را رعایت کند) 13
تحلیل نحوی تقدم عملگر (3) • چهطور از روابط گفتهشده استفاده میکنیم؟ • هدف، مشخصکردن و جداسازی دستگیرهی یک فرم جملهای راست است • <. ابتدا، و.> انتهای دستگیره را مشخص میکند و .=. در میان این دو ظاهر می شود • از آنجا که در سمت راست هیچیک از قواعد، دو غیرپایانهی پشت سر هم وجود ندارد، شکل کلی فرم جملهای به این صورت خواهد بود:که در آن βi ها غیرپایانه، یا رشتههایتهیاند (ε) β0 a1β1 a2β2 … anβn 14
تحلیل نحوی تقدم عملگر (4) • در هر مرحله از تحلیل نحوی، تحلیلگر، a یعنی بالاترین پایانهی روی انباره (بالاترین عنصر، یا یکی مانده به بالاترین عنصر) و b یعنی نشانهی جاری را در نظر میگیرد: • اگر a .=. b، آنگاهb را به انباره انتقال میدهد • اگر a <. b، آنگاه ابتدا <. را روی انباره قرار میدهد، و سپس b را به انباره منتقل میکند • اگر a >. b، آنگاه بالاترین <. را در انباره مییابد و عناصر بین آن (علامت اخیر)، و بالاترین عنصر انباره را (به همراه غیرپایانهی زیر <. در صورت وجود) به عنوان دستگیره در نظر میگیرد، و آنها را از روی انباره برمیدارد. سپس یک غیرپایانه نوعی (مثلا علامت شروع گرامر) را روی انباره قرار میدهد • دستگیره حذف شده بایستی با سمت راست یکی از قواعد به صورت ضعیف تطبیق کند (یعنی کافیست که پایانه ها و فقط محل غیرپایانهها تطبیق کند) 15
تحلیل نحوی تقدم عملگر (5) • مثال: جدول تحلیل 16
تحلیل نحوی تقدم عملگر (6) • ساخت جدول تحلیل = FirstTerm(A) { a | A + a αیا A + B a α } = LastTerm(A) { a | A +α a یا A +α a B } a .=. b U → α a b β U → α a B b β a <. b U → α a B β b FirstTerm(B) a .> b U → α B b β a LastTerm(B) 17
تحلیل نحوی تقدم عملگر (7) • مثال = FirstTerm(E) { +, *, id, ( } = FirstTerm(T) { *, id, ( } = FirstTerm(F) { id, ( } = LastTerm(E) { +, *, id, ) } = LastTerm(T) { *, id, ) } = LastTerm(F) { id, ) } 18
تحلیل نحوی تقدم عملگر (8) • توابع تقدم در مقابل رابطهها • هرگاهa <. b، آنگاه f(a) < g(b) • هرگاهa .=. b، آنگاه f(a) = g(b) • هرگاهa .> b، آنگاه f(a) > g(b) 19
تحلیل نحوی تقدم عملگر (9) • ساخت توابع تقدم g id f id f * g * g + f + f $ g $ 20
تحلیل نحوی تقدم عملگر (10) • مدیریت خطا در حین کاهش • فرض کنید a b E c از روی انباره برداشته شده، اما سمت راست هیچ قاعدهای با آن نمیخوانَد • اگر سمت راست قاعدهای a E c بود، باید پیامی به این مضمون نمایش دهیم: «وجود b در خط x غیرمجاز است» • اگر سمت راست قاعدهای a b E d c بود، باید پیامی به این مضمون نمایش دهیم: «d در خط x پیدا نشد» • اگر سمت راست قاعدهای a b c بود، باید پیامی به این مضمون نمایش دهیم: «وجود E در خط x غیرمجاز است» (که E معرّف یک مفهوم در نحو زبان است که آن را با غیرپایانهی E نشان میدهیم) 21
تحلیل نحوی تقدم عملگر (11) • مدیریت خطاهای انتقال-کاهش • e1 • زمانی که کل عبارت پیدا نشده است • id را به ورودی اضافه میکنیم • پیام «عملوند پیدا نشد» را نمایش میدهیم • e2 • زمانی که عبارت با پرانتز بسته آغاز میشود • پرانتز بسته را از ورودی حذف میکنیم • پیام «یک پرانتز بسته اضافی دیده شد» را نمایش میدهیم • e3 • زمانی که id یا پرانتز باز، بعد از id یا پرانتز بسته بیاید • + را به ورودی اضافه میکنیم • پیام «عملگر پیدا نشد» را نمایش میدهیم • e4 • زمانی که عبارت با پرانتز باز پایان مییابد • پرانتز باز را از روی انباره برمیداریم • عبارت «پرانتز بسته پیدا نشد» را نمایش میدهیم 22
تحلیل نحوی تقدم عملگر (12) • استخراج رابطههای تقدم از جدول تحلیل E E T + <. * + T F * id <. id * 23
تحلیل نحوی تقدم عملگر (13) • استخراج رابطههای تقدم از جدول تحلیل E T T F * .> * * T F * F id id .> * 24
تحلیل نحوی تقدم عملگر (14) • مزایا و کاستیهاپیادهسازی آسان جدول تحلیل کوچک قدرت بیان ضعیف (به این دلیل که دو غیرپایانهی پشت سر هم را مجاز نمیداند) دقت نه چندان خوب (بعضی از خطاهای نحوی به خاطر محدودیت روی غیرپایانهها) • روش «عملگر ساده» شکلی از روش «تقدم عملگر» است که این کاستیها را ندارد + + - - 25