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] Thông dịch ngôn ngữ có IF/WHILE lồng nhau

    Xây dựng trình thông dịch đầy đủ cho một ngôn ngữ mini có cấu trúc điều khiển IF/ELSE và WHILE lồng nhau tuỳ ý, cùng biểu thức so sánh — mô hình thu nhỏ của phần thực thi mã trung gian trong một trình biên dịch ngôn ngữ mệnh lệnh. Biến là định danh chữ cái thường, một biến chưa từng được gán có giá trị mặc định 000. Các câu lệnh hợp lệ, mỗi dòng một câu lệnh:

    • x = <bieu_thuc>: gán giá trị biểu thức cho biến xxx. Biểu thức là dãy toán hạng (số nguyên hoặc tên biến) xen kẽ toán tử + - * / %, được tính tuần tự từ trái sang phải, không ưu tiên toán tử (giống các bài trước). Phép / chia lấy phần nguyên làm tròn về 0; phép % là phần dư tương ứng, thoả a=(a / b)×b+(a % b)a = (a\ /\ b) \times b + (a\ \%\ b)a=(a / b)×b+(a % b) với phép chia làm tròn về 0 (dấu của phần dư theo dấu của aaa, ví dụ −7 % 3=−1-7\ \%\ 3 = -1−7 % 3=−1).
    • print x: in ra giá trị hiện tại của xxx.
    • if a op b ... (có thể có) else ... endif: nếu so sánh a op ba\ \text{op}\ ba op b đúng thì thực thi khối lệnh ngay sau if cho tới trước else/endif; nếu sai và có else thì thực thi khối lệnh sau else; nếu sai và không có else thì bỏ qua toàn bộ khối. Lưu ý: aaa và bbb trong điều kiện chỉ được phép là một số nguyên hoặc một tên biến đơn (không phải một biểu thức phức tạp); op là một trong == != < > <= >=.
    • while a op b ... endwhile: lặp lại khối lệnh bên trong chừng nào so sánh a op ba\ \text{op}\ ba op b còn đúng (điều kiện được kiểm tra lại ở đầu mỗi vòng lặp); aaa, bbb cũng chỉ là số nguyên hoặc biến đơn như trên.

    Các khối if/endif (kèm else tuỳ chọn) và while/endwhile lồng nhau hợp lệ như ngoặc, độ sâu lồng nhau tổng cộng không vượt quá 202020. Dữ liệu đảm bảo tổng số lệnh được thực thi thực tế (kể cả lặp lại) không vượt quá 5×1065 \times 10^{6}5×106.

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

      Dòng đầu là số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000) — số dòng chương trình. nnn dòng tiếp theo là nội dung chương trình như mô tả.

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

      In ra các giá trị được lệnh print xuất ra theo đúng thứ tự thực thi, mỗi giá trị một dòng.

      Ví dụ:

      Input:

      12
      x = 5
      y = 0
      while x > 0
      r = x % 2
      if r == 0
      y = y + x
      else
      y = y - x
      endif
      x = x - 1
      endwhile
      print y
      

      Output:

      -3
      

    Ví dụ:

    Đầu vào:

    12
    x = 5
    y = 0
    while x > 0
    r = x % 2
    if r == 0
    y = y + x
    else
    y = y - x
    endif
    x = x - 1
    endwhile
    print y
    

    Đầu ra:

    -3
    

    Đầu vào:

    5
    x = 3
    if x > 10
    y = 100
    endif
    print x
    

    Đầu ra:

    3
    

    Đang tải editor...