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 ngôn ngữ mini có biến và biểu thức trung tố

    Xây dựng trình thông dịch cho một ngôn ngữ mini gồm các câu lệnh, mỗi câu lệnh trên một dòng, thuộc một trong hai dạng:

    • Gán: ten_bien = bieu_thuc — tính giá trị bieu_thuc rồi gán cho biến ten_bien (biến gồm chữ cái/chữ số, bắt đầu bằng chữ cái). Biến chưa được gán trước đó có giá trị mặc định là 000.
    • In: PRINT bieu_thuc — tính và in ra giá trị của bieu_thuc.

    bieu_thuc là một biểu thức số học trung tố chuẩn, gồm số nguyên, tên biến, dấu ngoặc (), các toán tử + - * / % (cộng, trừ, nhân, chia nguyên, chia lấy dư) và dấu trừ/cộng một ngôi (unary), với độ ưu tiên toán tử thông thường (*, /, % cao hơn +, -; các toán tử cùng độ ưu tiên tính từ trái sang phải). Phép chia / làm tròn về 0 (trunc), phép chia lấy dư % thoả a=(a/b)×b+(a%b)a = (a/b) \times b + (a \% b)a=(a/b)×b+(a%b) với cùng quy ước làm tròn đó (ví dụ −7 / 2=−3-7 \, / \, 2 = -3−7/2=−3 và −7 % 2=−1-7 \, \% \, 2 = -1−7%2=−1).

    Các câu lệnh được thực thi tuần tự. Nếu một phép chia (/ hoặc %) cho 0 xảy ra khi tính một biểu thức, in thêm dòng ERROR ngay sau các kết quả đã in trước đó rồi dừng thông dịch ngay lập tức (không xử lý các câu lệnh còn lại).

    • Định dạng đầu vào:
      • Dòng đầu tiên chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số câu lệnh.
      • nnn dòng tiếp theo, mỗi dòng là một câu lệnh gán hoặc PRINT, đúng cú pháp mô tả ở trên (các token cách nhau bởi khoảng trắng).
    • Định dạng đầu ra:

      In ra, mỗi dòng một giá trị nguyên, kết quả của các lệnh PRINT theo đúng thứ tự xuất hiện. Nếu xảy ra chia cho 0, thêm dòng ERROR ở cuối rồi dừng (các PRINT sau đó không được in).

    Ví dụ:

    Đầu vào:

    2
    x = 2 + 3 * 4
    PRINT x

    Đầu ra:

    14
    

    Đầu vào:

    2
    x = (2 + 3) * 4
    PRINT x

    Đầu ra:

    20
    

    Đang tải editor...