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] Xác định các khối cơ bản từ mã có nhãn và lệnh rẽ nhánh

    Cho một chương trình gồm nnn dòng lệnh giả-TAC, đánh số thứ tự từ 111 đến nnn. Mỗi dòng có thể có tiền tố nhãn dạng Lk: (k là số nguyên dương) đứng trước nội dung lệnh (cách nhau đúng 1 khoảng trắng); phần nội dung sau nhãn (hoặc toàn bộ dòng nếu không có nhãn) thuộc một trong ba dạng:

    • goto Lk: nhảy không điều kiện tới dòng có nhãn Lk.
    • if <dieu_kien> goto Lk: nhảy có điều kiện tới dòng có nhãn Lk (<dieu_kien> có thể chứa nhiều token và khoảng trắng, nhưng từ khoá goto chỉ xuất hiện đúng một lần trong dòng, ngay trước Lk).
    • Lệnh thường (gán,...) — không thuộc hai dạng trên.

    Mỗi nhãn xuất hiện đúng một lần trong toàn bộ chương trình, và mọi nhãn đích được tham chiếu bởi goto/if...goto đều tồn tại.

    Xác định các leader (lệnh dẫn đầu khối cơ bản) theo đúng thuật toán kinh điển:

    1. Dòng 111 luôn là leader.
    2. Bất kỳ dòng nào là đích của một lệnh goto hoặc if...goto đều là leader.
    3. Bất kỳ dòng nào đứng ngay sau một lệnh goto hoặc if...goto (nếu tồn tại, tức không phải dòng cuối chương trình) đều là leader.

    Mỗi khối cơ bản bắt đầu tại một leader và gồm mọi dòng liên tiếp cho tới trước leader kế tiếp (hoặc tới hết chương trình nếu là leader cuối cùng).

    Ví dụ: với chương trình

    i = 0
    L1: i = i + 1
    if i < 5 goto L1
    x = i
    

    kết quả là 3 khối: khối 1 gồm dòng 1 (size=1), khối 2 gồm dòng 2-3 (leader=2, size=2), khối 3 gồm dòng 4 (leader=4, size=1).

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

      Dòng 1: số nguyên nnn. nnn dòng tiếp theo: nội dung các dòng lệnh, giữ nguyên định dạng mô tả ở trên.

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

      Dòng đầu: SO_KHOI = <so khoi co ban>. Sau đó, với mỗi khối theo thứ tự leader tăng dần, in một dòng Block i: leader=X, size=Y (i đánh số từ 1; X là số thứ tự dòng leader của khối; Y là số lệnh trong khối).

    Ví dụ:

    Đầu vào:

    16
    i = 1
    j = 1
    t1 = 10 * i
    t2 = t1 + j
    t3 = 8 * t2
    t4 = t3 - 88
    x = t4
    j = j + 1
    if j <= 20 goto L2
    i = i + 1
    if i <= 10 goto L1
    goto L3
    y = 0
    L2: z = 1
    L1: w = 2
    L3: end = 1
    

    Đầu ra:

    SO_KHOI = 7
    Block 1: leader=1, size=9
    Block 2: leader=10, size=2
    Block 3: leader=12, size=1
    Block 4: leader=13, size=1
    Block 5: leader=14, size=1
    Block 6: leader=15, size=1
    Block 7: leader=16, size=1
    

    Đầu vào:

    1
    x = 1
    

    Đầu ra:

    SO_KHOI = 1
    Block 1: leader=1, size=1
    

    Đang tải editor...