Presentation is loading. Please wait.

Presentation is loading. Please wait.

ניתוח תחבירי Top-Down.

Similar presentations


Presentation on theme: "ניתוח תחבירי Top-Down."— Presentation transcript:

1 ניתוח תחבירי Top-Down

2 תזכורת מתרגול אחרון מבנה סכמתי של קומפיילר אסימונים ולקסמות
מנתח לקסיקלי כלי Lex ניתוח לקסיקלי תחבירי סמנטי backend

3 ניתוח תחבירי היום נתרכז בשלב הניתוח התחבירי
עץ גזירה או הודעת שגיאה (syntax error) רצף אסימונים שפת התכניות החוקיות מוגדרת ע"י דקדוק ח"ה כל מילה בשפה היא תוכנית שלמה בקוד המקור

4 דרישת מהמנתח התחבירי שלמות: המנתח מזהה כל מילה בשפה
אם התכנית היא חוקית, המנתח יצליח לזהות אותה ויבנה עץ גזירה נאותות: המנתח אינו מקבל מילים שאינן בשפה אם התכנית לא חוקית, המנתח לא יצליח לזהותה ויודיע על שגיאה איזו דרישה חשובה יותר?

5 ניתוח Top-Down הניתוח מתחיל מהמשתנה התחילי מפעילים רצף כללי גזירה
עוצרים כאשר: מגיעים למילת הקלט  המילה בשפה נתקעים (אין או לא יודעים איזה כלל גזירה להפעיל)  המילה אינה בשפה

6 דוגמה בקוד המקור: x = y + 1 אחרי ניתוח לקסיקלי: id assign id op num
ניתוח תחבירי Top-Down: ST S  id assign E E id assign id op num

7 דוגמה בקוד המקור: x = y + 1 אחרי ניתוח לקסיקלי: id assign id op num
ניתוח תחבירי Top-Down: ST E E  E op E E E id assign id op num

8 דוגמה בקוד המקור: x = y + 1 אחרי ניתוח לקסיקלי: id assign id op num
ניתוח תחבירי Top-Down: ST E E  id E  num E E id assign id op num

9 ניתוח Top-Down הבעיה העיקרית: איזה כלל להפעיל בכל צעד?
S A A  α A  β ? הסיטואציה: יודעים איזה משתנה רוצים לגזור (A), השאלה באיזה כלל של A להשתמש.

10 שיטת Recursive Descent
הרעיון: נכתוב לכל משתנה פונקציה ש"תגזור" את כל המילים הנגזרות ממנו נבחר את כלל הגזירה לפי הסדר הבא: מבין כל הכללים של משתנה A וטרמינל הבא בקלט t: אם ל-A יש כלל שמתחיל ב-t, בחר בו אחרת, אם ל-A יש כלל יחיד שמתחיל במשתנה, בחר בו אחרת, תודיע על שגיאה שימו לב: זאת רק דוגמה אפשרית לקביעת סדר הכללים

11 דוגמה נתון דקדוק: S  aSa | B B  dB | e נשתמש בפונקצית עזר:
function match (token t) { if (lookahead == t) lookahead = next_token(); else error(); } משתנה עזר שמחזיק תו הבא בקלט

