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] Thông dịch mã ba địa chỉ có nhãn, nhảy và giới hạn bước

    Cho một chương trình mã trung gian ba địa chỉ (TAC) có nhãn và lệnh nhảy, mỗi dòng là một lệnh, các token cách nhau đúng một khoảng trắng:

    • LABEL l: đánh dấu nhãn l tại vị trí này (không làm gì khi thực thi ngoài việc là đích nhảy đến).
    • var = a: gán cho var giá trị của a (hằng số nguyên hoặc biến).
    • var = a OP b: OP ∈{+,−,∗,//,%,<,≤,>,≥,==,≠}\in \{+,-,*,\texttt{//},\%,<,\le,>,\ge,==,\ne\}∈{+,−,∗,//,%,<,≤,>,≥,==,=} — các phép so sánh trả về 111 (đúng) hoặc 000 (sai); // và % là chia nguyên và phần dư kiểu Python (làm tròn thương về −∞-\infty−∞, dấu của phần dư theo dấu số chia); đề bảo đảm không có phép // hay % nào chia cho giá trị đang bằng 000 tại thời điểm thực hiện.
    • GOTO l: nhảy không điều kiện tới ngay sau lệnh LABEL l.
    • IF var GOTO l: nếu giá trị hiện tại của var khác 000 thì nhảy tới ngay sau LABEL l; ngược lại thực hiện lệnh kế tiếp như bình thường.
    • PRINT var: in ra giá trị hiện tại của var, trên một dòng riêng.

    Biến chưa từng được gán có giá trị mặc định 000. Chương trình thực thi bắt đầu từ lệnh đầu tiên (chỉ số 000). Vì chương trình có nhãn/nhảy nên có thể lặp vô hạn: nếu tổng số lệnh đã được thực thi (mỗi lệnh, kể cả LABEL khi được thực thi tuần tự đi qua nó, tính là một bước — riêng khi nhảy tới sau một LABEL, bản thân lệnh LABEL đó không tính là một bước vì bị bỏ qua) đạt tới 10610^6106 mà chương trình vẫn chưa kết thúc (chưa chạy hết danh sách lệnh), thì dừng thực thi và in thêm dòng TIMEOUT sau tất cả các dòng đã PRINT được cho tới lúc đó.

    Đề bảo đảm mọi nhãn được GOTO/IF ... GOTO tham chiếu đều tồn tại đúng một lần bằng một lệnh LABEL tương ứng trong chương trình.

    Ví dụ: chương trình tính ∑i=15i\sum_{i=1}^{5} i∑i=15​i bằng vòng lặp và in kết quả sẽ in ra một dòng duy nhất 15.

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

      Dòng đầu: nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số lệnh. nnn dòng tiếp theo, mỗi dòng một lệnh theo đúng cú pháp trên.

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

      In ra các dòng do lệnh PRINT sinh ra theo đúng thứ tự thực thi. Nếu chương trình bị dừng do vượt giới hạn 10610^6106 bước như mô tả trên, in thêm một dòng cuối cùng TIMEOUT.

    Ví dụ:

    Đầu vào:

    4
    x = 3
    y = 4
    z = x + y
    PRINT z
    

    Đầu ra:

    7
    

    Đầu vào:

    0
    

    Đầu ra:

    
    

    Đang tải editor...