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] Giới hạn số lỗi báo cáo với đồng bộ theo dòng

    Nhiều trình biên dịch áp dụng đồng thời hai cơ chế xử lý lỗi: đồng bộ theo dòng (khi phát hiện lỗi đầu tiên trên một dòng, bỏ qua toàn bộ phần còn lại của dòng đó — vì các lỗi tiếp theo trên cùng dòng nhiều khả năng chỉ là hệ quả của lỗi đầu) và giới hạn số lỗi tối đa MMM (nếu số lỗi đã báo cáo đạt đến MMM, mọi lỗi phát hiện thêm sẽ khiến trình biên dịch dừng ngay lập tức để tránh tràn ngập thông báo).

    Mã nguồn đã được tiền xử lý thành nnn dòng, mỗi dòng là một chuỗi chỉ gồm ký tự 0 và 1 (độ dài tuỳ ý, có thể 0), trong đó 1 ở vị trí jjj (1-based, theo thứ tự ký tự trong dòng) nghĩa là token thứ jjj của dòng đó có lỗi cú pháp.

    Xử lý từng dòng theo thứ tự 1,2,…,n1, 2, \ldots, n1,2,…,n:

    • Quét dòng từ trái sang phải, tìm ký tự 1 đầu tiên (nếu có) ở vị trí jjj. Nếu không có 1 nào, dòng này không có lỗi, chuyển sang dòng kế tiếp.
    • Nếu có lỗi tại vị trí jjj: xét số lỗi đã báo cáo tính đến hiện tại (chưa tính lỗi này).
      • Nếu số đó nhỏ hơn MMM: báo cáo lỗi này (dòng hiện tại, vị trí jjj), rồi bỏ qua phần còn lại của dòng, chuyển sang dòng kế tiếp.
      • Nếu số đó đã bằng MMM (đã đạt giới hạn): trình biên dịch dừng ngay tại dòng này (không báo cáo lỗi này), không xét bất kỳ dòng nào sau đó nữa.

    Nếu quét hết nnn dòng mà không bị dừng giữa chừng, biên dịch được xem là hoàn tất.

    Ví dụ: n=5n=5n=5, M=2M=2M=2, các dòng: 010, 000, 1, 01, 11. Dòng 1 có lỗi tại vị trí 2 → báo cáo (đã báo 1). Dòng 2 không có lỗi. Dòng 3 có lỗi tại vị trí 1 → báo cáo (đã báo 2, bằng MMM). Dòng 4 có lỗi tại vị trí 2 → nhưng đã báo đủ M=2M=2M=2 lỗi → dừng ngay tại dòng 4, không báo lỗi này, không xét dòng 5. Kết quả in ra:

    Line 1 Token 2
    Line 3 Token 1
    ABORTED at line 4
    
    • Định dạng đầu vào:
      • Dòng 1: hai số nguyên nnn và MMM (0≤n≤30000 \le n \le 30000≤n≤3000, 0≤M≤30000 \le M \le 30000≤M≤3000), cách nhau một khoảng trắng.
      • nnn dòng tiếp theo: nội dung từng dòng, chỉ gồm ký tự 0/1 (độ dài mỗi dòng không quá 200, có thể là dòng rỗng).
    • Định dạng đầu ra:
      • Nếu biên dịch hoàn tất (không bị dừng giữa chừng): in dòng đầu COMPLETED k với kkk là tổng số lỗi đã báo cáo, sau đó kkk dòng theo thứ tự báo cáo, mỗi dòng dạng Line L Token P.
      • Nếu bị dừng giữa chừng do vượt giới hạn: in MMM dòng lỗi đã báo cáo trước đó (dạng Line L Token P), rồi một dòng cuối ABORTED at line L2 với L2L2L2 là số thứ tự dòng gây ra việc dừng.

    Ví dụ:

    Đầu vào:

    3 3
    000
    0
    
    

    Đầu ra:

    COMPLETED 0
    

    Đầu vào:

    5 2
    010
    000
    1
    01
    11
    

    Đầu ra:

    Line 1 Token 2
    Line 3 Token 1
    ABORTED at line 4
    

    Đang tải editor...