16.2.18

advertisement
‫פקולטה להנדסת תוכנה‬
‫חורף תשע"ח‬
‫תורת הקומפילציה ‪61763‬‬
‫מבחן סופי מועד א"‬
‫‪16.02.2018‬‬
‫‪ 7‬שאלות חובה‪ ,‬יש לפתור את כל השאלות‬
‫שים לב‪ :‬את התשובות יש לכתוב אך ורק בטופס הבחינה‪.‬‬
‫שים לב‪ :‬יש לכתוב בכתב ברור ובאופן תמציתי‪ .‬תשובות מסורבלות עלולות לגרור‬
‫הורדת נקודות‪.‬‬
‫‪ 10( .1‬נקודות) נתבונן בהגדרות הבאות של הערות ב‪ C-‬ו‪:C++-‬‬
‫‪ ‬ב‪ : C++-‬הערות מתחילות ב‪ //-‬ונגמרות בשורה חדשה ‪\n‬‬
‫‪ ‬ב‪ : C-‬הערות מתחילות ב‪ /*-‬ונגמרות ב‪*/-‬‬
‫נתבונן במימוש הבא של אוטומט שמזהה הערות ב‪ C-‬ו‪ . C++-‬נא להוסיף‬
‫ערכי קלט לקשתות של האוטומט כך שהוא יזהה את הערות ב‪ C-‬ו‪ C++-‬נכון‪.‬‬
‫‪ 20( .2‬נקודות) נתבונן בדקדוק הבא‪ S ,C ,B , A :‬הם משתני הדקדוק ו‪ , , ,-‬‬
‫הם טרמינאלים‪:‬‬
‫‪S  AC$‬‬
‫‪A  AB‬‬
‫‪A‬‬
‫‪B‬‬
‫‪C  BC‬‬
‫‪C ‬‬
‫)‪1‬‬
‫)‪2‬‬
‫)‪3‬‬
‫)‪4‬‬
‫)‪5‬‬
‫)‪6‬‬
‫‪ 8( ‬נקודות) מה הקבוצות ‪ FIRST‬ו‪ FOLLOW-‬של כל משתני הדיקדוק?‬
‫}‪First(S) = {, ‬‬
‫}‪First(A) = {, ‬‬
‫}‪First(B) = { ‬‬
‫}‪First(C) = {, ‬‬
‫}{ = )‪Follow(S‬‬
‫}‪Follow(A) = {, ‬‬
‫}‪Follow(B) = {, ‬‬
‫}‪Follow(C) = {, $‬‬
‫‪ 8( ‬נקודות) נא לבנות טבלת ניתוח ‪ LL1‬של הדקדוד‪:‬‬
‫‪$‬‬
‫‪error‬‬
‫‪error‬‬
‫‪error‬‬
‫‪error‬‬
‫‪‬‬
‫‪1‬‬
‫‪3‬‬
‫‪error‬‬
‫‪6‬‬
‫‪‬‬
‫‪error‬‬
‫‪error‬‬
‫‪error‬‬
‫‪error‬‬
‫‪‬‬
‫‪error‬‬
‫‪error‬‬
‫‪4‬‬
‫‪5‬‬
‫‪‬‬
‫‪1‬‬
‫‪2‬‬
‫‪error‬‬
‫‪error‬‬
‫‪ 4( ‬נקודות) האם הדקדוק שייך ב‪?LL(1)-‬‬
‫כן ‪ /‬לא‬
‫נא לנמק את תשובתך‪ .‬תשובה נכונה ללא נימוק נכון פוסלת את כל‬
‫הנקודות‪.‬‬
‫אין שני כללי גזירה לתוך משבצת אחת‬
‫‪S‬‬
‫‪A‬‬
‫‪B‬‬
‫‪C‬‬
‫‪ 15( .3‬נקודות) נתבונן בדקדוק הבא עם טרמינלים‪ . , ,( , ), a :‬הדקדוק מתאים‪,‬‬
‫למשל להגדרת רשימות בשפה ‪.LISP‬‬
‫)‪1‬‬
‫)‪2‬‬
‫)‪3‬‬
‫)‪4‬‬
‫)‪5‬‬
‫)‪6‬‬
‫’‪S → ( S‬‬
‫‪S→a‬‬
‫) → ’‪S‬‬
‫) ‪S’ → A‬‬
‫’‪A → S A‬‬
‫’‪A’ → , S A‬‬
‫‪7) A’ → ε‬‬
‫נא לכתוב פסאודו קוד למנתח תחבירי של הדקדוק הזה על ידי ירידה רקורסיבית ‪.‬‬
‫כל פתרון אחר נכון מתקבל‪.‬‬
‫‪ 21( .4‬נקודות) נתבונן בדקדוק הבא‪ S ,B , A :‬הם משתני הדקדוק ו‪ z, y ,x-‬הם‬
‫טרמינאלים‪:‬‬
‫‪S  AA$‬‬
‫‪A  xB‬‬
‫‪Ay‬‬
‫‪B Az‬‬
‫)‪1‬‬
‫)‪2‬‬
‫)‪3‬‬
‫)‪4‬‬
‫‪ 9( ‬נקודןת) נא להשלים את האוטמט הבא לניתוח הדקדוק בשיטת ‪:LR0‬‬
‫‪ 2( ‬נקודות) מה המצבים של ‪ reduce‬ו‪ shift-‬של האוטומט?‬
‫המצבים של ‪shift‬‬
‫המצבים של ‪reduce‬‬
‫‪‬‬
‫‪0, 1, 2, 5, 6‬‬
‫‪3, 4, 7, 8‬‬
‫(‪ 10‬נקודות) נא לסמלץ ניתוח של ‪ xyzy$‬בעזרת האוטומט הנתון‪:‬‬
‫‪ 10( .5‬נקודות) ב‪ , Pascal-‬ניתן להגדיר משתנים באופן הבא‪:‬‬
‫‪var a, b : integer‬‬
‫להגדרה‪ ,‬ניתן בהשתמש בדקדוק הבא‪:‬‬
‫; ‪decl → var id_list : types‬‬
‫‪types → integer‬‬
‫‪types → real‬‬
‫‪id_list → id_list , id‬‬
‫‪id_list → id‬‬
‫כאשר ‪ id_list ,type ,decl‬הם משתני הדקדוק ו‪ id , , , ; , : , var-‬הם‬
‫טרמינלים‪ .‬כאשר ‪ id_list‬גוזר שמות משתנים בודדים או רשימות של שמות‬
‫משתנים מופרדים בפסיקים‪ types .‬גוזר טיפוס חוקי ב‪. Pascal-‬‬
‫‪ 6( ‬נקודות) נתבונן בהגדרה וחישוב חלקיים של שתי תכונות‪ type :‬ו‪-‬‬
‫‪.value‬תכונה ‪ type‬נצמדת ל‪ id_list-‬ו‪ . id-‬תכונה ‪ value‬נצמדת למשתנה‬
‫הדקדוק ‪ .types‬נא להשלים את ההגדרה והחישוב של שתי התכונות‪ .‬אין‬
‫צורך בנימוק‪.‬‬
‫‪decl → var id_list : types ; id_list.type = types.value‬‬
‫‪types.value = integer‬‬
‫‪types → integer‬‬
‫‪types.value = real‬‬
‫‪types → real‬‬
‫‪id_list1.type = id_list0.type‬‬
‫‪id.type = id_list0.type‬‬
‫‪id_list0 → id_list1 , id‬‬
‫;‪id.type = id_list0.type‬‬
‫‪id_list0 → id‬‬
‫‪ 2( ‬נקודות) האם תכונה ‪ type‬היא תכונה נורשת או נוצרת לפי ההגדרה‬
‫והחישוב? נא לנמק את תשובתך‪ .‬תשובה נכונה ללא נימוק נכון פוסלת את‬
‫כל הנקודות‪.‬‬
‫נורשת ‪ /‬נוצרת‬
‫‪ 2( ‬נקודות) האם תכונה ‪ value‬היא תכונה נורשת או נוצרת לפי ההגדרה‬
‫והחישוב? נא לנמק את תשובתך‪ .‬תשובה נכונה ללא נימוק נכון פוסלת את‬
‫כל הנקודות‪.‬‬
‫נורשת ‪ /‬נוצרת‬
‫‪ 16( .6‬נקודות) נתבונן בשפת תכנות שמאפשרת תמיכה לפקודות של חזקה‬
‫בצורה ‪ A=B^C‬כאשר ‪ A‬שווה ‪ B‬בחזקה ‪.C‬‬
‫‪E → E1^E2‬‬
‫קוד לחישוב הביטוי של חזקה מוגדר באופן הבא‪:‬‬
‫)(‪‖ t1 = newtemp‬‬
‫)(‪t2 = newtemp‬‬
‫‪E.place = t2‬‬
‫‪E.code=append(E1.code,E2.code,‬‬
‫)'‪gen('if E2.place < 0 goto E.nexstat+7‬‬
‫)'‪gen('t1 = E2.place‬‬
‫)'‪gen('t2 = 1‬‬
‫)'‪gen('if t1 = 0 goto E.nexstat+0‬‬
‫)‪gen('t2 = t2 * E1.place‬‬
‫)'‪gen('t1 = t1 - 1‬‬
‫)'‪gen('goto E.nexstat+3‬‬
‫→‪E‬‬
gen('trap')
gen('E.place = t2') )
E1.nextstat = E.nexstat
E2.nextstat = E1.laststat
E.laststat = E2.laststat + 1
.‫? אין צורך במימוק‬x = a ^ b ‫מה יהיה הקוד עבור ביטוי‬
00:
01:
02:
03:
04:
05:
06:
07:
08:
if E2.place < 0 goto 07
t1 = b
t2 = 1
if t1 = 0 goto 08
t2 = t2 * a
t1 = t1 - 1
goto 03
trap
x = t2
:‫ נקודות) נתבונן בתוכנית הבאה‬16( .7
int n = 1; // global
print_plus_n(int x) {
cout << x + n;
}
increment_n() {
n = n + 2;
print_plus_n(n);
}
test() {
int n;
n = 200;
print_plus_n(7);
n = 50;
increment_n();
cout << n;
}
‫ נקודות) מה הפלט של התוכנית אם משתמשים בטווחים סטטיים‬8( 
‫ תשובה נכונה ללא נימוק נכון‬.‫)? נא לנמק את תשובתך‬Static Scoping(
.‫פוסלת את כל הנקודות‬
8 6 50
‫‪ 8( ‬נקודות) מה הפלט של התוכנית אם משתמשים בטווחים דינמיים‬
‫(‪ ?)Dynamic Scoping‬נא לנמק את תשובתך‪ .‬תשובה נכונה ללא נימוק‬
‫נכון פוסלת את כל הנקודות‪.‬‬
‫‪207 104 52‬‬
‫בהצלחה‬
Download