Top down
This presentation is the property of its rightful owner.
Sponsored Links
1 / 34

ניתוח תחבירי Top-Down PowerPoint PPT Presentation


  • 145 Views
  • Uploaded on
  • Presentation posted in: General

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Top down

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

נכתב ע"י אלכס קוגן (([email protected]

סמסטר חורף, תשס"ח


Top down

backend

ניתוח

סמנטי

ניתוח

תחבירי

ניתוח

לקסיקלי

תזכורת מתרגול אחרון

  • ראינו מהו המבנה הסכמתי של קומפיילר

  • לקסמות, אסימונים, וביטויים רגולריים.

  • דנו בתכונות המנתח הלקסיקלי.

  • ראינו את הכלי Flex.


Top down

ניתוח תחבירי

  • היום נתרכז בשלב הניתוח התחבירי

  • שפת כל התכניות החוקיות מוגדרת ע"י דקדוק חופשי הקשר:

ניתוח

תחבירי

רצף אסימונים

עץ גזירה או הודעת שגיאה (syntax error)

G=(V,T,P,S)

V – קבוצת המשתנים,

T – קבוצת הטרמינלים (א"ב השפה): האסימונים המתקבלים מהניתוח הלקסיקלי,

P – קבוצת כללי הגזירה, S – משתנה התחלתי.

  • רצף האסימונים המתאים לתוכנית שלמה חוקית (נכתבה באופן חוקי על פי כללי הדקדוק) מהווה מילה שצריכה להתקבל בשפה.


Top down

דרישת מהמנתח התחבירי

  • שלמות: המנתח צריך לזהות כל מילה בשפה:

    • אם התכנית היא חוקית,המנתח יצליח לזהות אותה ויבנה עץ גזירה.

  • נאותות: אסור למנתח לקבל מילים שאינן בשפה:

    • אם התכנית אינה חוקית,המנתח לא יצליח לזהותה ויודיע על שגיאה.


Top down1

ניתוח Top-Down

  • הניתוח מתחיל מהמשתנה התחילי ( S ).

  • מפעילים רצף של כללי גזירה.

  • עוצרים כאשר:

    • מגיעים למילת הקלט (התוכנית כולה)  המילה בשפה.

    • נתקעים (לא ניתן להפעיל אף כלל גזירה)  המילה אינה בשפה.


Top down

דוגמה

  • בקוד המקור: x = y + 1

  • אחרי ניתוח לקסיקלי: id assign id op num

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

S

שימוש בכלל

S  id assign E

E

טרמינל

טרמינל

משתנה

id assign id op num


Top down

דוגמה

  • בקוד המקור: x = y + 1

  • אחרי ניתוח לקסיקלי: id assign id op num

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

S

שימוש בכלל

E  E op E

E

E

E

id assign id op num


Top down

דוגמה

  • בקוד המקור: x = y + 1

  • אחרי ניתוח לקסיקלי: id assign id op num

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

S

שימוש בכללים

E

E  id

E

E

E  num

id assign id op num


Top down2

S

A

ניתוח Top-Down

  • הבעיה העיקרית: איזה כלל להפעיל בכל צעד?

A α

A  β

?

  • הסיטואציה: יודעים איזה משתנה רוצים לגזור (A), אבל השאלה היא באיזה כלל של A להשתמש.


Recursive descent

שיטת Recursive Descent

  • הרעיון: נכתוב לכל משתנה פונקציה שיודעת "לגזור" את כל המילים שניתן לקבל ממנו.

  • נבחר את כלל הגזירה לפי הסדר הבא:

    • כאשר הטרמינל הבא בקלט הוא t, מבין כל הכללים של המשתנה A:

      • אם ל-A יש כלל שמתחיל גם כן ב-t, בחר בו.

      • אחרת, אם ל-A יש כלל יחיד שמתחיל במשתנה, בחר בו.

      • אחרת, החזר הודעת שגיאה.

  • שימו לב: זאת רק דוגמה אפשרית לקביעת סדר הכללים.


Recursive descent1

Recursive Descent - דוגמה

  • נתון הדקדוק:

S  aSa | B

B  dB | e


Top down

דוגמה - המשך

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();

}


Top down

דוגמה - המשך

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() אין?


Top down

בעיות בשיטת RD

  • לא ניתן לטפל בכל הדקדוקים

    1) אם יש שני כללים או יותר שמתחילים במשתנה כלשהו.2) אם יש שני כללים או יותר שמתחילים באותו טרמינל.

  • המנתח לא שלם - הוא לא מזהה את כל המילים בשפה

    • דוגמה: עבור דקדוק עם כללי הגזירה: Sa | Bb, Ba,עבור מילת קלט “ab”, נשמח אם המנתח יבחר בכלל SBb, אבל לצערנו הוא יבחר בכלל Sa וייתקע.

  • רקורסיה שמאלית תגרום לריצה אינסופית

    • דוגמה: S  Sa | b , כאשר התו הבא בקלט אינו b.


