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 có lũy thừa và dấu trừ một ngôi

    Mở rộng văn phạm biểu thức số học để hỗ trợ dấu trừ một ngôi (unary minus) và phép lũy thừa ^ (kết hợp phải, ưu tiên cao hơn phép nhân/chia nhưng thấp hơn dấu trừ một ngôi bao ngoài — nghĩa là -2^2 được hiểu là −(22)=−4-(2^2) = -4−(22)=−4, còn 2^-2 được hiểu là 2−2=0.252^{-2} = 0.252−2=0.25):

    E→T  ((+∣−)  T)∗E \to T \; \big( (+ \mid -) \; T \big)^{*}E→T((+∣−)T)∗ T→F  ((×∣/)  F)∗T \to F \; \big( (\times \mid /) \; F \big)^{*}T→F((×∣/)F)∗ F→− F  ∣  PF \to - \, F \;\mid\; PF→−F∣P P→B  ( ∧ F )?(daˆˊu ? nghı˜a laˋ coˊ hoặc khoˆng coˊ phaˆˋn naˋy; neˆˊu coˊ, đoˆˊi soˆˊ beˆn phải của ∧ được phaˆn tıˊch lại từ F để đảm bảo keˆˊt hợp phải)P \to B \; ( \, \wedge \, F \, )^{?} \qquad \text{(dấu } ? \text{ nghĩa là có hoặc không có phần này; nếu có, đối số bên phải của } \wedge \text{ được phân tích lại từ } F \text{ để đảm bảo kết hợp phải)}P→B(∧F)?(daˆˊu ? nghı˜a laˋ coˊ hoặc khoˆng coˊ phaˆˋn naˋy; neˆˊu coˊ, đoˆˊi soˆˊ beˆn phải của ∧ được phaˆn tıˊch lại từ F để đảm bảo keˆˊt hợp phải) B→NUM∣( E )B \to \text{NUM} \mid ( \, E \, )B→NUM∣(E)

    Hãy cài đặt bộ phân tích cú pháp đệ quy để định giá biểu thức bằng số thực. Dữ liệu vào đảm bảo hợp lệ theo văn phạm, không có khoảng trắng, không có phép chia cho 0. Các số trong biểu thức luôn là số nguyên không âm.

    Ví dụ: 2^3^2 (kết hợp phải) =2(32)=29=512= 2^{(3^2)} = 2^{9} = 512=2(32)=29=512. Biểu thức (1+2)*3-4/2 =9−2=7= 9 - 2 = 7=9−2=7.

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

      Một dòng duy nhất chứa biểu thức (chỉ gồm chữ số và các ký tự + - * / ^ ( ), không có khoảng trắng).

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

      In ra kết quả là một số thực với đúng 6 chữ số thập phân (theo định dạng %.6f của Python).

    Ví dụ:

    Đầu vào:

    2^3^2

    Đầu ra:

    512.000000
    

    Đầu vào:

    -2^2

    Đầu ra:

    -4.000000
    

    Đang tải editor...