המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

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

מצגות קשורות


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

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

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

3 ניתוח תחבירי G=(V,T,P,S) היום נתרכז בשלב הניתוח התחבירי
רצף אסימונים עץ גזירה או הודעת שגיאה (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 ניתוח Top-Down הבעיה העיקרית: איזה כלל להפעיל בכל צעד?
S A 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(); } 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 פתרונות אפשריים שינוי הדקדוק לדקדוק שקול: בחירת שיטה אחרת מאשר RD.
אם יש שני כללים המתחילים באותו טרמינל ניתן לבטל רישות משותפות: A  αβ1 | αβ2 | … | αβn A  αA’ A’  β1 | β2 | … | βn ביטול רקורסיה שמאלית: למדנו בקורס אוטומטים. A  Aα | β A  βB B  αB | α בחירת שיטה אחרת מאשר RD.

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

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

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

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

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

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

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

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

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

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 (לכל משתנה דקדוק): C B S Ø {$} 1 לכל כלל Y  αA בדקדוק בצע: follow(A) := follow(A)  first(β) ואם β*ε, בצע גם: follow(A) := follow(A)  follow(Y)

30 המשך דוגמה - חישוב follow
נתון דקדוק: S  aB | BC | CBd B  b | ε C  c | ε חישוב follow (לכל משתנה דקדוק): C B S Ø {$} 1 {b,d,$} {c,$,d} 2 מתוך 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 (לכל משתנה דקדוק): C B S Ø {$} 1 {b,d,$} {c,$,d} 2 3

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

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


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

מצגות קשורות


מודעות Google