PDA

View Full Version : سوال: پیاده‌سازی جدول روابط تقدمی



f11691
شنبه 24 دی 1390, 23:49 عصر
سلام . من یک پروژه دارم که در مورد این هست که جدول روابط تقدمی رو به عنوان ورودی بگیره و توابع تقدمی رو به عنوان خروجی تحویل بده. میشه راهنماییم کنید که چطور و با چه متدی این برنامه رو بنویسم؟:متفکر:

maktoom
دوشنبه 26 دی 1390, 01:12 صبح
سلام
منظورتون جدول گرامر تقدم عملگر از مباحث کامپایلرهاست؟
این که چی رو باید خروجی بده دقیق تر بیان می کنید؟

f11691
دوشنبه 26 دی 1390, 15:07 عصر
سلام، بله از مباحث کامپایلر هست. مثلاً خروجی اون مواردیو که در ورودی دیدیم به طور مثال اینطور بده

agar a<.b ---> f(a) <. g(b) hamchin khoroji entzar mire

مرسی از جوابتون

*** {
توسط حامد مصافی ویرایش شد
لطفاً فینگلیش ننویسید!
} ***

maktoom
دوشنبه 26 دی 1390, 15:24 عصر
سلام چرا :
f(a) <. g(b)
? چون باید:
a<firstterm(B)
باشه. که a یک پایانه و B یک غیر پایانه است.
خوب شما کافیه به ازای هر قانون که در ورودی می گیرید دونه دونه ببرید داخل توابعی که اگه توی اونا صدق می کرد یه سری روابط تقدم عملگر رو بیرون بکشه.
اول کار هم باید چک بشه که هیچ دو غیر پایانه ای در سمت راست قانون مجاور نباشن ضمن اینکه قانون اپسیلون هم نباید وجود داشته باشه.
یعنی کار باید در حد امکان شکسته بشه.

f11691
دوشنبه 26 دی 1390, 17:30 عصر
سلام چرا :
f(a) <. g(b)
? چون باید:
a<firstterm(B)
باشه. که a یک پایانه و B یک غیر پایانه است.
خوب شما کافیه به ازای هر قانون که در ورودی می گیرید دونه دونه ببرید داخل توابعی که اگه توی اونا صدق می کرد یه سری روابط تقدم عملگر رو بیرون بکشه.
اول کار هم باید چک بشه که هیچ دو غیر پایانه ای در سمت راست قانون مجاور نباشن ضمن اینکه قانون اپسیلون هم نباید وجود داشته باشه.
یعنی کار باید در حد امکان شکسته بشه.

