Download presentation
Presentation is loading. Please wait.
1
Backpatching 1
2
תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני בקרה –שימוש בתוויות נורשות –היום: שיטת ה-backpatching 2
3
שיטת Backpatching הרעיון הכללי: –למספר משתנים בדקדוק תהיה תכונה לכל נקודת המשך אפשרית עבור המשתנה –התכונה תכיל "רשימת התחייבויות" רשימת כתובות של פקודות קפיצה, שבכל אחת מהן חסרה הכתובת אליה יש לקפוץ –ברגע שנדע סוף סוף מהו יעד של קפיצה, נשלים את הכתובת הנכונה בכל אחת ואחת מהפקודות החסרות האלה נשתמש בפונקציה מיוחדת לשם כך 3
4
שיטת Backpatching (המשך) נעבוד בשיטת יצור קוד המשתמשת ב-buffer נניח שימוש במשתנים סטנדרטיים: –B - גוזר ביטויים בוליאניים תכונות: truelist, falselist –S - גוזר פקודות / רשימה של פקודות תכונה: nextlist נניח שתמיד בסיום ביצוע רצף הפקודות ב- S, קופצים לאותה כתובת אשר בה נמלא את החסר בכל אחד מאיברי הרשימה nextlist –E - גוזר ביטויים אריתמטיים תכונה: place 4
5
שיטת Backpatching (המשך) נניח קיום של פונקציות הבאות: –makelist (item) - יוצרת רשימה ובה quad –merge (list1, list2) - מאחדת את שתי הרשימות list1 ו-list2 ומחזירה מהם רשימה חדשה –emit (command) - מדפיסה פקודה ל-buffer –nextquad() - מחזירה את הכתובת הפנויה הבאה ב-buffer –backpatch (list, address) - מטליאה את כל ה"חורים" בפקודות שכתובותיהן ב-list. בכל "חור" תוכנס כתובת address 5
6
הערות טכניות חשובות אין להשתמש בפונקציות נוספות שניגשות ל-buffer אין להניח דבר לגבי אורך הפקודות –כתובת הפקודה הבאה מתקבלת רק בעזרת nextquad() – לא על ידי הוספת 1 לכתובת של פקודה קודמת פונקצית backpatch() מקבלת רשימה –אם רוצים לתקן כתובת מסוימת, יש לייצר רשימה של איבר אחד בעזרת קריאה ל-makelist() 6
7
דוגמאות לפריסת קוד דוגמה: כתבו פריסת קוד עבור ביטויים בוליאניים ומבני בקרה בשיטת backpatching. איך ניגשים לשאלה? –מחליטים איך רוצים שהקוד ייפרס ומציירים דיאגרמה –כותבים סכימת תרגום על סמך הדיאגרמה 7
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.