Thiết kế trình biên dịch - Khôi phục lỗi

Một trình phân tích cú pháp sẽ có thể phát hiện và báo cáo bất kỳ lỗi nào trong chương trình. Dự kiến ​​rằng khi gặp lỗi, trình phân tích cú pháp sẽ có thể xử lý nó và tiếp tục phân tích cú pháp phần còn lại của đầu vào. Hầu hết nó được mong đợi từ trình phân tích cú pháp để kiểm tra lỗi nhưng lỗi có thể gặp phải ở các giai đoạn khác nhau của quá trình biên dịch. Một chương trình có thể có các loại lỗi sau ở các giai đoạn khác nhau:

  • Lexical : tên của một số định danh được nhập sai

  • Syntactical : thiếu dấu chấm phẩy hoặc dấu ngoặc đơn không cân đối

  • Semantical : gán giá trị không tương thích

  • Logical : không thể truy cập mã, vòng lặp vô hạn

Có bốn chiến lược khôi phục lỗi phổ biến có thể được thực hiện trong trình phân tích cú pháp để xử lý các lỗi trong mã.

Chế độ hoảng sợ

Khi trình phân tích cú pháp gặp lỗi ở bất kỳ đâu trong câu lệnh, nó sẽ bỏ qua phần còn lại của câu lệnh bằng cách không xử lý đầu vào từ đầu vào sai thành dấu phân cách, chẳng hạn như dấu chấm phẩy. Đây là cách dễ nhất để khôi phục lỗi và nó cũng ngăn trình phân tích cú pháp phát triển các vòng lặp vô hạn.

Chế độ tuyên bố

Khi trình phân tích cú pháp gặp lỗi, trình phân tích cú pháp sẽ cố gắng thực hiện các biện pháp sửa chữa để phần còn lại của đầu vào của câu lệnh cho phép trình phân tích cú pháp phân tích cú pháp trước. Ví dụ, chèn một dấu chấm phẩy bị thiếu, thay thế dấu phẩy bằng dấu chấm phẩy, v.v. Các nhà thiết kế phân tích cú pháp phải cẩn thận ở đây vì một lần sửa sai có thể dẫn đến một vòng lặp vô hạn.

Lỗi sản xuất

Các nhà thiết kế trình biên dịch đã biết một số lỗi phổ biến có thể xảy ra trong mã. Ngoài ra, các nhà thiết kế có thể tạo ngữ pháp tăng cường để sử dụng, như các sản phẩm tạo ra các cấu trúc sai khi gặp những lỗi này.

Hiệu chỉnh toàn cầu

Trình phân tích cú pháp xem xét chương trình trong tay tổng thể và cố gắng tìm ra chương trình dự định làm gì và cố gắng tìm ra kết quả phù hợp nhất cho chương trình mà không có lỗi. Khi một đầu vào (câu lệnh) X có lỗi được cung cấp, nó sẽ tạo ra một cây phân tích cú pháp cho một số câu lệnh không có lỗi gần nhất Y. Điều này có thể cho phép trình phân tích cú pháp thực hiện những thay đổi tối thiểu trong mã nguồn, nhưng do độ phức tạp (thời gian và không gian) của chiến lược này, nó vẫn chưa được thực hiện trong thực tế.

Cây cú pháp trừu tượng

Các biểu diễn cây phân tích cú pháp không dễ dàng được trình biên dịch phân tích cú pháp, vì chúng chứa nhiều chi tiết hơn thực tế cần thiết. Lấy cây phân tích cú pháp sau làm ví dụ:

Nếu theo dõi kỹ, chúng tôi thấy hầu hết các nút lá là con đơn lẻ đối với các nút cha của chúng. Thông tin này có thể được loại bỏ trước khi cấp cho giai đoạn tiếp theo. Bằng cách ẩn thông tin bổ sung, chúng ta có thể có được một cây như hình dưới đây:

Cây trừu tượng có thể được biểu diễn dưới dạng:

AST là cấu trúc dữ liệu quan trọng trong trình biên dịch với ít thông tin không cần thiết nhất. AST nhỏ gọn hơn một cây phân tích cú pháp và có thể dễ dàng sử dụng bởi trình biên dịch.