תרגול 11: backpatching שלבים בפתרון backpatch דוגמא : switch שאלה...

24
ללללל11 : Backpatching ללללל ללללללBackpatch ללללל:SWITCH לללל ללללל1

Upload: winfred-green

Post on 18-Dec-2015

221 views

Category:

Documents


0 download

TRANSCRIPT

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;

}