- Địa điểm: Giảng đường do P2 phđn công Nội dung chính:
1. Sắp xếp câc ký hiệu không kết thúc theo thứ tự A1, A2, , An 2 Âp dụng thuật toân sau:
4.2.3. Một số chiến lược phục hồi lỗ
Trong SA, sẽ rất bất tiện nếu chương trình dừng vă thơng bâo lỗi ngay khi gặp lỗi đầu tiín. Vì thế cần phải có kỹ thuật để vượt qua câc lỗi cú phâp để tiếp tục quâ trình dịch - Câc kỹ thuật phục hồi lỗi.
Phần lớn việc phât hiện vă phục hồi lỗi trong một trình biện dịch tập trung văo giai đoạn SA.
Bộ xử lý lỗi (error handler) trong compiler:
Ghi nhận vă thơng bâo lỗi một câch rõ răng vă chính xâc.
Phục hồi lỗi một câch nhanh chóng để có thể xâc định câc lỗi tiếp theo.
Khơng lăm chậm tiến trình của một chương trình đúng. Lỗi có thể xảy ra trong phđn tích dự đôn (LL(1) parsing)
Nếu ký hiệu kết thúc ở đỉnh stack không so khớp với ký hiệu đang xĩt.
Nếu đỉnh của stack lă một ký hiệu chưa kết thúc A, còn ký hiệu đang xĩt lă a, trong khi đó trín bảng phđn tích ơ M[A,a] lă rỗng. Khi đó, chương trình dịch phải xử lý thế năo?
Đưa ra một thơng bâo lỗi (căng chính xâc vă rõ răng căng tốt về lỗi xảy ra).
Đânh dấu lỗi năy vă tiếp tục phđn tích phần cịn lại. Phương thức “hoảng sợ” (Panic-Mode Error Recovery):
Khi một lỗi được phât hiện thì bộ phđn tích cú phâp bỏ qua từng ký hiệu một cho đến khi tìm thấy một token đồng bộ (synchronizing token);
câc token đồng bộ của ký hiệu phụ A lă tất cả câc ký hiệu kết thúc trong tập follow của A;
VD: Một câch phục hồi lỗi đơn giản theo phương thức hoảng sợ trong
LL(1) parsing:
Tất cả câc ô trống được đânh dấu lă synch để chỉ ra rằng parser sẽ bỏ qua mọi ký hiệu cho đến khi gặp ký hiệu trong tập follow(A)
trín đỉnh stack.
Để xử lý ký hiệu kết thúc khơng khớp, chương trình dịch loại nó ra khỏi stack vă đưa ra thơng bâo lỗi (rằng ký hiệu đó đó bị thay thế). Chiến lược mức ngữ đoạn (Phrase-Level Error Recovery):
37
Khi phât hiện một lỗi, SA hiệu chỉnh cục bộ trín phần cịn lại của dịng nhập. Cụ thể lă thay thế phần đầu còn lại bằng một chuỗi ký tự để có thể tiếp tục. Chẳng hạn, dấu phẩy (,) bởi dấu chấm phẩy (;), xóa một dấu phẩy lạ hoặc thím văo một dấu chấm phẩy.
Mỗi ô trống trong bảng ký hiệu đươc lấp đầy bởi con trỏ tới một thủ tục xử lý lỗi.
Câc thủ tục xử lý lỗi theo chiến lược mức ngữ đoạn có thể lă:
Thay đổi, chỉn, hoặc xóa bỏ câc ký tự nhập;
Đưa ra thơng bâo lỗi (gần đúng);
Loại bỏ một số phần tử (pop) ra khỏi stack.
Lưu ý: Việc lập câc thủ tục khơng đúng có thể dẫn đến việc lặp vơ hạn q trình xử lý.
Dùng câc luật sinh sửa lỗi (Error-Productions):
Thím văo văn phạm của ngơn ngữ những luật sinh lỗi vă sử dụng văn phạm năy để xđy dựng bộ phđn tích cú phâp, chúng ta có thể sinh ra bộ đơn lỗi thích hợp để chỉ ra cấu trúc lỗi được nhận biết trong dịng nhập;
Tuy nhiín phương phâp năy khơng thực tế. Chiến lược hiệu chỉnh toăn cục (Global-Correction):
Trong trường hợp lý tưởng, chương trình dịch thực hiện ít thay đổi, chỉn, xóa nhất có thể trong việc hiệu chỉnh lỗi.
Phđn tích một câch toăn cục chuỗi nhập: Cho một chuỗi nhập có lỗi x vă một văn phạm G, câc giải thuật năy sẽ tìm được một cđy phđn tích cú phâp cho chuỗi y mă số lượng câc thao tâc chỉn, xóa vă thay đổi token cần thiết để chuyển x thănh y lă nhỏ nhất..
Đđy lă phương phâp đang nghiín cứu vă chưa thực tế.