תורת הקומפילציה 236360 מועד א 15/08/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים ו 4 דפי נוסחאות. בדקו שכל העמודים ברשותכם. ב. משך המבחן שלוש שעות (180 דקות). ג. אסור כל חומר עזר פרט לדף הנוסחאות המצורף לבחינה. ד. במבחן 5 שאלות. כל השאלות הינן חובה. משקל כל שאלה מופיע בראשיתה. (חלוקת המשקל בין הסעיפים בכל שאלה אינה בהכרח אחידה) ה. ניתן לציין לגבי סעיף או שאלה לא יודע/ת. תשובה זו תזכה ב 20% מהניקוד של הסעיף או השאלה. תשובות שגויות לא יזכו בניקוד. ו. קראו את כל המבחן לפני שאתם מתחילים לענות על השאלות. ז. את התשובות לשאלות יש לרשום במחברת המבחן בלבד. בהצלחה! 1
שאלה 1 Lex ו (25 Bison נק ) א. נתונה תוכנית ה Lex הבאה: %{ #include <stdio.h> % %option noyywrap [\n] printf("ar"); [o-z]{2 printf("pr"); [e-k]{2 printf("%c", yytext[1]); [ e-k]{2 printf("ss%co", yytext[1]);.. printf("n"); [Ha-e ]+ printf("ex"); (Th er)+ printf("i "); [ aesw]+ printf("k"); "old man from Peru" printf("o"); "who" printf("r"); "he was eating his shoe." printf("ul"); [^f-z]+ printf("w"); ([^f-z] r)+ printf("e"); [ dem]+ printf("g"); "the night\n" printf("s!"); "with a terrible fright,\n" "and found out that it was quite true" int main(){ while(yylex()); return 0; כתבו מה יהיה פלט התוכנית עבור כל אחד מהקלטים הבאים (כל שורה מסתיימת בתו ירידת שורה n\ ): 1. There was an old man from Peru, 2. who dreamed he was eating his shoe. 3. He awoke in the night 4. with a terrible fright, 5. and found out that it was quite true. 2
ב. נתונה תוכנית ה Bison הבאה: %{ #include <iostream> using namespace std; int yylex(); void yyerror(const char*); % %left 'a' %right 'b' P : S '\n' ; S : S 'a' S {cout < < '1'; S 'b' S {cout < < '2'; 'c' {cout < < '3'; 'd' {cout < < '4'; /*expsilon*/ ; int yylex(){ return getchar(); void yyerror(const char*){ cout < < '5'; int main(){ return yyparse(); כתבו מה יהיה פלט התוכנית עבור כל אחד מהקלטים הבאים (כל שורה מסתיימת בסימן ירידת שורה n\ ( 1. cbdbc 2. cadbc 3. caddc 4. cadac 3
שאלה 2 דקדוקים (35 נק ) א. נתון דקדוק LR(1) הבא (מורחב וממוספר): 1. S S$ 2. S AB 3. S AA 4. S bc 5. A bca 6. A b 7. B Bd 8. B ɛ 9. C c bdd$ והקלט מתוך מכונת המצבים של האוטומט המתאים לדקדוק, ציירו את כל המצבים (ואת הקשתות בינהם) בהם ביקר האוטומט במהלך ריצתו על הקלט הנתון. בכל מצב רשמו את כל פרטי LR(1) המופיעים במצב. אין לצייר מצבים בהם האוטומט לא ביקר. $bbs ב. במהלך ריצת מנתח LL(1) עבור דקדוק {S G =,V,T,P התקבל תוכן המחסנית הבא: כאשר הסימן $ בתחתית המחסנית. הוכיחו\הפריכו את הטענות הבאות, במקרה שהטענה נכונה הסבירו בצורה משכנעת מדוע, אחרת תנו דוגמה נגדית. 1. השפה של G סופית. 2. השפה של G אין סופית..3 הדקדוק S) G = (V, T, P {S bb, בהכרח אינו.LL(1).4 הדקדוק S) G = (V, T, P {S bb, הינו בהכרח.LL(1).5 הדקדוק S) G = (V, T, P {S X, X t, כאשר t / T הינו בהכרח.LL(1) הערה: יש להניח שכל הכללים ב G ישיגים ושכל כלל גוזר מילה טרמינלית. 4
שאלה 3 שפת ביניים ו (30 Backpatching נק ) S do stmt E 1 : E 2 times L end L stmt : S L stmt : S בשאלה זאת נדון במבנה בקרה חדש שהתחביר שלו כלהלן: נסמן ב n את הערך של E 1 וב k את הערך של E 2 משמעות המבנה: אם n גדול ממספר הפקודות ב L (מספר הפקודות ב L הוא מספר ה Statements ש L גוזר) או ש k שלילי אין לבצע דבר. אחרת יש לבצע k פעמים את הפקודה ה n ית. א. הציעו פריסת קוד, מתאימה לשיטת backpatching עבור מבנה הבקרה הנ ל. על הקוד הנוצר להיות יעיל ככל האפשר. ב. כתבו סכימת תרגום בשיטת backpatching המייצרת את פריסת הקוד שהצעתם בסעיף הקודם. על הסכימה להיות יעילה ככל האפשר, הן מבחינת זמן הריצה שלה והן מבחינת המקום בזכרון שנדרש עבור התכונות הסמנטיות. שימו לב: אין להשתמש בכללים סמנטיים באמצע כלל גזירה. אין להשתמש במשתנים גלובליים בזמן קומפילציה. המשתנים S ו E הם המשתנים הסטנדרטיים המופיעים בדף הנוסחאות, ויש להם כללי גזירה בנוסף לכלל המופיע בשאלה. למשתנה L אין כללי גזירה פרט לכללים המוצגים בשאלה. 5
שאלה 4 10) DF A נק ) נאמר שמשתנים x ו y מתואמים בנקודה p בתוכנית אם:.p חיים בנקודה y ו x.1 2. קיים משתנה z כך שערכם של x ו y בנקודה p תלוי ישירות בערכו של z בנקודה p. למשל עבור הבלוק הבסיסי הבא z = 5 y = 4 + z x = x + z p1: u = 3 z = 6 p2: u = 2 בהנחה שהמשתנים x ו y חיים בנקודה p1 אז הם מתואמים בנקודה p1 והם אינם מתואמים בנקודה p2. הציעו אלגוריתם מבוסס DF A שמוצא את כל זוגות המשתנים המתואמים בתחילת וסיום כל בלוק בתוכנית, ניתן להשתמש באלגוריתמי DF A שנלמדו בכיתה. 6