طراحی کامپایلرها 414-40

41
ی ح را ط رها ل ی ا پ م کا414-40 دا ام خ ه ی ب4

description

به نام خدا. طراحی کامپایلرها 414-40. 4. مشکلات تحلیل نحوی بالا به پایین. چپ‌گردی در گرامر مستقل از متن، می‌تواند تحلیلگر نحوی را در حلقه‌ی نامتناهی بیاندازد مثلاً برای قاعده‌ی A → A α رویه‌ی زیر را داریم: راه حل: حذف چپ‌گردی البته بدون این که زبان متناظر گرامر تغییر کند. procedure A - PowerPoint PPT Presentation

Transcript of طراحی کامپایلرها 414-40

Page 1: طراحی کامپایلرها 414-40

طراحیکامپایلرها414-40

به نام خدا

4

Page 2: طراحی کامپایلرها 414-40

oدر گرامر مستقل از متن، چپ گردی

می تواند تحلیلگر نحوی را در حلقه ی

نامتناهی بیاندازد مثًال* برای قاعده یA → A α:رویه ی زیر را داریم

o :حذف چپ گردیراه حلالبته بدون این که زبان متناظر گرامر تغییر کند

مشکًالت تحلیل نحوی باال به پایین

1

procedure Abegin if lookahead is in First(Aα) then call procedure Aend

Page 3: طراحی کامپایلرها 414-40

oالگوریتمی برای حذف چپ گردی:ایده ی اولیه

:مثال

مواجهه با چپ گردی

2

A → A α | β A → β R

R → α R | ε

expr → expr + term | expr - term | term

term → id

expr → term rest

rest → + term rest | - term rest | ε

term → id

Page 4: طراحی کامپایلرها 414-40

o گرامر دارای چپ گردی، قاعده ای دارد که به

برای A →* A αکمک آن اشتقاقی مثل

ها قابل انجام استαبعضی

o تحلیل نحوی باال به پایین نمی تواند با چنین

گرامرهایی کنار بیاید، زیرا باید تصمیم

ثابتی بگیرد که نتیجتا* باعث خاتمه نیافتن آن

خواهد شد

o:به صورت کلی

(1حل مشکًالت: چپ گردی )

3

A → A α | β

A A α A α α A α α α …

A → A α | β A → β A’

A’ → α R | εگرامر دارای چپ گردی

گرامر بدون چپ گردی

Page 5: طراحی کامپایلرها 414-40

o:به شکل غیررسمی همه ی قواعد مربوط بهA را در نظر بگیرید و به این

آغاز نشود(:A با βiشکل مرتب کنید )به طوری که هیچ

حاال روشی را که پیش تر گفته شد روی آن ها اعمال

کنید:

:با این حساب، در مثال ما

(2حل مشکًالت: چپ گردی )

4

A → A α1 | A α2 | … | A αm | β1 | β2 | … | βn

A → β1 A’ | β2 A’ | … | βn A’

A’ → α1 A’ | α2 A’ | … | αm A’ | ε

E → E + T’ | T

T → T * F | F

F → ( E ) | id

E → T E’

E’ → + T E’ | ε

T → F T’

T’ → * F T’ | ε

Page 6: طراحی کامپایلرها 414-40

o مشکل: اگر چپ گردی دو یا چند مرحله عمق

داشته باشد، روش گفته شده کافی نیست

(3حل مشکًالت: چپ گردی )

5

S → A a | b

A → A c | S d | ε S A a S d a

