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] Phân tích và tính biểu thức có biến, lũy thừa, chia nguyên

    Xây dựng bộ phân tích cú pháp đệ quy cho biểu thức số học có biến (mỗi biến là một chữ cái, có thể hoa hoặc thường), số nguyên, các phép toán +,−,×+,-,\times+,−,× (*), chia nguyên /, lấy dư %, lũy thừa ^, dấu trừ đơn, và dấu ngoặc đơn, theo văn phạm (độ ưu tiên tăng dần từ trên xuống, ^ kết hợp phải, còn lại kết hợp trái):

    E→T  ((+∣−)  T)∗T→U  ((∗∣/∣%)  U)∗U→−U  ∣  PP→F  (∧ P)?F→NUMBER  ∣  IDENT  ∣  (E)\begin{aligned} E &\to T\;((+|-)\;T)^* \\ T &\to U\;((*|/|\%)\;U)^* \\ U &\to -U \;\mid\; P \\ P &\to F\;(\wedge\,P)? \\ F &\to \text{NUMBER} \;\mid\; \text{IDENT} \;\mid\; (E) \end{aligned}ETUPF​→T((+∣−)T)∗→U((∗∣/∣%)U)∗→−U∣P→F(∧P)?→NUMBER∣IDENT∣(E)​

    Phép / và % thực hiện theo đúng ngữ nghĩa chia làm tròn xuống (floor) như toán tử // và % của Python (ví dụ −7%3=2-7 \mathbin{\%} 3 = 2−7%3=2). Lũy thừa ^ chỉ hợp lệ khi số mũ (bên phải) là số nguyên không âm.

    Ví dụ: với a + b * 2, a=3, b=4a=3,\,b=4a=3,b=4, kết quả là 3+4×2=113+4\times2=113+4×2=11.

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

      Dòng 1: biểu thức (có thể chứa khoảng trắng). Dòng 2: số nguyên nnn — số lượng biến được gán giá trị. nnn dòng tiếp theo, mỗi dòng gồm tên biến và giá trị nguyên (có thể âm), cách nhau một khoảng trắng, ví dụ a 3. Biến không xuất hiện trong danh sách gán có giá trị mặc định là 0.

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

      Nếu trong quá trình tính toán có phép / hoặc % cho mẫu số 0, hoặc phép ^ với số mũ âm, in ra đúng chuỗi ERROR. Ngược lại in ra một số nguyên duy nhất là kết quả của biểu thức.

    Ví dụ:

    Đầu vào:

    a + b * 2
    2
    a 3
    b 4

    Đầu ra:

    11
    

    Đầu vào:

    2^3^2
    0

    Đầu ra:

    512
    

    Đang tải editor...