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] Máy tính biểu thức có biến và lũy thừa bằng đệ quy

    Xây dựng một máy tính biểu thức đơn giản có biến, dùng phân tích cú pháp đệ quy cho văn phạm:

    Stmt→ID=Expr ;Expr→Term (( +∣− ) Term)∗Term→Power (( ∗∣/ ) Power)∗Power→Unary (∧ Power)?Unary→(+∣−) Unary∣PrimaryPrimary→( Expr )∣soˆˊ∣ID\begin{aligned} \text{Stmt} &\to \text{ID} = \text{Expr}\ ; \\ \text{Expr} &\to \text{Term}\ ((\,{+}\mid{-}\,)\ \text{Term})^* \\ \text{Term} &\to \text{Power}\ ((\,{*}\mid{/}\,)\ \text{Power})^* \\ \text{Power} &\to \text{Unary}\ ({}^\wedge\ \text{Power})^? \\ \text{Unary} &\to ({+}\mid{-})\ \text{Unary} \mid \text{Primary} \\ \text{Primary} &\to (\ \text{Expr}\ ) \mid \text{số} \mid \text{ID} \end{aligned}StmtExprTermPowerUnaryPrimary​→ID=Expr ;→Term ((+∣−) Term)∗→Power ((∗∣/) Power)∗→Unary (∧ Power)?→(+∣−) Unary∣Primary→( Expr )∣soˆˊ∣ID​

    Toán tử ^ (lũy thừa) kết hợp phải (right-associative): 2∧3∧2=2∧(3∧2)=29=5122\wedge3\wedge2 = 2\wedge(3\wedge2) = 2^9 = 5122∧3∧2=2∧(3∧2)=29=512, và có độ ưu tiên cao hơn *, /, thấp hơn dấu một ngôi +/-. Phép / là chia lấy thương nguyên làm tròn về phía 0 (như bài chia ở trên). Định danh (ID) gồm chữ cái thường và chữ số, bắt đầu bằng chữ cái thường; mỗi ID chỉ được dùng trong Expr của một câu lệnh sau khi đã được gán ở một câu lệnh trước đó (bảo đảm không tham chiếu biến chưa gán). Số mũ trong Power (nhánh bên phải của ^) luôn được đảm bảo có giá trị không âm.

    Chương trình là một dãy nnn câu lệnh gán, thực hiện tuần tự theo thứ tự xuất hiện (câu lệnh sau ghi đè giá trị nếu gán lại cùng một biến). Hãy xác định giá trị của biến được gán ở câu lệnh cuối cùng, sau khi thực hiện toàn bộ chương trình.

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

      Dòng đầu là số nguyên nnn (1≤n≤200)(1 \le n \le 200)(1≤n≤200). nnn dòng tiếp theo, mỗi dòng đúng một câu lệnh dạng id=bieuthuc; (không chứa dấu cách), tuân theo văn phạm ở trên.

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

      Một số nguyên duy nhất — giá trị của biến được gán ở câu lệnh cuối cùng sau khi thực thi toàn bộ chương trình.

    Ví dụ:

    Đầu vào:

    3
    a=2;
    b=a+3;
    c=a*b;
    

    Đầu ra:

    10
    

    Đầu vào:

    1
    a=5;
    

    Đầu ra:

    5
    

    Đang tải editor...