- Quỏ trỡnh tớnh ∆i j VD: tớnh ∆ 2 4, Tớnh:
2. CÁC NGễN NGỮ TRUNG GIAN
2.2.3. Sinh mó ba địa chỉ cho một số lệnh điều khiển:
Trong cỏc cõu lệnh điều khiển cú điều kiện, ta dựa vào biểu thức logic E để chuyển việc thực hiện cỏc cõu lệnh tới vị trớ thớch hợp. Do đú ta cần hai nhón:
E.true (để xỏc định vị trớ cõu lệnh chuyển tới khi biểu thức logic E là đỳng), nhón E.false
(để xỏc định vị trớ cõu lệnh chuyển tới khi biểu thức logic E là sai). Để sinh ra một nhón mới, ta dựng thủ tục newlable.
Nhón S.next đối với khối lệnh sinh ra bởi ký hiệu S là nhón xỏc định vị trớ tiếp theo của cỏc lệnh sau S.
Đối với cõu lệnh S -> while E do S1
ta cần cú một nhón bắt đầu của khối lệnh này để nhảy đến mỗi khi E đỳng, vỡ vậy cần nhón S.begin để xỏc định vị trớ bắt đầu khối lệnh này.
Sản xuất Luật ngữ nghĩa
S -> if E then S1 E.true := newlable; E.false := S.next; S1.next := S.next;
S.code := E.code || gen(E.true ‘:’) || S1.code S -> if E then S1 else S2 E.true := newlable; E.false := newlable; 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
S -> while E do S1 S.begin := newlable; E.true := newlable; E.false := S.next S1.next := S.begin;
S.code := gen(S.begin ‘:’) || E.code || gen(E.true ‘:’) || S1.code || gen(‘goto’ S.begin)
Vớ dụ 1: sinh đoạn mó ba địa chỉ cho đoạn mó nguồn sau: while a<>b do if a>b then a:=a-b else b:=b-a Lời giải: L1: if a<>b goto L2 goto Lnext L2: if a>b goto L3 goto L4 L3: t1 := a-b
a := t1 goto L1 L4: t2 := b-a b := t2 goto L1 Lnext: 2.2.3.Cỏc khai bỏo.
Đối với cỏc khai bỏo định danh, ta khụng sinh ra mó lệnh tương ứng trong mó ba địa chỉ mà dựng bảng ký hiệu để lưu trữ. Như vậy cú thể hiểu là kết quả của sinh mó ba
địa chỉ từ chương trỡnh nguồn là tập lệnh ba địa chỉ và bảng ký hiệu quản lý cỏc định danh.
Với mỗi định danh, ta lưu cỏc thụng tin về kiểu và địa chỉ tương đối để lưu giỏ trị cho định danh đú.
Vớ dụ:
Giả sử ký hiệu offset để chứa địa chỉ tương đối của cỏc định danh; mỗi số interger chiếm 4 byte, số real chứa 8 byte và mỗi con trỏ chứa 4 byte; giả sử hàm enter dựng để nhập thụng tin về kiểu và địa chỉ tương đối cho một định danh, chỳng ta cú vớ dụ dưới đõy mụ ta việc sinh thụng tin vào bảng ký hiệu cho cỏc khai bỏo.
Sản xuất Luật ngữ nghĩa
P -> D offset := 0
D -> D ; D
D -> id : T enter(id.name,T.type, offset) ; offset := offset + T. width
T -> interger T.type := interger;
T. width := 4
T -> real T.type := real; T. width := 8 T -> array [ num ] of T1 T.type := array(num.val,T1.type);
T.width := num.val * T1. width T -> ^T1 T.type := pointer(T1.type)
Trong cỏc đoạn mó ba địa chỉ, khi đề cập đến một tờn, ta sẽ tham chiếu đến bảng ký hiệu để lấy thụng tin về kiểu, địa chỉ tương ứng để sử dụng trong cỏc cõu lệnh. Hay
núi cỏch khỏc chỳng ta cú thể thay một định danh bởi chỉ mục của định danh đú trong bảng ký hiệu.
Chỳ ý: Địa chỉ tương đối của một phần tử trong mảng, vớ dụ x[i], được tớnh bằng địa chỉ của x cộng với i lần độ dài của mỗi phần tử.
Bài tập
Bài tập 1: Hóy chuyển cỏc cõu lệnh hoặc đoạn chương trỡnh sau thành đoạn mó ba địa chỉ:
1) a * - (b+c)
2) đoạn chương trỡnh C
main ()
{ int i; int a[100]; i=1; while(i<=10) { a[i]=0; i=i+1; } } .1. Dịch biểu thức : a * - ( b + c) thành cỏc dạng : a) Cõy cỳ phỏp. b) Ký phỏp hậu tố. c) Mó lệnh mỏy 3 - địa chỉ.
8.2. Trỡnh bày cấu trỳc lưu trữ biểu thức - ( a + b) * ( c + d ) + ( a + b + c) ở cỏc dạng : a) Bộ tứ . a) Bộ tứ .
b) Bộ tam.