תרגול 11: backpatching שלבים בפתרון backpatch דוגמא : switch שאלה...
TRANSCRIPT
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 ___”);
}
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 התנאי הבוליאני עד אשרהלולאה תתבצע
פתרון - נניח, לרגע, דקדוק מצומצם
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 התנאי הבוליאני עד אשרהלולאה תתבצע