שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2023 - מפרשים
שאלה זו עוסקת בשדרוג של שפת "ויהי" (שפת LET המתוארת בספר הלימוד בפרק 3, עמודים 60–74) כך שתתמוך בחריגות (exceptions) כפי שמקובל במגוון שפות תכנות.
נוסיף לשפה ביטויים חדשים:
ביטוי `try-exp`:
ביטוי `throw-exp`:
`Except` ו-`message`:
משימה: ממשו את השינויים הדרושים בשפת "ויהי" בתוך שפת LET כך שתתמוך בחריגות. במקום הדפסת הודעת שגיאה, יש להחזיר חריגה מתאימה. עדכנו את כל הביטויים בקוד שמדפיסים הודעת שגיאה ובמקומם יחזירו חריגה מתאימה. עדכנו גם את כל המקומות בקוד המדפיסים הודעת שגיאה כך שבמקומם יחזירו חריגה מתאימה.
הנחיות לפתרון:
1. הקפידו על כתב ברור, ועל קוד מבני ומסודר.
2. הקפידו על פתיחת וסגירת סוגריים במקומות הנכונים.
3. הפתרון אמור לשמור על הגדרות השפה המקוריות (פרט למקרים בהם נדרש שינוי כזה במפורש בשאלה).
4. על מנת לפשט קוד ארוך, כדאי ורצוי להיעזר בכתיבת פרוצדורות עזר (מחוץ ל-
5. בפתרונכם, הקפידו על אבחנה ושימוש נכון בין ביטויי (expression) לבין תוצאת חישוב ביטויי (expval) לבין identifier.
6. ניקוד יורד על אי ניתוח ומימוש נכון של הדקדוק הנתון בשאלה.
נוסיף לשפה ביטויים חדשים:
ביטוי `try-exp`:
Expression ::= try { Expression }
{ catch [ Except ] : Expression ; }*
{ finally : Expression ; }*
ייצוג פנימי: try-exp (exp1 excpts excptexps finexps)ביטוי `throw-exp`:
Expression ::= throw Exceptייצוג פנימי:
throw-exp (excpt)`Except` ו-`message`:
Except ::= message Exception (msg) message ::= general | not a number | not a boolean | environmentסמנטיקה של `try-exp`:
exp1הוא הביטוי בבלוק ה-try.excptsהוא רשימת החריגות שב-catch; החריגה הראשונה ברשימה המתאימה לחריגה שנזרקה תטופל.excptexpsהוא רשימת הביטויים המתאימים לחריגות ב-catch.finexpsהוא הביטוי ב-finally(רשימה ריקה או אחת); מבוצע תמיד בסוף.
משימה: ממשו את השינויים הדרושים בשפת "ויהי" בתוך שפת LET כך שתתמוך בחריגות. במקום הדפסת הודעת שגיאה, יש להחזיר חריגה מתאימה. עדכנו את כל הביטויים בקוד שמדפיסים הודעת שגיאה ובמקומם יחזירו חריגה מתאימה. עדכנו גם את כל המקומות בקוד המדפיסים הודעת שגיאה כך שבמקומם יחזירו חריגה מתאימה.
הנחיות לפתרון:
1. הקפידו על כתב ברור, ועל קוד מבני ומסודר.
2. הקפידו על פתיחת וסגירת סוגריים במקומות הנכונים.
3. הפתרון אמור לשמור על הגדרות השפה המקוריות (פרט למקרים בהם נדרש שינוי כזה במפורש בשאלה).
4. על מנת לפשט קוד ארוך, כדאי ורצוי להיעזר בכתיבת פרוצדורות עזר (מחוץ ל-
value-of או כאלה המוטמעות בתוכו).5. בפתרונכם, הקפידו על אבחנה ושימוש נכון בין ביטויי (expression) לבין תוצאת חישוב ביטויי (expval) לבין identifier.
6. ניקוד יורד על אי ניתוח ומימוש נכון של הדקדוק הנתון בשאלה.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחה2023סמסטר ב
★★★★★
מפרשיםמעקב אחר קודSchemeתכנות פונקציונלי
יש להוסיף מקרים ל-
value-of עבור try-exp ו-throw-exp, ולהחליף את כל קריאות eopl:error במקום ה-interpreter בהחזרת ערך excp-val (Exception ...) המתאים. טפלו ב-try-exp על ידי חישוב exp1; אם תוצאתו היא excp-val, בדקו אם החריגה מופיעה ברשימת ה-catch וחשבו את הביטוי המתאים, ולאחר מכן בצעו את ה-finally.יש להוסיף לפרוצדורת
טיפול ב-`throw-exp`:כאשר
טיפול ב-`try-exp`:עדכון שגיאות בשאר המפרש:
בכל מקום במפרש שבו הייתה קריאה כגון:yש להחליף ב:וכן:
value-of שני מקרים חדשים:טיפול ב-`throw-exp`:כאשר
excpt הוא סוג החריגה (מחרוזת/סמל כגון "general", "not a number" וכד'), פשוט מחזירים excp-val המכיל Exception עם ה-message.טיפול ב-`try-exp`:עדכון שגיאות בשאר המפרש:
בכל מקום במפרש שבו הייתה קריאה כגון:yש להחליף ב:וכן:
eopl:errorעבור בדיקת בוליאניות →(excp-val (Exception "not a boolean"))eopl:errorעבור חיפוש משתנה בסביבה →(excp-val (Exception "environment"))eopl:errorכללי →(excp-val (Exception "general"))
try-exp מחשב את exp1. אם התוצאה היא excp-val (חריגה), בודקים אם סוג החריגה מופיע ברשימת ה-catch. אם כן, מחשבים את הביטוי המתאים ברשימת excptexps. לבסוף, אם קיים finally, מבצעים אותו (ותוצאתו נזרקת) ומחזירים את התוצאה הקודמת. throw-exp פשוט בונה ומחזיר excp-val חדש.