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 số học chính xác bằng phân tích cú pháp đệ quy

    Cho một biểu thức số học chỉ gồm số nguyên không âm, các phép toán +,−,×,÷+,-,\times,\div+,−,×,÷ (viết bằng ký tự + - * /), dấu ngoặc đơn ( ), và dấu trừ đơn (unary minus) đứng trước một biểu thức con bất kỳ. Hãy xây dựng bộ phân tích cú pháp đệ quy (recursive descent parser) theo văn phạm sau (không mơ hồ về độ ưu tiên và kết hợp):

    E→T  ((+ ∣ −)  T)∗T→F  ((∗ ∣ /)  F)∗F→NUMBER  ∣  (E)  ∣  −F\begin{aligned} E &\to T \; ((+\,|\,-) \; T)^* \\ T &\to F \; ((*\,|\,/) \; F)^* \\ F &\to \text{NUMBER} \;\mid\; (E) \;\mid\; -F \end{aligned}ETF​→T((+∣−)T)∗→F((∗∣/)F)∗→NUMBER∣(E)∣−F​

    và tính giá trị biểu thức bằng số học phân số chính xác (không dùng số thực dấu phẩy động, không làm tròn).

    Ví dụ: với biểu thức 1/3 + 1/6, kết quả chính xác là 12\dfrac{1}{2}21​, in ra 1/2.

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

      Một dòng duy nhất chứa biểu thức (độ dài không quá 200 ký tự). Biểu thức có thể chứa khoảng trắng ở bất kỳ đâu, cần bỏ qua khi phân tích. Các số trong biểu thức là số nguyên không âm.

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

      Nếu trong quá trình tính toán xuất hiện phép chia cho 0, in ra đúng chuỗi ERROR. Ngược lại, in ra giá trị của biểu thức dưới dạng phân số tối giản: nếu mẫu số bằng 1 chỉ in tử số (số nguyên, có thể âm); nếu mẫu số khác 1, in theo định dạng p/q với q là số nguyên dương và p là tử số (có thể âm), phân số đã tối giản (ước chung lớn nhất của |p| và q bằng 1).

    Ví dụ:

    Đầu vào:

    1/3 + 1/6

    Đầu ra:

    1/2
    

    Đầu vào:

    3 + 4 * (2 - 1)

    Đầu ra:

    7
    

    Đang tải editor...