1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ...
TRANSCRIPT
بطحائیان اصول طراحی کامپایلر
27
1 پارسر باال به پایین-6
. را از ریشه به سمت برگها می سازد parseدرخت : تعریف :دو نوع• LL(1), LL(k) 2بازگشتی کاهشی • :مثال
. بصورت باال به پایین در شکلهای زیر نشان داده شده استparseمراحل ساخت یک درخت : مثالگرامر
G = ({S},{‘(‘, ‘)’ }, P , S) S ( S ) S ε
: ورودیرشته(())$
.بصورت زیر خط دار نمایش داده شده استدر هر مرحله توکن خوانده شده در اسکنر
1( S
2( $ ) ) ( (
3( $ ) ) ( (
4( $ ) ) ( (
6-1- LL(1)
ها یا همان متغیرهای گرامر phraseسطرهای جدول عنوان . ول مربوطه استفاده می شوددر این روش از یک پشته و جدقوانین شماره گذاری می شوند و خانه های جدول نشان . توکنهای خوانده شده از فاز اسکنر می باشندستونهای جدول . هستند
می شود و سمت راست گرامر popوی پشته براین اساس متغیر موجود از ر. می دهند که براساس چه قانونی باید عمل کرد می popه و توکن گرفته شده از فاز اسکنر یکسان بودند توکن از سر پشته هرگاه سر پشت. می شودpushمربوطه در پشته
. شود . می شودpush شروع در پشته phraseابتدا
:مثال
1 Top down parsing 2Recursive descent
بطحائیان اصول طراحی کامپایلر
28
Narges S. Bathaeian
1( push S
1. S ( S )2. S ε S
(())$
221S$)(N/T
S
Narges S. Bathaeian
2( rule 1
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
S
(
Narges S. Bathaeian
3( match (
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
S
(
Narges S. Bathaeian
4( 1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
S
Narges S. Bathaeian
5( rule 1
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
)
S
(
Narges S. Bathaeian
6( match (
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
)
S
(
Narges S. Bathaeian
7( 1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
)
S
Narges S. Bathaeian
8( rule 2
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
)
Narges S. Bathaeian
9( match )
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
)
Narges S. Bathaeian
10( match )
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
)
بطحائیان اصول طراحی کامپایلر
29
Narges S. Bathaeian
11( accept
1. S ( S )2. S ε
( ( ) ) $
221S$)(N/T
چگونگی ساختن جدول .جدولی که ستونهای آن الفبا و سطرهای آن متغیرهای گرامر هستند را ایجاد می کنیم • . هر متغیر و قانونهای مربوطه اش را پیدا کرده و در خانه مربوطه شماره قانون را وارد می کنیمfirstمجموعه • .پیدا می کنیم را followمجموعه , برای متغیرهایی که به رشته تهی می روند •
follow و firstتعریف مجموعه های
زیر مجموعه ای از الفبا که نشان می دهد رشته هایی که از یک متغیر بدست می آیند با چه حرفی شروع : firstمجموعه • .می شوند
با چه حرفی زیر مجموعه ای از الفبا که نشان می دهد رشته هایی که در دنباله یک متغیر می آیند : followمجموعه • .شروع می شوند
firstپیدا کردن مجموعه
. یک متغیر را پیدا کردfirstقوانین زیر نشان میدهند که چگونه می توان مجموعه
:مثال : گرامر
: بدست آمدهfirstمجموعه های
• A ε first(A) = {ε} • A a first(A) = {a} • A aβ first(A) = {a} • A αβ first(A) = first(first(α)first(β)) • A α1 | α2 |…|αn first(A)= U first(A) A αi
S aAS | bCA cc | dA | ε C AS
بطحائیان اصول طراحی کامپایلر
30
followپیدا کردن مجموعه
: بدست آمده برای مثالfollowمجموعه های
.مثال زیر ساختن جدول را نشان می دهد
:مثال
• A is start symbol follow(A) ∃ $ • A αBβ follow(B) =
first(first(β)follow(Α)) • A1 α1Bβ1 | … • A2 α2Bβ2 | … • A3 α3Bβ3 | … • …. follow(B) = U follow(B) Ai αiBβi
.میکن یم نظر صرف محاسبه از دور در افتادن هنگام •
first(S) S aAS = {a} first(S) S bC = {b} first(S)={a,b} first(A) A cc = {c} first(A) A dA = {d} first(A)={c,d,ε} first(C) = first(first(A)first(S))= first({c,d,ε}{a,b})=
first({ca,cb,da,db,a,b})= {c,d,a,b}
follow(S) S aAS = first(first(ε)follow(S))= first(follow(S))= follow(S) follow(S) C AS = first(first(ε)follow(C))= first(follow(C))= follow(C) follow(S) ∃ $ follow(S)={$} U follow(C)
follow(C) S bC = first(first(ε)follow(S))= first(follow(S))= follow(S) Follow(S)= Follow(C)= {$}
follow(A) A dA = first(first(ε)follow(A))= first(follow(A))= follow(A) follow(A) S aAS = first(first(S)follow(S))= first({a,b}{$})= {a,b} follow(A) C AS = first(first(S)follow(C))= first({a,b}{$})= {a,b} follow(A)={a,b}
بطحائیان اصول طراحی کامپایلر
31
Narges S. Bathaeian
1( 1. S ( S )2. S ε
S$)(N/T
Narges S. Bathaeian
2 (1. S ( S )2. S ε
1S$)(N/T
first ( S) ) S (S) = { ‘(‘ }
Narges S. Bathaeian
3(1. S ( S )2. S ε
221S$)(N/T
first ( S ε ) = { ε }follow ( S ) ∃ $follow ( S ) S (S) =
first(first({ ‘)’})follow(S))=first({‘)’}follow(S))= {‘)’}
follow (S) = { $ , ‘)’}
:مثال دیگر
Narges S. Bathaeian
1(block_stmt stmt stmt_seqstmt_seq ; block_stmt | εstmt s
first(block_stmt)= first(first(stmt)first(stmt_seq))= first({s}{; , ε})= first({s; , s}) = {s}
first(stmt_seq)= first(stmt_seq) stmt_seq ; block_stmt U first(stmt_seq) stmt_seq ε = {;} U {ε} = {; , ε}
first(stmt)= {s}
Narges S. Bathaeian
2(1. block_stmt stmt stmt_seq2. stmt_seq ; block_stmt 3. | ε4. stmt s
4stmt
2stmt_seq
1block_stmt
$;s
Narges S. Bathaeian
3(block_stmt stmt stmt_seqstmt_seq ; block_stmt | εstmt s
follow(stmt_seq)= first(first(ε) follow(block_stmt)) = follow(block_stmt) = {$}
follow(block_stmt)= {$} U follow(block_stmt) stmt_seq ; block_stmt= {$} U first(first(ε) follow(stmt_seq)) = {$} U follow(stmt_seq)
Narges S. Bathaeian
4(1. block_stmt stmt stmt_seq2. stmt_seq ; block_stmt 3. | ε4. stmt s
4stmt
32stmt_seq
1block_stmt
$;s
نیستند؟LL(1)چه گرامرهایی کرد، گرامر باید خصوصیات parseی اینکه بتوان گرامر را به این روش برا. کردLL(1) ، parseهمه گرامرها را نمی توان به روش
:زیر را داشته باشد
بطحائیان اصول طراحی کامپایلر
32
:مثال
Narges S. Bathaeian
. نیستLL(1)مثال از گرامری که stmt if_stmt
| otherif_stmt if ( exp ) stmt else_partelse_part else stmt
| εexp 0
| 1
first(stmt)= first(if_stmt) U {other}= { if , other}
first(if_stmt)= {if}first(else_part)= {else , ε}first(exp)= {0,1}
follow(else_part)= follow(if_stmt)= follow(stmt)= first(first(else_part)follow(if_stmt)) U follow(else_part) U {$}= first({else, ε}follow(stmt) U {$}= {else , $ }
Narges S. Bathaeian
)ادامه (. نیستLL(1)مثال از گرامری که stmt if_stmt
| otherif_stmt if ( exp ) stmt else_partelse_part else stmt
| εexp 0
| 1
first(stmt)= first(if_stmt) U {other}= { if , other}
first(if_stmt)= {if}first(else_part)= {else , ε}first(exp)= {0,1}follow(else_part)= {else , $ }
first(else_part) Λ follow(else_part) <> {}
Narges S. Bathaeian
)ادامه (. نیستLL(1)مثال از گرامری که 1. stmt if_stmt 2. | other3. if_stmt if ( exp ) st else_part4. else_part else stmt 5. | ε6. exp 07. | 1
first(stmt)= first(if_stmt) U {other}= { if , other}
first(if_stmt)= {if}first(else_part)= {else , ε}first(exp)= {0,1}follow(else_part)= {else , $ }
76ex
54,5ep
3is
21s
$10else)(otif
: تبدیل شودLL(1)به دو مشکل که با رفع آنها ممکن است گرامر
1بازگشتی از چپ • 2فاکتور مشترک •
بازگشتی از چپ تعریف Aدر گرامر قانونی مانند Ax وجود داشته باشد که در این صورت یافتن مجموعه first با مشکل مواجه می شود.
:مثال
Narges S. Bathaeian
Left recursionبازگشتی از چپ
A Aa| b
first(A)= {b} U first(A)= ?
baa$
1 Left recursion 2 Common factor
.باشد شده نوشته قانون یک از بیش, جدول های خانه از یکی حداقل در که گرامرهایی • :یا •
• A α1| α2 |…| αn o first(αi) Λ first(αj) = {}
• ε E first(A) o first(A) Λ follow(A) = {}
بطحائیان اصول طراحی کامپایلر
33
:بازگشتی از چپ را می توان به روش زیر حذف کرد :گر داشته باشیما
: آنگاه بجای قوانین فوق خواهیم داشت
:یا بطور کلی
:تبدیل می شود به
:مثال
Narges S. Bathaeian
مثالexp exp addop term
|term
exp term exp’exp’ addop term exp’
|ε
1بازگشتی از چپ غیر مستقیمحذف :در این حالت قوانینی مانند قوانین زیر در گرامر داریم
:مثال
1 non immediate
A β1A’| β2A’|…| βmA’ A’ α1A’| α2A’|…| αnA’ | ε
A bA’ A’ aA’ | ε
A Aa | b
A Aα1| Aα2|…| Aαn |β1| β2|…| βm
• A Bα | 켈 • B Aβ | …
.کرد استفاده باید جایگزینی ازدر این صورت .کنیم می جلوگیری جایگذاری هنگام دور در افتادن از, متغیرها بندی اولویت با
بطحائیان اصول طراحی کامپایلر
34
Narges S. Bathaeian
مثالA Ba | Aa | cB Bb | Ab | d
B > A اولویت-1
A حذف بازگشتی از چپ -2A BaA’ | cA’A’ aA’ | εB Bb | Ab | d
B در A جايگذاري -3A BaA’ | cA’A’ aA’ | εB Bb | BaA’b | cA’b | d
B حذف بازگشتي از چپ -4A BaA’ | cA’A’ aA’ | εB cA’bB’ | dB’B’ bB’ | aA’bB’ | ε
فاکتور مشترکتعریف
:در این حالت قوانینی مانند قوانین زیر در گرامر داریم
:جب مشکل زیر می شوندکه مو
حذف فاکتور مشترک :در این حالت قوانین به قوانین زیر تبدیل می شوند
:مثال
Narges S. Bathaeian
یافتن بازگشتی از چپexp exp addop term
| termterm term mulop
fact | fact
fact (exp) | naddop +| -mulop *
Left recursion : expterm
Narges S. Bathaeian
حذف بازگشتی از چپ exp exp addop term
| termterm term mulop
fact | fact
fact (exp) | naddop +| -mulop *
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
:رمثال دیگ
A αβ1 | αβ2 | …
first(A αβ1) Λ first(A αβ2) <> {}
A αA’ | … A’ β1 | β2
بطحائیان اصول طراحی کامپایلر
35
Narges S. Bathaeian
یافتن فاکتور مشترک block_stmt stmt ; block_stmt
| stmtstmt s
Common factor block_stmt
Narges S. Bathaeian
مثالblock_stmt stmt ; block_stmt
| stmtstmt s
block_stmt stmt block_stmt’block_stmt’ ; block_stmt
| εstmt s
:مثالسپس با استفاده از جدول بدست آمده . را طی می کنیمparseدر مثال زیر بطور کلی برای یک گرامر تمام مراحل ساخت جدول
parseیک رشته را نشان می دهیم : :گرامر مورد بررسی
:مراحل ساخت جدول
Narges S. Bathaeian
1(first(exp)first(exp’) first(term)first(term’)first(fact)first(addop)first(mulop)
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
2(first(exp)first(exp’) first(term)first(term’)first(fact) = {(,n}first(addop) = {+,-}first(mulop) = {*}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
3(first(exp)first(exp’) = {+,-,ε}first(term) = {(,n}first(term’) = {*, ε}first(fact) = {(,n}first(addop) = {+,-}first(mulop) = {*}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
4(first(exp) = {(,n}first(exp’) = {+,-,ε}first(term) = {(,n}first(term’) = {*, ε}first(fact) = {(,n}first(addop) = {+,-}first(mulop) = {*}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
exp term exp’ exp’ addop term exp’ | ε term fact term’ term’ mulop fact term’ | ε fact (exp) | n addop +| - mulop *
بطحائیان اصول طراحی کامپایلر
36
Narges S. Bathaeian
5(follow(exp’) follow(term’)
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
6(follow(exp’) follow(term’) follow(exp) = {$,)}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
7(follow(exp’) = {$, )}follow(term’) follow(exp) = {$,)}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
8(follow(exp’) = {$, )}follow(term’) follow(exp) = {$,)} follow(term) = first({+,-
,ε}{$,)})= {+,-,$,)}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
9(follow(exp’) = {$, )}follow(term’) = {+,-,$,)}follow(exp) = {$,)} follow(term) = first({+,-
,ε}{$,)})= {+,-,$,)}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
10(1. exp term exp’2. exp’ addop term exp’3. | ε4. term fact term’5. term’ mulop fact term’6. | ε7. fact (exp) 8. | n9. addop +10. | -11. mulop *
11mul109add
78fact65666term’
44term3223exp’
11exp$*-+)(n
: را نشان می دهندn+n*n رشته parse اولیهتصویر زیر مراحل
Narges S. Bathaeian
11mul
109add
78fact
65666term’44term
3223exp’11exp
$*-+)(n
n+n*n$exp’ term’ factn+n*n$exp’ termn+n*n$expInput Stack
6-2- LL(k) L اول نشان می دهد که رشته از چپ به راست parse می شود و Lمی باشد1 دوم نشانه اشتقاق از نوع چپترین .
1 Left most derivation
بطحائیان اصول طراحی کامپایلر
37
kدر واقع نوعی پیش بینی برای انتخاب شماره قانون می باشد تعداد توکنهای گرفته شده از فاز اسکنر در هر مرحله است که . گفته می شودlookaheadکه
:در اینصورت• LL(0)
o بدون دیدن ورودی می توانیم رشته راparseکنیم . • LL(1)
o با دیدن یک ورودی می توانیم رشته راparseکنیم . • LL(K)
o با دیدنk ورودی می توانیم رشته را parseبا زیاد شدن که کنیمk پیچیدگی زمانی ساخت جدول و اندازه .آن بسیار بیشتر می شود
بسازیم؟LL(K)چگونه یک جدول
کاهشی- پارسر بازگشتی-6-3
پارسر بازگشتی کاهشیتعریف . استtop down parsingیک روش • . استparserساده ترین روش ساختن • . نیز می تواندLL(1) کند که parseی را می تواند تنها گرامرهای •
parserچگونگی ساختن
. را از گرامر برطرف می کنیمcommon factor و Left recursionمشکل • .تبدیل می شود) رویه ( procedureبه یک , و قوانینشnon_terminalهر • . رویه شروع کننده است , Start symbolرویه مربوط به • . مربوطه را صدا می زنیمprocedure, رسیدیمnon_terminalانون هرگاه به یک در هر ق • :دو تابع زیر نیز ساخته می شوند •
. پیش رو را برمی گرداندtokenمقدار : ()get_tokenتابع اگر برابر بود به جلو پیش می رود در , پیش رو می سنجدtoken را با مقدار input مقدار match(input)تابع .یر اینصورت پیغام خطا می دهدغ
()get_tokenتابع
firstκپیدا کردن •o K ترمینالی که یک non_terminalبا آن شروع می شود .
آنهاستfirstκدر � هایی که non_terminal برای followκپیدا کردن •o Kه در دنباله یک ترمینالی کnon_terminalمی آید .
ها non_terminal هاست و سطرهای آن terminal تایی از κ ترکیبساخت جدولی که ستونهای آن • .می باشد
بطحائیان اصول طراحی کامپایلر
38
token get_token() { return s[index]; /*
s رشته ای از token های ورودی است و index اندیس tokenپیش رو را نشان می دهد . */ }
match(input)تابع void match ( token input ) { if (s[index]==input) index++; else error(); }
.طرف کنیمدر این روش نیز مشکالت بازگشتی از چپ و فاکتور مشترک را بر :مثال
.مثال زیر مراحل ساخت یک پارسر بازگشتی کاهشی را برای یک گرامر نشان می دهد
Narges S. Bathaeian
1(exp exp addop term
| termterm term mulop fact
| factfact (exp) | naddop +| -mulop *
Left recursion : expterm
Narges S. Bathaeian
2(exp exp addop term
| termterm term mulop fact
| factfact (exp) | naddop +| -mulop *
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
3(void exp(){
term();exp’();
}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
4(void exp’(){
if (get_token() == “+” || get_token()== “-” )
{addop();term();exp’();
}}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
5(void term(){
fact();term’();
}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
6(void term’(){
if (get_token() == “*”){
mulop();fact();term’();
}}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
بطحائیان اصول طراحی کامپایلر
39
Narges S. Bathaeian
7(void fact(){
if (get_token() == “(”){ match(“(“);
exp();match(“)”);
}else match(“n”);
}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
8(void addop(){
if (get_token() == “+”)match(“+“);
elsematch(“_”);
}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
Narges S. Bathaeian
9(void mulop(){
match(“*”);}
exp term exp’exp’ addop term exp’
| εterm fact term’term’ mulop fact term’
| εfact (exp) | naddop +| -mulop *
:یم می توانیم از روشهای زیر استفاده کنیممشکالت بازگشتی از چپ و فاکتور مشترک را بطور معمول حل کناگر نخواهیم
. می نویسیم و از حلقه استفاده می کنیمEBNF، گرامر را به فرم برای مشکالت بازگشتی از چپ :مثال
Narges S. Bathaeian
مثالexp exp addop term
|term exp term {addop term}
void exp(){
term();while(get_token() == “+” || get_token()== “-” )
{addop();term();}
}
.فاکتور مشترک از گذاشتن شرط استفاده می کنیمبرای مشکل :مثال
Narges S. Bathaeian
مثالblock_stmt stmt ; block_stmt
| stmtstmt s void block_stmt()
{stmt();if (get_token== “;”)
{match(“;”);block_stmt();
}}
بطحائیان اصول طراحی کامپایلر
40
1 پارسر پایین به باال- 7
.می سازدریشه به سمت برگها را از parseدرخت : تعریف : نوع4
• LR(0) • SLR(1) • LALR(1) • LR(1) :مثال
. بصورت باال به پایین در شکلهای زیر نشان داده شده استparseمراحل ساخت یک درخت : گرامر مثال
G = ({S},{‘(‘, ‘)’ }, P , S) S ( S ) S a
: رشته ورودی((a))$
Narges S. Bathaeian
1(
G = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
((a))$
Narges S. Bathaeian
2(
G = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
((a))$( ( a ) ) $
Narges S. Bathaeian
3(
G = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
4(
G = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
((a))$
S |S|
( ( a ) ) $
Narges S. Bathaeian
5(
G = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
((a))$
S||S |S|
( ( a ) ) $
1 Bottom up parsing
بطحائیان اصول طراحی کامپایلر
41
7-1- LR(0)
ها و tokenجدول و ستونها نشان دهنده های state وجود دارد که در آن سطرها نشان دهنده parseدر این روش یک جدول phraseبرای . ها می باشدparseیک رشته از روش زیر استفاده می کنیم :
. داده می شودstack , shift در state 0در شروع • . از جدول عملی که باید انجام دهیم را پیدا می کنیمstack روی stateبا دیدن هر ورودی و •
o Sn : در ورودی را stack , shift بده و به state شماره nبرو . o rn : بر اساس قانون شمارهn از stack , reduceکن .
رشته را می , بود stack باالی start symbolمتغیر , stackوقتی در ورودی به عالمت انتهای رشته رسیدیم و در • .پذیریم
:مثالدر هر مرحله توکن خوانده . قوانین گرامر نیز شماره گذاری شده اند. ه است یک رشته نشان داده شدparseدر مثال زیر مراحل
.شده در اسکنر بصورت زیر خط دار نمایش داده شده است
Narges S. Bathaeian
0(
1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accepts2(
s223
101
5
SGS/T
Narges S. Bathaeian
1 ( shift 01. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s22
3
10
1
5
SGS/T
0
((a))$
( ( a ) ) $
Narges S. Bathaeian
2(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accepts2(
s223
101
5
SGS/T
0
( ( a ) ) $
( ( a ) ) $
Narges S. Bathaeian
3(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accepts2(
s223
101
5
SGS/T
0
(
2
( ( a ) ) $
( ( a ) ) $
Narges S. Bathaeian
4(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s22
3
10
1
5
SGS/T
0
(
2
( ( a ) ) $
( ( a ) ) $
Narges S. Bathaeian
5(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s22
3
10
1
5
SGS/T
0
(
2
(
2
( ( a ) ) $
( ( a ) ) $
بطحائیان اصول طراحی کامپایلر
42
Narges S. Bathaeian
6(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
( ( a ) ) $
( ( a ) ) $
Narges S. Bathaeian
7(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
a
3((a))$
( ( a ) ) $
Narges S. Bathaeian
8(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
9(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
10(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S
4((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
11(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S
4
( ( a ) ) $
S|
( ( a ) ) $
Narges S. Bathaeian
12(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S
5)4((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
13(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
(
2
S
5)4((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
14(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
((a))$
S|
( ( a ) ) $
Narges S. Bathaeian
15(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
((a))$
S |S|
( ( a ) ) $
بطحائیان اصول طراحی کامپایلر
43
Narges S. Bathaeian
16(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
4
((a))$
S |S|
( ( a ) ) $
Narges S. Bathaeian
17(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
4
( ( a ) ) $
S |S|
( ( a ) ) $
Narges S. Bathaeian
18(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
4
)
5((a))$
S |S|
( ( a ) ) $
Narges S. Bathaeian
19(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
(
2
S
4
)
5((a))$
S |S|
( ( a ) ) $
Narges S. Bathaeian
20(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
S
((a))$
S||S |S|
( ( a ) ) $
Narges S. Bathaeian
21(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
S
((a))$
S||S |S|
( ( a ) ) $
Narges S. Bathaeian
22(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
S
1
((a))$
S||S |S|
( ( a ) ) $
Narges S. Bathaeian
23(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
0
S
1
((a))$
S||S |S|
( ( a ) ) $
Narges S. Bathaeian
24(1. G S2. S ( S )3. S a
s54
4s3
$s3a)
r2
r3
r1: Accept
s2(
s223
10
1
5
SGS/T
G
((a))$G|
S||S |S|
( ( a ) ) $
چگونگی ساختن جدول
:را طی می کنیم مراحل زیر parseبرای ساخت جدول
بطحائیان اصول طراحی کامپایلر
44
جدید start symbolیک متغیر جدید به قوانین اضافه می کنیم که , از یک قانون می رود به بیشstart symbolاگر • .می شود
.قوانین را شماره گذاری می کنیم •• Stateگذاری shift : های خوانده شدهtoken ها با استفاده از stateحرکت از •• Stateهای پایانی :reduce Stateگذاری :ا طی می کنیممراحل زیر ر گذاری Stateبرای
Narges S. Bathaeian
بدست start symbolصفر و از ابتدای قانونی که از stateاز .باشد G ,start symbolاگر . شروع می کنیم, می آید
State گذاری
0
G .α
Narges S. Bathaeian
A α.Bβ
A α.aβ
State ادامه ( گذاری(
n
A α.Ββn
A α.Ββ
Β . γ
n
A α.aβ
n+m
A αa . β
a
:مثال :مراحل ساخت جدول برای گرامر مثال قبل نشان داده می شود
Narges S. Bathaeian
1(Grammar = ({S},{‘(‘, ‘)’ }, P , S)
S ( S )S a
Grammar = ({G,S},{‘(‘, ‘)’ }, P , S)
G SS ( S )S a
Narges S. Bathaeian
2(
G SS ( S )S a
0
G .S 0
G .S
S .(S)
S .a
Narges S. Bathaeian
3(G SS ( S )S a
0
G .S
S .(S)
S .a
1
G S .
2
S (.S)
S . (S)
S .a3
S a .
S
(
a
Narges S. Bathaeian
4(G SS ( S )S a
0
G .S
S .(S)
S .a
1
G S .
2
S (.S)
S . (S)
S .a3
S a .
S
(
a
4
S (S.)
a
S
(
بطحائیان اصول طراحی کامپایلر
45
Narges S. Bathaeian
5(G SS ( S )S a
0
G .S
S .(S)
S .a
1
G S .
2
S (.S)
S . (S)
S .a3
S a .
S
(
a
4
S (S.)
a
S
(
5
S (S) .
)
Narges S. Bathaeian
جدول نهایی ) 6
s54
4s3
$s3a)
r2
r3
r1: Accepts2(
s223
101
5
SGS/T
0G .SS .(S)S .a
1G S .
2S (.S)S . (S)S .a
3S a .
S
(
a
4S (S.)
a
S
(
5S (S) .
)
7-2- SLR(1)
های جدول و ستونها نشان state وجود دارد که در آن سطرها نشان دهنده parse یک جدول LR(0)در این روش مانند روش با این تفاوت که . استفاده می کنیمی مشابه همان روشاز روش یک رشته parseبرای . ها می باشدphrase ها و tokenدهنده . می شود دقت کنیمreduce مربوط به شماره قانونی که براساس آن Follow ،phrase باید به مجموعه reduceموقع
چگونگی ساختن جدول باید به reduce که موقع با این تفاوت. . را طی می کنیمLR(0) مراحل گفته شده برای روش parseبرای ساخت جدول
را فقط در reduce می شود دقت کنیم و عبارت reduce مربوط به شماره قانونی که براساس آن Follow ، phraseمجموعه . بنویسیمfollowستونهای مجموعه
:مثال :مراحل ساخت جدول برای گرامر زیر نشان داده می شود
: گرامرexp exp + term | term term term * fact | fact fact (exp) | n
. ها بصورت خالصه نشان داده شده استphraseعنوان
Narges S. Bathaeian
1(State گذاری
LR(0)کشیدن جدول G exex ex + tm
| tmtm tm * ft
| ftft ( ex )
| n
Narges S. Bathaeian
2(
0G ↑ exex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
1. G ex2. ex ex + tm 3. | tm4. tm tm * ft 5. | ft6. ft ( ex ) 7. | n
بطحائیان اصول طراحی کامپایلر
46
Narges S. Bathaeian
3(
0G ↑ exex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
1G ex ↑ex ex↑ + tm
ex
Narges S. Bathaeian
4(
0G ↑ exex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
1G ex ↑ex ex↑ + tm
ex
2ex tm↑tm tm↑ * ft
tm
3tm ft ↑ft
Narges S. Bathaeian
5(
0G ↑ exex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
1G ex ↑ex ex↑ + tm
ex
2ex tm↑tm tm↑ * ft
tm
3tm ft ↑ft
5ft n ↑
4ft ( ↑ ex )ex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
(
n
Narges S. Bathaeian
6(0
1G ex ↑ex ex↑ + tm
ex
2
tm
3
ft
5
4
(
n
6ex ex + ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
+
Narges S. Bathaeian
7(0
1ex
tm
3
ft
5
4
(
n
6+
2ex tm↑tm tm↑ * ft 7
tm tm * ↑ ftft ↑ ( ex )ft ↑ n
*
Narges S. Bathaeian
8(0
1ex
tm
3tm ft ↑
ft
5ft n ↑
(n
6+
2ex tm↑tm tm↑ * ft
7*
4ft ( ↑ ex )ex ↑ ex + tmex ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
8ft ( ex ↑ )ex ex ↑ + tm
n
ft tm
(
ex
Narges S. Bathaeian
9(0
1ex
tm
3
ft
5
(n
+
2
7*
4 8
n
ft
tm
(
ex
6ex ex + ↑ tmtm ↑ tm * fttm ↑ ftft ↑ ( ex )ft ↑ n
ft
n
(
9ex ex +tm ↑tm tm ↑ * ft
tm
Narges S. Bathaeian
10(0 1
ex
tm
3
ft
5
(n
+
2 *
4
8n
ft
tm
(ex
6ft
n
(
9
tm
7tm tm * ↑ ftft ↑ ( ex )ft ↑ n
10tm tm * ft ↑
ft
4
5
n
(
Narges S. Bathaeian
11(0 1
ex
tm
3
ft
5
(n
+
2 *
4
n
ft
tm
(ex
6ft
n
(
9
tm
7
10
ft
4
5
n
(
8ft ( ex ↑ )ex ex ↑ + tm
11ft ( ex ) ↑
+
)
Narges S. Bathaeian
12(0 1
ex
tm
3
ft
5
(n
+
2 *
4
n
ft
tm
(ex
6ft
n
( tm
7
10ft
4
5
n
(
811
+
)
9ex ex +tm ↑tm tm ↑ * ft
*
بطحائیان اصول طراحی کامپایلر
47
Narges S. Bathaeian
13(0 1
ex
tm
3
ft
5
(n
+
2 *
4
n
ft
tm
(ex
6ft
n
( tm
7
10ft
4
5
n
(
811
+
)
9
*
: بکشیم، خواهیم داشتLR(0)اگر بخواهیم جدول را به روش
r611r410
s79s6s118
10s4s5739s4s56
r75328s4s54
r53s72
s61321s4s50fttmexG$*+)(n
r611r410
s79s6s118
10s4s5739s4s56
r75328s4s54
r53s72
s61321s4s50fttmexG$*+)(n
: نیز داریم shift , reduce های زیر عالوه بر stateدر ولی
o 1 : r1 o 2 : r3 o 9 : r2
. نوشتfollowمجموعه های ها را فقط برای SLR(1) ، reduce نمی باشد و باید به روش LR(0)بنابراین این گرامر از نوع
: بدست آمده برای مثال فوقمجموعه های
:بنابراین جدول موردنظر
Follow(G) = { $ } Follow(ex) = { $ , + , ) } Follow(tm) = { $ , + , ) , * } Follow(ft) = { $ , + , ) , * }
بطحائیان اصول طراحی کامپایلر
48
r2s7r2r29r4r4r4r410
r7r7r7r75
r5r5r5r53
r6r6r6r611
s6s118s10s4s57s3s9s4s56
s3s2s8s4s54
r3s7r3r32r1s61
s3s2s1s4s50fttmexG$*+)(n
r2s7r2r29r4r4r4r410
r7r7r7r75
r5r5r5r53
r6r6r6r611
s6s118s10s4s57s3s9s4s56
s3s2s8s4s54
r3s7r3r32r1s61
s3s2s1s4s50fttmexG$*+)(n
: به صورت زیر خواهد بودn+n*n رشته parseمراحل
نیست؟SLR(1)چه موقع یک گرامر
stack input action
$0 n+n*n s5
$0n5 +n*n r7
$0 ft 3 +n*n r5
$0 tm 2 +n*n r3
$0 ex 1 +n*n s6
$0 ex 1 + 6 n*n s5
$0ex 1+6 n 5 *n r7
$0ex 1+6 ft3 *n r5
$0ex 1+6 tm9 *n s7
$0ex 1+6 tm9*7 n s5
$0ex1+6 tm9*7n5 $ r7
$0ex1+6 tm9*7 ft 10 $ r4
$0ex1+6 tm 9 $ r2
$0ex1 $ r1
$0G $ ac
بطحائیان اصول طراحی کامپایلر
49
در صورتی که حداقل در یکی از خانه های جدول . کردSLR(1) ، parse ممکن است نتوان یک گرامر را بصورت LR(0)مانند . کردSLR(1) ، parseبیش از یک عمل نوشته شده باشد، آنگاه نمی توان گرامر را بصورت
: پیش می آید1دو نوع برخوردبطور کلی • Shift reduce conflict • reduce reduce conflict
:شرایط زیر باید برقرار باشدبرای این دو نوع برخورد،
Narges S. Bathaeian
Shift reduce conflictA α ↑B β ↑ aλ
Follow(A) ∩ {a} <> {}
Narges S. Bathaeian
reduce reduce conflictA α ↑B β ↑
Follow(A) ∩ Follow(B) <> {}
:مثال : کردSLR(1) ، parseگرامر زیر را نمی توان بصورت
S id | V := E V id E V E n
7-3- LR(1)
های جدول و ستونها نشان state وجود دارد که در آن سطرها نشان دهنده parse یک جدول LR(0)در این روش همانند روش با این تفاوت که . یک رشته از روشی مشابه همان روش استفاده می کنیمparseبرای . ها می باشدphrase ها و tokenدهنده . می شود دقت کنیمreduce مربوط به شماره قانونی که براساس آن Follow ، phrase باید به مجموعه reduceموقع
:وصیات ویژه خود را دارداما این روش خص قویترین پارسر • SLR(1) های state هایش بسیار بیشتر از تعداد stateتعداد • . متفاوت نسبت به روش قبلی استfollowطرز پیدا کردن مجموعه •
چگونگی ساختن جدول
: با این تفاوت که. . را طی می کنیمLR(0) مراحل گفته شده برای روش parseبرای ساخت جدول • State گذاری با در نظر گرفتن مجموعهfollow
:stateنشان دادن � { follow set } قانون و اشاره گر | stateشماره �
1 conflict
بطحائیان اصول طراحی کامپایلر
50
� state n | A a ↑ b {x,…}
followپیدا کردن مجموعه : متفاوت نسبت به روشهای قبل می باشدfollowپیدا کردن مجموعه
:المث
:مراحل ساخت جدول برای گرامر زیر نشان داده می شود : گرامر
Stateهای پایانی پررنگ نشان داده شده اند .
Narges S. Bathaeian
1(start symbolگذاشتن
شماره گذاری قوانین1. G A2. A ( A ) A3. A ε
Narges S. Bathaeian
2(1. G A2. A ( A ) A3. A ε
G ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
0Rule {follow}state 0
Narges S. Bathaeian
3(1. G A2. A ( A ) A3. A ε
G ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
0
G A ↑ {$}1
Rule {follow}state 0 1A
Narges S. Bathaeian
4(1. G A2. A ( A ) A3. A ε
A (↑ A ) A {$}A ↑ ( A ) A { ) }A ↑ ε { ) }
2
G ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
0
G A ↑ {$}1
Rule {follow}state 0 1A
2(
S : start symbol state 0 | S ↑ α {$}
state n | A α ↑ B β {x,…} state n | B ↑ γ {first (β {x,…})}
state n | A α ↑ β λ {x,…} β ε ( T U V ) state n+m | A α β ↑ λ {x,…}
A ( A ) A A ε
بطحائیان اصول طراحی کامپایلر
51
Narges S. Bathaeian
5(1. G A2. A ( A ) A3. A ε
A (↑ A ) A {$}
A ↑ ( A ) A { ) }
A ↑ ε { ) }
2
G ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
0
G A ↑ {$}1
A ( A ↑ ) A {$}3
Rule {follow}state
0 1A
2( 3A
Narges S. Bathaeian
6(1. G A2. A ( A ) A3. A ε
A (↑ A ) A {$}
A ↑ ( A ) A { ) }
A ↑ ε { ) }
2
G ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
0
G A ↑ {$}1
A ( A ↑ ) A {$}3
Rule {follow}state
0 1A
2(
3A
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4Rule {follow}state
4(
Narges S. Bathaeian
7(1. G A2. A ( A ) A3. A ε
A (↑ A ) A {$}
A ↑ ( A ) A { ) }
A ↑ ε { ) }
2
G ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
0
G A ↑ {$}1
A ( A ↑ ) A {$}3
Rule {follow}state
0 1A
2(
3A
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
Rule {follow}state
4(
5)
Narges S. Bathaeian
8(1. G A2. A ( A ) A3. A ε
A ( A ↑ ) A { ) }6
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
Rule {follow}state
0 1A
2(
3A
4(
6
A
5)
Narges S. Bathaeian
9(1. G A2. A ( A ) A3. A ε
(
0 1A
2(
3A
4(
6
A
5)
(
A ( A ↑ ) A { ) }6
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
Rule {follow}state
Narges S. Bathaeian
10(1. G A2. A ( A ) A3. A ε
A ( A ↑ ) A { ) }6
A ( A ) A ↑ {$}7
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
Rule {follow}state
(
0 1A
2(
3A
4(
6
A
5)
(7
A
Narges S. Bathaeian
11(1. G A2. A ( A ) A3. A ε
0
1A
2(
3A
4(
6
A
(
5)
7
A
(
A ( A ↑ ) A { ) }6
A ( A ) A ↑ {$}7
A (↑ A ) A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
4
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
Rule {follow}state
Narges S. Bathaeian
12(1. G A2. A ( A ) A3. A ε
0
1A
2(
3A
4(
6
A
(
5)
7
A
(
8
)A ( A ) A ↑ {$}7
A ( A ↑ ) A { ) }6
A ( A ) ↑ A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
8
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5Rule {follow}state
Narges S. Bathaeian
13(1. G A2. A ( A ) A3. A ε
A ( A ) A ↑ {$}7
A ( A ) ↑ A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
8
A ( A ↑ ) A { ) }6
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
A ( A ) A ↑ { ) }9
Rule {follow}state
0
1A
2(
3A
4(
6
A
(
5)
7
A
(
8
)
9
A
Narges S. Bathaeian
14(1. G A2. A ( A ) A3. A ε
0
1A
2(
3A
4(
6
A
(
5)
7
A
(
8
)
9
A(A ( A ) A ↑ {$}7
A ( A ) ↑ A { ) }
A ↑ ( A ) A { ) }
A ↑ ε { ) }
8
A ( A ↑ ) A { ) }6
A ( A ) ↑ A {$}
A ↑ ( A ) A {$}
A ↑ ε {$}
5
A ( A ) A ↑ { ) }9
Rule {follow}state
:جدول بدست آمده
بطحائیان اصول طراحی کامپایلر
52
r29
7r35
s53
9s48
r27
s86
6r3s44
3r3s42
r11
1r3s20
AG$)(
r29
7r35
s53
9s48
r27
s86
6r3s44
3r3s42
r11
1r3s20
AG$)(
7-4- LALR(1)
های جدول و ستونها نشان state وجود دارد که در آن سطرها نشان دهنده parse یک جدول LR(1)در این روش همانند روش . یک رشته از روشی مشابه همان روش استفاده می کنیمparseای بر. ها می باشدphrase ها و tokenدهنده State با توجه به های آنstate های LR(1)اما. بدست می آیند:
o Stateهایی که هسته یکسانی دارند در هم ادغام می شوند o Follow , stateهای ادغام شده از اجتماع بدست می آید
:مثال : این روش حل می کنیممثال فصل قبل را با استفاده از
. در هم ادغام می شوند پیدا می کنیم سپس هایی که هسته یکسانی دارندStateابتدا
Narges S. Bathaeian
1(
A (↑ A ) A {$}A ↑ ( A ) A { ) }A ↑ ε { ) }
2
*
G ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
0
G A ↑ {$}1
A ( A ↑ ) A {$}3 **
Rule {follow}state
A ( A ) A ↑ {$}7 ****A ( A ) ↑ A { ) }A ↑ ( A ) A { ) }A ↑ ε { ) }
8
***A ( A ) A ↑ { ) }9 ****
A ( A ↑ ) A { ) }6 **
A (↑ A ) A { ) }A ↑ ( A ) A { ) }A ↑ ε { ) }
4
*A ( A ) ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
5
***
Rule {follow}state
Narges S. Bathaeian
2(
A (↑ A ) A { $ , ) }A ↑ ( A ) A { ) }A ↑ ε { ) }
24
G ↑ A {$}A ↑ ( A ) A {$}A ↑ ε {$}
0
G A ↑ {$}1
A ( A ↑ ) A {$ , ) }36
Rule {follow}state
A ( A ) A ↑ { $ , ) }79
A ( A ) ↑ A { $ , ) }A ↑ ( A ) A { $ , ) }A ↑ ε {$ , ) }
58Rule {follow}state
:بنابراین جدول بدست آمده
بطحائیان اصول طراحی کامپایلر
53
79r3s2458
s5836
r2r279
36r3s2424
r11
1r3s240
AG$)(
79r3s2458
s5836
r2r279
36r3s2424
r11
1r3s240
AG$)(
LALR(1)روش کوتاهتر برای بدست آوردن جدول . ها را بدست می آوریمSLR(1) , stateمانند روش • . بدست می آوریمLR(1) را نیز طبق روش followمجموعه , ها stateهنگام بدست آوردن • :مثال
: را پیدا می کنیمparseبرای گرامر زیر جدول S id | V := E V id E V E n
:مراحل کار
Narges S. Bathaeian
1(1. G S2. S id 3. S V := E4. V id5. E V6. E n
Narges S. Bathaeian
2(1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
Narges S. Bathaeian
3(1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
1G S ↑ {$}
S
Narges S. Bathaeian
4(1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
1G S ↑ {$}
S
2S id ↑ {$}V id ↑ {:=}
id
بطحائیان اصول طراحی کامپایلر
54
Narges S. Bathaeian
5(1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
1G S ↑ {$}
S
2S id ↑ {$}V id ↑ {:=}
id
3S V ↑ := E {$}
V
Narges S. Bathaeian
6(
1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
1G S ↑ {$}
S
2S id ↑ {$}V id ↑ {:=}
id
3S V ↑ := E {$}
V
4S V := ↑ E {$}E ↑ V {$}E ↑ n {$}V ↑ id {$}
:=
Narges S. Bathaeian
7(
1. G S2. S id 3. S V := E4. V id5. E V6. E n
0G ↑ S {$}S ↑ id {$}S ↑ V := E {$}V ↑ id {:=}
1G S ↑ {$}
S
2S id ↑ {$}V id ↑ {:=}
id
3S V ↑ := E {$}
V
4S V := ↑ E {$}E ↑ V {$}E ↑ n {$}V ↑ id {$}
:=5S V := E ↑ {$}
6E V ↑ {$}
7E n ↑ {$}8
V id ↑ {$}
E
V
nid
Narges S. Bathaeian
8(
1. G S2. S id 3. S V := E4. V id5. E V6. E n
7E n ↑ {$}
0
1G S ↑ {$}
S2S id ↑ {$}V id ↑ {:=}
id
3
V4
:=
5S V := E ↑ {$}
6E V ↑ {$}
8V id ↑ {$}
E
V
nid
:جدول بدست آمده
r48
r67
r56
r35
56s8s74
s43
r2r42
r11
31s20
EVSG$:=idn
r48
r67
r56
r35
56s8s74
s43
r2r42
r11
31s20
EVSG$:=idn
پایین به باالمقایسه روشهای -7-5
.از دو جهت قدرت و اندازه جدول روشهای گفته شده را با هم مقایسه می کنیم
قدرت
بطحائیان اصول طراحی کامپایلر
55
می تواند تمام گرامرها بجز گرامرهای مبهم را LR(1). کردparseبه این معنی که چه دامنه ای از گرامرها را می توان با آن روش .ر نمی دهدقدرت بیشتر به پارس, های بیشتر از یکk برای LR(k) .پارس کند
اندازه جدول
. ها می باشدstateمنظور تعداد
LR(0)
SLR(1)
LALR(1)
LR(1)
SLR(1) LR(0)
LALR(1)
LR(1)
بطحائیان اصول طراحی کامپایلر
56
ساخت پارسر بدون رفع ابهام- 8
در این کار موجب بزرگ شدن گرامر و . باید به نحوی ابهام گرامر را برطرف کرد. برای گرامرهای مبهم هیچ پارسری وجود ندارد . یک راه دیگر افزودن قوانین اضافی به پارسر است. نتیجه پارسر می شود
:مثال .گرامر الف مبهم است. گرامر ب همان گرامر الف را تولید می کند ولی از آن بزرگتر است
الفexp exp + exp | exp * exp |(exp) | n
بexp exp + term | term term term * fact | fact fact (exp) | n
گذاری را برای گرامر stateشکل زیر مراحل . ها و در نتیجه اندازه جدول کوچکتر می شودstateهر چه گرامر کوچکتر باشد، تعداد
.الف نشان می دهد
Narges S. Bathaeian
1(
G exex ex + ex
| ex * ex|(ex) | n
0G ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
5ex n ↑
2ex ( ↑ ex )ex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
(
n
Narges S. Bathaeian
2(G exex ex + ex
| ex * ex|(ex) | n
0G ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
3ex n ↑
2ex ( ↑ ex )ex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
(
n
4ex ex + ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
+
5ex ex * ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
*
Narges S. Bathaeian
3(G exex ex + ex
| ex * ex|(ex) | n
0G ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
3ex n ↑
2ex ( ↑ ex )ex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
(
n
4ex ex + ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
+
5ex ex * ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
*
6ex ( ex ↑ )ex ex↑ + exex ex↑ * ex
ex
Narges S. Bathaeian
4(G exex ex + ex
| ex * ex|(ex) | n
0
1G ex ↑ex ex↑ + exex ex↑ * exex
3ex n ↑
2ex ( ↑ ex )ex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
(
n
4ex ex + ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
+
5ex ex * ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
*
6ex ( ex ↑ )ex ex↑ + exex ex↑ * ex
exn
(
7ex ex + ex ↑ex ex↑ + exex ex↑ * ex
ex
(
n
Narges S. Bathaeian
5(G exex ex + ex
| ex * ex|(ex) | n
0
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
3ex n ↑
2
(
n
4ex ex + ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
+
5ex ex * ↑ exex ↑ ex + exex ↑ ex * exex ↑ ( ex )ex ↑ n
*
6ex ( ex ↑ )ex ex↑ + exex ex↑ * ex
ex
n
(
7ex ex + ex ↑ex ex↑ + exex ex↑ * ex
ex
(
n
n
8ex ex * ex ↑ex ex↑ + exex ex↑ * ex
ex
(
Narges S. Bathaeian
6(G exex ex + ex
| ex * ex|(ex) | n
0
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
3ex n ↑
2
(
n
4+
5
*
6ex ( ex ↑ )ex ex↑ + exex ex↑ * ex
ex
n
(
7ex ex + ex ↑ex ex↑ + exex ex↑ * ex
ex
(
n
n
8ex ex * ex ↑ex ex↑ + exex ex↑ * ex
ex
(
*
+
9ex ( ex ) ↑
)
بطحائیان اصول طراحی کامپایلر
57
Narges S. Bathaeian
7(G exex ex + ex
| ex * ex|(ex) | n
0
1G ex ↑ex ex↑ + exex ex↑ * ex
ex
3ex n ↑
2
(
n
4+
5
*
6
ex
n
(
7ex ex + ex ↑ex ex↑ + exex ex↑ * ex
ex
(n
n
8ex ex * ex ↑ex ex↑ + exex ex↑ * ex
ex
(
*
+
9ex ( ex ) ↑
)
+
+
*
*
. نمایان می شود8 و 7های stateولی مشکل در
r4r4r4r49
8s2s35
r5r5r5r53
r3r38r2r27
s5s4s96
7s2s34
6s2s32r1s5s41
1s2s30exG$*+)(n
r4r4r4r49
8s2s35
r5r5r5r53
r3r38r2r27
s5s4s96
7s2s34
6s2s32r1s5s41
1s2s30exG$*+)(n
?
?
??
?
?
??
بعد از state 7در . تصمیم گیری کنیم8 و 7 های stateای الزم است که با در نظر گرفتن اولویتهای تعریف شده در ریاضیات بر
+ نسبت به * می دهیم زیرا shift* شرکت پذیری از چپ دارد ولی با دیدن + می کنیم زیرا reduceجدید + با دیدن + دیدن . مشابه همین استدالل را داریمstate 8در مورد . اولویت دارد
r4r4r4r49
8s2s35
r5r5r5r53
r3r38r2r27
s5s4s96
7s2s34
6s2s32r1s5s41
1s2s30exG$*+)(n
r4r4r4r49
8s2s35
r5r5r5r53
r3r38r2r27
s5s4s96
7s2s34
6s2s32r1s5s41
1s2s30exG$*+)(n
s5r3
r2r3
s5r3
r2r3
بطحائیان اصول طراحی کامپایلر
58
YACCنرم افزار پیاده سازی با استفاده از -9
YACC یکParser به روشLALR(1) می توان برای عملگرها اولویت تعریف در این نرم افزار .برای گرامر داده شده می سازد . ها را یکی یکی می گیردlex ، token مربوط به برنامه yylexاز تابع این برنامه .کرد
: می توان با متغیرهای خاصی اشاره کردپشتهر روی به مقادییکی از ویژگیهای این برنامه این است که $n : nامین مقدار . می شودreduceمقداری که به آن : $$
. در شکل زیر نشان داده شده استYACCروش کار
: به شکل زیر استYACCطرز نوشتن برنامه
: به شکل زیر است1ن گرامرطرز نوشتن قوانی
. نوشتCمی توان دستورات زبان {} در
:مثال :برای گرامری مانند گرامر زیر
S -> REAL IDLIST IDLIST -> IDLIST , ID
1 Translation rules
بطحائیان اصول طراحی کامپایلر
59
IDLIST -> ID ID -> A | B | C | D
: بصورت زیر خواهد بودYACCبرنامه %{ #include<stdio.h> #include<ctype.h> #include "nbyout.h" extern FILE *yyin; void yyerror(char *s); %} %token real_kw identifier cama %% s : real_kw IDLIST {printf("s->REAL IDLIST\n");} | {printf("%s \n",$$);yyerror("syntax error");} ; IDLIST : IDLIST cama identifier {printf("IDLIST->IDLIST,ID\n");} | identifier {printf("IDLIST->ID\n");} ; %% main() { char fname[30]; printf("please enter the name of your file :\n"); scanf("%s",fname); yyin = fopen(fname,"r"); yyparse(); return 0; } void yyerror(char *s1) { printf("%s\n",s1); return; }
: آن باید به این صورت تغییر کندLEXالبته برنامه %{ #include<stdlib.h> #include "nbyout.h" %} ws [ \t\n]+ ID [A-D] %% "REAL" {return real_kw;} {ID} {return identifier;} "," {return cama;} {ws} %% int yywrap() { return 1; }