
Nhập môn Chương trình dịch
Học kì II 2006-2007
Bài 14: Sinh mã trung gian (tiếp)

Sinh mã trung gian
• Sửdụng cú pháp điều khiển (giống kiểm
tra kiểu)
• Sinh mã các nút biểu thức hoặc nút lệnh
dựa vào mã của các nút con
• Cú pháp điều khiển
– Mô tảchính xác chương trình dịch cần làm gì
– Có thểcài đặt dễdàng
– Có thểchứng minh tính đúng của chương
trình dịch

Sinh mã lệnh if
if (e) s
SEQ
CJUMP LABEL(t) [s] LABEL(f)
[e] NAME(t) NAME(f)
[if (e) s] = SEQ( CJUMP([e], NAME(t), NAME(f)), LABEL(t), [s], LABEL(f) )
CJUMP([e], t, f)
t: [s]
f:

Sinh mã lệnh if-else
if (e) s1else s2
SEQ
CJUMP LABEL(t) [s1]LABEL(f)
[e] NAME(t) NAME(f)
s2LABEL(end)JUMP
NAME(end)
[if (e) s1else s2] = SEQ( CJUMP([e], NAME(t), NAME(f)), LABEL(t), [s1],
JUMP(NAME(end)), LABEL(f), [s2], LABEL(end) )
CJUMP([e], t, f)
t: [s1]
JUMP end
f: [s2]
end:

Sinh mã lệnh while
while (e) s
SEQ
CJUMP LABEL(t) [s] LABEL(f)
[e] NAME(t) NAME(f)
JUMP
NAME(loop)
[while (e) s] = SEQ( LABEL(loop), CJUMP([e], NAME(t), NAME(f)),
LABEL(t), [s], JUMP(NAME(loop)), LABEL(f) )
loop: CJUMP([e], t, f)
t: [s]
JUMP loop
f:
LABEL(loop)

