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] Định giá biểu thức trung tố với bảng ký hiệu

    Khi trình biên dịch định giá một biểu thức chứa biến, nó cần tra bảng ký hiệu (symbol table) để lấy giá trị hiện tại của từng biến trước khi thực thi trên máy ngăn xếp.

    Cho một biểu thức trung tố gồm toán hạng là số nguyên hoặc biến (một chữ cái thường a-z), các toán tử +,−,×,÷,^+,-,\times,\div,\hat{}+,−,×,÷,^ (+ - * / ^, ^\hat{}^ kết hợp phải, ưu tiên cao nhất) và dấu ngoặc đơn, cùng một bảng gán giá trị cho một số biến. Hãy chuyển biểu thức sang hậu tố rồi định giá bằng cách thay giá trị các biến từ bảng ký hiệu.

    Quy tắc:

    • Phép chia ÷\div÷ là chia lấy phần nguyên, làm tròn về 0 (như C/C++): 7÷2=37 \div 2 = 37÷2=3, (−7)÷2=−3(-7)\div 2 = -3(−7)÷2=−3.
    • Phép ^\hat{}^ yêu cầu số mũ (toán hạng bên phải, sau khi thay giá trị) phải không âm.
    • Nếu chia cho 0, hoặc số mũ âm, hoặc biểu thức dùng một biến không có trong bảng ký hiệu, in ra ERROR.

    Ví dụ: biểu thức ( a + b ) / c với a=10,b=4,c=2a=10, b=4, c=2a=10,b=4,c=2 cho kết quả 777.

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

      Dòng 1: biểu thức trung tố, các token cách nhau bởi đúng một khoảng trắng. Dòng 2: một số nguyên kkk — số lượng biến được gán giá trị. kkk dòng tiếp theo, mỗi dòng gồm tên biến và giá trị nguyên của nó, cách nhau một khoảng trắng (ví dụ a 5).

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

      In ra một số nguyên là giá trị của biểu thức sau khi thay các biến bằng giá trị tương ứng, hoặc in ERROR nếu có lỗi (chia cho 0, số mũ âm, hoặc biến không có trong bảng ký hiệu).

    Ví dụ:

    Đầu vào:

    a + b * c
    3
    a 5
    b 3
    c 2

    Đầu ra:

    11
    

    Đầu vào:

    ( a + b ) / c
    3
    a 10
    b 4
    c 2

    Đầu ra:

    7
    

    Đang tải editor...