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

37
( ייייי ייייייParsing יייי- )

description

ניתוח תחבירי ( Parsing ) - המשך. תזכורת: סוגי הניתוח התחבירי. top-down – מהשורש לעלים (נקרא גם – "ניתוח תחזית" – predictive ) bottom-up – מהעלים לשורש – מעבירים למחסנית, או מחליפים צד ימין בסימן מהצד השמאלי של חוק הדקדוק (shift reduce). s. . x y. s. x y. - PowerPoint PPT Presentation

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

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

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

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

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

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

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

x y

s

x y

s

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

LR אלגוריתם

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

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

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

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

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

)LL)kשפות

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

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

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

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

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

מחסנית

Parser

קלט

פלט

טבלת פעולות

gotoטבלת

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

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

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

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

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

המחסנית

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

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

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

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

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

טבלת הפעולות

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

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

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

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

הוראות ביצוע

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

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

nreduce m

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

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

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

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

Gotoטבלת

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

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

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

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

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

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

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

שאלה...

, מדובר בכלל גזירה rmעבור כל כלל m

אבל מה מסמנים המספרים עבור כללי sn?

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

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

האלגוריתם

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

אם מצאתshift n: הסר את האסימוןi,מהקלט את הוסףi ואח"כ את n.למחסנית

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

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

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

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

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

בניית הטבלה

... למרבה הצער, הפעם לא בתרגול אלא בהרצאה.ראשית, כמה הגדרות.

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

)LR)0פריטי

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

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

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

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

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

A → ∙

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

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

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

.parserפריט מסמל את מצבו של ה-משמעותו: זיהינו את מה שנמצא לפני הנקודה; אנו

מצפים כעת למצוא את מה שנמצא אחריה.למשל, הפריט:

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

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

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

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

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

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

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

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

.של פריטיםלמשל,

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

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

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

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

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

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

A → α ∙ B β בדקדוק, B → δבקבוצת הסגור, ועבור כל כלל מהצורה

גם הפריטB → ∙ δ

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

עשוי להתחיל במשתנה.

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

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

למשל, עבור קבוצת הפריטים:C = { E → E + ∙ B }

ובהנתן הדקדוק מהדוגמאות הקודמות,

קבוצת הסגור היא:clos(C) = { E → E + ∙ B , B → ∙ 0 , B → ∙ 1

}

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

דקדוק מורחב

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

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

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

המשתנה הראשון,G.המשתנה הראשון המקורי של הדקדוק

".0נהוג למספר את הכלל החדש "(0) S → E(1) E → E * B(2) E → E + B(3) E → B(4) B → 0(5) B → 1

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

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

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

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

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

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

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

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

המצבים הבאים

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

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

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

ג. מצא את הסגור של הקבוצה שהתקבלה.

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

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

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

:1מצב

x = 0

S1 = { 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 = B

S4 = { E → ∙ B }

S4 = { E → B ∙ }

clos(S4) = { E → B ∙ }

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

ממשיכים...

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

בדוגמאות עד כה אין מצבי המשך (משום 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 }

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

וממשיכים...

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

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

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

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

:7מצב clos(S7) = { E → E * B ∙ }

:8מצב clos(S7) = { E → E + B ∙ }

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

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

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

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

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

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

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

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

*+01$EB

01234

1

2

356

4

5127

6128

7

8

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

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

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

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

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

הפריטS → E ∙

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

*+01$EB

01234

1

2

356acc

4

5127

6128

7

8

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

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

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

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

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

*+01$EB

0s1s234

1

2

3s5s6acc

4

5s1s27

6s1s28

7

8

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

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

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

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

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

כללA → α

mשמספרו (m>0):

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

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

rm.

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

*+01$EB

0s1s234

1r4r4r4r4r4

2r5r5r5r5r5

3s5s6acc

4r3r3r3r3r3

5s1s27

6s1s28

7r1r1r1r1r1

8r2r2r2r2r2

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

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

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

.סמל = אסימון או משתנהאמרנו גם שלמעשה, האלגוריתם זקוק רק

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

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

הקשתות דרכן עברנו.

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

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

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

03

6

2E+ 1

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

LRסוגי

.LR(0)הטבלה שבנינו היא טבלה עבור נוצרו רק על-ידי הפיכת reduceזאת משום שכללי

.reduce לשורה של הוראות שורה שלמה כלומר, מבצעיםreduce ללא תלות באסימון

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

אלגוריתםCLR (Cannonic LR) או LR(1) – חזק אבל "כבד"

אלגוריתםLALR (Look Ahead LR) פשרה – סבירה.

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

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

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

קיים בשורה זו.לכן ייתכן שבתאים מסוימים בטבלה יש

(או יותר).שני ערכים.קונפליקטיםמקרים כאלה נקראים

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

reduce/reduceקונפליקט

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

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

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

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

shift/reduceקונפליקט

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

shift/reduce.למשל, עבור הדקדוק הבא:

E → 1 EE → 1

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

קונפליקטים

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

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