Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
535,31 KB
Nội dung
Bài 11 Sinh mã trung gian Nội dung • 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 • 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ã 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 định danh • Tồn nhiều toán tử vế phải cộng thêm tốn tử gán • 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 thường trỏ tới lối vào bảng ký hiệu Mã trung gian t2=x + y * z • t1 := y*z • t2 := x+t1 Tập mã lệnh ba địa điển hình • Mã địa tương tự mã Assembly: lệnh có nhãn, có lệnh chuyển điều khiển cho cấu trúc lập trình Lệnh gán x := y op 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 Tập mã lệnh ba địa điển hình 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 Sinh mã trực tiếp từ ĐNTCP • 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 Dịch trực tiếp cú pháp thành mã địa Sản xuất S id := E E T+E1 Quy tắc ngữ nghĩa {S.code = E.code || gen(id.place ‘:=’ E.place)} {E.place = newtemp ; E.code = T.code || E1.code || gen(E.place‘:=’T.place‘+’E1.place) } T F* T1 {E.place = T.place ; E.code = T.code} {T.place = newtemp ; T.code = F.code || T1.code || gen(T.place‘:=’F.place‘*’T1.place) } TF {T.place = F.place ; T.code = F.code} F (E) {F.place= E.place ; F.code = E.code} F id {F.place = id.place ; F.code = ‘’ } ET 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: dãy câu lệnh địa dùng để ước lượng E Mã cho lệnh gán a := b * (c + d) Sinh mã cho cấu trúc lập trình • Biểu diễn giá trị biểu thức Boole biểu thức đến chương trình • Ví dụ: cho câu lệnh sau • S→ if B then S1 | iF B then S1 else S2 | while B S1 • Với biểu thức B kết hợp với nhãn: • B.true: nhãn dịng điều khiển B true • B.false: nhãn dịng điều khiển B false • S.code: mã lệnh địa sinh S • S.next: nhãn mã lệnh địa thực sau mã lệnh S • S.begin: nhãn địa lệnh sinh cho S lệnh while Mã lệnh lệnh if-then, if-then-else, while-do ĐNTCP cho cấu trúc lập trình Dịch biểu thức logic cấu trúc lập trình • Nếu B có dạng: a L3 B.true= newlabel() -> L4 B lệnh while B.False = S.next S2.next = begin = L3 => S2.next = S3.next = L3 S.code L3: if a< b goto L4 goto L0 L4: if c < d goto L1 goto L2 L1: t1= y + z x = t1 goto L3 L2:t2 = y – z x = t1 goto L3 38 Nhãn L0 xuất chương trình sử dụng quy tắc ngữ nghĩa luật S S1S2