 |
S if E then S1 else S2
|
E.true = newlabel
|
E.false = newlabel
|
S 1 .next = S.next
|
S2 .next = S.next
|
S.code = E.code ||
|
gen(E.true ':') ||
S 1 .code ||
gen(goto S.next) ||
gen(E.false ':') ||
S 2 .code
|
For if-then-else
S -> if E then S1 else S2
E.true = newlabel
E.false = newlabel
S1.next = S.next
S2.next = S.next
S.code = E.code || gen(E.true ':') || S1.code || gen('goto' S.next) || gen(E.false ':') || S2.code
In the above code, the labels E.true and E.false created are associated with the first three address code instructions for S1 and S2 respectively, so that if E is true, jump to S1 occurs and if E is false jump to S2 occurs. An explicit goto S.next is required after the code of S1 to ensure that after execution of code for S1 control moves to the statement after S instead of falling through the code of S2, in case E is true.
|