1 / 34

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

ניתוח תחבירי Top-Down. נכתב ע"י אלכס קוגן ( (sakogan@cs סמסטר חורף, תשס"ח. backend. ניתוח סמנטי. ניתוח תחבירי. ניתוח לקסיקלי. תזכורת מתרגול אחרון. ראינו מהו המבנה הסכמתי של קומפיילר לקסמות, אסימונים, וביטויים רגולריים. דנו בתכונות המנתח הלקסיקלי. ראינו את הכלי Flex. ניתוח תחבירי.

cleave
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ניתוח תחבירי Top-Down נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

  2. backend ניתוח סמנטי ניתוח תחבירי ניתוח לקסיקלי תזכורת מתרגול אחרון • ראינו מהו המבנה הסכמתי של קומפיילר • לקסמות, אסימונים, וביטויים רגולריים. • דנו בתכונות המנתח הלקסיקלי. • ראינו את הכלי Flex.

  3. ניתוח תחבירי • היום נתרכז בשלב הניתוח התחבירי • שפת כל התכניות החוקיות מוגדרת ע"י דקדוק חופשי הקשר: ניתוח תחבירי רצף אסימונים עץ גזירה או הודעת שגיאה (syntax error) G=(V,T,P,S) V – קבוצת המשתנים, T – קבוצת הטרמינלים (א"ב השפה): האסימונים המתקבלים מהניתוח הלקסיקלי, P – קבוצת כללי הגזירה, S – משתנה התחלתי. • רצף האסימונים המתאים לתוכנית שלמה חוקית (נכתבה באופן חוקי על פי כללי הדקדוק) מהווה מילה שצריכה להתקבל בשפה.

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

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

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

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

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

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

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

  11. Recursive Descent - דוגמה • נתון הדקדוק: S  aSa | B B  dB | e

  12. דוגמה - המשך S  aSa | B B  dB | e function S() { if (lookahead == ‘a’) { // S  aSa match(‘a’); S(); match(‘a’); } else { // S  B B(); } } • פונקציה ל"גזירת" המשתנה S: משתנה עזר שמחזיק את הטרמינל הבא בקלט • פונקצית עזר: function match (token t) { if (lookahead == t) lookahead = next_token(); else error(); }

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

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

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

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

  17. S A t... שיפור מנגנון ההחלטה לבחירת כלל • נגדיר פונקציה: select: P  2Tשמגדירה לכל כלל ב P, איזו קבוצת טרמינלים (ליטרלים) בקלט יגרמו לבחירת הכלל הזה. אז מתי ייבחר הכלל Aα? • א) אם זהו כלל מהצורה A  tβ[ tT,β(VT)* ]: • הכלל ייבחר כאשר t הוא הטרמינל הבא בקלט:

  18. S S A A B B β β ε t … t … קבוצת הטרמינלים שיכולים להופיע בתחילת מילה ש-B גוזר קבוצת הטרמינלים שיכולים להופיע בתחילת מילה שהתבניתβ גוזרת t  first(β) = t  first(B) = מתי ייבחר הכלל Aα? ב) אם זהו כלל מהצורה A  Bβ[ BV,β(VT)* ]: 1) כאשר הטרמינל הבא בקלט - t , מקיים שהמשתנה B יכול לגזור מילה המתחילה בו (כלומר, B*tα): • נגדיר פונקצית עזר first, עבור כל משתנה בדקדוק: • 2(אם B אפיס (B*ε): נבחר בכלל הזה כאשר התבנית הפסוקית β יכולה לגזור מילה המתחילה בטרמינל הבא בקלט - t: • – נגדיר first גם לתבניות פסוקיות [β(VT)* ] :

  19. C A B β ε t … כל הטרמינלים שיכולים להופיע מיד לאחר A בגזירה כלשהי t  follow(A) = מתי ייבחר הכלל Aα? ב) אם זהו כלל מהצורה A  Bβ[ BV,β(VT)* ]: 3)אם הכלל כולו אפיס (Bβ*ε):נבחר בכלל הזה כאשר רואים שהטרמינל הבא בקלט - t, יכול להופיע מיד אחרי A: • נגדיר פונקצית עזר נוספת follow, עבור כל משתנה בדקדוק:

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

  21. אלגוריתם לחישוב פונקצית first • שלב 0 – בודקים אילו משתנים הם אפיסים. • שלב 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 first(α) :=  first(xj) x1x2…xj -1*ε • שלב 2 – חישוב first עבור תבנית פסוקית x1x2…xk=α: • כלומר: • first(x1), איחוד עם • first(x2) במקרה ש-x1 אפיס, איחוד עם • first(x3) במקרה ש-x1 ו-x2 אפיסים, איחוד עם ...

  23. דוגמה - חישוב first • נתון דקדוק: • שלב 0 – המשתנים האפיסים: S,C,B. S  aB | BC | CBd B  b | ε C  c | ε • שלב 1 - חישוב first עבור המשתנים: • צעד: כל עוד יש שינויים, לכל כלל 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)

  24. דוגמה - חישוב first • נתון דקדוק: • שלב 0 – המשתנים האפיסים: S,C,B. S  aB | BC | CBd B  b | ε C  c | ε • שלב 1 - חישוב first עבור המשתנים: • צעד: כל עוד יש שינויים, לכל כלל 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)

  25. דוגמה - חישוב first • נתון דקדוק: • שלב 0 – המשתנים האפיסים: S,C,B. S  aB | BC | CBd B  b | ε C  c | ε • שלב 1 - חישוב first עבור המשתנים:

  26. דוגמה - חישוב first • נתון דקדוק: • שלב 0 – המשתנים האפיסים: S,C,B. S  aB | BC | CBd B  b | ε C  c | ε • שלב 1 - חישוב first עבור המשתנים:

  27. first(α) :=  first(xj) x1x2…xj-1*ε דוגמה - חישוב first • שלב 2 - חישוב first לאגפי ימין: first(aB) = {a} first(BC) = first(B)first(C) = {b,c} first(CBd) = first(C)first(B)first(d) = {c,b,d} S  aB | BC | CBd B  b | ε C  c | ε

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

  29. המשך דוגמה - חישוב follow • נתון דקדוק: S  aB | BC | CBd B  b | ε C  c | ε • חישוב follow (לכל משתנה דקדוק): • לכל כלל Y αAבדקדוק בצע: • follow(A) := follow(A)  first(β) • ואם β*ε, בצע גם: follow(A) := follow(A)  follow(Y)

  30. המשך דוגמה - חישוב follow • נתון דקדוק: S  aB | BC | CBd B  b | ε C  c | ε • חישוב follow (לכל משתנה דקדוק): מתוך SBC מתוך SCBd משתנה S לא מופיע בצד ימין של אף כלל גזירה • לכל כלל Y αAבדקדוק בצע: • follow(A) := follow(A)  first(β) • ואם β*ε, בצע גם: follow(A) := follow(A)  follow(Y)

  31. המשך דוגמה - חישוב follow • נתון דקדוק: S  aB | BC | CBd B  b | ε C  c | ε • חישוב follow (לכל משתנה דקדוק):

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

  33. first(α)  follow(A) α* ε select(Aα) = first(α) otherwise המשך דוגמה - חישוב select 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. first(α)  follow(A) α* ε select(Aα) = first(α) otherwise המשך דוגמה - חישוב select 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(C)= {b,d,$}

More Related