(۱۷ اردیبهشت ۱۳۹۵ ۰۱:۵۳ ب.ظ)mohamad moo نوشته شده توسط: (17 اردیبهشت ۱۳۹۵ ۰۱:۵۲ ب.ظ)saeid1389 نوشته شده توسط: سوال یک کامپایلر
به علت برخورد first/follow ، گرامر (۱)LL نیست
پس تناقض داشت
شما LL(1) بودن رو دارید اشتباه تحلیل میکنید!
گرامری LL(1) هستش که تمام قواعد آن،برخورد first/first و برخورد first/follow نداشته باشه!
ّ
در این سوال گفته شده یکی از متغیر های گرامر A هستش که دارای قاعده تولید های
A→α∣β هستش.(پس متغیرها و قواعد دیگه ای هم داره)...
از طرفی طبق فرض سوال :قاعده
α میتونه لامبدا رو تولید کنه ولی
β لامبدا رو تولید نمیکنه!
و شرط اول سوال:
first(α)∩first(β)=∅ هستش ،پس یعنی این متغیر برخورد first/first نداره.
و شرط دوم سوال:
follow(A)∩first(β)=∅ هستش، پس یعنی این متغیر برخورد First/Follow نداره!
همونطور که میدونید برخورد first/follow یعنی follow متغیر مورد نظر،اشتراکش با قاعده ای که لامبدا رو تولید نمیکنه،تهی باشه!!! که اینجا هم همینطوره!
و شرط سوم میگه که :
follow(A)∩first(A)≠∅ که هیچ مشکلی نداره و میتونه اتفاق بیفته!!بطور مثال گرامر زیر رو در نظر بگیرید:که هر سه شرط صورت سوال رو داره!
A→BC∣g
B→b∣λ
C→dD∣λ
D→Ab∣λ
در متغیر A:
First(α)=First(BC)={b,d,λ}
First(β)=First(g)={g}
پس برخورد first/first نداره.
Follow(A)={$,b}
و چون
Follow(A)∩First(β)={$,b}∩{g}=∅
پس برخورد first/follow هم نداره در حالیکه
Follow(A)∩First(A)={$,b}∩{b,c,λ,g}={b}≠∅ هستش!
پس با این مثال مشخص شد که هر سه شرط سوال درست هستش و هیچ تناقضی نیست.وچون زوج قاعده A ، شرط LL(1) بودن رو نقض نمیکنه ،LL(1) بودن یا نبودن گرامر بستگی به قواعد دیگر گرامر داره.(که در متن سوال اشاره شده زوج قاعده A بخشی از قواعد یک گرامر است)