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] Cấp phát offset trong khung ngăn xếp có tái sử dụng bộ nhớ

    Khi sinh mã cho một khung ngăn xếp (stack frame), trình biên dịch cấp cho mỗi biến cục bộ một offset (độ lệch bộ nhớ so với đáy khung), và khi một khối lệnh kết thúc, vùng nhớ dành cho các biến khai báo trực tiếp bên trong khối đó (và các khối con của nó) có thể được thu hồi để tái sử dụng cho các khối anh em mở ra sau này — đây là kỹ thuật tiết kiệm bộ nhớ khung ngăn xếp dựa trên phạm vi tĩnh.

    Gọi offset là một con trỏ (ban đầu bằng 000) theo dõi vị trí cấp phát tiếp theo. Cho nnn lệnh thuộc ba dạng:

    • BEGIN: mở một khối con; lưu lại giá trị offset hiện tại để khôi phục khi khối này đóng lại;
    • END: đóng khối con đang mở gần nhất; khôi phục offset về đúng giá trị đã lưu khi khối đó được mở (giải phóng toàn bộ bộ nhớ đã cấp bên trong khối vừa đóng); dữ liệu vào đảm bảo không đóng khối gốc;
    • DECL x s: khai báo biến xxx có kích thước sss byte (sss nguyên dương) tại khối đang mở; biến này được cấp phát tại vị trí offset hiện tại, sau đó offset tăng thêm sss.

    Với mỗi lệnh DECL, hãy in ra offset được cấp cho biến đó (theo đúng thứ tự các lệnh DECL xuất hiện trong input). Sau tất cả, in thêm một dòng cuối cùng là kích thước khung ngăn xếp lớn nhất từng đạt tới trong suốt quá trình thực hiện, tức giá trị lớn nhất mà offset từng nhận được (peak) sau bất kỳ lệnh DECL nào; nếu không có lệnh DECL nào, giá trị này bằng 000.

    Ví dụ: với các lệnh DECL a 4, BEGIN, DECL b 8, DECL c 4, END, DECL d 4, DECL e 8: aaa nhận offset 000 (offset→4); bbb nhận 444 (offset→12); ccc nhận 121212 (offset→16, peak=16); END khôi phục offset về 444; ddd nhận 444 (offset→8); eee nhận 888 (offset→16). Kết quả in ra 6 dòng: 0 4 12 4 8 16.

    • Đị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). nnn dòng tiếp theo là các lệnh BEGIN, END, hoặc DECL x s (với xxx là tên biến, sss là số nguyên dương).

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

      Mỗi lệnh DECL in ra một dòng chứa offset được cấp (theo đúng thứ tự xuất hiện), sau đó in thêm một dòng cuối cùng là kích thước khung ngăn xếp lớn nhất (peak offset).

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    0
    

    Đầu vào:

    7
    DECL a 4
    BEGIN
    DECL b 8
    DECL c 4
    END
    DECL d 4
    DECL e 8
    

    Đầu ra:

    0
    4
    12
    4
    8
    16
    

    Đang tải editor...