A1 مرتب کنید )که A1, A2, …, Anـ غیرپایانه ها را به شکل 1نماد شروع است(

شروعn تا 1 از iـ برای 2 شروعi - 1 تا 1 از j برای

را با قاعده ای به Ai → Aj γهر قاعده به شکل شکل

Ai → δ1 γ | δ2 γ | … | δk γ به طوری که Aj → δ1 | δ2 | … | δk

هستند، جای گزین Aj قاعده های فعلی مربوط به کنید

پایان چپ گردی مستقیم را از همه ی قاعده های مربوط

حذف کنیدAiبه پایان

A1, A2, … , An که غیرپایانه های آن به صورت Gگرامر ورودی: مرتب شده اند

گرامر معادلی که چپ گردی نداردخروجی:

Page 7: طراحی کامپایلرها 414-40

o:استفاده از الگوریتم در مثال

(4حل مشکًالت: چپ گردی )

6

A1 → A2 a | b | ε

A2 → A2 c | A1 d

1 تا 1 از jبرای

را با قاعده هایی به A2 → A1 γقاعده های به شکل

شکل

A2 → δ1 γ | δ2 γ | … | δk γ به طوری که A1 → δ1 | δ2 | … |

δk

هستند، جای گزین A1 قاعده های فعلی مربوط به

می کنیم

A2 → A2 a d | b d | d به A2 → A1 dبنابراین در مثال،

تبدیل می شود

i = 1 هیچ چپ گردی ای وجود نداردA1در مورد

i = 2

A1 → A2 a | b | ε

A2 → A2 c | A2 a d | b d | d:آن چه باقی می ماندآیا کار تمام شده

است؟

Page 8: طراحی کامپایلرها 414-40

o نه، کار تمام نشده. هنوز باید چپ گردی را

حذف کنیم:

o ،باید این قاعده را که پیش تر گفته شد

اعمال کنیم:

(5حل مشکًالت: چپ گردی )

7

A1 → A2 a | b | ε

A2 → A2 c | A2 a d | b d | d

A → A α1 | A α2 | … | A αm | β1 | β2 | … | βn

A → β1 A’ | β2 A’ | … | βn A’

A’ → α1 A’ | α2 A’ | … | αm A’ | ε

Page 9: طراحی کامپایلرها 414-40

o مشکل: کدام یک از دو قاعده ی زیر باید

انتخاب شود؟

o:حالت کلی چنین مشکلی

حل مشکًالت: فاکتورگیری چپ

8

stmt → if expr then stmt else stmt

| if expr then stmt

A → α β1 | α β2 α

β1

β2

if expr then stmt rest

else stmt

εدر مثال ما

ه ب

ودش

ی مل

دیتب

A → α A’

A’ → β1 | β2

stmt → if expr then stmt rest

rest → else stmt | ε

Page 10: طراحی کامپایلرها 414-40

o(1چپ به راست )( پویش )تحلیل لغوی

o(2یافتن اشتقاق چپ گرد )

o:گرامر

o:ورودی

o:اشتقاق

oانباره )پشته( پردازش

تحلیل نحوی مبتنی بر جدول

9

E → T E’

E’ → + T E’ | ε

T → id

id + id $ خاتمه دهنده

E

Page 11: طراحی کامپایلرها 414-40

oLپویش ورودی از چپ به راست :oLساخت اشتقاق چپ گرد :o1 برای تصمیم گیری در تحلیل نحوی، عًالوه :

بر انباره، تنها به »یک« نشانه ی پیش رو از ورودی نگاه می کند

o در جدول تحلیل گرامرهایLL(1) در هیچ ، قاعده به چشم نمی خورد2خانه ای

o ویژگی های گرامرهایLL(1):مبهم نیستند و چپ گردی ندارند برای قاعده هایی به شکلA → α | β:

مشتق می شوند، β و αهیچ دو رشته از رشته هایی که از 1.( شروع شوند. به عبارت دیگر aنباید با نماد یکسان )مثًال*

باید تهی باشد.First(β) و First(α)اشتراک .2ε حداکثر از یکی از α یا βممکن است مشتق شود و First(β) مشتق می شود، آنگاه اشتراک α از εاگر 3.

Follow(A).باید تهی باشد

o همه ی گرامرها را نمی توان به شکلLL(1) تبدیل کرد

LL(1)گرامرهای

10

Page 12: طراحی کامپایلرها 414-40

o :ورودی رفتار کلی تحلیلگر با توجه به(

فعلی(، و )باالی انباره(

= $، کار پایان می یابد، و رشته ی ورودی X = aوقتی 1.

پذیرفته می شود

را از روی انباره برمی داریم، نشانه ی X = a ≠ $، Xوقتی 2.

( برمی گردیم1بعدی را از ورودی می گیریم و به قدم )

در جدول M[X,a] یک غیرپایانه باشد، خانه ی Xوقتی 3.

بررسی می شود:اگر خطا بود، رویه ی برخورد با خطا فراخوانی می شود•

را از روی انباره X بود، X → U V Wاگر قاعده ای به شکل •

را روی انباره قرار U و W، Vبرمی داریم و به ترتیب

می دهیم )به ورودی کاری نداریم(

روش غیربازگشتی و مبتنی بر جدول

11

تحلیلگر نحوی پیش گو

جدول تحلیلM[A,a]

a + b $

XYZ$

)رشته ی اصلی + ورودیخاتمه دهنده(

انباره )غیرپایان

ه ها و پایانه ها

ی گرامر(

نشانه ی انتهای انباره

خروجی

مشخص می کند که با

توجه به ورودی و

انباره، تحلیلگر باید چه

تصمیمی بگیرد

aX

Page 13: طراحی کامپایلرها 414-40

جدول M

(1تحلیل نحوی غیربازگشتی )

13

E → T E’

E’ → + T E’ | ε

T → F T’

T’ → * F T’ | ε

F → ( E ) | id

o:مثال

غیرپایانه ها

نشانه ی ورودی

id + * ( ) $

E E → T E’ E → T E’

E’ E’ → + T E’ E’ → ε E’ → ε

T T → F T’ T → F T’

T’ T’ → ε T’ → * F T’ T’ → ε T’ → ε

F F → id F → ( E )

Page 14: طراحی کامپایلرها 414-40

(2تحلیل نحوی غیربازگشتی )

14

o مثال روندتحلیل نحوی:

انباره ورودی خروجی

$E id + id * id $ E → T E’

$E’ T id + id * id $ T → F T’

$E’ T’ F id + id * id $ F → id

$E’ T’ id id + id * id $

$E’ T’ +id * id $ T’ → ε

$E’ +id * id $ E’ → + T E’

$E’ T + +id * id $

$E’ T id * id $ T → F T’

$E’ T’ F id * id $ F → id

$E’ T’ id id * id $

$E’ T’ *id $ T’ → * F T’

$E’ T’ F * *id $

$E’ T’ F id $ F → id

$E’ T’ id id $

$E’ T’ $ T’ → ε

$E’ $ E’ → ε

$ $

گسترش

ورودی

Page 15: طراحی کامپایلرها 414-40

(3تحلیل نحوی غیربازگشتی )

15

o:اشتقاق چپ گرد مثال قبلی

E T E’ F T’ E’ id T’ E’ id E’ id + T E’

id + F T’ E’ id + id T’ E’ id + id * F T’ E’

id + id * id T’ E’ id + id * id E’ id + id * id

Page 16: طراحی کامپایلرها 414-40

چه چیزی کم داریم؟

16

o جدول تحلیلM!هنوز ساخته نشده است یک ـ مجموعه هایFirst و Follow را برای گرامر به دست

آورید. دو ـ الگوریتم زیر را جهت ساخت جدول تحلیل اعمال

کنید:

A → α( را به ازای هر قاعده به شکل 3( و )2ـ قدم های )1

تکرار می کنیم:

M[A, a] را در خانه ی A → α باشد، First(α)در aـ اگر پایانه ی 2

می گذاریم

,M[A را در تمام خانه های A → α باشد، First(α) عضو εـ اگر 3

b]

استFollow(A)عضو b می گذاریم که

ف 4 pـ همه ی خانه های باقی مانده ی جدول که خالی اند، معر

خطای نحوی هستند.

Page 17: طراحی کامپایلرها 414-40

(2ساخت جدول تحلیل )

18

o 1مثال:S → i E t S S’ | a

S’ → e S | ε

E → b

First(S) = { i, a }

First(S’) = { e, ε }

First(E) = { b }

Follow(S) = { e, $ }

Follow(S’) = { e, $ }

Follow(E) = { t }

S → i E t S S’

First(i E t S S’) = { i }

S → a

First(a) = { a }

E → b

First(b) = { b }

S’ → e S

First(e S) = { e }

S’ → ε

First(ε) = { ε } Follow(S’) = { e, $ }

غیرپایانه ها

نشانه ی ورودی

a b e i t $

S S → a S → i E t S S’

S’ E’ → + T E’ S → εS’ → e S

S → ε

E E → b

Page 18: طراحی کامپایلرها 414-40

(3ساخت جدول تحلیل )

19

o 2مثال:First(E, F, T) = { (, id }

First(E’) = { +, ε }

First(T’) = { *, ε }

Follow(E, E’) = { ), $ }

Follow(F) = { *, +, ), $ }

Follow(T, T’) = { +, ), $ }

E → T E’

E’ → + T E’ | ε

T → F T’

T’ → * F T’ | ε

F → ( E ) | id

E → T E’

First(T E’) = { (, id }

E → + T E’

First(+ T E’) = { + }

E → b

First(b) = { b }

E’ → ε

First(ε) = { ε }

T’ → ε

First(ε) = { ε }

First(T) =

غیرپایانه ها

نشانه ی ورودیid + * ( ) $

E E → T E’ E → T E’E’ E’ → + T E’ E’ → ε E’ → εT T → F T’ T → F T’T’ T’ → ε T’ → * F T’ T’ → ε T’ → εF F → id F → ( E )

( در 2با توجه به قدم )الگوریتم

( در 3با توجه به قدم )الگوریتم

Page 19: طراحی کامپایلرها 414-40

حل مشکًالت: گرامرهای مبهم (1 )

20

o:این گرامر را در نظر بگیرید

oمشکل چیست؟:یک درخت تحلیل ساده

stmt → if expr then stmt

| if expr then stmt else stmt

| other

if then elseexpr stmt

stmt

stmt

if then elseexpr stmt stmtE1 S1

E2 S2 S3

else باید به then قبلی مربوط شود

Page 20: طراحی کامپایلرها 414-40

حل مشکًالت: گرامرهای مبهم (2 )

21

o:درخت های تحلیل مثال 1شکل:

2شکل:

این جا چه مشکلی وجود دارد؟

if thenexpr

stmt

stmt

if then elseexpr stmt stmtE1

E2 S1 S2

if thenexpr

stmt

stmt

if thenexpr stmtE1

E2 S1

else stmt

S2

Page 21: طراحی کامپایلرها 414-40

(1حذف ابهام )

22

o:اگر این گرامر را در نظر بگیریم

o:یا اگر بخواهیم ساده تر بگوییم

o :رشته ای که مشکل ایجاد می کند

stmt → if expr then stmt

| if expr then stmt else stmt

| other

S → i E t S

| i E t S e S

| s

E → a

i a t i a t s e s

Page 22: طراحی کامپایلرها 414-40

(2حذف ابهام )

23

o گرامر را اصًالح می کنیم تا ابهام حذفشود:

o گرامر اصًالح شده را رویمی آزماییم

o:گرامر اصًالح شده به صورت خواناتر

S → i E t S

| i E t S e S

| a

E → b

i a t i a t s e s

S → M | U

M → i E t M e M | a

U → i E t S | i E t M e U

E → b

stmt → matched_stmt | unmatched_stmt

matched_stmt → if expr then matched_stmt else matched_stmt | other

unmatched_stmt | if expr then stmt | if expr then matched_stmt else unmatched_stmt

Page 23: طراحی کامپایلرها 414-40

پردازش خطا

24

oشناسایی خطاها

o پیداکردن جایی که خطا در آن رخ داده است

)مثًال* خطی از کد(

oاطًالع رسانی دقیق و روشن

o مواجهه با )یا عبور از( خطا برای ادامه ی

کار و یافتن خطاهای احتمالی آینده

o در کامپایل برنامه های صحیح نباید تغییری

ایجاد شود

Page 24: طراحی کامپایلرها 414-40

(1راه بردهای مواجهه با خطا )

25

o( حالت ترسPanic Mode) دور انداختن :نشانه ها تا جایی که به یک نشانه ی

( بربخوریمSynchronizing»همگام سازی« )« :نشانه های همگام سازی مثلend و »;« و »{« در »

زبان های برنامه سازیبسته به تصمیم طراح کامپایلر:کاستی ها

دور انداختن ورودی باعث عدم تعریف صحیح )مثًال* •تعریف متغیرها( و به این ترتیب ایجاد خطاهای بیش تر

می شود خطاهای احتمالی در بخشی که دور انداخته ایم شناسایی •

نمی شوند:مزایا

سادگی )به ویژه برای حالتی که در هر عبارت »یک« •خطا وجود دارد مناسب است(

o( سطح عبارتPhrase Level) تصحیح محلی :ورودی

»;« مثًال* در برخورد با »,« به جای »;«، »,« حذف واضافه می شود

بسته به تصمیم طراح کامپایلربرای همه ی خطاها مناسب نیست می تواند به همراه حالت ترس استفاده می شود تا

ورودی کم تری دور انداخته شود

Page 25: طراحی کامپایلرها 414-40

(2راه بردهای مواجهه با خطا )

26

o( قواعد خطاError Productions)افزودن قواعدی به گرامر

به منظور ساخت یا تولید تحلیلگر نحوی

مثًال* قاعده ای برای عًالمت := )انتساب در پاسکال( به

می افزاییمCگرامر زبان

خطا گزارش داده می شود اما فرآیند کامپایل ادامه

می یابد

تصحیح داخلی )گرامر( و پیام های عیب یابی

o( تصحیح سراسریGlobal Correction) افزودن، حذف کردن، یا جای گزینی نشانه ها نتیجه ای

نامشخص دارد و ممکن است به تغییرات زیادی منجر

شود

الگوریتم هایی وجود دارند که می کوشند این تغییرات

را در سطح برنامه به حداقل برسانند

Page 26: طراحی کامپایلرها 414-40

o خطا در چه صورتی رخ می دهد؟ یادآوری

تحلیلگر نحوی:

(1 در صورتی که )X پایانه باشد و با ورودی انطباق

نداشته باشد

(2 در صورتی که ]ورودی )X],Mخالی باشد

o:دو روش اصًالححالت ترس

سطح عبارت

اصًالح خطا

27

تحلیلگر نحوی پیش گو

جدول تحلیلM[A,a]

a + b $

XYZ$

ورودی

انبارهخروج

ی

Page 27: طراحی کامپایلرها 414-40

o فرض کنیدA یک غیرپایانه در باالی انباره باشد

o :ورودی ها را دور بیاندازیم تا به یکی از ایدهنشانه های مجموعه ی از پیش تعریف شده ی

همگام سازی برسیمo انتخاب اعضای مجموعه ی همگام سازی مهم

است؛ مثًال*: مجموعه ی همگام سازی راFollow(A) در نظر بگیریم و

ورودی ها را دور بیاندازیم تا به عضوی از این مجموعه و تحلیل نحوی را را از باالی انباره برداریم Aبرسیم.

ادامه دهیم مجموعه ی همگام سازی راFirst(A) در نظر بگیریم و

ورودی ها را دور بیاندازیم تا به عضوی از این مجموعه برسیم. تحلیل نحوی را از همین جا ادامه دهیم

ممکن است بتوان از قاعده های منتهی بهε هم استفاده کرد

o اگر پایانه ای باالی انباره باشد که با ورودینخواند، آن را از روی انباره برمی داریم و

در پیغامی می گوییم که آن پایانه را اضافه کرده ایم

اصًالح خطا: روش حالت ترس (1)

28

Page 28: طراحی کامپایلرها 414-40

o :خانه های خالی جدول تحلیل را ایده ی کلی

تغییر دهیم اگر خانه یM[A,a] خالی، و a عضو Follow(A) ،بود M[A,a]

” )همگام سازی( قرار می دهیمsyncرا برابر “

o بنابراین اگرA عنصر باالی انباره، و a

ورودی فعلی باشد: اگرA و غیرپایانه ،M[A,a] بود، خالی a را از ورودی دور

می اندازیم

اگرA و غیرپایانه ،M[A,a] برابر “sync ” ،بودA را از

روی انباره برمی داریم

اگرA نامساوی، ولی پایانه a ،بود A را از روی انباره

برمی داریم )در واقع به این معنی است که آن را در

