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

Post on 03-Jan-2016

53 views 0 download

Tags:

description

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

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) 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('וכו פירושה: העברת תו הקלט הבא למחסנית, ומעבר למצב

nreduce 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

שאלה...

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

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

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

האלגוריתם

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

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

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

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

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

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

בניית הטבלה

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

)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 → ∙

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

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

.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הרחבת הדקדוק מתבצעת על-ידי הוספת כלל גזירה

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

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

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

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

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

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

.S → ∙ Gמהכלל שהוספנו בבניית הדקדוק המורחב: 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)כל שניתן להגיע אליו מהמצב הנוכחי.

בדוגמא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 ∙ }

ממשיכים...

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

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

וממשיכים...

(כערכים עבור 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 ∙ }

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

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

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

בשורה של מצב 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

קונפליקטים

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

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