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

בשאלה זו נוסיף לשפת PROC ("יישגור") מרכיב חדש בשם overload proc.

התחביר החדש הוא:


Expression ::= overload proc [ [identifier]* -> Expression ; ]+ 


עם בנאי: overload-proc-exp(ids, bodies)


וכן:


Expression ::= (Expression | Expression }+)


עם בנאי: call-exp(rator, rands)


מרכיב ה-overload proc מגדיר פרוצדורה בשם p שלה מספר גרסאות. כל גרסה כוללת כמות פרמטרים שונה וגוף פרוצדורה שונה לביצוע. הגרסה הראשונה כוללת 2 פרמטרים, הגרסה השנייה היא כפרוצדורה ללא פרמטרים, והגרסה השלישית היא של פרוצדורה בעלת פרמטר יחיד. בגוף פעולת ה-let מופעלת הפרוצדורה p עם 2 פרמטרים, וזה מתאים לגרסה הראשונה שלה, ולכן מבוצעת פעולת החיסור בין הפרמטרים.


להלן דוגמאות להמחשת אופן השימוש במרכיב החדש:


דוגמה 1:


דוגמה 2:


דוגמה 3:


דוגמה 4:


דוגמה 5:


ממשו והטמיעו את השינויים הדרושים כפי שהוגדרו והודגמו בתוך שפת "יישגור" (שפת PROC).


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


הנחיות כלליות לפתרון:
1. הקפידו על כתב ברור, ועל קוד מבני ומסודר.

2. הקפידו על פתיחת וסגירת סוגריים במקומות הנכונים.

3. הפתרון אמור לשמור על הגדרות השפה המקוריות (פרט למקרים בהם נדרש שינוי כפי שמפורש בשאלה).

4. על מנת לפשט קוד ארוך, כדאי ורצוי להיעזר בכתיבת פרוצדורות עזר (מחוץ ל-value-of או כאלה המוטמעות בתוכו).

5. בפתרונכם, הקפידו על אבחנה ושימוש נכון בין ביטוי (expression) לבין תוצאת חישוב ביטוי (expval) לבין identifier.


ניקוד יורד על אי ניתוח ומימוש נכון של הדקדוק הנתון בשאלה, כלומר יש להפקיד על זיהוי וטיפול נכון ב- terminals, non-terminals ופעולות של סגור ( ), { }*, { }+.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד ב2024סמסטר ב
Schemeתכנות פונקציונלימפרשיםפונקציות מסדר גבוהdefine
יש לטפל בארבעה שלבים: הוספת כלל דקדוק לפרסר, הוספת בנאי ל-AST, הוספת מקרה ב-value-of שיוצר פרוצדורה מוגדרת-יתר, ובזמן קריאה (call-exp) בחירת הגרסה המתאימה לפי כמות הארגומנטים.
מרכיב ה-overload proc מאפשר הגדרת פרוצדורה עם מספר גרסאות (overloading לפי כמות ארגומנטים). הפתרון דורש שינויים בארבעה מקומות: דקדוק, AST, פרסור ו-מפרש.

א. שינויי דקדוק (scanner-and-parser.scm):


יש להוסיף את כלל הדקדוק החדש:
Expression ::= overload proc [ [identifier]* -> Expression ; ]+ 

וכן (אם call-exp שונה מהמקורי):

Expression ::= (Expression | Expression }+)


יש להוסיף ב-define-datatype expression:


ב. שינויי פרסור:




ג. שינויי value-of (interp.scm):




נגדיר פרוצדורת עזר overload-procedure:


ד. שינויי apply-procedure:


יש לוודא ש-apply-procedure מסוגל להפעיל גם את הפרוצדורות המוגדרות מ-overload proc, שהן ל מבדא רגיל שמקבל רשימת ארגומנטים. ה-call-exp מחשב את כל הארגומנטים ומעביר אותם כרשימה:




כל הדוגמאות עובדות לפי מנגנון ה-overloading: בזמן קריאה, בודקים לפי כמות הארגומנטים איזו גרסה להפעיל. אם אין גרסה מתאימה — שגיאה.
שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2024 | prepd