ניתוח תחבירי (Parsing) - המשך. תזכורת : סוגי הניתוח התחבירי...

Post on 20-Dec-2015

275 views 1 download

Tags:

Transcript of ניתוח תחבירי (Parsing) - המשך. תזכורת : סוגי הניתוח התחבירי...

( - המשךParsingניתוח תחבירי )

תזכורת: סוגי הניתוח התחבירי

top-down – "מהשורש לעלים )נקרא גם – "ניתוח תחזית – predictive)

bottom-up מהעלים לשורש – מעבירים למחסנית, או מחליפים צד – (shift reduceימין בסימן מהצד השמאלי של חוק הדקדוק )

x y

s

x y

s

LR אלגוריתם

LR(k)אלגוריתם

הוא אלגוריתם:LR(k)אלגוריתם bottom-up,,מבוסס טבלאות( סורק את הקלט משמאלL,לימין )( מניב את הגזירה הימניתR,ביותר )-וזקוק לlookahead בגודל k.

המקרה הפשוט ביותר הוא אלגוריתם LR(0).

LL(k), LR(k)שפות

אם אפשר לגזור אותה LR(k)שפה נקראת .LR(k) parserבעזרת

– אבל לא LR(n) היא גם LL(n)כל שפה להיפך.

.LL מכיל ממש את LRכלומר,

LR(0)אלגוריתם

מחסנית

Parser

קלט

פלט

פעולות טבלת

gotoטבלת

דקדוק פשוט לדוגמא...

נשתמש בדקדוק הבא לצורך הדגמה:

E → E * B | E + B | BB → 0 | 1

ממוספר, בצורה מסודרת:

(1) E → E * B(2) E → E + B(3) E → B(4) B → 0(5) B → 1