نه حتما نباید یکی پایانی باشه و یکی غیر پایانی بستگی به جدول ورودی داره . برای مثال :
*< ( ---> f(*) < g( ( )
در مورد firsttterm هم استاد ما به جای این کلمه از این نماد استفاده میکردند

maktoom
سه شنبه 27 دی 1390, 02:24 صبح
گرامر تقدم عملگر گرامریه که براش اصلا غیر پایانه ها مهم نیست و کل بحث روی غیر پایانه هاست. حتی توی جدولی هم که براش می کشیم در سطر و ستون پایانه ها به اضافه $ داریم.
به ازای هر قانون شروع به محاسبه بررسی تقدم ها می کنیم:

*در ابتدا قانون جدیدی، با فرض اینکه A غیر پایانه شروع گرامر است، به گرامر می افزاییم:
A'--->$A$
* هرجا یک پایانه قبل از یک غیر پایانه آمده باشد آن پایانه کوچکتر از firstterm اآن غیرپایانه است.
*و هرجا یک غیر پایانه قبل از یک پایانه بیاید Lastterm آن غیر پایانه بزرگتر از آن پایانه است.
*هرجا دو پایانه بلا فاصله و یا حداکثر به فاصله یک غیر پایانه در بینشان بیایند برای تقاطع این دو پایانه در جدول علامت مساوی را قرار می دهیم.
*ضمن آنکه a<b مساوی نیست با b>a و یا a=b مساوی نیست با b=a

اینا رو نوشتم که بدونیم داریم در مورد دقیقا کدوم موضوع بحث می کنیم. و اگه کسه دیگه ای خواست چیزی پیشنهاد بده متوجه بشه.
منظور از Firstterm برای یک غیر پایانه طبق کتاب طراحی کامپایلر ها از آقای اهو ترجمه دکتر دلداری عبارت است از:

*مجموعه ی پایانه هایی که در سمت راست آن غیر پایانه بلافاصله ظاهر شوند و یا حداکثر بعد از یک غیر پایانه.

و همچنین در همان مرجع Lastterm برای یک غیر پایانه عبارت است از:

*مجموعه پایانه هایی که در سمت راست قانون مربوط به آن غیر پایانه که در انتهای آن و یا حداکثر به فاصله یک غیر پایانه قبل از انتهای سمت راست آن قانون می آیند.

در صورتی که در سمت راست فقط غیرپایانه داشتیم (نمیتوان وجود دو غیرپایانه را متصور بود چون باشرط گرامر تقدم عملگر در تنقض است) هردوی Firstterm و Lastterm برای آن غیرپایانه سمت راست قانون محاسبه خواهد شد.
برای مثال:


A' ------> $A$

A ------> aBb|C

B ------> dB|C

C ------> af|AcBb

Firstterm(A)={a,c}

Firstterm(B)={d,a,c}

Firstterm(C)={a,c}

Lastterm(A)={b,f}

Lastterm(B)={d,f,b}

Lastterm(C)={f,b}


اینارو بداهه نوشتم.(اگه جاییش موردی هست بفرمایید)
که برای مثال از سطر دوم یعنی قانون شماره 1 می توان این نتایج را گرفت:

a<firstterm(B) , lastterm(B)>b , a=b

خوب حالا ما چند سطر دستورالعمل بسیار واضح داریم. فقط میمونه یک سیاست پیاده سازی.
خوب شما ایده اولیتون چیه؟
قانون ها رو میخواید ثابت بگیرید یا کاربر بتونه قانون دلخواه بده؟
و برای محاسبه Firstterm و Lastterm یک تابع خاص دارای عمومیت تعریف می کنید یا برای هر غیر پایانه مخصوص ایجاد می کنید؟
گرافیکی کار می کنید یعنی واقعا جدول ایجاد می کنید یا نه بنحوی نشان می دهید که روابط تقدم عملگر برای هر پایانه چطور است؟یعنی سطر سطر چاپ کند که برای این پایانه ما این روابط را بدست آوردیم.

f11691
سه شنبه 27 دی 1390, 17:02 عصر
سلام و مرسی بابت توضیحتون فکر میکنم منظورتون از firstterm همون تابع leading و lastterm همون تابع trailing هست. خوب حالا متوجه توضیحاتتون شدم. برای سادگی برنامه میشه قوانین رو ثابت گرفت و جدول رو به صورت آرایه 2 بعدی تعریف کرد. حالا یه سوال اگه کاربر یک گرامر به عنوان ورودی بده چکار کنیم؟
بازم ممنون از توضیحاتتون

maktoom
چهارشنبه 28 دی 1390, 10:32 صبح
سلام
اول باید چک بشه گرامر تقدم عملگر هست یا نه(دو تا شرط)
بعدش به ازای هر قانون ببره توی توابع تعیین Firstterm و Lastterm و مجموعه هایی رو برای هر قانون بدست بیاره. اگر هم تکراری بود که بگذره.
بعد شروع کنه روی هر سمت راست قانون پیمایش کنه. بعد از خوندن یک کاراکتر چک کنه پایانست یا غیر پایانه و کاراکتر بعدی رو هم همینطور.
بعد با توجه به حالتی که پیش میاد واسه اون پایانه روابط تقدم عملگرش رو درج کنه.
شما دیگه الان همه چیز رو دارید. شروع کنید.