ورودی اضافه کرده ایم(

اصًالح خطا: روش حالت ترس (2)

29

Page 29: طراحی کامپایلرها 414-40

o:مثال جدول تحلیل تغییریافته

اصًالح خطا: روش حالت ترس (3)

30

غیرپایانه ها

نشانه ی ورودی

id + * ( ) $

E E → T E’ E → T E’

E’ E’ → + T E’ E’ → ε E’ → ε

T T → F T’ T → F T’

T’ T’ → ε T’ → * F T’ T’ → ε T’ → ε

F F → id F → ( E )

. Follow”(. بر اساس مجموعه ی sync“همگام سازی )

غیرپایانه ی باالی انباره را برمی داریم

ورودی را دور می اندازیم

Page 30: طراحی کامپایلرها 414-40

اصًالح خطا: روش حالت ترس (4)

31

oمثال روندتغییریافته ی تحلیل نحوی:

انباره ورودی مًالحظات

$ E +id * + id $ +خطا: دور انداختن

$ E id * + id $

$ E’ T id * + id $

$ E’ T’ F id * + id $

$ E’ T’ id id * + id $

$ E’ T’ + *id $

$ E’ T’ F * + *id $

$ E’ T’ F +id $ ,M[Fخطا: خانه ی +]=“sync ”

$ E’ T’ +id $ F از روی انباره برداشته می شود

$ E’ +id $

$ E’ T + +id $

$ E’ T id $

$ E’ T’ F id $

$ E’ T’ id id $

$ E’ T’ $

$ E’ $

$ $

پیغام خطای نمونه:

+ به اشتباه »واردشده

است، و دور انداخته

می شود«

پیغام خطای نمونه:

( Term»جمله )پیدا نشد«

Page 31: طراحی کامپایلرها 414-40

(1نوشتن پیغام های خطا )

32

oبرای ورودی در نظر می گیریمشمارنده ای

o ف یک ساخت pیادآوری: هر غیرپایانه، معر

انتزاعی زبان است

o:مثال هایی از پیغام های خطا برای گرامر ما اگرE:ف »عبارت« باشد pمعر

روی انباره، و + ورودی فعلی است: Eبا فرض این که •

« یا : عبارت نمی تواند با ‘+’ آغاز شودiخطا در محل »

«: عبارت نادرست استiخطا در محل »

روی انباره، و * به عنوان ورودی Eبه طور مشابه برای •

فعلی

اگرE:ف »انتهای عبارت« باشد pمعر ’

id’ باالی انباره، و ورودی فعلی * یا Eبا فرض این که •

شروع شده است، در jخطا: عبارتی که در محل است: »

« ظاهری نادرست داردiمحل

را از روی انباره برمی داریم، محل فعلی E: هر بار نکته•

را جایی ذخیره می کنیم

Page 32: طراحی کامپایلرها 414-40

(2نوشتن پیغام های خطا )

33

o مثال هایی از پیغام خطا برای خانه ی“sync” فرض کنیدF:باالی انباره، و + ورودی فعلی است

: بر خًالف انتظار، عملوند جمع یا ضرب i»خطا در محل •

پیدا نشد«

فرض کنیدE:باالی انباره، و ( ورودی فعلی است

: بر خًالف انتظار، عبارتی پیدا نشد«i»خطا در محل •

Page 33: طراحی کامپایلرها 414-40

(3نوشتن پیغام های خطا )

34

o مثال هایی از حالتی که باالی انباره پایانه ای

است که با ورودی نمی خوان�د فرض کنیدid:باالی انباره، و + ورودی فعلی است

: بر خًالف انتظار، شناسه ای پیدا نشد«i»خطا در محل •

فرض کنید ( باالی انباره، و ورودی فعلی پایانه ای غیر

از ( است:

هر وقت به یک ) برخوردیم، محل آن را در »انباره ی •

ویژه پرانتز باز« ذخیره می کنیم

وقتی که حالت فوق اتفاق افتاد، به انباره ی پرانتز باز •

نگاه می کنیم تا محل آن پرانتز باز را که بسته نشده

است ، بیابیم

واقع m: برای پرانتز بازی که در محل i»خطا در محل •

)مثًال* در صورتی که شده، هیچ پرانتز بسته ای پیدا نشد«

$ باشد(id * + ( id id )ورودی )

Page 34: طراحی کامپایلرها 414-40

تجمیع پیغام های خطا با جدول تحلیل

35

o با توجه به آن چه گفته شد، خانه های خالی

جدول تحلیل را می توانیم با روش مناسب

صدور پیغام خطا پر کنیم

Page 35: طراحی کامپایلرها 414-40

(1اصًالح خطا: سطح عبارت )

36

o ه هایpخانه های خالی جدول تحلیل را با روی

. این رویpه ها نه مدیریت خطا پر می کنیم

تنها خطاها را گزارش می کنند، بلکه: نمادهای روی انباره یا ورودی را تغییر می دهند یا

درج / حذف می کنند

پیغام خطای مناسب را صادر می کنند

o:کاستی ها هر گونه تغییر انباره باید با احتیاط انجام شود تا

اشتقاقی که اصوال* در زبان ممکن مطمئن شویم

نیست، توسط تحلیلگر نحوی انجام نمی شود

باید مراقب حلقه های نامتناهی بود

o در واقع، حالت ترس را گسترش می دهیم تا

مدیریت خطا به نحو کامل تری انجام شود

Page 36: طراحی کامپایلرها 414-40

(2اصًالح خطا: سطح عبارت )

37

oچه طور پیاده سازی کنیم؟ به هر قاعده در خانه های پر جدول تحلیل، و همین طور

” و خانه های خالی، شماره ای یکتا sync“به حالت

اختصاص می دهیم

Page 37: طراحی کامپایلرها 414-40

(3اصًالح خطا: سطح عبارت )

38

غیرپایانه ها

نشانه ی ورودی

id + * ( ) $

E 1 18 19 1 9 10

E’ 20 2 21 22 3 3

T 4 11 23 4 12 13

T’ 24 6 5 25 6 6

F 8 14 15 7 16 171 E → T E’

2 E’ → + T E’

3 E’ → ε

4 T → F T’

5 T’ → * F T’

6 T’ → ε

7 F → ( E )

8 F → id

”(sync“: همگام سازی )17 تا 9

: مدیریت خطا25 تا 18

Page 38: طراحی کامپایلرها 414-40

حل مشکًالت گرامر

39

o همه ی ویژگی های یک زبان برنامه سازی را

نمی توان با گرامرها )زبان ها( ی مستقل از

متن توصیف کرد، مثًال*: تعریف یک شناسه )مثًال* نام متغیر( پیش از استفاده از

آن در ادامه ی برنامه

رعایت تجانس نوع ها در عبارت ها )مثًال* جمع عدد

صحیح با عدد صحیح(

تطابق پارامترها در زمان تعریف تابع، با آرگومان ها در

زمان فراخوانی آن

o این ویژگی ها و نظایر آن ها

»حساس به متن« اند و دسته ی

دیگری از زبان ها را معرفی

زبان های حساس به می کنند:

متن

زبان های حساس به

متن

زبان های مستقل از

متن

زبان های منظم

Page 39: طراحی کامپایلرها 414-40

زبان های حساس به متن

40

o:مثالتعریف شناسه پیش از استفاده

( تطابق پارامترهاanbm( و آرگومان ها )cndm)

{ w c w | w (a|b)* }=L1

{an bm cn dm | n ≥ 1, m ≥ 1 }=L2

Page 40: طراحی کامپایلرها 414-40

( 1زبان های مستقل از متن )

41

o:مثال{ w c wR | w (a|b)* }=L3

{an bm cm dn | n ≥ 1, m ≥ 1 }=L4

{an bn cm dm | n ≥ 1, m ≥ 1 }=L5

{an bn | n ≥ 1 }=L6

Page 41: طراحی کامپایلرها 414-40

(2زبان های مستقل از متن )

42

o( نمایش به کمک مثال

(:گرامر{ w c wR | w (a|b)* }=L3

{an bm cm dn | n ≥ 1, m ≥ 1 }=L4

{an bn cm dm | n ≥ 1, m ≥ 1 }=L5

{an bn | n ≥ 1 }=L6

S → a S a | b S b | c

S → a S d | a A d

A → b A c | b c

S → X Y

X → a X b | a b

Y → c Y d | c d

S → a S b | a b