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] Đếm lỗi khai báo trùng trong cùng phạm vi

    Một chương trình dịch cần duy trì bảng ký hiệu (symbol table) theo cấu trúc ngăn xếp các phạm vi (scope) lồng nhau. Khi biên dịch mã nguồn, trình biên dịch xử lý tuần tự các lệnh sau:

    • BEGIN: mở một phạm vi (khối) mới, lồng bên trong phạm vi đang có hiệu lực.
    • END: đóng phạm vi trong cùng hiện đang mở, quay về phạm vi cha.
    • DECL <ten>: khai báo một biến tên <ten> (chuỗi gồm chữ cái thường và chữ số, bắt đầu bằng chữ cái, độ dài không quá 20) trong phạm vi hiện tại.

    Ban đầu có sẵn một phạm vi toàn cục đang mở (không cần lệnh BEGIN để mở nó). Dữ liệu vào luôn đảm bảo số lệnh END không bao giờ vượt quá số BEGIN chưa đóng tương ứng.

    Hai biến có cùng tên có thể tồn tại ở hai phạm vi khác nhau (biến ở phạm vi trong che khuất — shadow — biến cùng tên ở phạm vi ngoài), việc này là HỢP LỆ và không bị coi là lỗi. Lỗi khai báo trùng (redeclaration) chỉ xảy ra khi lệnh DECL <ten> khai báo một biến mà tên <ten> đã được khai báo trước đó trong CHÍNH phạm vi hiện tại (không tính các phạm vi cha).

    Hãy đếm tổng số lệnh DECL gây ra lỗi khai báo trùng như trên.

    Ví dụ: Với dữ liệu

    5
    DECL x
    BEGIN
    DECL x
    END
    DECL x
    

    Lệnh DECL x ở dòng 3 nằm trong phạm vi con (khác phạm vi toàn cục) nên không trùng. Lệnh DECL x ở dòng 5 (sau khi END đã đóng phạm vi con) lại nằm trong phạm vi toàn cục, trùng với DECL x ở dòng 1. Vậy kết quả là 1.

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

      Dòng đầu tiên chứa số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) — số lệnh. nnn dòng tiếp theo, mỗi dòng chứa một lệnh thuộc một trong ba dạng BEGIN, END, DECL <ten> như mô tả.

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

      In ra một số nguyên duy nhất — số lệnh DECL gây lỗi khai báo trùng trong cùng phạm vi.

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    0
    

    Đầu vào:

    3
    DECL x
    DECL y
    DECL x
    

    Đầu ra:

    1
    

    Đang tải editor...