שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2023 - מפרשים

שאלה זו עוסקת בשדרוג של שפת "ויהי" (שפת LET המתוארת בספר הלימוד בפרק 3, עמודים 60–74) כך שתתמוך בחריגות (exceptions) כפי שמקובל במגוון שפות תכנות.

נוסיף לשפה ביטויים חדשים:


ביטוי `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 (רשימה ריקה או אחת); מבוצע תמיד בסוף.


סמנטיקה של `throw-exp`: זורק חריגה מהסוג המצוין.


משימה: ממשו את השינויים הדרושים בשפת "ויהי" בתוך שפת 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.
יש להוסיף לפרוצדורת 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"))


פרוצדורת `apply-environment` מעודכנת:


הסבר: try-exp מחשב את exp1. אם התוצאה היא excp-val (חריגה), בודקים אם סוג החריגה מופיע ברשימת ה-catch. אם כן, מחשבים את הביטוי המתאים ברשימת excptexps. לבסוף, אם קיים finally, מבצעים אותו (ותוצאתו נזרקת) ומחזירים את התוצאה הקודמת. throw-exp פשוט בונה ומחזיר excp-val חדש.