טבלאות סמלים נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף,...
Post on 18-Dec-2015
222 views
TRANSCRIPT
טבלאות סמלים
sakogan@cs)נכתב ע"י אלכס קוגן )סמסטר חורף, תשס"ח
Static Scoping
המופע של המשתנה אליו יש לגשת הוא •הסטטיהמופע הקרוב ביותר בשרשרת הקינון
ניתן לשייך כל גישה למופע מסוים בזמן קומפילציה–
}דוגמה:•int x,y;
{int x;{
y = x;}{ … }
}}
טבלת סמלים
מבנה נתונים בזמן קומפילציה שמחזיק מידע •על הסמלים בתכנית
סמלים: שמות משתנים, פונקציות, ...–static scopingצריך לתמוך ב-–צריך לאפשר חיפוש יעיל של סמלים–
מימוש טבלאות הסמלים
ניצור טבלה נפרדתscopeרעיון: לכל •המבנה המתקבל הוא עץ של טבלאות–
}דוגמה:•int x,y;
{int x;{
y = x;}{ … }
}}
x: inty : int
x: int
1
2
3
4
1
2
3 4
מימוש טבלאות הסמלים - המשך
:xכדי למצוא משתנה • הנוכחי. אם scopeחפש בטבלת הסמלים של ה-–
מצאת, עצור. אחרת, scopeחפש בטבלת הסמלים של האבא של ה-–
הנוכחי. אם מצאת, עצור. אחרת,המשך את החיפוש עד לשורש–
מה מכילה טבלת הסמלים בשורש העץ?•
בניית עץ טבלאות הסמלים
בזמן קומפילציההבנייה מתבצעת •
נשתמש במחסנית שמחזיקה את שרשרת • הנוכחי עד לשורשscopeהטבלאות מה-
על מנת למצוא משתנה, מספיק לבדוק רק –טבלאות במחסנית
מדוע?•
ניצור טבלה חדשה ונדחוף scopeבכניסה ל-–למחסנית
נוציא טבלה מראש המחסניתscopeביציאה מ-–
סכימת תרגום
נניח שמבנה הרשומה בטבלת הסמלים הוא•
name type offset–offsetהמיקום היחסי ברשומת ההפעלה –
נשתמש בשתי מחסניות:•–tablesמחסנית טבלאות הסמלים :–offsets-מחסנית של ה :offset ים הנוכחיים בכל-
scopeבמסלול לשורש
סכימת תרגום - המשך
נניח שקיימות פונקציות הבאות:•–maketable(parent( יוצרת טבלה חדשה ריקה :
בעץparentשהיא בת של –insert(table, name, type, offset( מכניסה :
משתנה לטבלת הסמלים –push, pop, topפעולות סטנדרטיות למחסנית :
סכימת תרגום - המשך
•Progגוזר תכנית שלמה :
•Stגוזר פקודה או רצף פקודות :הדקדוק הינו חלקי ביותר–
• Prog int main ( ( { St }
• St vartype id ;
• St { St }
• St print id ;
סכימת תרגום - המשך
• Prog int main ( ( { M St }{ pop(tables(;
pop(offsets(; }
• M ε{ t = maketable(null(;
push(t, tables(;push(0, offsets(; }
• Prog int main ( ( { St }
סכימת תרגום - המשך
• 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 }
סכימת תרגום - המשך
נניח כי היינו רוצים לבדוק האם משתנה הוגדר לפני הדפסה ...•
• 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(;
}