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áy ảo ngăn xếp có biến cục bộ

    Mở rộng máy ảo ngăn xếp ở phần trước bằng cách thêm bộ nhớ biến (giống bảng ký hiệu — symbol table — mà trình biên dịch dùng để cấp phát biến cục bộ). Bộ lệnh gồm:

    • PUSH x: đẩy số nguyên xxx vào đỉnh ngăn xếp.
    • LOAD name: đẩy giá trị hiện tại của biến name vào đỉnh ngăn xếp. Nếu biến name chưa từng được gán giá trị (chưa có lệnh STORE nào tới nó trước đó), giá trị mặc định của nó là 000.
    • STORE name: lấy phần tử ở đỉnh ngăn xếp ra (ngăn xếp giảm 1 phần tử) và gán giá trị đó cho biến name (ghi đè nếu đã tồn tại).
    • ADD, SUB, MUL, DIV: như trong bài máy ảo cơ bản (lấy 2 phần tử đỉnh bbb (đỉnh) và aaa (dưới), đẩy vào kết quả aaa op bbb; DIV làm tròn phần nguyên về 0 như phép chia C/C++/Java).
    • PRINT: in ra giá trị đỉnh ngăn xếp (không lấy ra khỏi ngăn xếp).
    • HALT: dừng ngay, bỏ qua các lệnh còn lại.

    Tên biến chỉ gồm chữ cái, chữ số, dấu gạch dưới, bắt đầu bằng chữ cái. Cho một chương trình, hãy mô phỏng thực thi và in ra các giá trị theo thứ tự các lệnh PRINT được thực hiện.

    Ví dụ: PUSH 5 / STORE x / LOAD x / LOAD x / ADD / PRINT gán x=5x=5x=5, rồi nạp xxx hai lần và cộng lại, in ra 10.

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

      Dòng đầu chứa số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000). nnn dòng tiếp theo là các lệnh PUSH x, LOAD name, STORE name, ADD, SUB, MUL, DIV, PRINT, HALT. Dữ liệu đảm bảo ngăn xếp không bao giờ underflow và không có DIV nào chia cho 0 trong các lệnh thực sự được thực thi.

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

      Mỗi giá trị được PRINT in ra trên một dòng riêng, theo đúng thứ tự thực thi. Nếu không có PRINT nào được thực thi, không in gì.

    Ví dụ:

    Đầu vào:

    6
    PUSH 5
    STORE x
    LOAD x
    LOAD x
    ADD
    PRINT
    

    Đầu ra:

    10
    

    Đầu vào:

    2
    LOAD y
    PRINT
    

    Đầu ra:

    0
    

    Đang tải editor...