Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Chế độ hoảng loạn: bỏ qua token đến điểm đồng bộ

    Chế độ hoảng loạn (panic-mode recovery) là kỹ thuật phục hồi lỗi cú pháp phổ biến nhất: khi gặp lỗi, trình phân tích loại bỏ các token liên tiếp cho đến khi gặp một token đồng bộ (synchronizing token) thuộc một tập cho trước (thường là dấu ;, }, các từ khóa bắt đầu câu lệnh, ...), rồi tiếp tục phân tích bình thường từ token đồng bộ đó.

    Cho một dãy nnn token, một tập các vị trí lỗi (các chỉ số 1-based mà tại đó trình phân tích phát hiện một lỗi cú pháp), và một tập token đồng bộ. Mô phỏng quá trình quét từ token 1 đến token nnn:

    • Nếu đang ở trạng thái bình thường (không phục hồi) và vị trí hiện tại nằm trong tập lỗi: báo cáo một lỗi, loại bỏ token này, chuyển sang trạng thái đang phục hồi (đang bỏ qua).
    • Nếu đang ở trạng thái bình thường và vị trí hiện tại không phải lỗi: giữ lại token này.
    • Nếu đang ở trạng thái phục hồi (đang bỏ qua): nếu token hiện tại thuộc tập đồng bộ, giữ lại token này và chuyển về trạng thái bình thường (phục hồi xong); ngược lại, loại bỏ token này và tiếp tục ở trạng thái phục hồi.

    Lưu ý quan trọng: nếu một vị trí lỗi khác rơi vào lúc đang ở trạng thái phục hồi, nó không được báo cáo thêm (bị ức chế) — vì trình phân tích lúc đó đang bỏ qua token, không "nhìn thấy" lỗi mới.

    Ví dụ: 8 token a b + ) c ; d e, lỗi tại vị trí 4 (token )), tập đồng bộ {;}\{;\}{;}. Token 1,2,3 (a b +) được giữ. Vị trí 4 là lỗi → báo cáo, loại bỏ, chuyển sang phục hồi. Token 5 (c) không phải đồng bộ → loại bỏ. Token 6 (;) là đồng bộ → giữ lại, hết phục hồi. Token 7,8 (d e) được giữ bình thường. Kết quả: 1 lỗi báo cáo, 2 token bị loại bỏ, dãy còn lại a b + ; d e.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) — số token.
      • Dòng 2: nnn token cách nhau khoảng trắng (dòng rỗng nếu n=0n=0n=0).
      • Dòng 3: số nguyên eee (0≤e≤n0 \le e \le n0≤e≤n) — số vị trí lỗi.
      • Dòng 4: eee số nguyên phân biệt trong khoảng [1,n][1,n][1,n] — các vị trí lỗi (dòng rỗng nếu e=0e=0e=0).
      • Dòng 5: số nguyên sss (0≤s≤500 \le s \le 500≤s≤50) — số loại token đồng bộ.
      • Dòng 6: sss token đồng bộ, cách nhau khoảng trắng (dòng rỗng nếu s=0s=0s=0).
    • Định dạng đầu ra:

      In ra 3 dòng:

      • Dòng 1: số lỗi thực sự được báo cáo (sau khi đã ức chế lỗi trùng lặp trong lúc phục hồi).
      • Dòng 2: số token bị loại bỏ.
      • Dòng 3: các token còn lại sau phục hồi, theo đúng thứ tự, cách nhau một khoảng trắng (dòng rỗng nếu không còn token nào).

    Ví dụ:

    Đầu vào:

    8
    a b + ) c ; d e
    1
    4
    1
    ;
    

    Đầu ra:

    1
    2
    a b + ; d e
    

    Đầu vào:

    5
    x y z w q
    0
    
    1
    ;
    

    Đầu ra:

    0
    0
    x y z w q
    

    Đang tải editor...