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

שאלה 2 (25 נקודות)

שאלה זו עוסקת בשפת "יוטורג" (שפה PROC תיאורטית) המוצגת בעמודים 81-74 בעמודים 3 בפרק 3. שאלה זו עוסקת בהגדרה הפשוטה של פרוצדורות לא רקורסיביות.

ברצונינו להחליף את השפה עם ביטויים בוליאניים נוסף על-ידי החדקוד הבא:



ביטויי check שישור של כמה ביטויים בוליאניים עם פונלות and מופעל. המשמעות של משתנים של check היא בוליאנית, ביטויי check היא בוליאנית, ורקו אם ורקו true הוא עורך, אחרת תנביעתו היא false. הביטויים השיתויים שתשורו על-ידי-ידי short-circuit הערכה, התחתיית בערערות short-circuit, אם עורך של אחד מחביטויים הבוליאניים היא false, הערכה של כל הביטויים check הנותרים היא false. על סמך לעירות תחיברית (parser) לביטויי בוליאני בפוליאני, ביטויי מהחיל בממילה end.

בתחביר מופשט, ביטויי check-exp נקראות check הביטויים בבוליאני מופעל - bexps מופעל מופעל וגם - bexps היא רישימה של יתרות הביטויים הבוליאניים.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמבחן 2017 סמסטר ב · 2017 · סמסטר ב
מפרשיםתהליך איטרטיבימודל הסביבהסדר אפליקטיבי
המפתח הוא יישום short-circuit evaluation: יש לעבור על הביטויים ברשימה ברקורסיה, ולהפסיק מיד (מבלי להעריך את השאר) ברגע שמוצאים ביטוי שמוערך ל-false.
הוספת ביטויי check לשפת PROC
תחביר קונקרטי ומופשט


תחביר קונקרטי:



תחביר מופשט (AST):



כאשר הוא הביטוי הבוליאני הראשון, ו- היא רשימה של שאר הביטויים הבוליאניים.

---
הגדרת סוג הנתונים (define-datatype)




---
הפרשן (eval-expression)


המשמעות של check-exp היא שיתוף AND עם short-circuit evaluation:
  • אם כל הביטויים מחזירים true — הערך הוא true.
  • אם אחד מהביטויים מחזיר false — מיד מפסיקים (ללא הערכת השאר) ומחזירים false.


---
הסבר השלבים


שלבתיאור
1מחלצים את הביטוי הנוכחי curr ומסביבה env
2מעריכים אותו: (eval-expression curr env)
3אם הערך הוא falseshort-circuit: מחזירים (bool-val #f) מיד
4אם הערך הוא true והרשימה ריקה — מחזירים (bool-val #t)
5אחרת — קריאה רקורסיבית עם ראש הרשימה הנותרת


---
דוגמה לריצה


הביטוי: check true and false and true end

1. מעריכים true#t, ממשיכים.
2. מעריכים false#f, short-circuit — מפסיקים מיד.

3. true השלישי לא מוערך כלל.

4. תוצאה: (bool-val #f)


---
הערה על מודל הסביבה


הסביבה env מועברת ללא שינוי לכל קריאת eval-expression פנימית, כיוון שביטוי check אינו מגדיר קשירות חדשות — הוא רק מחשב ביטויים קיימים בסביבה הנוכחית.