Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 42 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
42
Dung lượng
195,13 KB
Nội dung
CHƯƠNG BIÊN DỊCH TRỰC TIẾP CÚ PHÁP Có hai khái niệm luật ngữ nghóa có liên quan đến luật sinh: định nghóa trực tiếp cú pháp lược đồ dịch - Định nghóa trực tiếp cú pháp - Lược đồ dịch Chuỗi nhập → phân tích → đồ thị phụ thuộc → → đánh giá thứ tự luật ngữ nghóa Hình 5.0 Khái niệm dịch trực tiếp cú pháp Khái niệm tổng quan biên dịch trực tiếp cú pháp 5.1 Định nghóa trực tiếp cú pháp Là văn phạm phi ngữ cảnh mà ký hiệu văn phạm có tập thuộc tính Tập thuộc tính có hai loại: thuộc tính tổng hợp thuộc tính kế thừa Cây cú pháp có giá trị thuộc tính nút gọi phân tích thích Dạng định nghóa trực tiếp cú pháp Mỗi luật sinh có dạng A → α có tập luật ngữ nghóa có dạng b:= f (c1, c2, …, ck) với f hàm số và: b thuộc tính tổng hợp A c1, c2, …, ck thuộc tính ký hiệu văn phạm luật sinh, b thuộc tính kế thừa ký hiệu văn phạm bên vế phải luật sinh c1, c2, …, ck thuộc tính ký hiệu văn phạm luật sinh Thí dụ 5.1 Định nghóa trực tiếp cú pháp bảng 5.1 Bảng 5.1 Định nghóa trực tiếp cú pháp cho bảng tính đơn giản Luật sinh L → En E → E1 + T E → TE.val: = T.val T → T1* F T → FT.val: = F.val F → (E) F → digit Luật ngữ nghóa Print (E.val) E.val: = E1.val + T.val E.val: = T.val T.val: = T.val x F.val T.val: = F.val F.val: = E.val F.val: = digit lexval Thuộc tính tổng hợp Định nghóa trực tiếp cú pháp dùng thuộc tính tổng hợp gọi định nghóa thuộc tính S Thuộc tính S nút từ thuộc tính nút từ lên Thí dụ 5.2 Định nghóa thuộc tính S thí dụ 5.1 L E.val = 19 E.val = 15 + T.val = 15 T.val = F.val = digit.lexval = * n T.val = F.val = F.val = digit.lexval = digit.lexval = Hình 5.1 Cây phân tích thích * + 4n Thuộc tính kế thừa Thuộc tính kế thừa thuộc tính mà giá trị nút phân tích xác định thuộc tính cha mẹ và/hoặc anh chị nút Thí dụ 5.3 Sự khai báo tạo ký hiệu không kết thúc D định nghóa trực tiếp cú pháp (bảng 5.2) Bảng 5.2 Định nghóa trực tiếp cú pháp với thuộc tính kế thừa L.in Luật sinh D → TL T → int T → real L → L1, id L → id Luật ngữ nghóa L.in: = T.type T.type: = integer T.type: = real L1.in: = L.in Addtype (id.entry, L.in) Hình 5.2 phân tích thích cho câu real id1, id2, id3 D L.in = real T.type = real L.in = real , id3 real L.in = real , id2 id1 Hình 5.2 Cây phân tích với thuộc tính kế thừa in nút có nhãn L Đồ thị phụ thuộc Các phụ thuộc trung gian: thuộc tính kế thừa tổng hợp nút phân tích miêu tả đồ thị có hướng gọi đồ thị phụ thuộc (dependency graph) Cây phụ thuộc phân tích cho trước, xây dựng sau: for với nút n phân tích for với thuộc tính a ký hiệu văn phạm nút n - xây dựng nút đồ thị phụ thuộc cho a; for với nút n phân tích for với luật ngữ nghóa b:= f (c1, c2, …, ck) tương ứng với luật sinh dùng nút n for i := to k xây dựng cạnh từ nút c1 đến nút b Thí dụ 5.4 Khi ta dùng luật sinh E → E1 + E2 phân tích, thêm cạnh sau vào (H.5.3) đồ thị phụ thuộc Luật sinh E → E1 + E2 Luật ngữ nghóa E.val := E1.val + E2.val E E1 val + val E2 val Hình 5.3 Đồ thị phụ thuộc phân tích cho E Ỉ E1+ E2 Thí dụ 5.5 (H.5.4) đồ thị phụ thuộc cho phân tích (H.5.2) Đánh giá thứ tự Trong xếp logic topo, thuộc tính phụ thuộc c1, c2, …, ck luật ngữ nghóa b:= f (c1, c2, …, ck) đánh giá trước f D type T in real in L 10 L L entry id3 id2 entry id1 entry Hình 5.4 Đồ thị phụ thuộc cho phân tích (H.5.2) Thí dụ 5.6 Mỗi cạnh đồ thị phụ thuộc (H.5.4.) từ số thấp đến số cao nút Từ thứ tự logic topo có chương trình Chúng ta viết an cho thuộc tính liên quan đến nút đánh số n đồ thị phụ thuộc a4 := real a5 := a4 addtype (id3.entry, a5); a7 := a5 addtype (id2.entry, a7); a9 := a7 addtype (id1.entry, a9); Một số phương pháp đề nghị cho việc đánh giá luật ngữ nghóa Phương pháp phân tích (parse-tree method) Phương pháp sở luật (rule-based method) Phương pháp rõ ràng A.a = g(g(f(X.x), Y1, y), Y2, y) A.a = g(f(X.x), Y1, y) Y2 A R.i = f(X.x) X Y1 A.a = f(X.x) Y1 Y2 X R.I = g(g(f(X.x), Y1, y), Y2,y) Hình 5.11 Hai cách tính giá trị thuộc tính ∈ Mô 5.5 Lược đồ dịch chuyển đổi cho cấu trúc cú pháp E→T R R→+ T R1 R→− T R1 R→∈ T→( E ) T → id T → num {Rj := T.nptr} {E.nptr := R.s} {R1j := mknode (‘+’, Rj.T.nptr)} {R.s := R1.s} {R1j := mknode (‘-’, Rj.T.nptr)} {R.s := R1.s} {R.s := Rj} {T.nptr := E.nptr} {T.nptr := mkleaf (id.id.entry)} {T.nptr := mkleaf (num.num.val)} Hình 5.12 biểu diễn toàn hành vi mô 5.5 cho cấu trúc cú pháp câu a – + c Thiết kế dịch đoán nhận trước E R T•nptr − R i T•nptr + num id i • nptr = s ∈ id − R + id c id a num Hình 5.12 Dùng thuộc tính kế thừa để xây dựng cú pháp Giải thuật 5.2: xây dựng trình biên dịch trực tiếp cú pháp đoán nhận trước Nhập: cho lược đồ dịch trực tiếp cú pháp với văn phạm sở phù hợp cho phân tích đoán nhận trước Xuất: mã cho trình biên dịch trực tiếp cú pháp Phương pháp: Với ký hiệu không kết thúc A, xây dựng hàm, thông số thuộc tính kế thừa A, trả giá trị thuộc tính tổng hợp A Mã cho ký hiệu không kết thúc A định luật sinh dùng sở ký hiệu nhập đọc Mã cho luật sinh tạo ra: i) Với token X với thuộc tính tổng hợp x, cất giá trị x vào biến X.x Tạo lệnh gọi chương trình để so trùng token X với ký hiệu nhập đọc ii) Với B, tạo phát biểu gán C1 = B (b1, b2, …, bk), b1, b2, …, bk biến chứa thuộc tính kế thừa B C biến chứa thuộc tính tổng hợp B iii) Với hành vi, chép mã vào cho phận tích, thay tham chiếu đến thuộc tính biến chứa thuộc tính Thí dụ 5.14 Văn phạm mô 5.5 LL (1), phù hợp cho việc phân tích từ xuống function E: ↑ nút cú pháp function R: (i: ↑ nút cú pháp): ↑ nút cú pháp; function T: ↑ nút cú pháp; Kết hợp hai luật sinh R mô 5.5 R → addop T {R1.i :=mknode (addop.lexeme, R.i, T.nptr)} R1 {R.s := R1.s} R → ∈ {R.s := R.i} Moâ 5.6 Thủ tục phân tích cú pháp cho luaät sinh R: R → addop TR |∈ Procedur R: begin if lookahead = addop then begin match (addop): T; R; end else begin /*không làm cả*/ end Mô 5.7 Cây cú pháp đệ quy xuống function R (i: ↑ nút cú pháp): ↑ nút cú pháp; var nptr ll, sl, s: ↑ nút cú pháp; addoplexeme: char; begin if lookahead = addop then begin /* luaät sinh R → addop TR*/ addoplexeme := lexval; match (addop); il := mknode (addoplexeme, i, nptr); sl := R (il); s := sl; end else s := i; /* luaät sinh R → ∈ */ return s end; 5.6 Đánh giá thuộc tính kế thừa từ lên Loại bỏ hành vi nhúng lược đồ dịch Ví dụ: có lược đồ dịch E → TR R → + T {print (‘+’)} R ⏐ - T {print (‘−‘)} R⏐∈ T → num {print (num.val)} Tạo lược đồ dịch với việc dùng ký hiệu đánh dấu không kết thúc N, M E → TR R → + T MR ⏐- TNR ⏐∈ T → num {print (num.val)} M → ∈ {print (‘+’) } N → ∈ {print (‘−’) } Thuộc tính kế thừa stack phân tích Thí dụ 5.15 Quá trình đánh giá thuộc tính kế thừa phân tích từ lên cho câu nhập real p, q, r (H.5.13) D → T {L.in := T.type} T → int {T.type := integer} T → real {T.type := real} L → {L1.in := L.in} L1, id {add type (id.entry, L.in)} L → id {add type (id.entry, L.in)} D T L in in in real r L • L , q p Hình 5.13 Tại nút L có L.in := T.type Bảng 5.9 Bất lúc vế phải L thu giảm T vế phải Nhập Real p, q, r p, q, r p, q, r , q, r , q, r , q, r ,r ,r r Traïng thaùi real T Tp TL TL, TL, q TL TL, TL, r TL D Luật áp dụng T → real L → id L → L, id L → L, id D → TL Bảng 5.10 Giá trị T.type dùng vị trí L.in Luật sinh D Æ TL T Æ int T Æ real L Æ L, id L Ỉ id Đoạn mã val [ntop] := integer val [ntop] := real addtype (val[top], val[top – 3]) addtype (val[top], val[top – 1]) Đánh giá thuộc tính kế thừa Thí dụ 5.16 Đây ví dụ trường hợp đoán nhận trước vị trí thuộc tính lược đồ dịch Luật sinh S Ỉ aAC S Ỉ aABC CỈc Luật ngữ nghóa C.i:= A.s C.i := A.s C.i := g (C.i) (5.4) Luaät sinh Luật ngữ nghóa S Ỉ aAC S Ỉ bABMC CỈc MỈ∈ C.i := A.s M.i := A.s ; C.i := M.s C.i := g(C.i) M.S := M.i S S b b A s a) B i C A B b) i M s i C ∈ Hình 5.14 Sao chép thuộc tính thông qua ký hiệu M a) Luật sinh chưa biến đổi; b) Luật sinh biến đổi Ký hiệu không kết thúc N dùng để mô cho luật ngữ nghóa mà luật chép Ví dụ ta có luật sinh luật ngữ nghóa: Luật sinh S Ỉ aAC Luật ngữ nghóa C.i := f(A.s) (5.5) Luật sinh S Ỉ aANC NỈ∈ Luật ngữ nghóa N.i := A.s ; C.i := N.s N.s := f(N.i) (5.6) Giaûi thuật 5.3 Phân tích từ lên biên dịch với thuộc tính kế thừa Nhập: định nghóa thuộc tính L với văn phạm sở LL (1) Xuất: phân tích cú pháp tính giá trị tất thuộc tính stack phân tích Phương pháp: giả sử ký hiệu không kết thúc A có thuộc tính kế thừa A.i ký hiệu văn phạm X có thuộc tính tổng hợp X.x Với luật sinh A Ỉ X1 … Xn, có n ký hiệu không kết thúc đánh dấu M1 …Mn, thay luật thành luật sinh A Ỉ M1X1 … MnXn Để nhận thấy thuộc tính tính trình phân tích từ lên, xét hai trường hợp Trường hợp thứ ta thu giảm ký hiệu Mj ta phải biết luật sinh A → Mj X1 … MnXn mà Mj có Chúng ta phải biết vị trí thuộc tính mà thuộc tính kế thừa Xj.i cần để tính giá trị cho A.i val[top – 2j + 2], X1.i val[top – 2j + 3], X1.s val[top – 2i + 4], X2.i val[top – 2j + 5]… Trường hợp thứ hai xuất ta thu giảm ký hiệu không kết thúc văn phạm giả sử luật sinh A → M1X1 … MnXn, giả sử ta tính A.s, A.i sinh nằm stack vị trí vị trí A Các thuộc tính cần thiết để tính A.s sẵn sàng stack, biết, vị trí Xj trình thu giảm Thay thuộc tính kế thừa thuộc tính tổng hợp Chúng ta tránh dùng thuộc tính kế thừa việc thay đổi văn phạm sở Trong ngôn ngữ Pascal cho phép khai báo chuỗi biến sau kiểu liệu chúng Thí duï: m, n: integer D→L:T T → integer ⏐ char L → L, id ⏐ id D → id L L → ,id Ll:T T → integer ⏐ char ... Dùng thuộc tính kế thừa để xây dựng cú pháp Giải thuật 5. 2: xây dựng trình biên dịch trực tiếp cú pháp đoán nhận trước Nhập: cho lược đồ dịch trực tiếp cú pháp với văn phạm sở phù hợp cho phân... vị trí a Hình 5. 5 Cây cú pháp cho biểu thức a – + c Định nghóa trực tiếp cú pháp cấu trúc cú pháp Thí dụ bảng 5. 3 định nghóa thuộc tính S dùng để xây dựng cú pháp cho biểu thức số học cộng (+)... tính cha mẹ và/hoặc anh chị nút Thí dụ 5. 3 Sự khai báo tạo ký hiệu không kết thúc D định nghóa trực tiếp cú pháp (bảng 5. 2) Bảng 5. 2 Định nghóa trực tiếp cú pháp với thuộc tính kế thừa L.in Luật