תרגול 11: backpatching
DESCRIPTION
תרגול 11: Backpatching. שלבים בפתרון Backpatch דוגמא: SWITCH שאלה ממבחן. שלבים בפתרון. פריסת קוד: ציור סכמאטי של הקוד שיווצר . סכימת תרגום: כתיבת הכללים הסמנטיים. Switch : example. Switch (x) { case 5: … break; case 7: … break; … case 12: …break; }. Case List. Case List. - PowerPoint PPT PresentationTRANSCRIPT
Backpatching: 11תרגול Backpatchשלבים בפתרון •
SWITCHדוגמא: •
שאלה ממבחן•
1
שלבים בפתרון
פריסת קוד: •
ציור סכמאטי של הקוד שיווצר.–
סכימת תרגום:•
כתיבת הכללים הסמנטיים.–
2
Switch: example
Switch (x) {case 5: … break;case 7: … break;…case 12: …break;
}
3
switchתרגום פקודת
CaseCaseCaseCase
Case ListCase ListCase ListCase List
4
S → switch ( E ) { CL }
CL → C CL | C
C → case num : S ; break ;
: פריסת קודIשלב
ציור סכימטי של •הקוד שיווצר:
מיקום יחסי של 1.הקוד הנפלט
)קבוע(. goto פקודות2.
שנרצה לתפור.הקוד המאחה.3.
5
S → switch ( E ) { CL }CL → C CL | CC → case num : S ; break ;
: סכימת תרגוםIIשלב
רשימת התכונות שנצטרך ומשמעותן.•הרחבת הדקדוק )באמצעות מרקרים(.•כתיבת הכללים הסמנטיים.•
6
7
• S: nextlist .
• E: place .
• C: value, quad,
nextlist.
• CL: value_list (stack),
quad_list (stack),
nextlist .
תכונות סמנטיות למשתני הדקדוקהנחה: כל נקודות היציאה מהקוד
gotoהמתאים למשתנה הן בפקודת .___
nextlist היא רשימה המכילה את כלל הכתובות של נקודות היציאה הללו.
מרקרים שימושיים
8
M → ε{
M.quad = nextquad();}
N → ε{
N.nextlist = makelist (nextquad());emit (“goto ___”);
}
9
C → case num : M S ; break ; {
C.quad = M.quad;C.value = num.value;C.nextlist = S.nextlist;
}
S → switch ( E N ) { CL }CL → C CL | CC → case num : M S ; break ;
פריסת הקוד:
10
CL → C{
CL.quad_list = newstack();CL.quad_list.push(C.quad);CL.value_list = newstack();CL.value_list.push(C.value);CL.nextlist = C.nextlist;
}
תזכורת: מכיל את התווית הראשונה של
Sn
S → switch ( E N ) { CL }CL → C CL | CC → case num : M S ; break ;
11
CL → C CL1
{
CL.quad_list = CL1.quad_list;
CL.quad_list.push(C.quad);
CL.value_list = CL1.value_list;
CL.value_list.push(C.value);
CL.nextlist=merge(CL1.nextlist,C.nextlist);
}
S → switch ( E N ) { CL }CL → C CL | CC → case num : M S ; break ;
S → switch ( E N ) { CL }CL → C CL | CC → case num : M S ; break ;S → switch ( E N ) { CL }
{backpatch(N.nextlist, nextquad());while (!CL.value_list.empty()) {
value = CL.value_list.pop();quad = CL.quad_list.pop();emit(“if” || E.place || ”=“ || value ||
”goto” || quad);}S.nextlist = merge ( CL.nextlist,
makelist(nextquad() );emit (“goto ___”);
}
שאלה ממבחן
13
Lisp style loops
14
1( S loop COND_LIST do S1
2( COND_LIST COND_LIST1 COND3( COND_LIST COND4( COND while B 5( COND until B
הלולאה מכילה מספר משתנה של תנאים, וממשיכה .כל עוד כולם מתקיימיםלהתבצע
מתקייםBהתנאי הבוליאני כל עודהלולאה תתבצע
יתקייםB התנאי הבוליאני עד אשרהלולאה תתבצע
דוגמא:
15
פתרון - נניח, לרגע, דקדוק מצומצם
16
1( S loop COND_LIST do S1
2( COND_LIST COND_LIST1 COND3( COND_LIST COND4( COND while B
מתקייםBהתנאי הבוליאני כל עודהלולאה תתבצע
פריסת קוד
17
B1 (While)
Bn (While)
S1
nextlist
falselist
B2 (While)
S
nextlist
truelist
truelist
truelist
תכונות
COND_LIST: truelist, falselist,start_quad ( היכן התנאי
(הראשון
18
S: nextlist
B: truelist, falselist
COND: truelist, falselist, quad (היכן התנאי מתחיל)
סכימת תרגום
COND while M B {
COND.quad = M.quad;COND.truelist = B.truelist;COND.falselist = B.falselist;
}
19
סכימת תרגוםCOND_LIST COND{
COND_LIST.start_quad = COND.quad;
COND_LIST.truelist = COND.truelist;
COND_LIST.falselist = COND.falselist;
}
20
COND_LIST COND_LIST1 COND
{
COND_LIST.start_quad = COND_LIST1.start_quad;
backpatch )COND_LIST1.truelist, COND.quad(;
COND_LIST.truelist = COND.truelist;
COND_LIST.falselist = merge )COND_LIST1.falselist,
COND.falselist(;
}
21
S loop COND_LIST do M S1{
backpatch )COND_LIST.truelist, M.quad(;backpatch )S1.nextlist, COND_LIST.start_quad(;
S.nextlist = COND_LIST.falselist;
}
22
נניח כעת דקדוק לא מצומצם
23
1( S loop COND_LIST do S1
2( COND_LIST COND_LIST1 COND3( COND_LIST COND4( COND while B 5( COND until B
מתקייםBהתנאי הבוליאני כל עודהלולאה תתבצע
יתקייםB התנאי הבוליאני עד אשרהלולאה תתבצע
פריסת קוד
24
B1 (While)
nextlist
B2 (Until) truelist
truelist
B3 (While)
falselist
falselist
falselist
סכימת תרגוםCOND until M B
{COND.quad = M.quad;COND.truelist = B.falselist;COND.falselist = B.truelist;
}