تالار گفتمان مانشت
محاسبه روابط تقدم در تقدم عملگر ساده - نسخه‌ی قابل چاپ

محاسبه روابط تقدم در تقدم عملگر ساده - firouziam - 23 دى ۱۳۹۲ ۰۶:۴۹ ب.ظ

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

این گرامرمون:

۱) E->+ET|T
۲) T->*TF|F
۳) F->id

اینا هم head و tail:
{Head(E)={+,*,id,T,F
{Tail(E)={id,T,F
{Head(T)={*,id,F
{Tail(T)={id,F
{Head(F)={id
{Tail(F)={id

حالا بر اساس قاعده E->+ET مگه نباید بگیم :
(Head(E > + {یعنی هر چی تو مجموعه هد E داریم > + }
که میشه {+,*,id,T,F}>+ و
(Tail(E)>Head(T
که میشه {id,T,F}>{*,id,F} و
(E<Head(T
که میشه {E<{*,id,F
از طرفی هم چون داریم T->*TF پس داریم T=F
تا اینجا درسته؟
پس یعنی دوتا رابطه بین T,F هست یکی: T=F و یکی T>F ولی تو جدول تقدمش فقط مساوی رو گذاشته...

اگه اشتباه میکنم لطفا بگین کجارو بد حساب میکنم مرسی،
آخه تو خیلی از مثالاش این مشکل پیش میاد، بعید میدونم اشتباه حل کرده باشه. این مشکل مخصوصا تو مواردی که دوتا غیر پایانی کنار هم داریم پیش میاد...
تصویر حل سوال تو مدرسانو هم میذارم ببینین

RE: محاسبه روابط تقدم در تقدم عملگر ساده - mhma_1367 - 24 دى ۱۳۹۲ ۰۹:۲۶ ب.ظ

(۲۳ دى ۱۳۹۲ ۰۶:۴۹ ب.ظ)firouziam نوشته شده توسط:  سلام
دوستان من کامپایلرو خوب خوندم و اکثر جاها شو خوب بلدم ولی این روابط تقدم عملگر ساده بدجور اعصابمو خورد کرده، نمیدونم من بد متوجه شدم یا... خلاصه همیشه چنتا مورد تو جدول تجزیه اش هست که من نمیدونم چجوری بدست آورده یا مثلا به روشی که میرم بعضی جاها باید دوتا رابطه قرار بگیره
یه مثال میزنم تا بفهمید مشکلم کجاست

این گرامرمون:

۱) E->+ET|T
۲) T->*TF|F
۳) F->id

اینا هم head و tail:
{Head(E)={+,*,id,T,F
{Tail(E)={id,T,F
{Head(T)={*,id,F
{Tail(T)={id,F
{Head(F)={id
{Tail(F)={id

حالا بر اساس قاعده E->+ET مگه نباید بگیم :
(Head(E > + {یعنی هر چی تو مجموعه هد E داریم > + }
که میشه {+,*,id,T,F}>+ و
(Tail(E)>Head(T
که میشه {id,T,F}>{*,id,F} و
(E<Head(T
که میشه {E<{*,id,F
از طرفی هم چون داریم T->*TF پس داریم T=F
تا اینجا درسته؟
پس یعنی دوتا رابطه بین T,F هست یکی: T=F و یکی T>F ولی تو جدول تقدمش فقط مساوی رو گذاشته...

اگه اشتباه میکنم لطفا بگین کجارو بد حساب میکنم مرسی،
آخه تو خیلی از مثالاش این مشکل پیش میاد، بعید میدونم اشتباه حل کرده باشه. این مشکل مخصوصا تو مواردی که دوتا غیر پایانی کنار هم داریم پیش میاد...
تصویر حل سوال تو مدرسانو هم میذارم ببینین


برای اینکه بشه روش تقدم ساده استفاده کرد باید سمت راست هیچ دو قاعده ای از نظر قرارگیری ترمینال و غیرترمینال یکسان نباشه که همون جور که میبینیم این شرط نقض شده و نمیشه از تقدم ساده برا این روش استفاده کرد ...

RE: محاسبه روابط تقدم در تقدم عملگر ساده - firouziam - 25 دى ۱۳۹۲ ۰۹:۰۳ ق.ظ

(۲۴ دى ۱۳۹۲ ۰۹:۲۶ ب.ظ)mhma_1367 نوشته شده توسط:  برای اینکه بشه روش تقدم ساده استفاده کرد باید سمت راست هیچ دو قاعده ای از نظر قرارگیری ترمینال و غیرترمینال یکسان نباشه که همون جور که میبینیم این شرط نقض شده و نمیشه از تقدم ساده برا این روش استفاده کرد ...

ممنون از پاسختون، ولی به نظورتون کجای گرامر این شرطو نقض کرده؟ قواعد E->T و T->F ؟ آخه من این قواعدو تو خیلی گرامرها دیدم که بدون مشکل با تقدم ساده پارسش کردن!

RE: محاسبه روابط تقدم در تقدم عملگر ساده - mehdi63_1 - 16 بهمن ۱۳۹۲ ۱۰:۵۰ ب.ظ

منم همین مشکلو دارم!!!!
کسی جوابو نمی دونه؟
مشکل من فقط این نیست مثلا واسه گرامر زیر:
lS->(SS)l
S->c
که تو اکثر کتابا هم هست برای SS اگه برای اولین S ما tail(s)=c رو در نظر بگیریم و s دوم رو هم بهش دست نزنیم ( دو تا شرطی که معمولا با or برای بزرگتری نوشته شده) رابطه c>S باید وجود داشته باشه که توی جدول خالیه!!!
نمی دونم کجا رو اشتباه می کنیم لطفا کمک کنید. Huh