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] Độ sâu lồng ngoặc trong biểu thức số học

    Xét văn phạm phi ngữ cảnh sinh biểu thức số học không chứa khoảng trắng, chỉ gồm chữ số 000-999 (mỗi số là một chữ số), các phép toán +,−,∗,/+, -, *, /+,−,∗,/ và dấu ngoặc đơn:

    E→T ((+∣−) T)∗E \to T\ \big((+|-)\ T\big)^*E→T ((+∣−) T)∗ T→F ((∗∣/) F)∗T \to F\ \big((*|/)\ F\big)^*T→F ((∗∣/) F)∗ F→d ∣ ( E )F \to d \ \mid\ ( \ E \ )F→d ∣ ( E )

    trong đó ddd là một chữ số từ 000 đến 999.

    Cho một chuỗi sss được sinh đúng theo văn phạm EEE ở trên (đảm bảo hợp lệ cú pháp, dấu ngoặc cân bằng). Hãy cài đặt một bộ phân tích cú pháp đệ quy xuống (recursive descent) gồm ba hàm tương ứng ba ký hiệu E,T,FE, T, FE,T,F, đồng thời theo dõi độ sâu lồng ngoặc trong quá trình phân tích: mỗi lần hàm FFF gặp ngoặc mở và gọi đệ quy vào EEE bên trong, độ sâu tăng thêm 111 so với lời gọi hiện tại. Độ sâu của biểu thức ở mức ngoài cùng (không nằm trong ngoặc nào) là 000.

    Yêu cầu: in ra độ sâu lồng ngoặc lớn nhất đạt được trong toàn bộ quá trình phân tích.

    Ví dụ: với s=s = s= 1+(2*(3-4)), ngoặc ngoài có độ sâu 111, ngoặc trong (chứa 3-4) có độ sâu 222 → kết quả là 222.

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

      Một dòng duy nhất chứa chuỗi sss (1≤∣s∣≤20001 \le |s| \le 20001≤∣s∣≤2000), chỉ gồm các ký tự 0-9, +, -, *, /, (, ), được đảm bảo là chuỗi hợp lệ theo văn phạm EEE nêu trên (dấu ngoặc luôn cân bằng và đúng cú pháp).

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

      In ra một số nguyên duy nhất — độ sâu lồng ngoặc lớn nhất trong biểu thức.

    Ví dụ:

    Đầu vào:

    1+2*3

    Đầu ra:

    0
    

    Đầu vào:

    5

    Đầu ra:

    0
    

    Đang tải editor...