Thuật toán hiệu quả để cập nhật cây phân tích cú pháp


14

Giả sử tôi có một khối mã lớn mà tôi đã viết và phân tích cú pháp.
Giả sử chỉ cần một nhân vật thay đổi; Tôi muốn cập nhật phân tích cú pháp của mình, nhưng vì sửa đổi rất nhỏ so với toàn bộ, tôi muốn biết liệu có thể không phân tích lại toàn bộ hay không, nhưng nếu có thuật toán để xác định phạm vi để phân tích lại và để xử lý chính xác các ranh giới mã thông báo di chuyển.

Cảm ơn trước!


1
Xin chào, và chào mừng! Tôi không phải là một chuyên gia về chủ đề này, nhưng tôi nghĩ rằng từ khóa bạn đang tìm kiếm là phân tích cú pháp gia tăng hoặc biên dịch gia tăng .
MS Dousti

@Sadeq cảm ơn con trỏ! Bạn sẽ xem xét thêm một câu trả lời với một số chi tiết? Nó sẽ được đánh giá rất cao!
Agos

Câu trả lời:


9

Theo yêu cầu của @Agos, tôi đã biến nhận xét thành câu trả lời.

Đầu tiên, tôi phải thừa nhận rằng tôi không thực sự am hiểu về lĩnh vực này. Tuy nhiên, tôi khuyên bạn nên đọc các bài viết Xây dựng trình phân tích cú pháp thân thiệnPhân tích cú pháp tăng dần hiệu quả và linh hoạt để có cái nhìn về thuật toán nào được sử dụng để phân tích cú pháp gia tăng trước năm 2000.

Đối với phương pháp điều trị cập nhật, bạn có thể xem các giấy tờ này:

Thông tin thêm: Có (ít nhất) hai cách tiếp cận để phân tích / biên dịch:

  • Cách tiếp cận hàng loạt , trong đó toàn bộ khối mã được phân tích cú pháp / biên dịch.
  • Cách tiếp cận gia tăng , trong đó tài liệu được phân tích / biên dịch đầu tiên trong chế độ hàng loạt, sau đó các thay đổi được phát hiện và phân tích lại / biên dịch lại tối thiểu được áp dụng. Cách tiếp cận này không chỉ làm tăng tốc độ phân tích cú pháp / biên dịch, mà còn giúp các tính năng tiện lợi của IDE như biên dịch nền , có liên quan đến việc biên dịch lười biếng . (Bạn cũng có thể tìm kiếm về các tính năng thương mại như IntelliSense ).

1

nếu trình phân tích cú pháp gia tăng của bạn lưu trạng thái ở mỗi đầu dòng, bạn chỉ phân tích lại từ trạng thái trình phân tích cú pháp hợp lệ cuối cùng (ví dụ: sau khi phân tích đầy đủ, đây chỉ là bắt đầu dòng bắt đầu sửa đổi) và dừng phân tích cú pháp ở cuối của dòng nơi sửa đổi kết thúc (trình phân tích cú pháp bên trong có thể nhìn về phía trước ngoài sửa đổi để nhận ra cấu trúc đúng)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.