Cho một chương trình gồm n dòng lệnh giả-TAC, đánh số thứ tự từ 1 đến n. 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).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:
goto hoặc if...goto đều là leader.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).
Dòng 1: số nguyên n. n dòng tiếp theo: nội dung các dòng lệnh, giữ nguyên định dạng mô tả ở trên.
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...