Chapter 8: Intermediate Code Generation

 

S while E do S 1
S.begin = newlabel
E.true = newlabel
E.false = S.next
S 1 .next = S.begin
S.ocde = gen(S.begin ':') ||

E.code ||

gen(E.true ':') ||

S 1 .code ||

gen(goto S.begin)

For while-do

S -> while E do S1

S.begin = newlabel

E.true = newlabel

E.false = S.next

S1.next = S.begin

S.code = gen(S.begin ':') || E.code || gen(E.true ':') || S1.code || gen(goto S.begin)

In case of while-do statement a new label S.begin is created and associated with the first instruction of the code for E, so that control can be transferred back to E after the execution of S1. E.false is set to S.next, so that control moves out of the code for S in case E is false. Since S1.next is set to S.begin, jumps from the code for S1 can go directly to S.begin.