Tiếp nội dung phần 1, Bài giảng Chương trình dịch: Phần 2 cung cấp cho người học những kiến thức như: Trình bày các kiến thức cơ bản về: Vị trí, nhiệm vụ của giai đoạn phân tích cú pháp và các phương pháp phân tích cú pháp. Các kỹ thuật biến đổi văn phạm: khử đệ quy trái, thừa số hoá bên trái, khử nhập nhằng. Phương pháp phân tích top – down: phân tích cú pháp đệ quy xuống, phân tích cú pháp dự đoán. Phương pháp phân tích bottom – up: phân tích cú pháp đẩy thu, phân tích cú pháp LR(k).
Chƣơng Phân tích cúa pháp Chƣơng PHÂN TÍCH CÚ PHÁP Mục tiêu: Giúp sinh viên có khả năng: - Biết đƣợc vị trí, nhiệm vụ giai đoạn phân tích cú pháp - Biết đƣợc phƣơng pháp phân tích cú pháp - Hiểu đƣợc kỹ thuật biến đổi văn phạm - Hiểu đƣợc kỹ thuật phƣơng pháp phân tích top - down - Hiểu đƣợc kỹ thuật phƣơng pháp phân tích bottom - up - Vận dụng kỹ thuật vào phân tích cú cho số văn phạm đơn giản Nội dung chính: - Vị trí, nhiệm vụ giai đoạn phân tích cú pháp phƣơng pháp phân tích cú pháp - Các kỹ thuật biến đổi văn phạm: khử đệ quy trái, thừa số hoá bên trái, khử nhập nhằng - Phƣơng pháp phân tích top – down: phân tích cú pháp đệ quy xuống, phân tích cú pháp dự đốn - Phƣơng pháp phân tích bottom – up: phân tích cú pháp đẩy thu, phân tích cú pháp LR(k) 3.1 Giai đoạn phân tích cú pháp 3.1.1 Vị trí, chức năng, nhiệm vụ giai đoạn phân tích cú pháp Giai đoạn phân tích cú pháp giai đoạn giai đoạn phân tích từ vựng trƣớc giai đoạn phân tích ngữ nghĩa Chức giai đoạn phân tích cú pháp phân tích chƣơng trình nguồn mặt cú pháp: Xây dụng phân tích cú pháp báo lỗi Nhiệm vụ giai đoạn nhận vào dịng thẻ từ (token) có đƣợc từ giai đoạn phân tích từ vựng xác nhận đƣợc sinh từ văn phạm ngôn ngữ nguồn cách tạo phân tích cú pháp cho dịng thẻ từ đầu phân tích cú pháp (parsing tree) Ngồi ra, phân tích cú pháp cịn có chế ghi nhận lỗi cú pháp theo phƣơng thức linh hoạt có khả phục hồi đƣợc 76 Chƣơng Phân tích cúa pháp lỗi thƣờng gặp để tiếp tục xử lý phần lại xâu vào Có thể vị trí giai đoạn với giai đoạn liên quan hình 3.1 Chƣơng trình nguồn Bộ phân tích từ vựng Thẻ từ Bộ phân tích cú pháp Cây phân tích cú pháp (Parsing tree) Yêu cầu Thẻ từ Phần lại front end Bảng ký hiệu Hình 3.1 Vị trí phân tích cú pháp 3.1.2 Xử lý lỗi cú pháp Chƣơng trình nguồn chứa lỗi nhiều mức độ khác nhau: - Lỗi từ vựng: nhƣ tên, từ khóa, tốn tử viết khơng - Lỗi cú pháp: nhƣ ghi biểu thức toán học với dấu ngoặc đóng mở khơng cân bằng, thiếu dấu chấm phảy (;), thiếu từ khoá - Lỗi ngữ nghĩa: nhƣ toán tử áp dụng vào tốn hạng khơng tƣơng thích, sai kiểu liệu - Lỗi logic: nhƣ thực lời gọi đệ quy kết thúc Phần lớn việc phát phục hồi lỗi chƣơng chƣơng trình biên dịch tập trung vào giai đoạn phân tích cú pháp Vì thế, xử lý lỗi (error handler) trình phân tích cú pháp phải đạt đƣợc mục đích sau: - Ghi nhận thông báo lỗi cách rõ ràng xác - Phục hồi lỗi cách nhanh chóng để xác định lỗi - Khơng làm chậm tiến trình chƣơng trình 3.1.3 Các chiến lƣợc phục hồi lỗi Phục hồi lỗi kỹ thuật vƣợt qua lỗi để tiếp tục trình dịch Nhiều chiến lƣợc phục hồi lỗi dùng phân tích cú pháp Mặc dù khơng có chiến lƣợc đƣợc chấp nhận hoàn toàn nhƣng số chúng đƣợc áp dụng rộng rãi Ở giới thiệu số chiến lƣợc: 1) Phương thức "hoảng sợ" (panic mode recovery) 77 Chƣơng Phân tích cúa pháp Đây phƣơng pháp đơn giản cho cài đặt dùng cho hầu hết phƣơng pháp phân tích Khi lỗi đƣợc phát phân tích cú pháp bỏ qua ký hiệu tìm thấy tập hợp đƣợc định token đồng (synchronizing tokens), token đồng thƣờng dấu chấm phẩy (;) end 2) Chiến lược mức ngữ đoạn (phrase_level recovery) Khi phát lỗi, phân tích cú pháp thực hiệu chỉnh cục phần lại xâu vào Cụ thể thay phần đầu lại chuỗi ký tự tiếp tục Chẳng hạn, dấu phẩy (,) dấu chấm phẩy (;), xóa dấu phẩy lạ thêm vào dấu chấm phẩy 3) Chiến lược dùng luật sinh sửa lỗi (error production) Thêm vào văn phạm ngôn ngữ luật sinh lỗi sử dụng văn phạm để xây dựng phân tích cú pháp, giúp sinh đốn lỗi thích hợp để cấu trúc lỗi đƣợc nhận biết xâu vào 4) Chiến lược hiệu chỉnh toàn cục (global correction) Một cách lý tƣởng chƣơng trình biên dịch tạo số thay đổi xử lý lỗi Có giải thuật để lựa chọn số tối thiểu thay đổi để đạt đƣợc hiệu chỉnh có chi phí tồn cục nhỏ Cho xâu vào có lỗi x văn phạm G, giải thuật tìm đƣợc phân tích cú pháp cho xâu y mà số lƣợng thao tác chèn, xóa thay đổi token cần thiết để chuyển x thành y nhỏ Nói chung, kỹ thuật dạng nghiên cứu lý thuyết 3.1.4 Các phƣơng pháp phân tích cú pháp Hiện có nhiều phƣơng pháp phân tích cú pháp khác nhau; nhiên, ngƣời ta phân chúng thành loại: phƣơng pháp phân tích tổng hợp, phƣơng pháp phân tích top – down phƣơng pháp phân tích bottom – up 1) Phương pháp phân tích tổng hợp (Universal parsing) Tiêu biểu cho phƣơng pháp phân tích tổng hợp giải thuật Cooke – Young Kasami giải thuật Earley; Ngƣời ta gọi chúng giải thuật tổng hợp hay giải thuật vạn chúng phân tích cú pháp cho văn phạm Tuy nhiên tính vạn chúng nói chung phƣơng pháp không hiệu với 78 Chƣơng Phân tích cúa pháp văn phạm cụ thể; lý trên, ngƣời ta sử dụng chúng để viết chƣơng trình dịch (Compiler) 2) Phương pháp phân tích Top – Down Về mặt trực giác coi phƣơng pháp phân tích Top – Down phƣơng pháp xây dựng phân tích cú pháp từ xuống hay xem nhƣ nỗ lực xây dựng phân tích cú pháp nút gốc phát sinh dần xuống (Root – Leaves) 3) Phương pháp phân tích Bottom – Up Về mặt trực giác coi phƣơng pháp phân tích Bottom – Up xây dựng phân tích cú pháp từ dƣới lên hay hay xem nhƣ nỗ lực xây dựng phân tích cú pháp nút thu gọn dần gốc (Leaves – root) 3.2 Biến Ðổi văn phạm phi ngữ cảnh Nhiều ngơn ngữ lập trình có cấu trúc đệ quy mà đƣợc định nghĩa văn phạm phi ngữ cảnh (context-free grammar) G với thành phần G = (N, T, P, S), đó: - N : tập hữu hạn ký hiệu chƣa kết thúc hay biến (variables) - T : tập hữu hạn ký hiệu kết thúc (terminals) với N T = - P : tập luật sinh văn phạm (productions) có dạng: A với A N V* = (NT)* - S N: ký hiệu bắt đầu văn phạm (start symbol) Ví dụ: Văn phạm với luật sinh sau cho phép định nghĩa biểu thức số học đơn giản (với E biểu thức - expression) : E → EAE | (E) | - E | id ; A→+|-|*|/|↑ 3.2.1 Cây phân tích cú pháp (Parsing tree) dẫn xuất Ta nói αAβ dẫn xuất αγβ (ký hiệu: αAβ αγβ) A → γ luật sinh, α β chuỗi tùy ý ký hiệu văn phạm Nếu α α α ta nói α dẫn xuất (suy ra) α n Ký hiệu : dẫn xuất qua bƣớc 79 n Chƣơng Phân tích cúa pháp * : dẫn xuất qua 0, nhiều bƣớc + : dẫn xuất qua nhiều bƣớc i : dẫn xuất qua i bƣớc Ta có tính chất: * α α với α * * α β β γ α * γ + Cho văn phạm G với ký hiệu bắt đầu S Ta dùng quan hệ để định nghĩa L(G) ngôn ngữ đƣợc sinh G Xâu ký hiệu kết thúc w thuộc + L(G) S w xâu w đƣợc gọi câu G Một ngôn ngữ đƣợc sinh văn phạm phi ngữ cảnh gọi ngôn ngữ phi ngữ cảnh Nếu hai văn phạm sinh ngơn ngữ chúng đƣợc gọi hai văn phạm tƣơng đƣơng * Nếu S α, α chứa ký hiệu chƣa kết thúc ta nói α dạng câu (sentential form) G Một câu dạng câu chứa tồn ký hiệu kết thúc Cây phân tích cú pháp hình ảnh minh họa cho ký hiệu bắt đầu văn phạm dẫn đến xâu ngôn ngữ Nếu ký hiệu chƣa kết thúc A có luật sinh A XYZ phân tích cú pháp có nút có nhãn A có nút có nhãn tƣơng ứng từ trái qua phải X, Y, Z A X Y Z Hình 3.2 Minh họa phân tích cú pháp Một cách hình thức, cho văn phạm phi ngữ cảnh phân tích cú pháp có tính chất sau đây: Nút gốc có nhãn ký hiệu bắt đầu 80 Chƣơng Phân tích cúa pháp Mỗi có nhãn ký hiệu kết thúc ε Mỗi nút có nhãn ký hiệu chƣa kết thúc Nếu A ký hiệu chƣa kết thúc đƣợc dùng làm nhãn cho nút X1, , Xn nhãn của theo thứ tự từ trái sang phải A → X1X2 Xn luật sinh Ở X1, , Xn ký hiệu kết thúc chƣa kết thúc Ðặc biệt, A → ε nút có nhãn A có có nhãn ε Một phân tích cú pháp xem nhƣ biểu diễn cho dẫn xuất Ðể hiểu đƣợc phân tích cú pháp làm việc ta cần xét dẫn xuất có ký hiệu chƣa kết thúc trái dạng câu đƣợc thay bƣớc, dẫn xuất nhƣ đƣợc gọi dẫn xuất trái Nếu α β ký hiệu chƣa kết thúc trái α đƣợc thay thế, ta viết α * Nếu S * lm lm β α ta nói α dạng câu trái văn phạm Tƣơng tự, ta có dẫn xuất phải - cịn gọi dẫn xuất tắc (canonical derivations) Ví dụ 3.1: Cho văn phạm G = ( N, T, P, S); Tập P gồm quy tắc: E E + E; E E * E; E (E); E - E; E id Khi phân tích cú pháp cho xâu - (id + id) có dạng hình 3.2 E E ( ) E E E + id id Hình 3.3 Minh họa phân tích cú pháp Ðể thấy mối quan hệ phân tích cú pháp dẫn xuất, ta xét dẫn xuất: α α α n Với α ta xây dựng phân tích cú pháp Ví dụ với dẫn xuất: i 81 Chƣơng Phân tích cúa pháp E -E - (E) - (E + E) - (id + E) - (id + id) Q trình xây dựng phân tích cú pháp nhƣ sau: E E E - E - E ) ( E E E E ( ) E ( E E E - E + E + id E ) E E ( ) E E E + id id Hình 3.4 Xây dựng phân tích cú pháp từ dẫn xuất 3.2.2 Ngôn ngữ nhập nhằng (Ambiguity) Trong lý thuyết ngôn ngữ hình thức đề cập đến tính nhập nhằng văn phạm; để tiện cho việc trình bày, ta đƣa khái niệm tƣơng tự văn phạm nhập nhằng Văn phạm đƣợc gọi nhập nhằng tồn xâu có hai phân tích cú pháp khác Nói cách khác văn phạm đƣợc gọi nhập nhằng tồn xâu có nhiều phân tích cú pháp cho dẫn xuất trái hay phải Ngôn ngữ đƣợc sinh văn phạm nhập nhằng gọi ngôn ngữ nhập nhằng 82 Chƣơng Phân tích cúa pháp Ví dụ 3.2: Cho văn phạm: G = ( N, T, P, E) Tập P gồm quy tắc: E E + E; E E * E; E (E); E - E; E id Xét xâu id + id * id, xâu có hai dẫn xuất trái là: a) E E + E id + E id + E * E id + id * E id + id * id b) E E * E E + E * E id + E * E id + id * E id + id * id Hình 3.5a 3.5b hai phân tích cú pháp xâu E E E E + id E E * E E * id E id + id E id id a) b) Hình 3.5 Hai phân tích cú pháp xâu id + id * id Vậy văn phạm văn phạm nhập nhằng 3.2.3 Kỹ thuật khử nhập nhằng Nếu văn phạm nhập nhằng gặp xâu có nhiều phân tích cú pháp; ta khơng thể xác định đƣợc phân tích cú pháp đƣợc chọn Vì vậy, ta phải viết lại văn phạm nhằm loại bỏ nhập nhằng Chẳng hạn, xét văn phạm với luật sinh : IF THEN IF THEN ELSE Other Các luật sinh định nghĩa câu lện IF, ứng với biến câu lệnh; - biến biểu thức; other câu lệnh khác Ký hiệu E biểu thức; S câu lệnh xét câu lệnh sau: IF E1 THEN IF E2 THEN S1 ELSE S2 83 Chƣơng Phân tích cúa pháp Văn phạm văn phạm nhập nhằng câu lệnh có hai phân tích cú pháp trái hình 3.6a hình 3.6b sttm if expr then E1 sttm if expr then E2 sttm else sttm S2 S1 a) sttm if expr then E1 sttm if expr else then E2 sttm sttm S2 S1 b) Hình 3.6 Hai phân tích cú pháp xâu Để khử tính nhập nhằng văn phạm nêu trên, ngƣời ta thƣờng khắc phục cách cho ELSE ứng với THEN gần trƣớc Theo nguyên tắc này, ta sửa lại luật sinh nhƣ sau: IF THEN ELSE other IF THEN IF THEN ELSE 3.2.4 Kỹ thuật khử đệ quy trái Trong lý thuyết ngơn ngữ hình thức, xét dạng chuẩn Greibach đề cập đến A - luật sinh Các A - luật sinh thƣờng làm cho văn phạm trở thành đệ quy 84 Chƣơng Phân tích cúa pháp trái Ở đây, ta nhắc lại khái niệm kỹ thuật khử đệ quy trái nêu bổ đề Greibach 1) Khái niệm Một văn phạm phi ngữ cảnh đƣợc gọi đệ quy trái tồn dẫn xuất dạng: A + A với AN; V+ = (NT)+ Phƣơng pháp phân tích Top – Down không khắc phục đƣợc trƣờng hợp văn phạm đệ quy trái Vì vậy, để sử dụng đƣợc phƣơng pháp phân tích Top – Down cần phải khử tính đệ quy trái văn phạm Ðệ quy trái có hai loại : - Trực tiếp: Dạng A Aα ; i - Gián tiếp: A Aα với i ≥ Ví dụ 3.3: Xét văn phạm nhƣ sau: S → Aa | b; A→ Ac | Sd | a Biến A biến đệ quy trái (trực tiếp) A Ac nhờ áp dụng luật sinh A→ Ac Biến S, A biến đệ quy trái (gián tiếp); Vì S Aa Sda nhờ áp dụng luật sinh S → Aa; A→ Sd A Sd Aad nhờ áp dụng luật sinh A→ Sd; S → Aa 2) Kỹ thuật khử đệ quy trái a) Khử đệ quy trái trực tiếp Nếu luật sinh có dạng: A → Aα1 | Aα2 | | Aαm | β1 | β2 | | βn thêm vào biến A‟ thay luật sinh luật sinh: A → β1A‟ | β2A‟ | | βnA‟ Và A‟ → α1A‟| α2A‟ | | αm A‟ | ε Ví dụ 3.4: - Xét văn phạm sinh biểu thức số học có luật sinh sau: E E + T; E T ; T T*F; T F ; F (E); F id 85 ... Phân tích cúa pháp E -E - (E) - (E + E) - (id + E) - (id + id) Quá trình xây dựng phân tích cú pháp nhƣ sau: E E E - E - E ) ( E E E E ( ) E ( E E E - E + E + id E ) E E (... root) 3 .2 Biến Ðổi văn phạm phi ngữ cảnh Nhiều ngơn ngữ lập trình có cấu trúc đệ quy mà đƣợc định nghĩa văn phạm phi ngữ cảnh (context-free grammar) G với thành phần G = (N, T, P, S), đó: - N :... sau: - Ghi nhận thơng báo lỗi cách rõ ràng xác - Phục hồi lỗi cách nhanh chóng để xác định lỗi - Khơng làm chậm tiến trình chƣơng trình 3.1.3 Các chiến lƣợc phục hồi lỗi Phục hồi lỗi kỹ thuật