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] Tính giá trị biểu thức số học có dấu ngoặc bằng đệ quy

    Cho văn phạm biểu thức số học:

    E→T (( +∣− ) T)∗T→F (( ∗∣/ ) F)∗F→(+∣−) F∣( E )∣soˆˊ nguyeˆn khoˆng aˆm\begin{aligned} E &\to T\ ((\,{+}\mid{-}\,)\ T)^* \\ T &\to F\ ((\,{*}\mid{/}\,)\ F)^* \\ F &\to ({+}\mid{-})\ F \mid (\ E\ ) \mid \text{số nguyên không âm} \end{aligned}ETF​→T ((+∣−) T)∗→F ((∗∣/) F)∗→(+∣−) F∣( E )∣soˆˊ nguyeˆn khoˆng aˆm​

    nghĩa là cho phép dấu +/- một ngôi lặp lại nhiều lần trước một nhân tố (ví dụ ---5 nghĩa là −(−(−5))=−5-(-(-5)) = -5−(−(−5))=−5).

    Viết bộ phân tích cú pháp đệ quy (recursive descent) để tính giá trị của biểu thức. Phép chia / là phép chia lấy thương nguyên làm tròn về phía 0 (như toán tử / giữa hai số nguyên trong C/Java), không phải phép chia sàn (floor) của Python. Ví dụ: (−7)/2=−3(-7)/2 = -3(−7)/2=−3 (không phải −4-4−4).

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

      Dòng đầu là số nguyên nnn (0≤n≤1000)(0 \le n \le 1000)(0≤n≤1000) — số biểu thức. nnn dòng tiếp theo, mỗi dòng một biểu thức không chứa dấu cách, gồm chữ số, các toán tử + - * /, dấu ngoặc ( ). Biểu thức được đảm bảo hợp lệ theo văn phạm trên, và mọi phép chia đều có số chia khác 0.

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

      In ra nnn dòng, mỗi dòng là một số nguyên — kết quả của biểu thức tương ứng theo đúng thứ tự đầu vào.

    Ví dụ:

    Đầu vào:

    3
    (1+2)*(3+4)
    -3+5
    7/2
    

    Đầu ra:

    21
    2
    3
    

    Đầu vào:

    1
    3+4*2
    

    Đầu ra:

    11
    

    Đang tải editor...