Top down

פתרונות אפשריים

  • שינוי הדקדוק לדקדוק שקול:

    • אם יש שני כללים המתחילים באותו טרמינל ניתן לבטל רישות משותפות:

A αβ1 | αβ2 | … | αβn

A  αA’

A’  β1 | β2 | … | βn

A Aα | β

A  βB

B  αB | α

  • ביטול רקורסיה שמאלית:

    • למדנו בקורס אוטומטים.

  • בחירת שיטה אחרת מאשר RD.


Top down

חסרונות של פתרון 1

  • לא מובטח שהבעיות ייפתרו:

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

  • קיבלנו דקדוק "מכוער" ולא אינטואיטיבי.


Top down

S

A

t...

שיפור מנגנון ההחלטה לבחירת כלל

  • נגדיר פונקציה: select: P  2Tשמגדירה לכל כלל ב P, איזו קבוצת טרמינלים (ליטרלים) בקלט יגרמו לבחירת הכלל הזה.

    אז מתי ייבחר הכלל Aα?

  • א) אם זהו כלל מהצורה A  tβ[ tT,β(VT)* ]:

  • הכלל ייבחר כאשר t הוא הטרמינל הבא בקלט:


Top down

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)* ] :


Top down

C

A

B

β

ε

t …

כל הטרמינלים שיכולים

להופיע מיד לאחר A

בגזירה כלשהי

t  follow(A) =

מתי ייבחר הכלל Aα?

ב) אם זהו כלל מהצורה A  Bβ[ BV,β(VT)* ]:

3)אם הכלל כולו אפיס (Bβ*ε):נבחר בכלל הזה כאשר רואים שהטרמינל הבא בקלט - t, יכול להופיע מיד אחרי A:

  • נגדיר פונקצית עזר נוספת follow, עבור כל משתנה בדקדוק:


Top down

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 –

  • לכל כלל בדקדוק, זו קבוצת הטרמינלים (אסימונים) האפשריים שיגרמו לכלל להיבחר, אם האסימון נמצא בראש הקלט כרגע :


First

אלגוריתם לחישוב פונקצית 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)

שימו לב: יש כאן תלות מעגלית!

האלגוריתם הוא איטרטיבי

ופועל עד שאין יותר שינויים.


Top down

אלגוריתם לחישוב פונקצית first

first(α) :=  first(xj)

x1x2…xj -1*ε

  • שלב 2 – חישוב first עבור תבנית פסוקית x1x2…xk=α:

  • כלומר:

    • first(x1), איחוד עם

    • first(x2) במקרה ש-x1 אפיס, איחוד עם

    • first(x3) במקרה ש-x1 ו-x2 אפיסים, איחוד עם ...


First1

דוגמה - חישוב 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)


First2

דוגמה - חישוב 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)


First3

דוגמה - חישוב first

  • נתון דקדוק:

  • שלב 0 – המשתנים האפיסים: S,C,B.

S  aB | BC | CBd

B  b | ε

C  c | ε

  • שלב 1 - חישוב first עבור המשתנים:


First4

דוגמה - חישוב first

  • נתון דקדוק:

  • שלב 0 – המשתנים האפיסים: S,C,B.

S  aB | BC | CBd

B  b | ε

C  c | ε

  • שלב 1 - חישוב first עבור המשתנים:


First5

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 | ε


Follow

אלגוריתם לחישוב פונקצית 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 ... ]


Follow1

המשך דוגמה - חישוב follow

  • נתון דקדוק:

S  aB | BC | CBd

B  b | ε

C  c | ε

  • חישוב follow (לכל משתנה דקדוק):

  • לכל כלל Y αAבדקדוק בצע:

    • follow(A) := follow(A)  first(β)

    • ואם β*ε, בצע גם: follow(A) := follow(A)  follow(Y)


Follow2

המשך דוגמה - חישוב 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)


Follow3

המשך דוגמה - חישוב follow

  • נתון דקדוק:

S  aB | BC | CBd

B  b | ε

C  c | ε

  • חישוב follow (לכל משתנה דקדוק):


Select

first(α)  follow(A)α* ε

select(Aα) =

first(α)otherwise

המשך דוגמה - חישוב select

  • נתון דקדוק:

S  aB | BC | CBd

B  b | ε

C  c | ε

  • חישוב קבוצת הטרמינלים selectלכל כלל בדקדוק:

    • תזכורת:


Select1

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ε) =


Select2

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,$}


  • Login