המחסנית

)מזוהים על-ידי מצבים מכילה LRהמחסנית ב-מספר(.

לצורך קריאות, נכלול במחסנית גם משתנים אין בכך צורך אמיתיואסימונים. למעשה, מבחינת האלגוריתם.

" שנמצא בתחתית המחסנית, 0למעט מצב "כל שאר המחסנית תהיה מורכבת מזוגות של

מצב+משתנה או מצב+אסימון.

".0 מכילה רק את מצב "המחסנית ההתחלתית

טבלת הפעולות

טבלה זו מכתיבה את הפעולה לביצוע בכל שלב.

מצבים )על-פי מספרים(. שורות הטבלה:

עמודות הטבלה: אסימונים אפשריים בקלט.

.הוראות ביצועתוכן הטבלה:

הוראות ביצוע

הוראות הביצוע בטבלת הפעולות יכולות להיות:

shift n מסומנתsn למשל( s1, s2)'וכו פירושה: העברת תו הקלט הבא למחסנית, ומעבר למצבn

reduce m מסומנתrm למשל( r1, r2)'וכו 'פירושה: זיהינו כלל גזירה מסm

accept מסומנתacc.פירושה: הקלט נגזר בהצלחה

.שגיאה בקלטתאים ריקים –

Gotoטבלת

טבלת העזר השנייה משמשת במקרים בהם זיהינו גזירה של כלל.

שורות הטבלה: מצבים

עמודות הטבלה: משתנים

תוכן הטבלה: מצבים.

היות שלשתי הטבלאות אותן שורות, מקובל להציג אותן זו-לצד-זו.

E → E * B )1(למשל...)2( E → E + B

)3( E → B)4( B → 0)5( B → 1 gotoטבלת טבלת הפעולות

*+01$EB

0s1s234

1r4r4r4r4r4

2r5r5r5r5r5

3s5s6acc

4r3r3r3r3r3

5s1s27

6s1s28

7r1r1r1r1r1

8r2r2r2r2r2

שאלה...

m, מדובר בכלל גזירה rmעבור כל כלל אבל מה מסמנים המספרים עבור כללי

sn?

?nמהו טווח הערכים של

האלגוריתם

"0 "אתחול המחסנית:

אסימון הקלט הבא(:t ראש המחסנית, i )action[t, i]מצא את אם מצאתshift n:

הסר את האסימוןt,מהקלט את הוסףt ואח"כ את n.למחסנית

אם מצאתreduce m: יהיw מספר התווים בצד ימין של כלל הגזירה מספר m .

ערכים מהמחסנית.2wהסר יהיM המשתנה שגוזר כלל m הוסף את .M.למחסנית מצא אתgoto[s, M]( s והוסף החדש ראש המחסנית )

אותו למחסנית. אם מצאתacc:.סיום בהצלחה :סיום בשגיאה.אחרת

המשך עד לעצירה.

בניית הטבלה

... למרבה הצער, הפעם לא בתרגול אלא בהרצאה.

ראשית, כמה הגדרות.

LR(0)פריטי

( item, ובעברית פריט )או בקיצור LR(0)פריט הגדרה:הוא כלל גזירה עם "נקודה" מיוחדת בתוכו.

n+1 רכיבים מצד ימין ניתן לקבל nמכלל גזירה עם פריטים.

רכיבים מימין( נקבל את 3 )E → E + Bלמשל, עבור הכלל הפריטים הבאים:4

E → ∙ E + BE → E ∙ + BE → E + ∙ BE → E + B ∙

ניתן לקבל A → ε, לכן מהכלל 0 נחשב לכלל באורך εכלל רק את הפריט:

A → ∙

מה משמעותו של פריט?

פריט אינו באמת כלל גזירה )בכללים האמיתיים אין את הנקודה(.

.parserפריט מסמל את מצבו של ה-

משמעותו: זיהינו את מה שנמצא לפני )משמאל( הנקודה; אנו מצפים כעת למצוא את מה שנמצא אחריה )מימינה(.

למשל, הפריט:

E → E ∙ + B בקלט, E זיהה מחרוזת המתאימה ל-parserמסמן כי ה-

והוא כעת מצפה למצוא "+" ואחר-כך מחרוזת המתאימה .Bל-

קבוצות של פריטים

למרבה הצער, בדרך-כלל לא ניתן לתאר את מצב בעזרת פריט יחיד.parserה-

, אנו עשויים Eלמשל, אם זיהינו מחרוזת המתאימה ל-להיות במצב

E → E ∙ + B... אבל מצד שני, אולי אנו במצב

E → E ∙ * Bקבוצה של בעזרת parserלכן מציינים את מצבו של ה-

.פריטים

למשל,

{E → E ∙ + B , E → E ∙ * B}

סגור של קבוצת פריטים

אם קבוצת הפריטים הנוכחית כוללת מצב שבו הנקודה נמצאת לפני משתנה, קשה לדעת מה צריך להיות הפריט

הבא בקלט.

של קבוצת הפריטים.קבוצת הסגורלשם כך בונים את

קבוצת הסגור של קבוצת פריטים: קבוצת הגדרה:פריטים שבה, עבור כל פריט בקבוצה מהצורה

A → α ∙ B β בדקדוק, גם הפריטB → δועבור כל כלל מהצורה

B → ∙ δנמצא בקבוצה.

עשוי δבניית קבוצת הסגור היא איטרטיבית, משום שגם להתחיל במשתנה.

סגור של קבוצת פריטים – דוגמא

למשל, עבור קבוצת הפריטים:

C = { E → E + ∙ B }ובהנתן הדקדוק מהדוגמאות הקודמות,

קבוצת הסגור היא:

clos(C) = { E → E + ∙ B , B → ∙ 0 , B → ∙ 1 }

דקדוק מורחב הוא דקדוק שהוסיפו לו כלל יחיד, דקדוק מורחב הגדרה:

המבטיח שהגזירה האחרונה היא חד-משמעית בהיותה אחרונה.

, S → Eנרחיב את הדקדוק על-ידי הוספת כלל גזירה כאשר:

S משתנה שלא היה קיים בדקדוק לפני-כן, והוא כעת המשתנה הראשון,

E.המשתנה הראשון המקורי של הדקדוק ".0נהוג למספר את הכלל החדש "

(0) S → E(1) E → E * B(2) E → E + B(3) E → B(4) B → 0(5) B → 1

מכונת המצבים והמצב ההתחלתי

בבניית הטבלאות, אנו בונים למעשה מכונת מצבים שלה מסומן על-ידי קבוצת סגור מצבדטרמיניסטית שכל כלשהי של פריטים.

המצב ההתחלתי הוא הסגור של הפריט הראשון מהכלל .S → ∙ Eשהוספנו בבניית הדקדוק המורחב:

S → ∙ E.בדוגמא שלנו :המצב ההתחלתי בדוגמא שלנו הוא

clos({S → ∙ E }) ={S → ∙ E , E → ∙ E * B , E → ∙ E + B , E → ∙ B , B → ∙ 0 , B → ∙ 1}

0זוהי "קבוצת פריטים."

המצבים הבאים

איך מוצאים לאילו מצבים ניתן להגיע ממצב נתון?

א. מצא את כל הפריטים במצב הנוכחי, שבהם הנקודה .xנמצאת לפני סימן נתון כלשהו

x.יכול להיות אסימון או משתנה נסמן קבוצת פריטים זוS תת-קבוצה של המצב(

הנוכחי(.

.Sב. הזז את הנקודה צעד אחד ימינה עבור כל הפריטים ב-ג. מצא את הסגור של הקבוצה שהתקבלה.

שנמצא בעזרת הכללים הללו הוא מצב חדש clos(S)כל .xשניתן להגיע אליו מהמצב הנוכחי, כאשר בקלט מופיע

0למשל: מצבים שניתן להגיע אליהם ממצב בדוגמא

:1מצב

x = 0S1 = { B → ∙ 0 }

S1 = { B → 0 ∙ }

clos(S1) = { B → 0 ∙ }

:2מצב

x = 1S2 = { B → ∙ 1 }

S2 = { B → 1 ∙ }

clos(S2) = { B → 1 ∙ }

:3מצב

x = ES3 = {S → ∙ E , E → ∙ E * B , E → ∙ E + B}

S3 = {S → E ∙ , E → E ∙ * B , E → E ∙ + B}

clos(S3) ={S → E∙, E → E∙*B , E → E ∙ + B}

:4מצב

x = BS4 = { E → ∙ B }

S4 = { E → B ∙ }

clos(S4) = {E →B∙}

ממשיכים...

ממשיכים למצוא את כל המצבים שניתן להגיע אליהם מכל אחד מהמצבים שמצאנו עד כה.

בדוגמאות עד כה אין מצבי המשך )משום 4 ו-2, 1ממצבים כל פריט בקבוצת סגור אלה(.סוףשהנקודה תמיד נמצאת ב

ניתן להגיע למצבים חדשים:3ממצב

:5מצב

x = *S5 = { E → E ∙ * B }

S5 = { E → E * ∙ B }

clos(S5) = { E → E * ∙ B , B → ∙ 0 , B → ∙ 1 }

:6מצב

clos(S6) = { E → E + ∙ B , B → ∙ 0 , B → ∙ 1 }

וממשיכים...

(.x )כערכים עבור B ו-1, 0 ניתן להתקדם בעזרת הסימנים 5ממצב

, בהתאמה.2 ו-1 נגיע שוב למצבים x = 1 ועבור x = 0אבל עבור

:x=Bעבור

, נקבל את:x=B, עבור 6באופן דומה, ממצב

למצבים אלה אין מצבי המשך )מדוע?(

:7מצב

clos(S7) = { E → E * B ∙ }

:8מצב

clos(S7) = { E → E + B ∙ }

בניית הטבלאות: טבלת המעברים הראשונית

שורה עבור כל מצב.

מתייחסים לטבלאות כאל טבלת מעבריםשל האוטומט.

בשורה של מצב a בעמודה ,

xשהיא ה-ששימש לבניית

, רושמים bמצב .bאת

gotoטבלת טבלת הפעולות

*+01$EB

01234

1

2

356

4

5127

6128

7

8

בניית הטבלאות: מצבי הסיום

accמוסיפים בעמודה $ עבור

כל מצב, שקבוצת

הפריטים שלו כוללת את

הפריט

S → E ∙

gotoטבלת טבלת הפעולות

*+01$EB

01234

1

2

356acc

4

5127

6128

7

8

shiftבניית הטבלאות: פעולות

כל ערך מספרי n בטבלת

הפעולות הופך .snלהוראת

gotoטבלת טבלת הפעולות

*+01$EB

0s1s234

1

2

3s5s6acc

4

5s1s27

6s1s28

7

8

reduceבניית הטבלאות: פעולות

עבור כל מצב, שקבוצת

הפריטים שלו כוללת את

A → α ∙כך שקיים בדקדוק

כלל

A → α mשמספרו

(m>0):

ממלאים את השורה של מצב זה

)בטבלת הפעולות( בערך

rm.

gotoטבלת טבלת הפעולות

*+01$EB

0s1s234

1r4r4r4r4r4

2r5r5r5r5r5

3s5s6acc

4r3r3r3r3r3

5s1s27

6s1s28

7r1r1r1r1r1

8r2r2r2r2r2

מחסנית האלגוריתם

מכילה מספרי מצב parserאמרנו שמחסנית ה-וסמלים לסירוגין.

.סמל = אסימון או משתנה

אמרנו גם שלמעשה, האלגוריתם זקוק רק למספרי המצב שבמחסנית.

לקרוא את הסמלים במחסנית מאפשרים לנו כמסלול באוטומט של האלגוריתם.המחסנית

הסמלים שבין המצבים מסמנים את הקשתותדרכן עברנו.

מחסנית האלגוריתם

למשל, אם המחסנית ברגע נתון היא:

216+3E0

03

6

2E+ 1

LRסוגי

.LR(0)הטבלה שבנינו היא טבלה עבור

נוצרו רק על-ידי הפיכת reduceזאת משום שכללי .reduce לשורה של הוראות שורה שלמה

כלומר, מבצעיםreduce ללא תלות באסימון .lookaheadשבקלט – או במילים אחרות, אפס

ישנם שיפורים לאלגוריתם הבנייה... אלגוריתםCLR (Cannonic LR) או LR(1) חזק –

אבל "כבד" אלגוריתםLALR (Look Ahead LR) פשרה –

סבירה.

קונפליקטים בטבלאות

לשורה reduceכשמוסיפים הוראות בטבלת הפעולות, לא מוחקים מה שכבר

קיים בשורה זו.

לכן ייתכן שבתאים מסוימים בטבלה יש )או יותר(.שני ערכים

.קונפליקטיםמקרים כאלה נקראים

reduce/reduceקונפליקט

נוצר כשבתא אחד reduce/reduceקונפליקט .reduceיש כמה אפשרויות שונות ל-

למשל, נסו ליצור את הטבלה עבור הדקדוק הבא:

E → A 1E → B 1A → 1B → 1

shift/reduceקונפליקט

וגם הוראת reduceכשבתא אחד יש גם הוראת shift קונפליקט , מקבליםshift/reduce.

למשל, עבור הדקדוק הבא:

E → 1 EE → 1

קונפליקטים

מה הפירוש הסמנטי של קונפליקט המתקבל בדקדוק?

כיצד ניתן להתגבר על קונפליקטים?