Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
286,34 KB
Nội dung
CHƯƠNG IV Dịch trực tiếp cú pháp Mục tiêu: • Vai trị dịch trực tiếp cú pháp • Hiểu khái niệm: Định nghĩa trực tiếp cú pháp, thuộc tính tổng hợp thuộc tính kế thừa, cấu trúc CuuDuongThanCong.com https://fb.com/tailieudientucntt Định nghĩa trực tiếp cú pháp • Ðịnh nghĩa trực tiếp cú pháp (syntax- directed definition) tổng quát hóa văn phạm phi ngữ cảnh, ký hiệu văn phạm kết hợp với tập thuộc tính (attribute) • Các thuộc tính xâu, số, kiểu liệu, địa nhớ • Giá trị thuộc tính tính luật ngữ nghĩa (semantic rule) kèm Mỗi luật ngữ nghĩa viết lời gọi thủ tục đoạn chương trình • Cây phân tích cú pháp có trình bày giá trị thuộc tính nút gọi thích CuuDuongThanCong.com https://fb.com/tailieudientucntt • Trong định nghĩa trực tiếp cú pháp, luật sinh A kết hợp tập luật ngữ nghĩa có dạng b:= f (c1, c2, , ck) f hàm và: 1) b thuộc tính tổng hợp (synthesized attribute) A c1, c2, , ck thuộc tính ký hiệu văn phạm luật sinh Hoặc 2) b thuộc tính kế thừa (inherited attribute) ký hiệu văn phạm vế phải luật sinh c1, c2, , ck thuộc tính ký hiệu văn phạm luật sinh CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 4.1: Định nghĩa trực tiếp cú pháp (ĐNTTCP) cho máy tính đơn giản PRODUCTION L En E E1 + T ET T T1 * F TF F (E) F digit SYMANTIC RULES print(E.val) E.val := E1.val + T.val E.val := T.val T.val := T1.val * F.val T.val := F.val F.val := E.val F.val := digit.lexval • Token digit có thuộc tính tổng hợp lexval mà giá trị cung cấp phân tích từ vựng CuuDuongThanCong.com https://fb.com/tailieudientucntt • Thuộc tính tổng hợp thuộc tính mà giá trị nút phân tích cú pháp tính từ giá trị thuộc tính nút • Ðịnh nghĩa trực tiếp cú pháp sử dụng thuộc tính tổng hợp gọi định nghĩa S- thuộc tính (S- attributed definition) • Trong phân tích cú pháp định nghĩa Sthuộc tính, luật ngữ nghĩa tính giá trị thuộc tính cho nút từ lên, từ đến gốc CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 4.2: ĐNTTCP ví dụ 4.1 định nghĩa S- thuộc tính Cây thích cho biểu thức 3*5+4n (n kí hiệu cho newline) sau: T.val=3 | F.val=3 | digit.lexval=3 CuuDuongThanCong.com E.val=15 | T.val=15 | * L | E.val=19 | + F.val=5 | digit.lexval=5 n T.val=4 | F.val=4 | digit.lexval=4 https://fb.com/tailieudientucntt • Thuộc tính kế thừa thuộc tính mà giá trị xác định từ giá trị thuộc tính nút cha nút anh em • Nói chung ta viết định nghĩa trực tiếp cú pháp thành định nghĩa S- thuộc tính Nhưng số trường hợp, việc sử dụng thuộc tính kế thừa lại thuận tiện tính tự nhiên CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 4.3: Xét định nghĩa trực tiếp cú pháp sau cho khai báo kiểu cho biến PRODUCTION D TL T int T real L L1, id L id SYMANTIC RULES L.in := T.type T.type := integer T.type := real L1.in := L.in; addtype (id.entry, L.in) addtype (id.entry, L.in) • Các luật kết hợp với luật sinh L gọi thủ tục addtype dùng để nhập kiểu cho mục vào định danh symbol table CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 4.4: Cây thích cho dòng lệnh real id1, id2, id3; sau D L.in=real | , T.type=real | real L.in=real | , L.in=real | id1 CuuDuongThanCong.com id3 id2 https://fb.com/tailieudientucntt • Đồ thị phụ thuộc (dependency graph): Trong cú pháp chứa thuộc tính tổng hợp thuộc tính kế thừa, ta dùng đồ thị phụ thuộc để biểu diễn loại thuộc tính Ví dụ 4.5: Với định nghĩa S- thuộc tính E E1 + E2 E.val := E1.val + E2.val Ta có đồ thị phụ thuộc: CuuDuongThanCong.com https://fb.com/tailieudientucntt • Xây dựng cú pháp cho biểu thức: Tương tự việc dịch biểu thức thành dạng hậu tố Xây dựng cho biểu thức cách tạo nút cho tốn hạng tốn tử Mỗi nút cài đặt ghi có nhiều trường Trong nút tốn tử, có trường tốn tử, trường lại chứa trỏ, trỏ tới nút tốn hạng CuuDuongThanCong.com https://fb.com/tailieudientucntt • Ðể xây dựng cú pháp cho biểu thức sử dụng hàm sau đây: mknode(op, left, right): Tạo nút tốn tử có nhãn op hai trường chứa trỏ, trỏ tới left right mkleaf(id, entry): Tạo nút với nhãn id trường chứa trỏ entry, trỏ tới ô bảng ký hiệu mkleaf(num,val): Tạo nút với nhãn num trường val, giá trị số CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ 4.7: Xây dựng cú pháp cho biểu thức: a - + c ta dùng dãy lời gọi hàm (1): p1 := mkleaf(id, entrya) (4): p4 := mkleaf(id, entryc) (2): p2 := mkleaf(num,4) (5): p5 := mknode(‘+’, p3, p4) (3): p3 := mknode(‘-‘, p1, p2) • Cây xây dựng từ lên • p1, p2, , p5 trỏ, trỏ tới nút • entrya, entryc trỏ, trỏ tới mục vào a c symbol table CuuDuongThanCong.com https://fb.com/tailieudientucntt • Cây cú pháp cho biểu thức a - + c CuuDuongThanCong.com https://fb.com/tailieudientucntt • Xây dựng cú pháp từ định nghĩa trực tiếp cú pháp: Căn vào luật sinh văn phạm luật ngữ nghĩa kết hợp mà ta gọi hàm mknode mkleaf để tạo cú pháp Ví dụ 4.8: Ðịnh nghĩa trực tiếp cú pháp giúp việc xây dựng cú pháp cho biểu thức (thuộc tính tổng hợp nptr theo dõi trỏ trả gọi hàm) PRODUCTION E E1 + T E E1 - T ET T (E) T id T num CuuDuongThanCong.com SYMANTIC RULES E.nptr := mknode(‘+’, E1.nptr, T.nptr) E.nptr := mknode(‘-’, E1.nptr, T.nptr) E.nptr := T.nptr T.nptr := E.nptr T nptr := mkleaf(id, id.entry) T.nptr := mkleaf(num, num.val) https://fb.com/tailieudientucntt Ví dụ 4.9: Cây cú pháp cho biểu thức a-4+c CuuDuongThanCong.com https://fb.com/tailieudientucntt Đánh giá từ lên với định nghĩa S- thuộc tính • Các thuộc tính tổng hợp đánh giá cách phân tích cú pháp từ lên • Bộ phân tích cú pháp lưu trữ giá trị thuộc tính kí hiệu văn phạm STACK • Khi áp dụng reduction, giá trị tổng hợp tạo từ thuộc tính kí tự văn phạm bên vế phải luật sinh lưu trữ STACK CuuDuongThanCong.com https://fb.com/tailieudientucntt • STACK cài đặt cặp mảng state val Mỗi ô stack trỏ trỏ tới bảng phân tích LR(1) Nếu phần tử thứ i STACK ký hiệu A val[i] giá trị thuộc tính kết hợp với A • Giả sử luật ngữ nghĩa A.a := f ( X.x, Y.y, Z.z ) kết hợp với luật sinh A XYZ Trước XYZ rút gọn thành A val[top] = Z.z, val[top 1] = Y.y, val[top - 2] = X.x Sau rút gọn, top bị giảm đơn vị, A nằm state[top] (vị trí X trước đó) thuộc tính tổng hợp nằm val[top] CuuDuongThanCong.com https://fb.com/tailieudientucntt top state val X Y Z X.x Y.y Z.z Ví dụ 4.10: Biểu diễn máy tính đơn giản với LR parser PRODUCTION L En E E1 + T ET T T1 * F TF F (E) F digit CuuDuongThanCong.com CODE FRAGMENT print(val[top]) val[ntop] := val[top - 2] + val[top] val[ntop] := val[top - 2] * val[top] val[ntop] := val[top - 1] https://fb.com/tailieudientucntt • Bảng sau trình bày q trình thực phân tích cú pháp với chuỗi nhập vào 3*5+4 n IINPUT 3*5+4n *5+4n *5+4n *5 + n 5+4n +4n +4n +4n +4n 4n n n n n state _ F T T* T*5 T*F T E E+ E+4 E+F E+T E En L CuuDuongThanCong.com val _ 3 33-5 3-5 15 15 15 15 - 15 - 15 - 19 19 19 PRODUCTION USED F digit TF F digit TT*F ET F digit TF EE+T L En https://fb.com/tailieudientucntt Ðịnh nghĩa L- thuộc tính • Mỗi định nghĩa trực tiếp cú pháp định nghĩa L- thuộc tính thuộc tính kế thừa Xj (1 j n) vế phải luật sinh A X1X2 Xn phụ thuộc vào: Các thuộc tính X1, X2, , Xj-1 Các thuộc tính kế thừa A CuuDuongThanCong.com https://fb.com/tailieudientucntt Lược đồ dịch • Lược đồ dịch (translation scheme) văn phạm phi ngữ cảnh thuộc tính kết hợp với ký hiệu văn phạm hành vi ngữ nghĩa đặt cặp dấu { } xen vào bên phải luật sinh Ví dụ 4.11: Lược đồ dịch biểu thức trung tố với phép cộng trừ thành dạng hậu tố: E R T TR addop T { print ( addop.lexeme) } R1 | num { print ( num.val) } CuuDuongThanCong.com https://fb.com/tailieudientucntt • Với biểu thức - + ta có phân tích cú pháp phía Khi áp dụng phép duyệt depth- first có kết dạng hậu tố 95-2+ E T { print('9') } R { print('-') } - T { print('5') } + CuuDuongThanCong.com R T { print('+') } { print('2') } https://fb.com/tailieudientucntt R • Cách xây dựng lược đồ dịch - Trường hợp chứa thuộc tính tổng hợp: Với luật ngữ nghĩa, ta tạo lệnh gán tương ứng đặt vào cuối vế phải luật sinh Ví dụ 4.12: Luật sinh Luật ngữ nghĩa T T1 * F T.val := T1.val * F.val Ta có lược đồ dịch: T T1 * F { T.val := T1.val * F.val} CuuDuongThanCong.com https://fb.com/tailieudientucntt - Trường hợp chứa thuộc tính tổng hợp thuộc tính kế thừa phải thoả mãn điều kiện: Thuộc tính kế thừa ký hiệu vế phải luật sinh phải xác định hành vi nằm trước ký hiệu Một hành vi khơng tham khảo tới thuộc tính tổng hợp ký hiệu nằm bên phải hành vi Thuộc tính tổng hợp ký hiệu chưa kết thúc vế trái xác định sau tất thuộc tính mà tham khảo xác định Hành vi xác định thuộc tính ln đặt cuối vế phải luật sinh CuuDuongThanCong.com https://fb.com/tailieudientucntt ... https://fb.com/tailieudientucntt • Bảng sau trình bày q trình thực phân tích cú pháp với chuỗi nhập vào 3*5 +4 n IINPUT 3*5+4n *5+4n *5+4n *5 + n 5+4n +4n +4n +4n +4n 4n n n n n state _ F T T* T*5 T*F T E E+ E +4 E+F E+T E En... https://fb.com/tailieudientucntt Ví dụ 4. 6: Đồ thị phụ thuộc cho thích ví dụ 4. 4 CuuDuongThanCong.com https://fb.com/tailieudientucntt Xây dựng cú pháp • Cây cú pháp (syntax - tree) dạng rút gọn phân tích cú pháp dùng để... phạm luật ngữ nghĩa kết hợp mà ta gọi hàm mknode mkleaf để tạo cú pháp Ví dụ 4. 8: Ðịnh nghĩa trực tiếp cú pháp giúp việc xây dựng cú pháp cho biểu thức (thuộc tính tổng hợp nptr theo dõi trỏ trả