Bài giảng môn học trình biên dịch chương 6 xử lí ngữ nghĩa

19 4 0
Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Đ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

CHƯƠNG XỬ LÝ NGỮ NGHĨA Xử lý ngữ nghóa có hai cách: kiểm tra tónh (static check) kiểm tra động (dynamic check) Trong chương bàn đến kiểm tra ngữ nghóa tónh Xử lý ngữ nghóa tónh bao gồm: Truyền thuộc tính Kiểm tra kiểu Kiểm tra trình tự điều khiển Kiểm tra tính Kiểm tra mối liên hệ tên Xử lý phát biểu goto tham khảo trước chuỗi cây Bộ phân Bộ xử lý token tích cú pháp cú pháp ngữ nghóa cú pháp Sinh mã trung gian mã trung gian Hình 6.1 Vị trí xử lý ngữ nghóa 6.1 Truyền thuộc tính Mã trung gian Mã trung gian có nhiều loại: mã cambridge, mã Balan ngược, mã tam (triple code), mã tứ (quadruple code) Bộ tứ cho biểu thức số học Dạng tổng quát: (, , ) Một cách biểu thị biến tạm bảng danh biểu: Tên:rỗng Loại: Kiểu liệu: tùy theo kiểu toán hạng tham gia phép toán Địa : địa tương đối Địa gán sinh mã Một số mã tứ cho phép toán học JMP (i, 0, 0) nhảy đến tứ có số i JPG (i, p1, p2) nhảy đến tứ i toán hạng thứ lớn toán hạng hai as1 (p1, p2, 0) gán trị p1 cho p2 p2 biến đơn FLT (p1, p2, 0) Đổi trị p1 thành số thực, gán sang p2 FIX (p1, p2, 0) Đổi trị p1 thành số nguyên, gán sang p2 6.2 Xử lý ngữ nghóa với phân tích cú pháp từ lên Vấn đề truyền thuộc tính Thí dụ 6.1 Chúng ta có văn phạm G → id := → + | → * | < factor> < factor > → id | (< expr>) n12 n11 n10 n9 n8 n2 n1 id1 := id2 * ( n5 n7 n4 n6 n3 id3 + id4 Hình 6.2 Cây cú pháp A := X * (R + Q) ) Token Bảng danh biểu Trị từ vựng Kiểu liệu id id id id A X R Q thực thực thực thực - Truyền thuộc tính - Sinh biến tạm thu giảm Phương pháp thực truyền thuộc tính Để thực xử lý ngữ nghóa trình phân tích cú pháp, dùng stack đặc biệt gồm phần: A: ký hiệu văn phạm (tượng trưng cho danh hiệu) B: có trị (ký hiệu biến tạm) C: trỏ đến bảng danh biểu (thực chất vị trí danh biểu bảng danh biểu Thí dụ 6.2 Cho văn phạm G thí dụ 6.1 → id := → + | → * | → id | () Nguyên tắc xử lý ngữ nghóa Khi có chuỗi x = x1x2…xn thu giảm KHKKT U (với luật sinh U Ỉ x1, x2 …xn) hành vi xử lý ngữ nghóa nút V hàm của: 1) Luật sinh U Ỉ x1x2…xn 2) Các xử lý ngữ nghóa nút xi, tức nút V là: i) Tra cứu bảng danh biểu ii) Tạo biến tạm iii) Sinh mã trung gian iv) Truyền thuộc tính từ x V 6.3 Kiểm tra kiểu liệu Hệ thống kiểu Định nghóa biểu thức kiểu Kiểu liệu Khi biểu thức kiểu đặt tên Bộ kiến thiết kiểu bao gồm: 1) Dãy (array): array (I, T) 2) Tích số (product): tích số cartesian T1 x T2 3) Bản ghi (record): kiểu ghi tích số biểu thức kiểu thành phần Thí dụ: type row = record address : integer; lexeme : array [1 15] of char; end; var table : array [1 10] of row; Kiểu row biểu diễn biểu thức kiểu: record ((address x integer) x (lexeme x array (1 15, char))) 4) Con troû (pointer): pointer (T) 5) Hàm (function): D Ỉ R Thí dụ: Pascal có khai báo: function f (a, b : char) : ↑ integer; Biểu thức kiểu f là: char x char Ỉ pointer (integer) Biểu thức kiểu chứa biến mà trị chúng biểu thức kiểu Để biểu diễn biểu thức kiểu ta dùng đồ thị (H.6.4) dag, biểu thị cho biểu thức kiểu char x char Ỉ pointer (integer) Hệ thống kiểu x char pointer char interger x char pointer interger Hình 6.4 Cây dag, biểu thị cho biểu thức char x char Ỉ point (interger) Kiểm tra kiểu tónh kiểm tra kiểu động Phát lỗi Đặc tả kiểm tra kiểu đơn giản Ngôn ngữ đơn giản Chúng ta có ngôn ngữ đơn giản sinh từ văn phạm G P→D;E D → D ; D | id : T T → char | integer | array [num] of T | ↑ T E → literal | num | id |E mod E | [E] | E ↑ Mô 6.1 Sơ đồ biên dịch dùng để lưu giữ kiểu danh biểu P→D;E D→D;D D → id : T {addtype (id entry, T type)} T → char { T type := char} T → integer {T type := integer} T → ↑ T1{T type := pointer (T1 type)} T → array [num] of T1{T type = array (num val, T1 type)} Kieåm tra cho biểu thức Kiểu token literal num thí có kiểu char integer E → literal {E type := char} E → num {E type := integer} E → id {E type := lookup (id Entry)} E → E1 mod E2 {E type := if (E1 type = integer) and (E2 type := integer) then integer else type - error} E → E1 {E2} {E type := if (E1 type = integer) and (E1 type E2 = array (s, t)) then t else type – error} E → E1 ↑ {E type := if E1 type = pointer (t) then t else type – error} Kiểm tra kiểu liệu cho phát biểu Một chương trình bao gồm khai báo, sau phát biểu, điều biểu thị luật sinh P Ỉ D; S Mô 6.2 Sơ đồ biên dịch cho kiểu liệu phát biểu P → D; S S → id := E {S.type := if id type = E type then void else type - error} S → if E then S1 {S.type := if E type = boolean then S1 type else type - error} S → while E S1 {S.type := if E type = boolean then S1 type else type - error} S → S1; S2 {S.type := if (S1 type = void) and (S2 Type = void) then void else type - error} Kiểm tra kiểu hàm E Ỉ E (E) Để diễn tả kiểu cho biểu thức kiểu ta dùng ký hiệu T thêm luật sinh T Ỉ T1’ Ỉ ‘ T2 {T type := T1 type Ỉ T2 type} Quy tắc kiểm tra kiểu hàm E Ỉ E1 (E2) {E type := if (E2 type = s) and (E1 type = s Ỉ t) then t else {type - error} T1 x T2 x x Tn Thí dụ: root Ỉ (real Ỉ real) x real Ỉ real Chúng ta hiểu có khai báo: function root (functionf (real) : real; x : real) : real Sự tương đương biểu thức kiểu • Sự tương đương cấu trúc biểu thức kiểu • Giải thuật kiểm tra tương đương cấu trúc biểu thức kiểu Mô 6.3 Kiểm tra tương đương cấu trúc hai biểu thức kiểu s t function sequiv (s, t): boolean; begin if s t kiểu then true else if s = array (s1, s2) and t = array (t1, t2) then return sequiv (s1, s2) and sequiv (s2, t2) else if s = s1 x s2 and t = t1 x t2 then return sequiv (s1, t1) and sequiv (s2, t2) else if s = pointer (s1) and t = pointer (t1) then return sequiv (s1, t1) else if s = s1→ s2 and t = t1→ t2 then return sequiv (s1, t1) and sequiv (s2, t2) else return false; end; Thí dụ 6.3 Chúng ta giới thiệu cách mã hoá biểu thức kiểu trình biên dịch C D.M Ritchie viết Mô 6.4 Các thí dụ biểu thức kiểu char freturns (char) pointer (freturns (char)) array (pointer (freturns (char)) Bộ kiến thức kiểu pointer array freturns Mã hóa 01 10 11 Các kiểu ngôn ngữ C John (1979) mã hóa bit Kiểu boolean char integer real Mã hóa 0000 0001 0010 0011 Mô 6.5 Mã hóa biểu thức kiểu mô 6.4 Biểu thức kiểu char freturns (char) pointer (freturns (char)) array (pointer (freturns (char)) - Tên cho biểu thức kiểu Sau đoạn khai báo kiểu Pascal: type link = ↑ cell; var next : link; last : link; p : ↑ cell; q, r : ↑ cell; Mã hóa 000000 0001 000011 0001 0111 0001 100111 0001 Thí dụ 6.4 Biến next last p q r Biểu thức kiểu link link pointer (cell) pointer (cell) pointer (cell) Hình 6.11 Biến biểu thức kiểu tương ứng 6.4 Chuyển đổi kiểu Thí dụ ký hiệu hậu tố biểu thức a + i sau thực hành vi chuyển đổi kiểu: a i intereal real + - Áp đặt toán tử (Coercion) Thí dụ 6.5 Mô 6.6 Quy tắc kiểm tra kiểu cho việc áp đặt toán tử để đổi trị toán hạng từ số nguyên sang số thực Luaät sinh E → num E → num num E → id E → E1 op E2 Luật ngữ nghóa E type := integer E type := real E type := lookup (id entry) E type := if (E1 type = integer) and (E2 type = integer) then integer else if (E1 type = integer) and (E2 type = real) then real else if (E1 type = real) and (E2 type = integer) then real else if (E1 type = real) and (E2 type = real) then real else type - error Lưu ý: for | := to N x [i] := for | := to N x [i] := 1.0 (1) (2) 6.5 Xử lý ngữ nghóa cho phát biểu goto tham khảo trước Thí dụ 6.6 Giả sử có đoạn chương trình … goto L (10) JMP (0,0,0) … goto L (50) JMP (10,0,0) … goto L (90) JMP (50,0,0) … L: x := x + (120) Baûng 6.2 Baûng lưu giữ tên phát biểu số đầu danh sách liên kết Tên p/b Địa Định nghóa L 90 Bảng 6.3 Điền số tên L vào lệnh nhảy (10) (50) (90) Tên p/b Địa Định nghóa L 120 JMP JMP JMP (120,0,0) (120,0,0) (120,0,0) ... := to N x [i] := for | := to N x [i] := 1.0 (1) (2) 6. 5 Xử lý ngữ nghóa cho phát biểu goto tham khảo trước Thí dụ 6. 6 Giả sử có đoạn chương trình … goto L (10) JMP (0,0,0) … goto L (50) JMP (10,0,0)...chuỗi cây Bộ phân Bộ xử lý token tích cú pháp cú pháp ngữ nghóa cú pháp Sinh mã trung gian mã trung gian Hình 6. 1 Vị trí xử lý ngữ nghóa 6. 1 Truyền thuộc tính Mã trung gian Mã... and sequiv (s2, t2) else return false; end; Thí dụ 6. 3 Chúng ta giới thiệu cách mã hoá biểu thức kiểu trình biên dịch C D.M Ritchie viết Mô 6. 4 Các thí dụ biểu thức kiểu char freturns (char)

Ngày đăng: 23/03/2022, 21:57

Hình ảnh liên quan

Hình 6.2. Cây cú pháp A := X* (R + Q). - Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Hình 6.2..

Cây cú pháp A := X* (R + Q) Xem tại trang 4 của tài liệu.
Bảng danh biểu - Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Bảng danh.

biểu Xem tại trang 5 của tài liệu.
Hình 6.4. Cây và dag, biểu thị cho biểu thức char x char Ỉ point (interger) - Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Hình 6.4..

Cây và dag, biểu thị cho biểu thức char x char Ỉ point (interger) Xem tại trang 8 của tài liệu.
Bảng 6.2. Bảng lưu giữ tên phát biểu và chỉ số đầu danh sách liên kết - Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Bảng 6.2..

Bảng lưu giữ tên phát biểu và chỉ số đầu danh sách liên kết Xem tại trang 19 của tài liệu.
Bảng 6.3. Điền chỉ số của tên L vào các lệnh nhảy - Bài giảng môn học trình biên dịch   chương 6 xử lí ngữ nghĩa

Bảng 6.3..

Điền chỉ số của tên L vào các lệnh nhảy Xem tại trang 19 của tài liệu.