Sinh mã ba địa chỉ cho biểu thức Boole

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 110 - 112)

- So sánh giá trị tìm kiếm x với khoá của gốc: + Nếu trùng: tìm kiếm thoả mãn.

3.3.2Sinh mã ba địa chỉ cho biểu thức Boole

3 MÃ ĐỊA CHỈ

3.3.2Sinh mã ba địa chỉ cho biểu thức Boole

Đối với một biểu thức Boole E, ta dịch E thành một dãy các câu lệnh ba địa chỉ, trong đó đối với các phép toán logic sẽ sinh ra các lệnh nhảy có điều kiện và không có điều kiện đến một trong hai vị trí: E.true, nơi quyền điều khiển sẽ chuyển tới nếu E đúng, và E.false, nơi quyền điều khiển sẽ chuyển tới nếu E sai.

Ví dụ: E có dạng a<b. Thế thì mã sinh ra sẽ có dạng

if a<b goto E.true goto E.false

Ví dụ đoạn lệnh sau: if a>b then a:=a-b;

else b:=b-a;

được chuyển thành mã ba địa chỉ như sau E.true = L1 và E.false = L2

if a>b goto L1 goto L2 L1: t1 := a –b a := t1 goto Lnext L2: t2 := b-a b := t2 Lnext:

Một số cú pháp điều khiển sinh mã ba địa chỉ cho các biểu thức Boole.

Sản xuất Luật ngữ nghĩa

E -> E1 or E2 E1.true := E.true; E1.false := newlable; E2.true := E.true; E2.false := E.false;

E -> E1 and E2 E1.true := newlable; E1.false := E.false; E2.true := E.true; E2.false := E.false;

E.code := E1.code || gen(E1.true „:‟) || E2.code E -> not E1 E1.true := E.false;

E1.false := E.true; E.code := E1.code; E -> ( E1 ) E1.true := E.true;

E1.false := E.false; E.code := E1.code;

E -> id1 relop id2 E.code := gen(„if‟ id1.place relop.op id2.place „goto‟ E.true) || gen(„goto‟ E.false)

E -> true E.code := gen(„goto‟ E.true)

E -> false E.code := gen(„goto‟ E.false) Ví dụ: Sinh mã ba địa chỉ cho đoạn chương trình sau:

if a>b and c>d then x:=y+z else x:=y-z

Lời giải:

Nếu coi E là biểu thức logic a>b and c>d thì đoạn chương trình trên trở thành

if E then x:=y+z , khi đó mã ba địa chỉ cho đoạn chương trình có dạng:

E.code {

if E=true goto E.true goto E.false } E.true: t1:= y+z x := t1; E.false : t2 := y-z x :=t2

Áp dụng các luật sinh mã ba địa chỉ trong bảng trên chúng ta có đoạn mã ba địa chỉ cho đoạn chương trình nguồn ở trên là:

if a>b goto L1 goto L3

L1: if c>d goto L2 goto L3 L2: t1 := y+z x := t1 goto L4 L3: t2 := y-z x := t2 L4:

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 110 - 112)