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

בשאלה זו נוסיף לשפת IMPLICIT-REFS מרכיב חדש בשם event (אירוע) בהשראת שפת VisualBasic (IMPLICIT-REFS).

למשתנה ניתן לשייך מאפיין ממין event. המאפיינים של ה-event הם קבוצת פרוצדורות ורשימת המשתנים הרשומים לאירוע. בכל פעם שמופעל האירוע הוא מפעיל כל אחת מהפרוצדורות הרשומות אליו.

התחביר החדש:

Expression ::= event.create()


עם בנאי: event-create-exp()

Expression ::= <Identifier> += [ Expression ]+ 


עם בנאי: event-add-exp(evt, procs)

התנהגות הביטויים החדשים:
  • ביטוי event-create-exp: יוצר אירוע (event) חדש ומחזיר אותו.
  • ביטוי event-add-exp: רושם פרוצדורות לאירוע שנמצא בזיהוי <Identifier>. מחזיר את ערך הארגומנט האחרון (המשתנה שרשמנו אליו). הדקדוק הנתון בשאלה — ניקוד יורד על אי ניתוח ומימוש נכון של הדקדוק, כלומר יש להפקיד על זיהוי וטיפול נכון ב- terminals, non-terminals ופעולות סגור ( ), { }*, { }+.


להפעלת האירוע משתמשים ב-call-exp הקיים: (OnClick 50) מפעיל את כל הפרוצדורות הרשומות ל-OnClick עם הארגומנט 50.

דוגמאות:

דוגמה 1:



הסבר: a מתחיל ב-1000. נרשמות 3 עותקי dec_x ל-OnClick. פעולת (dec_x 100) מורידה a ל-900. לאחר מכן (OnClick 50) מפעיל את dec_x שלוש פעמים עם 50, מוריד a ב-150, לכן a = 750... (ראה פרטים בדוגמה).

דוגמה 2:



דוגמה 3:



דוגמה 4:



דוגמה 5:



דוגמה 6:



דוגמה 7:



ממשו והטמיעו את השינויים הדרושים כפי שהוגדרו והודגמו בתוך שפת IMPLICIT-REFS.

בתשובתכם, הקפידו להסביר היכן בדיוק נדרשים שינויים ותוספות בקבצי המפרש, ומהם השינויים והתוספות.

הנחיות כלליות לפתרון זהות לשאלה 1.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד ב · 2024 · סמסטר ב
★★★★★
מפרשיםמצבתכנות מונחה עצמיםSchemeהעברת מסרים
יש להוסיף expval חדש event-val שמחזיק רשימת פרוצדורות. event-create-exp יוצר event ריק, event-add-exp מוסיף פרוצדורות לרשימה (עם בדיקות שגיאה), ו-call-exp צריך לזהות event ולהפעיל את כל הפרוצדורות הרשומות.
מרכיב ה-event מוסיף לשפת IMPLICIT-REFS תמיכה בדפוס ה-observer: ניתן לרשום רשימת פרוצדורות לאירוע ולהפעיל את כולן בו-זמנית. הפתרון דורש שינויים ב-expval, דקדוק/פרסור, ו-value-of/apply.

א. הוספת expval חדש:

יש להוסיף לסוג expval ערך חדש:



פרוצדורות עזר:



ב. שינויי דקדוק (פרסר):



ג. שינויי value-of:



ד. שינויי call-exp (apply):

במקום שגיאה כאשר ה-rator אינו proc-val, יש לבדוק גם event-val:



בדוגמה 1: נרשמות 3 פרוצדורות ל-OnClick. הפעלת (dec_x 100) מורידה a ב-100. הפעלת (OnClick 50) מפעילה את dec_x שלוש פעמים עם 50, מורידה a ב-150 נוספות. סה"כ a = 1000 - 100 - 150 = 750... הדוגמה מחזירה 700, כנראה dec_x רשומה 3 פעמים ו-(dec_x 100) גם מחסרת.