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

12
םםםםםם םםםםם( םםםם ם"ם םםםם םםםם( sakogan@cs םםםםם םםםם, םםם"ם

Post on 18-Dec-2015

223 views

Category:

Documents


1 download

TRANSCRIPT

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

טבלאות סמלים

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

Page 2: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

Static Scoping

המופע של המשתנה אליו יש לגשת הוא •הסטטיהמופע הקרוב ביותר בשרשרת הקינון

ניתן לשייך כל גישה למופע מסוים בזמן קומפילציה–

}דוגמה:•int x,y;

{int x;{

y = x;}{ … }

}}

Page 3: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

טבלת סמלים

מבנה נתונים בזמן קומפילציה שמחזיק מידע •על הסמלים בתכנית

סמלים: שמות משתנים, פונקציות, ...–static scopingצריך לתמוך ב-–צריך לאפשר חיפוש יעיל של סמלים–

Page 4: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

מימוש טבלאות הסמלים

ניצור טבלה נפרדתscopeרעיון: לכל •המבנה המתקבל הוא עץ של טבלאות–

}דוגמה:•int x,y;

{int x;{

y = x;}{ … }

}}

x: inty : int

x: int

1

2

3

4

1

2

3 4

Page 5: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

מימוש טבלאות הסמלים - המשך

:xכדי למצוא משתנה • הנוכחי. אם scopeחפש בטבלת הסמלים של ה-–

מצאת, עצור. אחרת, scopeחפש בטבלת הסמלים של האבא של ה-–

הנוכחי. אם מצאת, עצור. אחרת,המשך את החיפוש עד לשורש–

מה מכילה טבלת הסמלים בשורש העץ?•

Page 6: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

בניית עץ טבלאות הסמלים

בזמן קומפילציההבנייה מתבצעת •

נשתמש במחסנית שמחזיקה את שרשרת • הנוכחי עד לשורשscopeהטבלאות מה-

על מנת למצוא משתנה, מספיק לבדוק רק –טבלאות במחסנית

מדוע?•

ניצור טבלה חדשה ונדחוף scopeבכניסה ל-–למחסנית

נוציא טבלה מראש המחסניתscopeביציאה מ-–

Page 7: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום

נניח שמבנה הרשומה בטבלת הסמלים הוא•

name type offset–offsetהמיקום היחסי ברשומת ההפעלה –

נשתמש בשתי מחסניות:•–tablesמחסנית טבלאות הסמלים :–offsets-מחסנית של ה :offset ים הנוכחיים בכל-

scopeבמסלול לשורש

Page 8: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום - המשך

נניח שקיימות פונקציות הבאות:•–maketable(parent( יוצרת טבלה חדשה ריקה :

בעץparentשהיא בת של –insert(table, name, type, offset( מכניסה :

משתנה לטבלת הסמלים –push, pop, topפעולות סטנדרטיות למחסנית :

Page 9: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום - המשך

•Progגוזר תכנית שלמה :

•Stגוזר פקודה או רצף פקודות :הדקדוק הינו חלקי ביותר–

• Prog int main ( ( { St }

• St vartype id ;

• St { St }

• St print id ;

Page 10: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום - המשך

• Prog int main ( ( { M St }{ pop(tables(;

pop(offsets(; }

• M ε{ t = maketable(null(;

push(t, tables(;push(0, offsets(; }

• Prog int main ( ( { St }

Page 11: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום - המשך

• St { N St }{ pop(tables(;

pop(offsets(; }• N ε

{ t = maketable(top(tables((;push(t, tables(;push(top(offsets(, offsets(; }

• St vartype id ;{

insert(top(tables(, id.name, vartype.type, top(offsets((;top(offsets( += vartype.size; }

• St { St }

Page 12: טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

סכימת תרגום - המשך

נניח כי היינו רוצים לבדוק האם משתנה הוגדר לפני הדפסה ...•

• St print id ;{ found = false;

for (int i = 0; i < tables.size((; i++( { t = tables.get(i(; // get i’th table from top if (t.contains(id.name(( { found = true; break; }}if (found == false( error(“use of undef variable”, id.name(;

}