1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ...

33
ﮐﺎﻣﭙﺎﯾﻠﺮ ﻃﺮاﺣﯽ اﺻﻮل ﺑﻄﺤﺎﺋﯿﺎن27 6 - ﭘﺎﯾﯿﻦ ﺑﻪ ﺑﺎﻻ ﭘﺎرﺳﺮ1 ﺗﻌﺮﯾﻒ: درﺧﺖ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 ﮔﺮاﻣﺮ راﺳﺖ ﺳﻤﺖ و ﺷﻮد ﻣﯽ ﭘﺸﺘﻪ در ﻣﺮﺑﻮﻃﻪpush ﺷﻮد ﻣﯽ. ﭘﺸﺘ ﺳﺮ ﻫﺮﮔﺎه ﭘﺸﺘﻪ ﺳﺮ از ﺗﻮﮐﻦ ﺑﻮدﻧﺪ ﯾﮑﺴﺎن اﺳﮑﻨﺮ ﻓﺎز از ﺷﺪه ﮔﺮﻓﺘﻪ ﺗﻮﮐﻦ وpop ﻣﯽ ﺷﻮد. اﺑﺘﺪاphrase ﭘﺸﺘﻪ در ﺷﺮوعpush ﺷﻮد ﻣﯽ. ﻣﺜﺎل: 1 Top down parsing 2 Recursive descent

Upload: others

Post on 01-Jan-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 2: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

)

Page 3: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 4: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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}

Page 5: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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همه گرامرها را نمی توان به روش

:زیر را داشته باشد

Page 6: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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) = {}

Page 7: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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β | …

.کرد استفاده باید جایگزینی ازدر این صورت .کنیم می جلوگیری جایگذاری هنگام دور در افتادن از, متغیرها بندی اولویت با

Page 8: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 9: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 *

Page 10: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 11: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 تایی از κ ترکیبساخت جدولی که ستونهای آن • .می باشد

Page 12: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 *

Page 13: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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();

}}

Page 14: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 15: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 ) ) $

Page 16: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 ) ) $

Page 17: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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برای ساخت جدول

Page 18: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

(

Page 19: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. 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

Page 20: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

*

Page 21: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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) = { $ , + , ) , * }

Page 22: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 23: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 24: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 ε

Page 25: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

:جدول بدست آمده

Page 26: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

:بنابراین جدول بدست آمده

Page 27: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 28: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

.از دو جهت قدرت و اندازه جدول روشهای گفته شده را با هم مقایسه می کنیم

قدرت

Page 29: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

55

می تواند تمام گرامرها بجز گرامرهای مبهم را LR(1). کردparseبه این معنی که چه دامنه ای از گرامرها را می توان با آن روش .ر نمی دهدقدرت بیشتر به پارس, های بیشتر از یکk برای LR(k) .پارس کند

اندازه جدول

. ها می باشدstateمنظور تعداد

LR(0)

SLR(1)

LALR(1)

LR(1)

SLR(1) LR(0)

LALR(1)

LR(1)

Page 30: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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 ) ↑

)

Page 31: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 32: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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

Page 33: 1ﻦﯿﯾﺎﭘ ﻪﺑ ﻻﺎﺑ ﺮﺳرﺎﭘ -6 - basu.ac.ir...نﺎﯿﺋﺎﺤﻄﺑ ﺮﻠﯾﺎﭙﻣﺎﮐ ﯽﺣاﺮﻃ لﻮﺻا 29 Narges S. Bathaeian accept (11 1. S

بطحائیان اصول طراحی کامپایلر

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; }