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] Sinh mã ngăn xếp trực tiếp từ biểu thức trung tố có biến

    Đây là bài kết hợp hai giai đoạn của trình biên dịch: phân tích cú pháp biểu thức trung tố và sinh mã cho máy ảo ngăn xếp.

    Cho một biểu thức trung tố gồm toán hạng là biến (một chữ cái) hoặc hằng số nguyên không âm, các toán tử +,−,×,÷+, -, \times, \div+,−,×,÷ (+ - * /, không có ^, không có dấu trừ một ngôi) và có thể có dấu ngoặc đơn. Độ ưu tiên: *, / cao hơn +, -; tất cả đều kết hợp trái.

    Hãy sinh mã theo hai bước: (1) chuyển biểu thức sang hậu tố bằng thuật toán Shunting-yard; (2) duyệt hậu tố và sinh lệnh cho máy ảo: PUSH k khi gặp hằng số kkk, LOAD x khi gặp biến xxx, và ADD/SUB/MUL/DIV khi gặp toán tử tương ứng +/-/*//.

    Ví dụ: với ( a + b ) * 2, hậu tố là a b + 2 *, mã sinh ra là:

    LOAD a
    LOAD b
    ADD
    PUSH 2
    MUL
    
    • Định dạng đầu vào:

      Một dòng chứa biểu thức trung tố, các token cách nhau bởi đúng một khoảng trắng. Biểu thức luôn cân bằng ngoặc và hợp lệ.

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

      In ra danh sách lệnh của máy ảo ngăn xếp, mỗi lệnh một dòng, theo đúng thứ tự sinh ra.

    Ví dụ:

    Đầu vào:

    a + b * c

    Đầu ra:

    LOAD a
    LOAD b
    LOAD c
    MUL
    ADD
    

    Đầu vào:

    ( a + b ) * 2

    Đầu ra:

    LOAD a
    LOAD b
    ADD
    PUSH 2
    MUL
    

    Đang tải editor...