. 98 TỔNG QUAN VỀ BIÊN DỊCH
74 MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN 1 Tốn hạng làm chỉ thị cho biết vị trí đích.
1. Tốn hạng làm chỉ thị cho biết vị trí đích.
2. Tốn hạng làm chỉ thị mơ tả khoảng cách tương đối cẩn nhảy theo chiều tới (dương) hoặc lui (âm).
3. Đích được mơ tả bằng các ký hiệu tượng trưng; nghĩa là máy cĩ cho phép đùng các nhân.
Với hai tùy chọn đầu tiên, chúng ta cĩ thêm khả năng lấy tốn hạng từ đỉnh chẳng xếp.
Chúng ta chọn tùy chọn thứ ba cho máy trừu tượng đang xét bởi vì nĩ rất dễ sinh ra các lệnh nhảy. Hơn nữa địa chỉ tượng trưng (dùng ký hiệu) khơng cần phải thay đổi nếu sau khi đã sinh ra mã cho máy trừu tượng, chúng ta cần phải sửa đổi lại đoạn mã, chèn thêm hay xĩa bớt các chỉ thị.
Chỉ thị cho dịng điều khiển của máy chồng xếp là:
1abal Í đích của các lệnh nhảy đến ¿; khơng cĩ tác dụng nào khác gote chỉ thị tiếp theo được lấy từ câu lệnh cĩ 1abel /
go£false/ lấy giá trị ở đỉnh ra; nhảy đến / nếu nĩ là zero gotrua/ lấy giá trị ở đỉnh ra, nhảy đến / nếu nĩ khác zero halt ngừng thực hiện
Dịch các câu lệnh
Sơ đơ bố trí trong Hình 2.33 phác thảo đoạn mã máy trừu tượng cho các câu lệnh while và câu lệnh điều kiện if. Thảo luận đưới đây tập trung vào việc tạo nhãn.
Xét sơ đề đoạn mã cho câu lệnh if trong Hình 2.38. Chỉ cĩ một chỉ thị label out. trong bản dịch của chương trình nguồn; bằng khơng sẽ khơng biết dịng điều khiển sẽ chuyển đến đâu từ một câu lệnh goto out. Vì thế chúng ta cẩn một cơ chế nào đĩ để thay out trong sơ đồ bằng một nhãn duy nhất mỗi lần dịch một câu lệnh if.
Giả sử neulabel là một thủ tục trả về một nhãn mới mỗi khi nĩ được gọi. Trong hành động ngữ nghĩa sau đây, nhãn được trả về bởi một lời gọi đến neuiabel được ghi lại bằng cách dùng một biến cục bộ ou¿:
sừmt —x» Ìf cxpr then sim { out nguÏinbie; gtmf.P = expr.t ||
*gofalse' oưứ || (2.18) gimh£ |
PHẦN 2.8 MÁY CHỒNG XẾP TRỪU TƯỢNG , T5
WHILE
Tr lnbel test
mã cho expr mã cho expr
SoFalae cut gofa1se out
mã cho si Tnâ cho sứ
* 1abel cụt oto tèt label cụt
Hình 2.38. Sơ đồ đoạn mã cho các câu lệnh điều kiện và câu lệnh wbile. Đưa ra một bản dịch
Chương trình dịch biểu thức trong Phần 2.5 dùng các lệnh in để tạo đản dần bản dịch cho một biểu thức. Các lệnh in tương tự cĩ thể được dùng để đưa ra bản dịch cho các câu lệnh. Thay vì các câu lệnh in, chúng ta đùng thủ tục emit nhằm che dấu các chỉ tiết in. Thí dụ em¿£ cĩ thể phải lo liệu xem mỗi chỉ thị máy trừu tượng cĩ cần ở trên một hàng riêng biệt hay khơng. Sử dụng thủ tục emi, chúng ta cĩ thể viết lại (2.18) như đưới đây
Sim -> TỶ
@xpr { out := neuUlabel; emi(*gofalse", ou#), } then
§SớmMfI { enH(*labe1', out}, }
Khi các hành động ngữ nghĩa xuất hiện bên trong một luật sinh, chúng ta xét các phần tử ở vế phải của luật sinh theo thứ tự từ trái sang phải. Đối với luật sinh ở trên, thứ tự các hành động như sau: các hành động trong khi phân tích cú pháp cho expr được thực hiện, ou£ được đặt là nhãn do neulabel trả về và chỉ thị go£false được đưa ra, các hành động khi phân tích sứ, được thực hiện, và cuối cùng chỉ thị labeL được đưa ra. Giả sử rằng các hành động khi phân tích cú pháp cho expr và sim; đưa ra đoạn chương trình cho những chưa tận này, luật sinh ở trên cài đặt sơ đồ đoạn chương trình của Hình 2.33.
Đoạn mã giả dịch phép gán và các cầu lệnh điều kiện được trình bày trong Hình 2.34. Bởi vì biến o là cục bộ đối với thủ tục sim, giá trị của nĩ khơng bị ảnh hưởng bởi các lời gọi đến các thủ tục expr và s¿m. Việc sinh ra các nhân cần phải giải thích kỹ hơn. Giá sử rằng các nhãn trong bản dịch cĩ dạng L1, L2,... Đoạn mã giả thao tác những nhãn này bằng cách dùng số nguyên theo sau 1. Vì thế ow¿ được khai báo là số nguyên, neiolabel trả về một số nguyên và nĩ trở thành giá trị của oưứ, rồi emit phải được viết để in ra một nhãn khi cho biết một số nguyên.