Bài giảng xây dựng chương trình dịch bài 11 sinh mã trung gian

38 0 0
Bài giảng xây dựng chương trình dịch bài 11   sinh mã trung gian

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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) } TF {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 = ‘’ } ET 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

Ngày đăng: 10/10/2023, 18:31

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan