tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài nghiên cứu nhóm giải thuật shifft reduce parsing

25 773 0
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài nghiên cứu nhóm giải thuật shifft reduce parsing

Đ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

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG  Đề tài: BÀI TẬP LỚN Nghiên cứu nhóm giải thuật shift-reduce parsing Giảng viên hướng dẫn: TS Nguyễn Hữu Đức Học viên thực hiện: Đỗ Thị Nhâm Đoàn Minh Quân Nguyễn Việt Tiến Lớp: 12BCNTT2 Hà Nội – 2012 MỤC LỤC I Shift – Reduce parsing Bộ phân tích cú pháp Shift – Reduce 2 Handle Cắt tỉa handle (Handle Pruning) Cài đặt phân tích cú pháp Shift - Reduce II Operator - Precedence parsing Quan hệ thứ tự ưu tiên Sử dụng quan hệ thứ tự ưu tiên toán tử III LR parsing Thuật toán phân tích cú pháp LR Văn phạm LR 11 Xây dựng bảng phân tích cú pháp SLR 11 a Mục 12 b Văn phạm tăng cường 12 c Phép toán bao đóng 12 d Phép toán Goto 13 e Giải thuật xây dựng họ tập hợp mục LR (0) văn phạm G' 13 f Thuật toán xây dựng bảng phân tích SLR 15 Xây dựng bảng phân tích cú pháp LR tắc (Canonical LR Parsing Table) 18 a Mục LR (1) 18 b Thuật toán xây dựng họ tập hợp mục LR (1) 18 c Thuật toán xây dựng bảng phân tích cú pháp LR tắc 20 Xây dựng bảng phân tích cú pháp LALR 21 a Hạt nhân (core) 22 b Thuật toán xây dựng bảng phân tích cú pháp LALR 22 Shift – Reduce parsing kiểu phân tích cú pháp từ lên tổng quát Một dạng dễ cài đặt gọi phân tích cú pháp thứ bậc toán tử (Operator - Precedence parsing) phương pháp tổng quát kỹ thuật Shift - Reduce phân tích cú pháp LR (LR parsing) I Shift – Reduce parsing Bộ phân tích cú pháp Shift – Reduce Phân tích cú pháp Shift - Reduce cố gắng xây dựng phân tích cú pháp cho chuỗi nhập nút lên hướng nút gốc Ðây xem trình thu gọn (reduce) chuỗi w thành ký hiệu bắt đầu văn phạm Tại bước thu gọn, chuỗi cụ thể đối sánh với vế phải luật sinh chuỗi thay ký hiệu vế trái luật sinh Và chuỗi chọn bước, dẫn xuất phải đảo ngược xây dựng Ví dụ 1.1: Cho văn phạm: S→aABe A→A b c| b B→d Câu abbcde thu gọn thành S theo bước sau: abbcde aAbcde aAde aABe S Thực chất dẫn xuất phải đảo ngược sau: S ⇒ rmaABe ⇒rmaAde ⇒rm aAbcde ⇒rm abbcde Handle Handle chuỗi chuỗi hợp với vế phải luật sinh thu gọn thành vế trái luật sinh dẫn đến ký hiệu chưa kết thúc bắt đầu Ví dụ 1.2: Xét văn phạm sau: E →E + E E →E * E E → (E) E→ id Chuỗi dẫn xuất phải: E ⇒rm E + E (các handle gạch dưới) ⇒rm E + E *E ⇒rm E + E * id3 ⇒rm E + id2 * id3 ⇒rm id1+ id2 * id3 Cắt tỉa handle (Handle Pruning) Handle pruning kỹ thuật dùng để tạo dẫn xuất phải đảo ngược từ chuỗi ký hiệu kết thúc w mà muốn phân tích Nếu w câu văn phạm w = γn Trong đó, γn dạng câu phải thứ n dẫn xuất phải mà chưa biết S ⇒ γ0 ⇒rm γ1 ⇒rm γ2 ⇒rmγn-1 ⇒rm γn= w Ðể xây dựng dẫn xuất theo thứ tự ngược lại, tìm handle βn γn thay βn An (An vế trái luật sinh An → βn) để dạng câu phải thứ n - γn-1 Nếu ta có dạng câu phải γ0= S phân tích thành công Ví dụ 1.3: Với văn phạm: E →E +E | E *E | (E)| id Và câu nhập: id1 + id2 * id3, ta có bước thu gọn câu nhập thành ký hiệu bắt đầu E sau: Dạng câu phải Handle id1+ id2 *id3 E + id2 *id3 E + E *id3 E + E *E E+E E id1 id2 id3 E *E E+E Luật thu gọn E →id E →id E →id E →E * E E →E + E Thành công Cài đặt phân tích cú pháp Shift - Reduce Có hai vấn đềc ần phải giải dùng kỹ thuật phân tích cú pháp Thứ định vị chuỗi cần thu gọn dạng câu dẫn phải, thứ hai xác định luật sinh dùng có nhiều luật sinh chứa chuỗi vế phải Cấu tạo: Dùng Stack để lưu ký hiệu văn phạm Dùng đệm nhập INPUT đểgiữchuỗi nhập cần phân tích w Ta dùng ký hiệu $ để đánh dấu đáy Stack xác định cuối chuỗi nhập Hoạt động: Khởi đầu Stack rỗng w nằm đệm input Bộ phân tích đẩy ký hiệu nhập vào Stack handle β nằm đỉnh Stack Thu gọn β thành vế trái luật sinh Lặp lại bước gặp lỗi Stack chứa ký hiệu bắt đầu đệm input rỗng (thông báo kết thúc thành công) Ví dụ 1.4: Với văn phạm E →E +E | E *E | (E)| id câu nhập id1 + id2 * id3 Quá trình phân tích cú pháp thực sau: STACK $ $ id1 $E $E+ $ E + id2 $E+E $E+E* $ E + E *id3 $ E + E *E $E+E $E INPUT id1+ id2 *id3 $ + id2 *id3 $ + id2 *id3 $ id2 *id3 $ *id3 $ *id3 $ id3 $ $ $ $ $ ACTION Đẩy Thu gọn E →id Đẩy Đẩy Thu gọn E →id Đẩy Đẩy Thu gọn E →id Thu gọn E →E *E Thu gọn E →E + E Chấp nhận II Operator - Precedence parsing Lớp văn phạm có tính chất luật sinh có vế phải ε có hai ký hiệu chưa kết thúc nằm kế dễ dàng xây dựng phân tích cú pháp Shift- Reduce hiệu theo lối thủ công Một kỹ thuật phân tích dễ cài đặt gọi phân tích cú pháp thứ bậc toán tử (Operator - Precedence parsing) Quan hệ thứ tự ưu tiên Bảng định nghĩa quan hệ thứ bậc cho sau: Quan hệ Ý nghĩa a b a có độ ưu tiên cao b b a có độ ưu tiên b Sử dụng quan hệ thứ tự ưu tiên toán tử Các quan hệ ưu tiên giúp việc xác định handle Trước hết, ta dựa vào quy tắc sau để xây dựng bảng quan hệ ưu tiên ký hiệu kết thúc Nếu toán tử θ1 có độ ưu tiên cao θ2 θ1 •> θ2 θ2 θ2 θ2 •> θ1 toán tử kết hợp trái θ1 - ;- •> - ; - •> + Phép toán ↑ kết hợp phải nên ↑ •> •> + * •> •> $ [...]... phạm này trong hầu hết các kết cấu ngôn ngữ lập trình điển hình Có một sự khác biệt rất lớn giữa các văn phạm LL và LR Ðể cho một văn phạm là LR (k), chúng ta phải có khả năng nhận diện được sự xuất hiện của vế phải của một luật sinh ứng với k ký hiệu đọc trước Ðòi hỏi này ít khắt khe hơn so với các văn phạm LL (k) Vì vậy, các văn phạm LR có thể mô tả được nhiều ngôn ngữ hơn so với các văn phạm LL 3 Xây... hợp các mục LR(1) C = { I0, I1, , In } 2 Với mỗi hạt nhân tồn tại trong tập các mục LR (1) tìm trên tất cả các tập hợp có cùng hạt nhân này và thay thế các tập hợp này bởi hợp của chúng 3 Ðặt C' = {I0, I1, , Im } là kết quả thu được từ C bằng cách hợp các tập hợp có cùng hạt nhân Action tương ứng với trạng thái i được xây dựng từ Ji theo cách thức như giải thuật 3.4 Nếu có một sự đụng độ giữa các action... ACTION Shift Reduce by F→ id Reduce by T → F Shift Shift Reduce by F → id Reduce by T → T * Reduce by E→ T Shift Shift Reduce by F → id Reduce by T → F Reduce by E→ E + T Thành công 2 Văn phạm LR Làm thế nào để xây dựng được một bảng phân tích cú pháp LR cho một văn phạm đã cho? Một văn phạm có thể xây dựng được một bảng phân tích cú pháp cho nó được gọi là văn phạm LR Có những văn phạm phi ngữ cảnh không... pháp LALR Phần này giới thiệu phương pháp cuối cùng để xây dựng bộ phân tích cú pháp LR - kỹ thuật LALR (Lookahead-LR), phương pháp này thường được sử dụng trong thực tế bởi vì những bảng LALR thu được nói chung là nhỏ hơn 21 nhiều so với các bảng LR chính tắc và phần lớn các kết cấu cú pháp của ngôn ngữ lập trình đều có thể được diễn tả thuận lợi bằng văn phạm LALR a Hạt nhân (core) của một tập hợp mục... có hạt nhân (core) là tập hợp {A → α •β} 2 Trong họ tập hợp các mục LR (1) C = {I0, I1, , In } có thể có các tập hợp các mục có chung một hạt nhân Ví dụ 3.10: Trong ví dụ 3.8, ta thấy trong họ tập hợp mục có một số các mục có chung hạt nhân là: I4 và I11 I5 và I12 I7 và I13 I8 và I10 b Thuật toán xây dựng bảng phân tích cú pháp LALR Giải thuật 3.5: Xây dựng bảng phân tích LALR Input: Văn phạm tăng... S' thì action[i, a] = " reduce (A → α)" • Nếu [S' → S•, $] ∈ Ii thì action [i, $] = "accept" Nếu có một sự đụng độ giữa các luật nói trên thì ta nói văn phạm không phải là LR (1) và giải thuật sẽ thất bại 3 Nếu goto (Ii, A) = Ij thì goto [i,A] = j 20 4 Tất cả các ô không xác định được bởi 2 và 3 đều là "error" 5 Trạng thái khởi đầu của bộ phân tích cú pháp được xây dựng từ tập các mục chứa [S' → •S,$]... action [i, a] = "reduce (A → α)", ∀a ∈ FOLLOW (A) • Nếu S' → S• ∈ Ii thì action [i, $] = "accept" Nếu một action đụng độ được sinh ra bởi các luật trên, ta nói văn phạm không phải là SLR (1) Giải thuật sinh ra bộ phân tích cú pháp sẽ thất 15 bại trong trường hợp này 3 Với mọi ký hiệu chưa kết thúc A, nếu goto (Ii,A) = Ij thì goto [i, A] = j 4 Tất cả các ô không xác định được bởi 2 và 3 đều là “error”... action [2, =] = "reduce (R → L)" ⇒ Có sự đụng độ tại action [2, =] Vậy văn phạm trên không là văn phạm SLR(1) 17 4 Xây dựng bảng phân tích cú pháp LR chính tắc (Canonical LR Parsing Table) a Mục LR (1) của văn phạm G là một cặp dạng [A → α•β, a], trong đó A → αβ là luật sinh, a là một ký hiệu kết thúc hoặc $ b Thuật toán xây dựng họ tập hợp mục LR (1) Giải thuật 3.3: Xây dựng họ tập hợp các mục LR (1)... (goto (I, +) = closure (I') bao gồm các mục : E→ E+•T (Luật 1) T→ •T*F (Luật 2) T→ •F (Luật 2) F → • (E) (Luật 2) F → • id (Luật 2) e Giải thuật xây dựng họ tập hợp các mục LR (0) của văn phạm G' Gọi C là họ tập hợp các mục LR (0) của văn phạm tăng cường G' Ta có thủ tục xây dựng C như sau: Procedure Item (G') Begin C:= closure ({ S' → •S}); 13 Repeat For Với mỗi tập các mục I trong C và mỗi ký hiệu văn... T•*F Goto (I7,F) Goto (I8,) ) I10 I: 11 T→ T*F• F → (E) • f Thuật toán xây dựng bảng phân tích SLR : Giải thuật 3.2: Xây dựng bảng phân tích SLR Input: Một văn phạm tăng cường G' Output: Bảng phân tích SLR với hàm action và goto Phương pháp: 1 Xây dựng C = {I0, I1, , In}, họ tập hợp các mục LR(0) của G' 2 Trạng thái i được xây dựng từ Ii Các action tương ứng trạng thái i được xác định như sau: • Nếu ... kết hợp phải Ví dụ 2.1: Toán tử + - có độ ưu tiên kết hợp trái nên: + •> + ; + •> - ;- •> - ; - •> + Phép toán ↑ kết hợp phải nên ↑

Ngày đăng: 17/04/2016, 21:23

Từ khóa liên quan

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

Tài liệu liên quan