12 דוגמה - המשך פונקציה ל"גזירת" המילים מתוך המשתנה S: function S() {
if (lookahead == ‘a’) { // S  aSa match(‘a’); S(); } else { // S  B B(); }

13 דוגמה - המשך פונקציה ל"גזירת" המילים מתוך המשתנה B: function B() {
if (lookahead == ‘d’) { // B  dB match(‘d’); B(); } else if (lookahead == ‘e’) { // B  e match(‘e’); } else error(); } מדוע כאן יש קריאה מפורשת ל-error() ובפונקציה S() אין?

14 בעיות בשיטת RD לא ניתן לטפל בכל הדקדוקים מנתח לא שלם
אם יש שני כללים שמתחילים במשתנה או אותו טרמינל מנתח לא שלם לא מזהה את כל המילים בשפה דוגמה: עבור דקדוק עם שני כללי גזירה Sa | Bb ו-Ba, עבור מילת קלט “ab” המנתח יבחר בכלל Sa וייתקע רקורסיה שמאלית תגרום לריצה אינסופית דוגמה: S  Sa | a

15 פתרונות אפשריים שינוי הדקדוק לדקדוק שקול A  αβ1 | αβ2 | … | αβn
ביטול רישות משותפות: A  αβ1 | αβ2 | … | αβn A  αA’ A’  β1 | β2 | … | βn ביטול רקורסיה שמאלית נלמד בקורס של אוטומטים בחירת שיטה אחרת

16 חסרונות של פתרון 1 לא מובטח שהבעיות ייפתרו
לא נותן מענה לשני כללים שמתחילים ממשתנה שונה קיבלנו דקדוק "מכוער" ולא אינטואיטיבי

17 שיפור מנגנון ההחלטה נגדיר פונקציה: select: P  2T שמגדירה לכל כלל איזה טרמינלים בקלט יגרמו לבחירת כלל זה. אז מתי רוצים לבחור בכלל Aα? אם זהו כלל מהצורה Atβ (tT): כאשר רואים t בקלט  select(Atβ) = {t} S A t...

18 שיפור מנגנון ההחלטה (המשך)
אם זהו כלל מהצורה ABβ (BV): כאשר רואים בקלט טרמינל ש-B יכול לגזור מילה שמתחילה בו נגדיר פונקצית עזר first: A B β t … C טרמינלים שיכולים להופיע בתחילת מילה ש-B גוזר first(B) = A B β t … C ε אם B אפיס (B*ε): כאשר רואים בקלט טרמינל ש-β יכול לגזור מילה שמתחילה בו  נגדיר first גם לתבניות פסוקיות

19 שיפור מנגנון ההחלטה (המשך)
אם זהו כלל מהצורה ABβ (המשך): אם הכלל כולו אפיס (Bβ*ε) – כאשר רואים בקלט טרמינל שיכול להופיע אחרי A נגדיר פונקצית עזר נוספת follow: A B β ε t … C טרמינלים שיכולים להופיע אחרי A בגזירה כלשהי follow(A) =

20 הגדרות פורמליות טרמינלים שיכולים להופיע בתחילת מילה ש-α גוזר:
first(α) = { t  T | α * tβ } טרמינלים שיכולים להופיע אחרי A בגזירה כלשהי: follow(A) = { t  T{$} | S$ * αAtβ } S - משתנה תחילי של דקדוק $ - סימן סוף קלט (לא חלק מאוסף הטרמינלים) הגדרת פונקצית select: select(Aα) = first(α)  follow(A) α * ε first(α) otherwise

21 אלגוריתם לחישוב פונקצית first
שלב 1 – חישוב first עבור כל סימן X(VT) בדקדוק אתחול: לכל טרמינל tT: first(t) = {t} לכל משתנה AV: first(A)=Ø צעד: כל עוד יש שינויים, לכל כלל AY1Y2…Yk (כאשר Yi(VT) עבור k ≥ i ≥ 1), בצע: first(A) = first(A)first(Y1) לכל i > 1 עבורו Y1Y2…Yi-1*ε, בצע: first(A) = first(A)first(Yi) שימו לב: יש כאן תלות מעגלית! לכן האלגוריתם הוא איטרטיבי ופועל עד שאין יותר שינויים

22 אלגוריתם לחישוב פונקצית first (המשך)
שלב 2 – חישוב first עבור תבנית פסוקית x1x2…xk=α: כלומר: first(x1), איחוד עם first(x2) במקרה ש-x1 אפיס, איחוד עם first(x3) במקרה ש-x1 ו-x2 אפיסים, איחוד עם ... x1x2…xj-1*ε first(α) =  first(α)

23 דוגמה S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב first עבור המשתנים: C B S Ø 1

24 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב first עבור המשתנים: C B S Ø 1 {c} {b} {a,d} 2

25 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב first עבור המשתנים: C B S Ø 1 {c} {b} {a,d} 2 {a,d,b,c} 3

26 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב first עבור המשתנים: C B S Ø 1 {c} {b} {a,d} 2 {a,d,b,c} 3 4

27 דוגמה (המשך) חישוב first לאגפי ימין: first(aB) = {a}
first(BC) = first(B)first(C) = {b,c} first(CBd) = first(C)first(B)first(d) = {c,b,d}

28 אלגוריתם לחישוב פונקצית follow
רוצים לחשב follow(A) = { t  T{$} | S$ * αAtβ } אתחול: לכל משתנה A≠S: follow(A)=Ø עבור משתנה תחילי S: follow(S)={$} צעד: כל עוד יש שינויים, לכל משתנה AV בצע: לכל כלל Y  αA (שבו A מופיע באגף ימין): follow(A) = follow(A)first(β) אם β*ε, בצע גם: follow(A) = follow(A)follow(Y) אם t יכול להופיע אחרי Y, אזי הוא יכול להופיע גם אחרי αAβ. אם β אפיס, אזי t יכול להופיע גם אחרי A

29 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב follow: C B S Ø {$} 1

30 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב follow: C B S Ø {$} 1 {b,d,$} {c,$,d} 2 מתוך SBC משתנה S לא מופיע בצד ימין של אף כלל גזירה מתוך SCBd

31 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב follow: C B S Ø {$} 1 {b,d,$} {c,$,d} 2 3

32 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב select עבור הכללים: תזכורת: select(Aα) = first(α)  follow(A) α * ε first(α) otherwise select(SaB) = first(aB) = {a}

33 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב select עבור הכללים: select(SaB) = first(aB) = {a} select(SBC) = first(BC)follow(S) = {b,c,$} select(SCBd) = select(Bb) = select(Bε) = select(Cc) = select(Cε) =

34 דוגמה (המשך) S  aB | BC | CBd נתון דקדוק: B  b | ε C  c | ε
חישוב select עבור הכללים: select(SaB) = first(aB) = {a} select(SBC) = first(BC)follow(S) = {b,c,$} select(SCBd) = first(CBd) = {b,c,d} select(Bb) = first(b) = {b} select(Bε) = first(ε)follow(B) = {c,d,$) select(Cc) = first(c) = {c} select(Cε) = first(ε)follow(B) = {b,d,$}


Download ppt "ניתוח תחבירי Top-Down."

Similar presentations


Ads by Google