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

הרחיבו את שפת LET (שפת "יוויומ") כך שתיתמך ב- if בעומק שרירותי. החידוקים החדשים הם:



את התחביר החדש של הדקדוק החידוקים המומדרים בתוך הביטויים הם:

היא בעולם בוליאני.

הם ביטויים המופעלים בתוך; שומרים לתחבורה כאשר עירכו של הביטוי הנוכחי הוא . חידוק זה ייתרחוף בפקודה זו ייתיילה בעירכו של הביטויים האתרים שנמצאים.

הם ביטויים המופעלים בתוך; שומרים לתחבורה כאשר עירכו של הביטוי הנוכחי הוא . חידוק זה ייתרחוף בפקודה זו ייתיילה בעירכו של הביטויים האתרים שנמצאים.

לחילוץ דוגמה לשימוש בביטויים החדשים:

let in if zero? then else if then else

2 מופעילים בתוך else-n בנבדוק ערכו. לכן יוציאו בלוק else-n ערכו של הביטוי הראשון מביניהם לאחר בצפיצות. (סוג התיוג של תחזוקה הוא, כמקרה זה: (num-val -4)).
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד א · 2018 · סמסטר ב
מפרשיםevalמעקב אחר קודהרחבת שפה
הוסיפו מבנה תחבירי מופשט חדש עבור ביטוי if. במפרש, טפלו במבנה זה על ידי הערכת התנאי, ולאחר מכן הפעלת פונקציית עזר שמעריכה רצף של ביטויים ומחזירה את ערכו של האחרון.
כדי להרחיב את שפת LET כך שתתמוך בביטוי if בעומק שרירותי עם רצפים של ביטויים בענפים, עלינו לבצע שני שינויים עיקריים: הרחבת התחביר המופשט (Abstract Syntax) כדי לייצג את המבנה החדש, והרחבת הסמנטיקה, כלומר, פונקציית ההערכה של המפרש (eval או value-of), כדי שתטפל במבנה זה.
1. הרחבת התחביר המופשט


נוסיף סוג ביטוי חדש למבנה העץ התחבירי המופשט (AST) של השפה, שייצג את תנאי ה-if החדש. נקרא לסוג ביטוי זה if-exp. מבנה הנתונים שלו יכיל שלושה שדות:

  • cond-exp: ביטוי התנאי, שיוערך ראשון.
  • then-exps: רשימת הביטויים שיש להעריך אם התנאי מתקיים (הענף של then).
  • else-exps: רשימת הביטויים שיש להעריך אם התנאי אינו מתקיים (הענף של else).


לדוגמה, את הביטוי:
if zero?(x) then {-(x,4); x} else {-4}

נייצג ב-AST באופן הבא (בכתיב דמוי-Scheme):


2. הרחבת הסמנטיקה (המפרש)


כעת נרחיב את פונקציית ההערכה המרכזית של המפרש, value-of(exp, env), כך שתטפל בסוג הביטוי החדש if-exp. נוסיף תנאי חדש למפרש:



ההרחבה מסתמכת על שתי פונקציות עזר:

א. `is-true?`: פונקציה זו קובעת את הכלל לערכי אמת. בשפות רבות (כמו Scheme), כל ערך שאינו false נחשב ל-true. נאמץ כלל זה:



כלומר, הפונקציה תחזיר false רק עבור ערך בוליאני מסוג (bool-val #f), ו-true עבור כל ערך אחר (מספרים, כולל 0, וגם (bool-val #t)).

ב. `value-of-sequence`: זוהי פונקציית מפתח המטפלת בהערכת רצף של ביטויים. היא מקבלת רשימת ביטויים וסביבה, מעריכה אותם לפי הסדר, ומחזירה את הערך של הביטוי האחרון ברצף. הערכים של הביטויים הקודמים נזרקים (אם כי תופעות הלוואי שלהם, אם היו, היו מתרחשות).

מימוש רקורסיבי לפונקציה זו:



אם הרשימה exps ריקה, התנהגות זו אינה מוגדרת. בשאלה נתון שהרצפים אינם ריקים.
3. מעקב אחר הדוגמה


נבצע מעקב אחר הערכת הביטוי מהשאלה בסביבה בה x=7:

if zero?(x) then {-(x,4); -(x,9); x} else {if -(x,3) then {3} else {6}; -4}

1. הערכת התנאי החיצוני: value-of(zero?(x), env) מחזיר (bool-val #f) מכיוון ש-.
2. מכיוון שהתנאי שקרי, נעריך את רצף הביטויים בענף ה-else. נפעיל את value-of-sequence על הרשימה:

[ if -(x,3) then {3} else {6} , -4 ]

3. value-of-sequence מעריכה את הביטוי הראשון ברצף: if -(x,3) then {3} else {6}.

א. הערכת התנאי הפנימי: value-of(-(x,3), env) מחשב
ומחזיר (num-val 4).
ב. is-true?((num-val 4)) מחזיר #t, מכיוון שהערך אינו (bool-val #f).

ג. לכן, נעריך את רצף ה-then הפנימי, שהוא [ 3 ].

ד. value-of-sequence([3], env) מעריך את 3 ומחזיר (num-val 3).

4. הערך שהוחזר מהביטוי הראשון ברצף, (num-val 3), נזרק. value-of-sequence ממשיכה לביטוי הבא.

5. כעת value-of-sequence מעריכה את הביטוי האחרון ברצף: -4.

6. value-of(-4, env) מחזיר (num-val -4).

7. מכיוון שזהו הביטוי האחרון, ערך זה, (num-val -4), הוא התוצאה הסופית של value-of-sequence ושל ביטוי ה-if כולו.


התוצאה הסופית היא אכן (num-val -4), כפי שצוין בשאלה.