Come Back
Come Back
-۱زبان ماشین :دادهها و دستورالعملها به صورت باینری هستند .به لحاظ معماری ماشین
-۲زبان اسمبلی :برای پیاده سازی یک برنامه در این زبان استفاده از کلمات اختصاری استفاده میشود.
-۳زبان سطح باال :به زبان انسان نزدیکتر است و دارای ساختارهای و امکانات بیشتری برای استفاده برنامه
نویس است.
-۱براساس نوع معماری ماشینها زبان ماشینها متفاوت است تعداد و نوع دستورالعملها
1
{ )for (i = 0; i < 0; i++
}
به چه صورت زبان اسمبلی یا زبان سطح باال اجرا میشود؟ هدف هر برنامهای باید به زبان ماشین دربیاید.
استفاده از مفسر
خطا
دستورالعمل بعدی
2
مثل مترجم زبان انگلیسی که جمله به جمله تفسیر میکند .در زبان کامپایلری یک فایل exeایجاد میکند
و این فایل را هرکجا ببریم اجرا میشود و یکی از معایب زبان مفسری همین است که همه جا باید مفسر را
سهولت در اشکالزدایی برنامههایی که مدام در حال تغییر است رمان ساخت نرم افزار را
کاهش میدهد.
قابلیت حمل هر کجا مفسر باشد مستقل از نوع سخت افزار روی هر ماشینی میتوان اجرا کرد.
معایب
مفسر
سخت افزار
سرعت اجرا پائین چون برنامه به طور مستقیم روی سخت افزار اجرا نمیشود و یک الیه میانی
نیاز به مفسر
دسترسی به کد منبع حتماً باید کد منبع در اختیار استفاده کننده قرار گیرد.
کامپایلر
کامپایلر برنامهای است که برنامههای یک زبان برنامهنویسی را ،از زبان مبدأ(همان زبان) به زبان هدف ترجمه
میکند.
3
برنامه مبدأ ورودیها
فایلی که روی HWاجرا شود در صورتیکه هیچ خطایی نداشته باشد.
برنامه به زبان ماشین ترجمه میشود و میتوان روی سخت افزار اجرا شود برای همین است که میگوئیم
برنامهای که اجرا میکنیم روی هر کامپیوتری ببریم اجرای برنامه بعد از کامپایل روی ماشین
عدم نیاز به کامپایل مجدد یک بار که ساخته میشود دیگر نیازی به اجرای برنامه نیست برخالف
مفسر که هر زمان الزم است اجرا شود باید مفسر اجرا میشد.
قابلیت حمل پائین وقتی کامپایل میشود از زبان مبدأ به زبان ماشین تفسیر میشود .چون زبان
همه ماشینها 0و 1است ولی باهم فرق دارند برای هر ماشین خاص کامپایلر خاص داریم(.فایل
4
جلوبندی و عقب بندی کامپایلر
جلوبندی :تجزیه برنامه مبدأ به قطعات تشکیل دهنده و ایجاد یک نمایش میانی از برنامه مبدأ
عقب بندی :ایجاد برنامه هدف با استفاده از نمایش میانی و اطالعات جدول نماد
جدول نماد در طول روال کامپایل تشکیل میشود .مثالً اطالعات شناسه در جدول قرار میگیرد که در بخش
فرض nزبان برنامه نویسی داریم و kتا ماشین مختلف داشته باشیم بر روی اجرای هر زبان روی هر ماشین.
برای حل این مشکککل از نمایش میانی اسککتفاده میکنیم یعنی برنامه هدف از نمایش میانی اسککتفاده می
سادگی طراحی
کاهش پیچیدگی
5
افزایش سرعت تولید کامپایلر برای سخت افزار جدید و زبانهای جدید
برنامه
مبدأ
جلوبندی
کد میانی
عقب بندی
برنامه هدف
توجه :بعضی از زبانها از مفسر برای اشکالزدایی ساده و برای تولید کد منبع از کامپایلر استفاده میکند.
برنامه مبدأ
کد میانی
عقب بندی برای عقب بندی برای عقب بندی برای ... عقب بندی برای
ماشین 1 ماشین 2 ماشین 3 ماشین n
ویژوال بیسیک از مفسر و کامپایلر استفاده میکند .قابلیت حمل ویژگی دیگری از مفسری استفاده میکند.
6
Lispو متلب مفسری
C++کامپایلری
جاوااسکریپت به طور مفسری توسط مرورگرها اجرا میشود در هر سیستم سخت افزاری اجرا میشوند.
برنامه را به زبان JVMماشین مجازی جاوا ترجمه میکند حاال JVMهرکجا باشد روی هر سخت افزاری این
common language Runtime CLR C#نقش ماشین مجازی را بازی میکند پالتفرمی است که
با سخت افزار در ارتباط است .فایل اجرایی هم بوجود میآید که در مراحل بعدی نیاز به اجرای دوباره برنامه
نداریم.
CLRنقش ماشین مجازی را ایفا میکند .اما برای اجرا باید آن فریم ورک حتماً نصب باشد مثالً برای CFحتماً
تحلیلگر لغوی
تحلیلگر نحوی
تحلیلگر معنایی
مولد کد میانی
مولد کد
7
) (Lexical Analyzer تحلیلگر لغوی
تشخیص نوع لغات برنامه و در صورت عدم خطا در دیکته لغت ،ارسال آن برای تحلیلگر نحوی
پیام خطا
-کاراکتر به کاراکتر از برنامه مبدأ میخواند و نشانه یا tokenرا برای تحلیلگر نحوی ارسال میکند در واقع
تحلیلگر نحوی با فراخوانی تحلیلگر لغوی این درخواستها را ارسال میکند .تحلیلگر لغوی این لغتها را
در خواست میکند و تحلیلگر لغوی آن نشانه را همراه با ویژگیهایش میخواند و برای تحلیلگر نحوی ارسال
میکند.
Int Temp >کلمه کلیدی و < temp, Id>, < if ارسال میکند
if i+f
اگر تحلیلگر لغوی جملهای را بخواند و به لحاظ امالیی و دیکته نادرست باشد خطا میدهد.
8
تحلیلگر نحوی ()syntax Analyzer
تشخیص ظاهری فرم برنامه و بررسی صحت و درستی ترتیب لغات برنامه مبدا
تحلیلگر نحوی یک درخت تجزیه از نشانهها که برایش ارسال میکند به طور ضمنی ارسال میکند.
مثال:
صابون
) For (i=0; i<10; i++ گیرد.گر نحوی خطا میبه لحاظ لغوی درست است اما تحلیل
x+y=z z=x+y
}
9
تحلیلگر معنایی )(semantic Analyzer
استفاده از اطالعات موجود در درخت تجزیه و جدول نماد برای بررسی مطابقت معنایی برنامه با
تعریفهای زبان دستور با ساختار آن زبان برنامه نویسی مغایرت نداشته باشد.
معنایی نادرست ×
;Int x
;Char ch
صحیح کاراکتر
{ )( Int main
;Int a =1; int b=3; float c = 1.5
;)a = f (b, c
;)a = f (a, b, c
10
-2کنترل نوع عملوندها( :تبدیل نوع هم میتوان انجام داد)
;int x
;float y, z
;z = x + y
;int x متغیری تعریف شده و حافظه در نظر گرفته شده است ولی از آن
خطا
خروجی
کد میانی
ADD y, z, x
11
بهینه سازی کد میانی
اعمال تغییرات در برنامه بدون تغییر در عملکرد آن به منظور افزایش سرعت و کاهش حافظه
مصرفی
)x = int to real (p1
y = p2 + x
z =p3 + y int to real 20, , x اعشاری
پارامتر 1اگر عدد باشد و مشخص باشد دستورالعمل 3آدرسه باشد mult p2, x, y mult p2, 20.0, y
مولد کد نهایی
Move Z, R1
12
X=y+2*z
=
Id1 +
Id2 *
2 Id3
=
Id1 +
Id2 *
2
13
Front ENDجلوبندی
توجه!
Back ENDعقببندی
مولد کد نهایی
14
تحلیلگر لغوی
خواندن کاراکترهای برنامه مبدأ – گروه بندی در قالب لغتها و ایجاد دنبالههایی از نشانهها برای هر
لغت است.
تحلیلگر نحوی با ارسال دستور get next tokenدرخواست نشانه میکند و تحلیلگر لغوی را فراخوانی می
کند .تحلیلگر لغوی وقتی لغتی را میخواند در جدول نماد بنویسید و لغت را در قالب توکن برای تحلیلگر
نحوی ارسال میکند(شناسه – رزرو شده و ...در قالب بستهبندی شده) ارسال میکند.
پویش:شامل پردازش سادهای است که نیازی به تولید نشانه ندارد .مانند تشخیص توضیحات ،حذف
کاراکترهای فضای خالی متوالی .....در فرایند کامپایل نیازی نیست رویش کاری انجام شود(برای فضای
15
تحلیل لغوی :استخراج نشانهها از خروجی پویشگر(تحلیلگر لغوی)
Int x
;x = x + 2
یکی یکی میخواند و نشانهها را استخراج میکند – تحلیلگر لغوی با جدول نماد در ارتباط بطور دوطرفه و
کلمات کلیدی(رزرو شده):لغاتی که در زبان مبدأ ،مفهوم خاصی دارند مثال ifرا نمیتوان بعنوان نام
عملگرها :برای انجام عملیات مساوی ،مقایسه و منطق ...در زبان مبدأ کاربرد دارد >(.و < )or ،and ،
توضیحات :برای خوانایی بیشتر برنامه مبدأ است ،توسط کامپایلر نادیده گرفته میشود.
16
; int i , j مثال :برنامهای به زبان c++
;Float 2j کلمه کلیدی intشود.گر نحوی ارسال میدر قالب توکن برای تحلیل
{ شناسهj
.
.
برنامه زیر صحیح نیست اما در فاز اول(تحلیل لغوی) صحیح است.
;Int i
تعداد آکوالد باز و بسته باید باهم مساوی باشد .در تحلیلگر نحوی بررسی میشود.
توقف :در این روش تحلیلگر لغوی پس از کشف اولین خطا متوقف میشود.
17
-زمان تولید نرم افزار افزایش مییابد.
پوشش خطا :در این روش پس از کشف یک خطای لغوی تحلیلگر متوقف نمیشود ،بلکه به کار خود ادامه
مثال:
نشانهها )(Token
در ورودی تحلیلگر نحوی عالوه بر لغات ،باید نوع هر لغت را نیز مشخص کنیم .برای ایجاد هماهنگی بین
در واقع نشانه ،عالمتی است که بین تحلیلگر لغوی و نحوی توافق شده است.
کلمات کلیدی برای هر کلمه کلیدی یک شانه مجزا در نظر گرفته میشود .مثالً برای کلماتی مثل else, for,
اگر کامپایلر را با زبان C ++بنویسیم برای هر توکن یک عدد که توافق شده در نظر بگیریم.
18
# define IF – TK مقدار عددی
…………
# define WHILE - TK ………
# define ELSE - TK ………
# define FoR - TK ……...
عالئم :برای هر کدام از عالئم یک نشانه همراه در نظر گرفته میشود .مثالً برای عالمتهای تک کاراکتری از
عملگرها :همانند عالئم برای عملگرها نیز میتوان یک نشانه مجزا در نظر گرفت و برای عملگرهای یک
انتخاب
عملگر
Dentifier tokenداریم با شناسه شناسه yبا شماره 2داریم
1
X=y تحلیلگر لغوی > < ID – TK , L > < ASSIGN > < ID – TK, 2
x y
اندیس لغت
1 x
2 y
جدول نماد
ثوابت مطابق با نوع ثابت تحلیگر لغوی یک نشانه را برای تحلیلگر نحوی ارسال میکند
19
فضاهای خالی و توضیحات فضاهای خالی و توضیحات بدلیل بیتأثیر بودن در نتیجه برنامه توسط تحلیلگر
رشتهها و زبانها :برای طراحی تحلیلگر لغوی یا اسکنر لغات را با استفاده از عبارات منظم و با قاعده پیاده
کنیم و بعد ماشین متناهی پیادهسازی کنیم که تحلیلگر لغوی را پیادهسازی کنیم آیا دیکته با ساختارها
}Σ {0 , 1
}Σ {a , b , c
}… Σ {a , b , c , d …, A , B , C, … [ , ] , { , } , 8 , α , ! ,
در زبان برنامهنویسی این الف زبان میشود
Σ {0 , 1} ⇒ 101011101
Σ {a , b , c} ⇒ abcbb ≪ aaba
}… = {λ , a, ab, abb, abbb, abbbb, *λ ⃓ ab 𝑛𝑏 𝑛 ≥ 0 ← 𝑏 ∗ 𝐿1
n=0→λ
= {abc, aa bb cc, aaa bbb ccc, …} 𝑎𝑛 𝑏 𝑛 𝑐 𝑛 ∶ 𝑛 ≥ 1𝐿2
= {W ∈ {𝑎 , 𝑏}∗ ∶ |𝑎| = |𝑏|} 𝐿3
20
عملیات بر روی زبانها
𝑛 𝑏 𝑛𝑎 = 𝐿
𝑛 𝑏 𝑛𝑎 𝐿̅ = {𝑎 , 𝑏}∗ −
∗}𝑏 :{𝑎 ,تمامی رشتههای ممکن
L* = ababba
L+ = a کوچکترین رشته
انواع زبانها
زبانهای منظم ) ← (Regularبیشترین محدودیت دارند (* برای هر زبان یک گراف وجود دارد)
21
زبانهای بدون محدودیت
زبانهای منظم
گرامر:
گرامر مجموعهای از قواعد میباشد که ساختار جمالت یک زبان را مشخص میکند با استفاده از گرامر می-
توانیم تعلق یک رشته به زبان را مشخص کنیم .هر گرامر با چهارتایی زیر مشخص میشود.
V: میتوان عمل اشتقاق را انجام داد توسعه داد → غیر پایانهها (متغیرها)
T: پایانهها
مثال( ab* → abb :هر رشته را گرامر بپذیرد) یک گرامر بنویسیم (محدودیتی نمیگذاریم :فرض)
S → aB
=P
B → bB ⃓ λ
}T = {a , b
}V = {S , B
حتماً با aشروع شود یا هیچ bیا هر تعداد b
G:
E→E+T⃓T S: E }V: {E, T, F
T→T*F⃓F با اشتقاق }T = {+ , * , (,) , id
F → (E) ⃓ id
22
E
⃓
)(id + id * id این رشته با این گرامر به دست میآید
T
⃓ E→T
F
T→F
( ) )F → (E
E
E→E+T
E + T E→T
انواع گرامر
مثال:
𝛽A → α
گرامر خطی راست *A,B𝝐V , α𝝐T
A→α
:αپایانه :𝛽 ،غیر پایانه
23
S → aA
A → bS
S → ab
A → 𝛽α
گرامر خطی چپ *A,B𝝐V , α𝝐T
A→α
𝑎 → 𝑆2
)*)r = (aab (ab
)G = (V, T, S, P
نه منظم راست نه خطی چپ
S→A
A → aB │ λ
B → Ab
24
همه گرامرهای منظم مستقل از متن هستند
مثال:
)G = (N , Σ , P , S
:Nمتغیر ها
:Σترمینالها
:Pقوانین
:Sنمادین
25
مثال:
}Σ {a , b
زمانی که حداکثر a ،3داشته باشد
∗ 𝑏 )𝜆 (𝑎 + 𝜆) 𝑏 ∗ (𝑎 + 𝜆) 𝑏 ∗ (𝑎 +
روی bمحدودیت نداریم bها تولید شوند یا نشوند.
}{𝑎2𝑛 𝑏 2𝑚 + 1 : 𝑛 ≥ 0 , 𝑚 ≥ 0
𝑛 :𝑎2تعداد aزوج
:𝑛 ≥ 0 , 𝑚 ≥ 0رابطهای نیست.
مثال:
a
Σ {a, b, c} b λ
c ϕ
اگر 𝑟1 , 𝑟2عبارت منظم و ) L (𝑟1 ) , 𝐿 (𝑟2زبانهای منظم مربوط به آنها باشد آنگاه:
26
𝑟1 + 𝑟2 )1نیز عبارت ،منظم است.
عبارت منظم برای رشتههایی که هیچ دو صفر متوالی ندارند؟ }Σ = {0 , 1
*)(0 + λ) (10 + 1 11 00 1 11 00 000 11 0 111 0
عبارت منظم برای }زوج = 𝑛 [𝑎𝑎]∗ [𝑏𝑏]∗ + [𝑎𝑎]∗ 𝑎 [𝑏𝑏]∗ 𝑏 {𝑎𝑛 𝑏 𝑚 ∶ 𝑚 +
دو حالت وجود دارد اول aو بعد .1 . bتعداد b , aزوج باشد مجموع زوج .2 .اگر تعداد b , aفرد باشد مجموع
زوج میشود.
27
زبانی روی الفبای } {0 , 1که حداقل دو صفر متوالی دارند
∗𝑎 𝑏 ∗𝑎 𝑏 ∗𝑎 𝑏 ∗𝑎
)(a + b) (a + b + c)* (a + c a (a │ b │ c)* c , b (a │ b │ c)* c
4فرم مختلف ابتدا یا با aیا bو انتهایی aیا cباشد.
∗) ∗𝑏𝑎 ∗𝑏 𝑎 ∗𝑏 𝑎 ∗𝑏( :تمامی رشتهها روی الفبای b , aکه تعداد aها بر 3بخشپذیر است
) ∗𝑏 𝜙 ∗ 𝑏 )𝜆 :(𝑏∗ 𝑎 𝑏∗ 𝑎 𝑏∗ 𝑎𝑏∗ ) (𝑏∗ (𝑎 +رشتههایی را تولید میکند که باقیمانده تقسیم تعداد ϕهای
ماشین خودکار متناهی یک رشته از یک زبان منظم را دریافت میکند ،و در صورتیکه رشته متعلق به زبان
باشد آن را تصدیق میکند و در غیر این صورت آن را رد میکند .ماشین خودکار متناهی دو نوع است:
-1ماشین خودکار قطعی ) ← (DFAکامالً قطعی است که با حروف الفبا به چه حالتی میرسیم.
-2ماشین خودکار غیر قطعی ) ← (NFAبه ازای هر حروف چندین حرکت ممکن است.
δتابع گذر
q0حالت شروع
28
δ (qi , a) = qj
δ (qi , b) = qk
در این ماشین ،در هر حالت با خواندن یکی از الفبای زبان امکان چندین گذر وجود دارد .گذر λهم وجود
دارد
𝑞0 b
طراحی دوم:
a
𝑞1 a
b F
𝑞0
b
a
a
bیا ( aشروع) bیا ( aختم) b
a
b
b
29
a,b طول 2است ⇐ 4حالت
a a a a
0 1 2 3 F
b
b
5
4
a
a,b a
b
6 a,b
a 10
8
b b
7
a,b b
9
b F
:δتابع گذر
:q0حالت شروع
در این ماشین ،در هر حالت با خواندن یکی از الفبای زبان تنها یک گذر وجود دارد( .گذر λنداریم)
30
b
b b
0 0 a 1 a F bb aa b
∗𝑏 𝑎 ∗𝑏 𝑎 ∗𝑏
مثال :یک DFAبرای پذیرش زبان با رشتههایی که حداقل یک aو دقیقاً دو تا bدارند
a a a
a b b
0 1 2 F
b a
a b
3
4 t
b
a,b
حالت تله ← رشتهای که تولید میکند از روال عادی زبان خارج شود
∗𝑎 𝑏 ∗𝑎 𝑏 ∗𝑎 𝑎
0
1 0 0
3
t
1
برای هر کدام از عبارتها یک nfaرسم میکنیم .یعنی برای هر 𝑎𝜖Σیک nfaبا حالت شروع iبدین
s=a مثال:
t=c
r=s+t
مثال N(r) :را برای عبارت منظم 𝑡 𝑟 = 𝑠 +به صورت زیر رسم میکنیم.
32
N(s) را برای عبارت منظم 𝑡 ∙ 𝑠 = 𝑟 (الحاق sدر tاست) به صورت زیر رسم میکنیم.
مثال :بنویسید؟
---------------------------------------------------------------------------
33
یک NFAبرای عبارت با قاعده ) 0(10)∗ (01رسم کنید.
تعریف )𝑞(𝑒𝑟𝑢𝑠𝑜𝑙𝑐 : 𝜆 −مجموعه حاالتی از NFAکه از حالت 𝑞 با تبدیل 𝜆 قابل دسترس هستند.
34
}𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(0) = {0.1.2.5
تعریف )𝑇(𝑒𝑟𝑢𝑠𝑜𝑙𝑐 : 𝜆 −مجموعه حاالتی از NFAکه از حاالت 𝑇 با تبدیل 𝜆 قابل دسترس هستند.
}𝑇 = {1.4.5
}𝑇 = {0.3
تعریف )𝑎 : 𝑚𝑜𝑣𝑒(𝑇.مجموعه حاالتی از NFAکه از حالت Sدر مجموعه Tو با نماد ورودی aیک
}𝑇 = {1.3
}𝑚𝑜𝑣𝑒(𝑇. 𝑎) = {3
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(𝑠) را محاسبه میکنیم و به مجموعه حاصل یک اسم اختصاصی میدهیم و آن را به
35
یک حالت عالمت نخورده ،در Dtransرا پیدا میکنیم و آن را Tمینامیم .و مراحل زیر را روی آن اجرا
میکنیم (ابتدا فقط یک حالت در جدول Dtransوجود دارد) .درصورت عدم وجود حالت عالمت خورده
-2برای هر نماد از الفبای زبان (در الگوریتم آنها را aمینامیم) مراحل زیر را انجام میدهیم:
این مجموعه با مجموعههای موجود در Dtransیکسان نبود نام جدیدی به آن اختصاص میدهیم و آن را به
Dtransاضافه میکنیم.
)2-2در واقع باید به جدول Dtransدرصورت تکراری نبودن 𝑢 = ]𝑎 𝐷𝑡𝑟𝑎𝑛𝑠[𝑇.را اضافه کنیم.
مجموعهای را که شامل حداقل یکی از حالتهای پایانی NFAباشد را به عنوان حالت پایانی DFAمشخص
میکنیم.
36
𝐴 = }𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(−1) = {−1.0.1.2
}𝑚𝑜𝑣𝑒(𝐴. 𝑎) = {3
}𝑚𝑜𝑣𝑒(𝐴. 𝑏) = {4
𝐵 → }𝑚𝑜𝑣𝑒(𝐵. 𝑎) = {3
}𝑚𝑜𝑣𝑒(𝐵. 𝑏) = {4.6.3
}𝑚𝑜𝑣𝑒(𝐶. 𝑎) = {3.4
}𝑚𝑜𝑣𝑒(𝐶. 𝑏) = {4.6
37
: Dtrans جدول
a b
A B C
B B D
C E F
D E D
E E D
F E F
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(0) = {0.1.2} = 𝐴
𝑚𝑜𝑣𝑒(𝐴. 𝑎) = 3 = 𝐵
𝑚𝑜𝑣𝑒(𝐴. 𝑏) = 4 = 𝐶
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(3) = {3} = 𝐵
𝑚𝑜𝑣𝑒(3. 𝑎) = ∅
𝑚𝑜𝑣𝑒(3. 𝑏) = 3
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(4) = {4} = 𝐶
𝑚𝑜𝑣𝑒(4. 𝑎) = 4
𝑚𝑜𝑣𝑒(4. 𝑏) = ∅
𝑚𝑜𝑣𝑒(𝐸. 𝑎) = {3.4} → 𝐸
38
𝐷 → }𝑚𝑜𝑣𝑒(𝐸. 𝑏) = {3.4.6
𝐸 → }𝑚𝑜𝑣𝑒(𝐹. 𝑎) = {3.4
𝐹 → }𝑚𝑜𝑣𝑒(𝐹. 𝑏) = {4.6
رسم DFA
39
𝛿(𝑁𝐹𝐴) a b c 𝜆
𝑞0 {𝑞0 . 𝑞1 . 𝑞2 } 𝜙 𝜙 𝜙
𝑞1 𝜙 {𝑞1 } 𝜙 𝜙
𝑞2 𝜙 𝜙 {𝑞2 } {𝑞1 }
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(𝑞0 ) = {𝑞0 }
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(𝑞1 ) = {𝑞1 }
𝜆 − 𝑐𝑙𝑜𝑠𝑢𝑟𝑒(𝑞2 ) = {𝑞2 . 𝑞1 } = 𝑃
t a b c
𝑞0 {𝑞0 . 𝑞1 . 𝑞2 } 𝜙 𝜙
𝑞1 𝜙 {𝑞1 } 𝜙
𝑞2 𝜙 {𝑞1 } {𝑞2 . 𝑞1 }
𝐹 = {𝑋|𝑋 ∩ 𝐹 ≠ ∅}
40
t a b c
41
سپس جدول Dtranceمیکشیم:
a b
-1هر نماد یا الندا در عبارت منظم rدر برگ درخت قرار میگیرد.
42
-2درخت نحو را برای هر کدام از عملگرها به صورت زیر رسم میکنیم.
-3نهایت درخت نحو عبارت ≠ 𝑟 (𝑟 شارپ) را به صورت بازگشتی رسم میکنیم .به هر برگ که غیرالندا
: 𝑁𝑢𝑙𝑙𝑎𝑏𝑙𝑒(𝑛) این تابع مشخص میکند که آیا زیردرخت nمیتواند 𝜆 را تولید کند یا خیر؟ در صورت
43
-2اگر∗ 𝑟 = 𝑛 یک برگ ستاره باشد آنگاه 𝑒𝑢𝑟𝑡 = )𝑛(𝑒𝑙𝑏𝑎𝑙𝑙𝑢𝑁
𝑎 ∙ ∗)𝑏𝑎(
𝑒𝑠𝑙𝑎𝑓 = 𝑒𝑙𝑏𝑎𝑙𝑙𝑢𝑁
: 𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠(𝑛) مجموعه مکان نمادهایی را برمیگرداند که منطبق بر اولین نماد رشتههای تولیدی از
-3اگر 𝑛 = 𝑟1 + 𝑟2آنگاه:
-4اگر 𝑛 = 𝑟1 ∙ 𝑟2آنگاه:
44
𝑒𝑠𝑙𝑒 )𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠(𝑟1) ∪ 𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠(𝑟2 )𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠(𝑟1
∗)𝑏𝑎(
⏟ ∗⏟
𝑏𝑎
𝑟1 𝑟2
: 𝑙𝑎𝑠𝑡 𝑝𝑜𝑠(𝑛) مجموعه مکان نمادهایی را برمیگرداند که منطبق بر آخرین نماد رشتههای تولیدی از
-1اگر nیک گره الحاق باشد 𝑟1فرزند چپ و 𝑟2فرزند راست آن است .برای هر موقعیت iدر
) 𝑙𝑎𝑠𝑡 𝑝𝑜𝑠 (𝑟1تمام موقعیتها در ) 𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠 (𝑟2در )𝑖( 𝑠𝑜𝑝 𝑤𝑜𝑙𝑙𝑜𝑓 قرار دارند.
-2اگر nیک گره ستاره و iیک موقعیت در محموله )𝑛( 𝑠𝑜𝑝 𝑡𝑠𝑎𝑙 باشد همه موقعیتها در
𝑐𝑏𝑎
45
∗)𝑏𝑎( 𝑏𝑎𝑏𝑎
𝑎𝑏𝑎
𝑏𝑏𝑎
-2توابع 𝑒𝑙𝑏𝑎 𝑙𝑙𝑢𝑁 𝑓𝑜𝑙𝑙𝑜𝑤 𝑝𝑜𝑠 ، 𝑙𝑎𝑠𝑡 𝑝𝑜𝑠 ، 𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠 ،را در پیمایش عمقی درخت مشخص
میکنیم.
𝐹𝑖𝑟𝑠𝑡 𝑝𝑜𝑠 (𝑟𝑜𝑜𝑡) -3را محاسبه میکنیم .و آن را به عنوان یک حالت عالمت نخورده به جدول Dtrans
-4اگر در جدول Dtransحالت عالمت نخوردهای وجود ندارد آن را انتخاب میکنیم .در این الگوریتم این
حالت را Tمینامیم .اگر حالت عالمت نخورده وجود ندارد الگوریتم تمام میشود.
)1-6مجموعه مکانهایی در Tکه نماد متناظر در عبارت با قاعده aاست را محاسبه کرده و آن را Pمینامیم.
)2-6مجموعه )𝑝( 𝑠𝑜𝑝 𝑤𝑜𝑙𝑙𝑜𝑓 را محاسبه میکنیم مجموعه بدست آمده را uمینامیم.
46
-7به مرحله 4برمیگردیم.
مکان : 1
}1 → {1.2.3
}2 → {1.2.3
}3 → {4
}4 → {5
}5 → {6
6 → −
47
a b
}𝑃𝑎 = {1.3
}𝑃𝑏 = {2
𝐵 → }𝑃𝑎 = {1.3
}𝑃𝑏 = {2.4
𝐵 → }𝑃𝑎 = {1.3
}𝑃𝑏 = {2.5
𝐵 → }𝑃𝑎 = {1.3
}𝑃𝑏 = {2
48
. بسازیدDFA یکa(ab )* a*b برای عبارت با قاعده:مثال
a (ab )* a b
*
First pos {1} A 1 2 3 4 5 6
. ختم شود عبارت باید به
follow pos a b
1 }2 ,4 ,5{ A B -
2 }3{ B C D
3 }2 ,4 ,5{ C E F
4 }4 ,5{ D - -
5 }6{ E E D
6 - F C D
A:
a
P {1}
b
P o کجا است؟ تهی1 در موقعیت
B:
a
P {2, 4} است؟a کجا5 و4 ,2 در موقعیت
49
Follow pos (2 ,4) = {3 ,4 ,5} =C مجموعه
جدید
E:
a
P {4} E است؟a برابر4 و5 کجاهای
b
P {5} D است؟b برابر4 و5 کجاهای
F:
a
P {2, 4} C A
b a
P {5} D
B
a a,b
a,b
C D +
a
b
a دارد که حالت# عالمت
b
E
a پایانی
F
b
6 دارد که عدد# عالمت
50
گرامرها
در این فصل در مورد نحوه تولید یک گرامر و اصالح آن برای اینکه بتوانیم یک تجزیه کننده را تولید کنیم
توضیح می دهیم و گرامر مستقل از متن برای شناسایی ساختار زبان استفاده می شود و نحوه اصالح آن را
بحث می کنیم.
ویژگی نحوی ساختارهای زبان های برنامه نویسی با استفاده از یک گرامر مستقل از متن توصیف می
شود.
گرامر یک نمایش دقیق و قابل فهم از زبان برنامه نویسی را ارایه می کند.
یک گرامر به زبان این امکان را می دهد که بلورت تکرار پذیر نکامل یافته یا توسعه پیدا کند .این
عمل با افزدن ساختارهای جدید برای انجام اعمال جدید انجام می شود.
TT*F|F
F(E) |id
مثال گرامری مستقل از متن برای عبارات محاسباتی اولیه
factor id
51
به لحاظ بعدی مشکل ندارد به لحاظ نحوی مشکل دارد
id +* id
گرامر این رشته را نمی پذیرد و می گوید بدی فا نحوری مشکل دارد.
1 *2
1 2* 3
برای سادگی گرامرها معموال از قواعد زیر استفاده می شود:
-ارقام
A 1
*در گرامر A 2را می توان به صورت A 1|2|3 | ...نوشت.
A ...
EE+T|E-T|T E+T
TT*F|T\F|F
E+T*F
F(E)|id
T F id
F
id
id
52
اشتقاق ()Derivation
تولید یک رشته بوسیله گرامر مستقل از متن از نماد شروع آغاز می شود.
در هر مرحله یک غیرپایانه بوسیله سمت راست قاعده تولید آن گسترش داده می شود.
روند تولید تا زمانی ادامه پیدا می کند که هیچ غیر پایانه ای نماند.
-2اشتقاق چپ ()LMD
اشتقاق راست :در این اشتقاق همواهر سمت راست ترین غیرپایانه ،با سمت راست ،قاعده تولید آن جایگزین
می شود.
اشتقاق چپ :در این اشتقاق همواره سمت چپ ترین غیرپایانه ،با سمت راست ،قاعده تولید آن جایگزین می
شود.
اشتقاق چپ
E E+T| E-T| T اشتقاق راست
id + id
T T*F| T/F| F E+T EE+T
id + id
EE+T
F (E)| id T+T E T
E+T
E+F TF
F+T
E+id Fid
id+T
اشتقاق چپ T+id ET
id+F
E اشتقاق راست TF
F+id
id + id
E
id + id
E + T
T F
T F
F id
F id
id
53 id
درخت تجزیه :یک نمایش گرافیکی برای اشتقاق می باشد .در واقع نحوه جایگزینی غیرپایانه ها با سمت
توجه :در درخت تجزیه ترتیب ها مشخص نیست ولی در درخت اشتقاق مشخص است.
د) اگر Aیک غیر پایانه و گره میانی درخت تجزیه باشد x 1, x 2 ,..., x nفرزندان این گره هستند آنگاه در
id id
در اشتقاق ترتیب بکارگیری قواعد مشخص است اما در درخت تجزیه ای موضوع مشخص نیست.
گرامر مبهم :در صورتی که در یک گرامر برای یک رشته بتوان دو اشتقاق چپ یا دو اشتقاق
راست و یا دو درخت تجزیه متقاوت ایجاد نمود ،آنگاه گرامر مبهم است.
E E+T|E-T|T
T T*F| T/F| F|E
F (E)| id
54
E E
T F
F id
id
تمرین کتاب AHO
S SS+|SS*|a
الف) یک سمت چپ ترین و سمت راست ترین استقاق برای رشته بنوسید.
S SS+|SS*|a
چون رشته خ به * ختم شده است دو سمت راست ترین پس
* SSانتخاب می شود
اشتقاق راست اشتقاق چپ
سمت چپ ترین را سمت چپ ترین را
* SSگسترش دهیم. گسترش دهیم. *SS
*Sa *SS+ S
* SS + a *aS+ S
*Sa+ a *aa+ S
55
*aa+ a *aa+ a
ب) برای این رشته فقط یک درخت تجزیه به این فرم وجود دارد.
S
a a د) چند رشته مختلف تولید شده توسط گرامر
a
aa+
*aa
SS+
SSS++
SSS*S++
aaa*a++ a+a*a+a
سه عملگر 4عملوند
این گرامر تمامی عبارات ریاضی بفرم پیشوندی با عملگرهای * ،+را تولید می کند.
56
الف)
اشتقاق راست اشتقاق چپ
SS SS
Sa S*S
S*a (S)*S
(S)* a (S+S)*S
(S+S)*a (a+S)*S
(S+a)*a (a+a)*S
(a+a)*a (a+a)*a
S
ب)
S S
بر اساس این رشته نمی توان گفت گرامر مبهم است
ب) مجموعه تمام رشته ها که تعداد aها دو برابر تعداد bها است.
ب)
-a-b-a-
-b-a-a-
a 58
b
S
S
SA|Ab :aaگرامر مبهم است
A
AAa|λ
a B
BBb|a A
a
a
a A
A
S
S S
S
B
A a B A
a a B
b
A a
b a A
a
a A
a
A
دو درخت تجزیه ای برای aab دو درخت تجزیه ای برای aa
(برای هر زمان گرامرهای مختلف می توان نوشت .اگر گرامر یک زمان مبهم می توان تغییر داد یعنی زبانها
-1تغییر گرامر :هر گرامر یک زبان را توصیف می کند .اما برای هر زبان گرامرهای متعددی می توان نوشت
59
گرامر مبهم
S2
:درخت تجزیه
1 قاعده stmt
if E1 then stmt
S1 else S2
if E2 then
2 قاعده
stmt
60
دو درخت تجزیه به دست آمد پس گرامر مبهم است و باید رفع ابهام کرد .اگر بجای stmtجمله balance
-2استفاده از قوانین جانبی :بدون تغییر گرامر ،قوانینی برای انتخاب یک درخت تجزیه از بین درخت های
تجزیه استفاده می کنیم .در این صورت گرامر برای هر رشته مربوط زبان فقط یک درخت تجزیه خواهد داشت
یا مثال در گرامر مبهم مربوط به ،ifمی توان گفت که هر elseبه نزدیک ترین ifمربوط می شود.
E
EE+E E
Eid
E + E
E + E
id+id+idاین رشته را دارم گرامر می تواند این رشته را تولید کند در نتیجه دو درخت تجزیه رسم شده
است.
ابهام دارد چون دو درخت تجزیه دارد اما اگر از شرکت پذیری چپ داشته باشیم رفع ابهام می شود.
61
توجه :عملگر یکسان باشند یا اولویت یکسان داشته باشند عملگری اولویت باالتری دارد که سمت چپ باشد.
بازگشتی چپ:
اگر سمت راست قاعده تولید با غیرپایانه سمت چپ قاعده تولید شود ،در این صورت گرامر دارای بازگشتی
چپ است.
نیست) مشخص چپ بازگشتی اولیه ظاهر (در مستقیم غیر چپ بازگشتی )2
*
A A *) (V uT
جایگذاری
مثال:
S AB S S B
A Sبازگشتی چپ غیر مستقیم
*i V uT
62
قواعد به دو دسته تقسیم می شوند:
مثال:
1 : 2
A Ab | a | b
A aA | bA
A bA | بازگشتی است در تجزیه کننده باال به پایین مشکل ایجاد نمی کند ،بازگشتی چپ
مثال:
S , Aغیر پایانه
1 2
A A 1 | A 2 |
A BA
A 1A | 2A |
63
S Ab |b
A Sb | A a A A bb | bb | A a
جایگذاری می کنیم
S Ab | b
S Ab | b
A bbA
A aA | bbA | A Abb | bb | Aa
A bbA
S Sb | b |
A
:مثال
S Ab |b S Ab | b
S SbA b | b
.*حل استاد رو بنویسید A Sb | A a A SbA
B A aA | A A aA |
:غیر پایانه جدید
S bS
.) ابتدا بازگتشی چپ مستقیم را حذف کردیم1 S bA bS |
A aA |
64
:مثال
E E T |T
T T * F | F بازگشتی را حذف کنیم
F (E ) | id
E TE
E TE |
T FT
T *FT |
F (E ) | id
:مثال
N ATN N N
N AT
N aTN | N N |
A Na | a
T Ta | b A a
T bT
T aT |
N N a T | AT
A a
T T a | b
65
مثال:
در تجزیه باال به پایین بازگشتی چپ باید حذف شود چون باعث می شود در حلقه بی نهایت بمانند.
فاکتورگیری چپ:
برای یک غیر پایانه ممکن است ،انتخاب های مختلفی از یک قاعده تولید وجود داشته باشد .لذا برای راحت
66
مثال:
نمی دونیم کدام را انتخاب کنیم و در تجزیه پیشگو ابهام ایجاد می کند چون به ازاء یک قاعده چندین
A aA
A aA | a
A A |
به ازای تولید یک قاعده چند حالت که با یک حرف شروع شود را ندارم و فاکتور گیری چپ انجام شده
S aS
A aBB | aB
S ABb | Bc
A aBA C cC
B bB | b
A B | C C |
B bB
C cC | c
B B |
67
تجزیه باال به پائین((top – down parsing
در تجزیه کننده های باال به پائین برای تشخیص تعلق رشته ورودی به گرامر درخت تجزیه از ریشه
( عالمت شروع گرامر ) به سمت برگها ( پایانه ها در گرامر ) ساخته می شود .در واقع ترتیب ساخت
در درخت ،براساس اشتقاق چپ می باشد .
مثال :برای رشته id+id*idبراسا س گرامر زیر تجزیه کننده باال به پائین رسم کنید .
E→E+T|T
T→T*F|F
F→(E)|id
)(2 F
id )(3,4
T T * F T T * F T T * F
68
تجربه پیشگو بازگشتی:
بطور رسمی و خطا عمل می کند .اگر فاکتور گیری چپ انجام نشده باشد این روش می تواند تعلق رشته و
گرامر را تشخیص دهد.
S→cAd
A→ab|ac|a
C A d C A d C A d C A d
First(α):
اگر aیک رشته از نمادهای گرامر باشد First(α)،مجموعه ای از پایانه ها خواهد بود که رشته های
مشتق شده آن ها شروع می شود .اگر α→ λآنگاه λنیز در ) First(αقرار دارد .
مثال :
69
A→ a }First(A) ={0 نحوه محاسبه ): First(x
اگر Xیک غیرپایانه و X=y1 y2 ….. ykمولد برای k≥ 1باشد آنگاه برای هر iو aدر مجموعه
) First(yiقرار داشته باشد و λدر تمام مجموعه های ) First(y1) …. First(yi-1قرار داشته باشد
B→λ
C→λ
اگر برای تمام مقادیر Y=1,2,….. Kرشته الندا در مجموعه ) First(YJوجود داشته باشد آنگاه λ
C→λ
مثال :با توجه به گروه های زیر Firstرا محاسبه کنید .
1 2
A→ 𝐴𝐶𝑎| λ 𝐴|𝑠𝐴𝑠|𝑎𝑠𝑏 →S
E→ 𝑒𝐸|λ
70
1 حل:
2 حل:
3 حل:
𝐹 → (𝐸)|𝑖𝑑
4 حل:
71
𝐸 → 𝑒𝐸|λ } First (𝐸)={e,λ
): Follow(A
برای غیر پایانه Follow(A) ، Aبرابر است با مجموعه ای از پایانه ها مانند aکه در هر شبه جمله
بالفاصله در سمت راست Aقرار می گیرند .بعبارت دیگر مجموعه ای از پایانه ها مانند aبه شکلی
که برای هر Bو aیک اشتقاق بلو است S→ 𝛼𝐴𝑎𝛽 .وجود داشته باشد
در صورتیکه ، Aآخرین نماد در شبه جمله باشد ،آنگاه $در ) Follow(Aقرار می گیرد
$ در ) Follow(Aقرار داده می شود که Sنماد شروع گرامر و $نماد مشخص کننده انتهای سمت
اگر مولدی به صورت 𝑆 𝛽𝐵 𝛼 → وجود داشته باشد آنگاه هر چندی در ) First(βبه جز الندا
𝐵𝐴 → 𝐴
اگر مولدی بصورت 𝐵𝛼 → Aوجود داشته باشد ،یا مولدی بصورت 𝛽𝐵 𝛼 → Aکه )First(β
شود.
C→ λ
72
E→ 𝑇𝐸´ Follow (E)={ $ , ) }
𝐴 → 𝐵𝑒𝐶
𝐵 → 𝑎𝐵|λ
𝐶 → 𝑏𝐶𝐴|C
3: E →TE´
2 : 𝐸´ → 𝐸|λ
𝑆 → 𝐵𝑒 𝑇 → 𝐹𝑇´
𝐵 → 𝐴𝐵𝑐|𝐵𝑏|λ 𝑇´ → 𝑇|λ
𝐴 → 𝐴𝛼|λ 𝐹 → 𝑃𝐹´
𝐶 → 𝑑𝐴𝐵|λ 𝐹´ → 𝑃𝐹´
𝐹´ → 𝑃𝐹´
𝐹´ →∗ 𝐹´| λ
𝑃 → (𝐸)|a|b|c
73
1
2
Follow(A( = Follow(C( Follow(S(= {$}
{a , e , $ } Follow(A( = { a, d}
B→ 𝐴 𝐵𝐶
A→ 𝐴𝑎
c→ 𝑑 𝐴 𝐵
3
Follow(E( = { ) , $ }
Follow (𝐸´)={ ) , $ }
Follow (𝑇)={ + , ) , $ }
Follow (𝐹)={ ( , a , b, c , + , ) , $ }
Follow (𝐹´)={ ( , a , b, c , + , ) , $ }
Follow (𝑝)={* , ( , a , b, c , + , ) , $ }
. سمت راست یک غیر پایانه انتخاب می شود، براساس هر نماد ورودی از ؟
74
aB a ← First (A) فراخوانی شودA اگر نماد
A→
B→ bB λ|
S→ A| B
A→ aA | C
B→ bB| d
Vad s ( ) f
A()
(B)
Else
(eaut ≪ Error ) }
75
) ( Void A } First ( A ) = { a , c
else
}
) ( Void B
با استفاده از این کد ما این تجزیه کننده را پیاده سازی کردیم .
در تجزیه پیشگو ( تجزیه باال به پائین ) اگر بازگشت چپ ،فاکتورگیری چپ باشد ما مشکل ایجاد می کنیم.
در گرامرهای زیر نمی توان تجزیه کننده پیشگو ایجاد کرد
76
S→ 𝑆𝑎𝐴|𝐴 S→ 𝑎𝑆|𝑎𝐴
A→ 𝑎𝐴|𝑎 A→ 𝑎𝐴|𝑏
هر دوFirst ( S ) وFirst ( A ) نمی توان یکی را انتخاب کرد پس مشکل ایجاد می شود چونA وS بین
شدهa
Void s ( ) {
S( ),
Match (´a ´) ,
A(),
A→ α1|α2|…|αn
∃I , j , first ( αi ) ? first ( α j ) ≠ ϕ i≠ 𝑗
s→ as|aA|𝑎𝑏 S→as´
A→bA| λ
first
77
B→ bB|aB A´´→b|λ
استفاده از ساختار کد و ifهای متوالی سرعت اجرا را پائین می آورد ،اذا برای حل مشکل از جدول تجزیه
استفاده می کنیم ،در واقع برای هر غیر پایانه ،متناسب با هر پایانه ورودی ،قاعده تولید مناسب را در
جدول ثبت می کنیم .و تجزیه کننده از این جدول برای انتخاب مولد مناسب استفاده می کنند .
S→ aS|bS|λ
a b
S → ab S → bs
asb$
*تحلیلگر لغوی به نحوی
a1وارد شده اند آیا مطابقت وارد a2 a3 a4 … an $
با گرامر زبان ما .اگر مطابقت
دارد اگر ندارد اعالم خطا می
کند
به پپشته و رشته ورودی
مراجعه می کند
-2اگر λدر ) 𝛼(𝑡𝑠𝑟𝑖𝐹 باشد 𝛼 → Aرا برای هر پایانه در ) 𝐴( Followبه ] M[ A , bاضافه می
کنیم
اگر با اجرای مراحل باال مولدی در خانه } M[A,aوجود نداشته باشد ،آنگاه خطا اعالم می شود .
A 𝑎 →A
𝐴𝛼 → A مثال
مثال :
79
id + * ( ) $
A → 𝐶𝐵|λ
𝐵 → 𝑐𝐶𝐵|λ
𝐷𝐸 → 𝐶
𝐷 → 𝑎𝐸𝐷|λ
)𝐸 → 𝑏|(A
}F(A)={ b , ( , λ
}F(B) = { C , λ
80
𝑎 b c ( ) $
در صورتیکه رشته Wدر ) L(Gباشد ،این الگوریتم سمت چپ ترین اشتقاق را برای Wبرگشت می
در ابتدا عالمت $به انتهای رشته Wاضافه می شود و در بافر ورودی قرار ی گیرد و نماد شروع گرامر
اگرنماد باالی پشته Xوتوکن جاری را aبنامیم ،آنگاه تجزیه کننده تا هنگامی که پشته خالی نشده است
اعمال زیر را انجام می دهد ← اگر پشته خالی شود رشته پذیرفته شده
الف ) اگر Xیک غیر پایانه بود و با توکن aبرابر بود آنگاه از باالی پشته حذف شده و aبا توکن بعدی مقدار
ب) اگر Xیک غیر پایانه بود و ] 𝑎 M[X ,در جدول تجزیه تهی بود آنگاه اعالم خطا می شود
ج) اگر Xبرابر یک غیر پایانه بود و ] 𝑎 M[X ,برابر قاعده X→ y1 y2….yKباشد ،آنگاه Xرا از باالی پشته
د) اگر Xپایانه بود و با توکن aیکسان نبود اعالم خطا می شود.
81
این رشته جزء گرامر هست یا نه ؟
Id+ Id* Id $
E$ id+id*id$
TE´$ id+id*id$ 𝐸 → 𝑇𝐸´
FT´E´$ id+id*id$ 𝑇 → 𝐹𝑇´
idT´E´$ id+id*id$ 𝐹 → 𝑖𝑑
id T´E´$ +id*id$ id
id E´$ +id*id$ T´→ λ
id+id*id $ $ E´→ λ
82
گرامر (LL )1
یک گرامر ( )1است برای هر توکن ورودی در اشتقاق چپ به راست بتوان غیر پایانه بعدی را برای گسترش
انتخاب نمود و در واقع عدد یک نشان دهنده این است که فقط با دیدن یک توکن کافیست تا قانون تولید
Firstآن ها اشتراک داشته باشد ). )1فاقد برخورد FIRST / FIRSTاست ( سمت راست
مثال :
A→ 𝑎𝐵|λ
𝑎𝐴 → B
a
A A→ Ab
A→ λ
این گرامر بدلیل برخورد LL )1( FOLLOW / FIRSTنیست
S→ 𝑎𝑆|𝐴|λ
A→ 𝐵𝐶𝐷|𝑏|λ
83
c→ 𝑐|λ
D→ 𝑑𝐷|λ
در گرامر یک قاعده به شکل s→ α|βداریم که aو Bو λرا تولید می کنند پس گرامر شرط ( LL)1بودن را ندارد.
)C ∈ FOLLOW(B
مثال :برای گرامر زیر جدول تجزیه پیشگویی بازگشتی تشکیل دهید ؟
𝑏𝐶𝐵𝑎 →A
C→ 𝐶 |λ
𝑇𝑆𝑅𝐼𝐹 FOLLOW
A 𝑎 $
B c, λ, b Cc, b
C c, λ b
84
نکته :هر گرامر که ) LL(1باشد مبهم نیست .
B→ λ
شرط ) LL(1بودن را نقض می کند ( وقتی بازگشتی چپ داریم قطعا باید λباشد).
85
تبدیل کنید ؟LL(1) مثال گرامرهای زیر را به
A→ 𝐵𝐶𝐷|λ A→ A𝑎𝐶𝐷|𝑏𝑐𝐷|λ
D→ 𝑐𝑑 C→ C|λ D→ cd|𝑑
D→ 𝑐𝑑
A→ bB|𝐴´ A→ bB|𝐴´
B→ CDA´|𝐷𝐴´ B→ CCdA´|𝑐𝑑𝐴´|𝑑𝐴´
A→ aB|λ A´ → aB|λ
D → cd|d
A→ bB|𝐴´ A→ 𝑎𝐴
B→ cc|𝑑𝐴´ B→ bB|𝑎
c→ cdA´|dA´
A´ → aB|λ
A→ B1A´| B2 A´|…. | Bn A´
86
: رسم جدول تجزیه
A→ bB|𝐴´
B→ cc|𝑑𝐴´
c→ cdA´|dA´
A´ → aB|λ
𝐹𝐼𝑅𝑆𝑇 FOLLOW
A b,a,λ $
B c,d
C c,d
A´ a,λ $
$A
$Bb $A´ $A´d
$B $Ba $A´
$Cc $B $
$C $Cc
$ A´d $C
87
𝑎 b c d $
A A → A´ A→ 𝑏𝐵 𝐴 → A´
𝐵 𝐵 → 𝑐𝐶 B → 𝑑A´
C c → 𝑐𝑑A´ c → 𝑑A´
A´ A´ → aB A´ → λ
A→ 𝑎𝐴|𝐵 → A→ 𝑎𝐴|𝑏𝐵|𝑎 → 𝑎$
$A´
$
A→ 𝑎𝐴´|𝑏𝐵
A´ → 𝐴|λ
B→ 𝑏𝐵|𝑎
𝛼 b $
A A → 𝑎A´ A→ 𝑏𝐵 → A´𝐴
A´ A → 𝑎A´ A→ 𝑏𝐵 A´→ λ
B B→𝑎 B → 𝑏𝐵
88
مثال :
گرامر مبهم دو درخت تجزیه داره چون اولویت عملگرها در نظر گرفته نشده * مبهم است .
S S
𝑋 →C
89
X+X*X$
$A
$A´B $A´B´
$ A´B´C $ A´B´C*
$ A´B´x $ A´B´C
$ A´B´ $ A´B´x
$ A´ $ A´B´
$ A´B + $ A´
$ A´B $
$ A´B´C
$ A´B´x
90