שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 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) גם מחסרת.