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] Tránh lỗi dây chuyền khi kiểm tra khai báo biến

    Một trình biên dịch mini kiểm tra ngữ nghĩa cơ bản trên nnn dòng lệnh, mỗi dòng có 1 trong 2 dạng:

    • DECL x — khai báo biến xxx.
    • USE x — sử dụng biến xxx.

    Có 2 loại lỗi ngữ nghĩa:

    1. Khai báo trùng: DECL x khi xxx đã được khai báo (bởi DECL hoặc do phục hồi ở mục 2) trước đó.
    2. Biến chưa khai báo: USE x khi xxx chưa từng được khai báo tính đến thời điểm đó.

    Nếu mỗi lần dùng biến chưa khai báo đều báo lỗi độc lập, một biến bị quên khai báo nhưng được dùng nhiều lần sẽ gây ra hiệu ứng lỗi dây chuyền (cascading errors) — rất nhiều lỗi giả chỉ vì 1 nguyên nhân gốc. Để tránh điều này, trình biên dịch áp dụng phục hồi: ngay khi báo lỗi "biến chưa khai báo" cho xxx, nó coi xxx là đã được khai báo ngầm định kể từ dòng đó trở đi, nên các lần USE x sau này sẽ không bị báo lỗi lại. Lưu ý: lỗi "khai báo trùng" thì không được phục hồi kiểu bỏ qua — mỗi lần DECL x khi xxx đã tồn tại đều tính là 1 lỗi riêng (khai báo trùng đó bị bỏ qua, không ảnh hưởng gì thêm tới trạng thái đã khai báo của xxx).

    Cho nnn dòng lệnh theo thứ tự, in ra: tổng số lỗi, và danh sách chỉ số dòng (đánh số từ 1) xảy ra lỗi, theo thứ tự tăng dần.

    Ví dụ: 5 dòng: DECL x / USE x / USE y / DECL y / USE y. Dòng 1: khai báo x. Dòng 2: dùng x, hợp lệ. Dòng 3: dùng y nhưng y chưa khai báo → lỗi, đồng thời y được coi là đã khai báo ngầm định. Dòng 4: khai báo y nhưng y đã "khai báo" (ngầm định) → lỗi trùng. Dòng 5: dùng y, hợp lệ. Tổng: 2 lỗi, ở các dòng 3 và 4.

    • Định dạng đầu vào:

      Dòng 1: số nguyên nnn (0≤n≤1050 \le n \le 10^50≤n≤105). nnn dòng tiếp theo, mỗi dòng có dạng DECL <tên> hoặc USE <tên> (tên biến là chuỗi chữ-số-gạch dưới không chứa khoảng trắng).

    • Định dạng đầu ra:

      Dòng 1: tổng số lỗi. Dòng 2: các chỉ số dòng bị lỗi, tăng dần, cách nhau 1 dấu cách (dòng trống nếu không có lỗi).

    Ví dụ:

    Đầu vào:

    5
    DECL x
    USE x
    USE y
    DECL y
    USE y
    

    Đầu ra:

    2
    3 4
    

    Đầu vào:

    0
    

    Đầu ra:

    0
    
    

    Đang tải editor...