Bài giảng Xây dựng chương trình dịch - Bài 11: Sinh mã trung gian cung cấp cho người học các kiến thức: Mã ba địa chỉ, sinh mã cho lệnh gán, sinh mã cho các biểu thức logic, sinh mã cho các cấu trúc lập trình. Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên Công nghệ thông tin và những ai quan tâm dùng làm tài liệu học tập và nghiên cứu.
21/1/2010 Nội dung Bài 11 Sinh mã trung gian Mã trung gian Một chương trình với mã nguồn chuyển sang chương trình tương đương ngơn ngữ trung gian sinh mã trung gian Ngôn ngữ trung gian người thiết kế trình biên dịch định, là: Cây cú pháp Ký pháp Ba Lan sau (hậu tố) Mã địa … Mã ba địa Sinh mã cho lệnh gán Sinh mã cho biểu thức logic Sinh mã cho cấu trúc lập trình Mã trung gian Được sản sinh dạng chương trình cho máy trừu tượng Mã trung gian thường dùng : mã ba địa chỉ, tương tự mã assembly Chương trình dãy lệnh Mỗi lệnh gồm tối đa toán hạng Tồn nhiều toán tử vế phải cộng thêm toán tử gán Dạng tổng quát: x := y op z x,y,z địa , tức tên, hay tên trung gian trình biên dịch sinh Tên trung gian phải sinh để thực phép toán trung gian Các địa thực trỏ tới lối vào bảng ký hiệu 21/1/2010 Mã trung gian x + y * z Các dạng mã ba địa phổ biến t1 := y*z t2 := x+t1 Mã địa tương tự mã Assembly: lệnh có nhãn, có lệnh chuyển điều khiểnolcho cấu trúc lập trình Lệnh gán x := y op z z Lệnh gán với phép tốn ngơi : x := op y Lệnh chép: x := y Lệnh nhảy không điều kiện: goto L, L nhãn lệnh Lệnh nhảy có điều kiện x relop y goto L Các dạng mã ba địa Sinh mã trực tiếp từ ĐNTCP Lời gọi thủ tục param x call p,n để gọi thủ tục p với n tham số Return y giá trị thủ tục trả param x1 param x2 param xn Call p,n Lệnh gán có số x:=y[i] hay x[i]:=y Thuộc tính tổng hợp S.code biểu diễn mã ba địa lệnh Các tên trung gian sinh cho tính tốn trung gian Các biểu thức liên hệ với hai thuộc tính tổng hợp E.place chứa địa chứa giá trị E E.code mã ba địa để đánh giá E Hàm newtemp sinh tên trung giant1, t2, Hàm gen sinh mã ba địa Trong thực tế, code gửi vào file thay cho thuộc tính code 21/1/2010 Dịch trực tiếp cú pháp thành mã địa Sản xuất S → id := E E → E1 + E2 E → E1 * E2 E → - E1 E → ( E1 ) E → id Quy tắc ngữ nghĩa Mã cho lệnh gán a := b * -c + d { S.code = E.code||gen(id.place ‘:=’ E.place) } {E.place= newtemp ; E.code = E1.code || E2.code || || gen(E.place‘:=’E1.place‘+’E2.place) } {E.place= newtemp ; E.code = E1.code || E2.code || || gen(E.place‘:=’E1.place‘*’E2.place) } {E.place= newtemp ; E.code = E1.code || || gen(E.place ‘:=’ ‘uminus’ E1.place) } {E.place= E1.place ; E.code = E1.code} {E.place = id.place ; E.code = ‘’ } Hàm newtemp trả dãy tên khác t1, t2… cho lời gọi E.place: tên giữ giá trị E E.code:là dãy câu lệnh địa dùng để ước lượng E Cài đặt câu lệnh địa Bộ bốn (Quadruples) t1:=- c t2:=b * t1 t3:=- c t4:=b * t3 t5:=t2 + t4 a:=t5 op (0) (1) uminus * arg1 Cài đặt câu lệnh địa arg2 c b result t1 t1 t2 ((2)) uminus c (3) * b t3 t4 (4) + t2 t4 t5 (5) := t5 t3 a Bộ ba (Triples) t1:=- c t2:=b * t1 t3:=:= c t4:=b * t3 t5:=t2 + t4 a:=t5 op arg1 (0) uminus arg2 c (1) * b (2) uminus c (3) * b (2) (4) + (1) (3) (5) assign a (4) (0) Tên tạm khơng thêm vào bảng kí hiệu Tên tạm phải thêm vào bảng kí hiệu chúng tạo 21/1/2010 Các dạng khác câu lệnh địa Cài đặt câu lệnh địa Ví dụ: x[i]:=y x:=y[i] Sử dụng cấu trúc ba op (0) (1) [] := arg1 x (0) Bộ gián tiếp: sử dụng danh sách trỏ op arg2 op arg1 uminus c i (0) (14) (14) y (1) (15) (15) * b uminus c b arg2 (14) (2) (16) (16) op arg1 arg2 (3) (17) (17) * (0) [] y i (4) (18) (18) + (15) (17) (1) := x (0) (19) (19) assign a (18) Sinh mã cho khai báo Sử dụng biến toàn cục offset Các tên cục chương trình truy xuất thông qua địa tương đối offset Sản xuất Quy tắc ngữ nghĩa P→MD {} M→ε {offset:=0 } D → D; D D → id : T { enter(id.name, T.type, offset) offset:=offset + T.width } T → integer {T.type = integer; T.width = } T → real {T.type =real; T.width = } T → array [ num ] of T1 {T.type=array(1 num.val,T1.type) T.width = num.val * T1.width} (5) (16) Lưu trữ thông tin phạm vi Trong ngơn ngữ mà chương trình phép khai báo lồng nhau, tìm thấy CTC q trình khai báo chương trình bao bị tạm dừng Văn phạm khai báo này: P→D D → D; D | id : T | proc id ; D ; S Khi khai báo chương trình D → proc id D1; S tạo khai báo D1 lưu bảng kí hiệu 21/1/2010 Khai báo chương trình lồng 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) Năm bảng kí hiệu Sort Ví dụ chương trình: Program sort; Var a: array[0 10] of integer; x: integer; Procedure readarray; Var i: integer; Begin …a… end {readarray}; Procedure exchange(i, j: integer); Begin {exchange} end; Procedure quicksort(m, n: integer); Var k, v: integer; Function partition(y,z: integer): integer; Begin a v exchange(i,j) end; {partition} Begin … end; {quicksort} Begin … end; {sort} Các thủ tục tập quy tắc ngữ nghĩa mktable(previous) – tạo bảng kí hiệu mới, bảng có previous đến bảng cha bảng kí hiệu enter(table,name,type,offset) – tạo có tên name bảng kí hiệu table đặt kiểu type, địa tương đối offset vào trường bên enterproc(table,name,newbtable) – tạo cho tên chương trình vào table, newtable trỏ tới bảng kí hiệu chương trình addwidth(table,width) – ghi tổng kích thước tất bảng kí hiệu vào header bảng Xử lý khai báo chương trình lồng P→MD { addwidth(top(tblptr), top(offset)); pop(tblptr); pop(offset) } M→ε { t:=mktable(null); push(t, tblptr); push(0, offset)} D → D1 ; D2 D → proc id ; N D1 ; S N→ε { t:=top(tblpr); addwidth(t,top(offset)); pop(tblptr); pop(offset); enterproc(top(tblptr), id.name, t)} {t:=mktable(top(tblptr)); push(t,tblptr); push(0,offset);} D → id : T {enter(top(tblptr), id.name, T.type, top(offset); top(offset):=top(offset) + T.width tblptr – để giữ trỏ bảng kí hiệu offset – lưu trữ địa offset bảng kí hiệu tblptr 21/1/2010 Xử lý khai báo chương trình lồng Với sản xuất A → BC {actionA} hoạt động B, C thực trước A Sản xuất M → ε khởi tạo stack tblptr với bảng kí hiệu cho phạm vi ngồi (chương trình sort) lệnh mktable(nil) đồng thời đặt offset = N đóng vai trị tương tự M khai báo chương trình xuất hiện, dùng lệnh mktable(top(tblptr)) để tạo bảng mới, tham số top(tblptr) cho giá trị trỏ tới bảng lại đẩy vào đỉnh stack tblptr đẩy vào stack offset Với khai báo id: T ô tạo cho id bảng kí hiệu hành, stack tblptr không đổi, giá trị top(offset) tăng lên T.width Khi D → proc id ; N D1 ; S diễn kích thước tất đối tượng liệu khai báo D1 nằm đỉnh stack offset Nó lưu trữ cách dùng Addwidth, stack tblptr offset bị đẩy thao tác khai báo chương trình Tên bảng kí hiệu Hàm lookup tìm bảng kí hiệu xem có hay khơng tên cho id.name Nếu có trả trỏ ơ, khơng trả nil Thủ tục emit để đưa mã địa vào tập tin output khơng xây dựng thuộc tính code cho kí hiệu chưa kết thúc gen Quá trình dịch thực cách đưa tập tin output thuộc tính code kí hiệu khơng kết thúc vế trái sản xuất tạo cách nối thuộc tính code kí hiệu khơng kết thúc vế phải theo thứ tự xuất kí hiệu chưa kết thúc vế phải Tên bảng kí hiệu Xét ĐNTCP để sinh mã lệnh địa cho lệnh gán Tên bảng kí hiệu Xét sản xuất D → proc id; ND1; S Các tên lệnh gán sinh kí hiệu khơng kết thúc S khai báo chương trình chương trình chứa Khi khai báo tới tên trước hết hàm lookup tìm xem tên có bảng kí hiệu hành hay khơng, khơng dùng trỏ header bảng để tìm bảng kí hiệu bao tìm đó, khơng tìm thấy tất mức lookup trả nil 21/1/2010 Địa hóa phần tử mảng Các phần tử mảng truy xuất nhanh chúng lưu trữ khối ô nhớ Trong mảng chiều, kích thước phần tử w địa tương đối phần tử thứ i mảng A tính theo cơng thức: A[i] = base + (i-low)*w Trong đó: Low: cận tập số Base: địa tương đối ô nhớ cấp phát cho mảng(địa tương đối A[low]) Tương đương A[i] = i*w + (base – low*w) Trong đó: c = base – low*w tính thời gian dịch lưu bảng kí hiệu ⇒ A[i] = i*w + c Địa hóa phần tử mảng chiều Theo dòng Địa tương đối A[i1,i2] = base + (( ((i1 – low1))*n2 + i2 – low2))*w Địa hóa phần tử mảng chiều Theo cột low1, low2: cận cho i1 i2 n2: số lượng giá trị mà i2 nhận Nếu high2 cận i2 n2 = high2 – low2 + Sinh mã biểu thức Logic Biểu thức logic sỉnh văn phạm sau: E→ E or E | E and E | not E | (E) | id relop id | true |false Trong đó: Or O And A d kế kết h hợp trái Or có độ ưu tiên thấp And, Not 21/1/2010 Biểu diễn số ĐNTCPdùng số để biểu diễn giá trị logic Mã hóa true false số ước lượng biểu thức boole tương tự biểu thức số học Có thể biểu diễn true 1; false Hoặc số khác true, false Ví dụ: biểu thức a or b and not c Mã địa chỉ: t1 = not c t2 = b and t1 t3 = a or t2 Biểu thức quan hệ a