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] Tra cứu bảng xử lý ngoại lệ trong máy ảo

    Máy ảo của các ngôn ngữ như Java (JVM) hiện thực cơ chế try/catch bằng một bảng ngoại lệ (exception table) gắn với mỗi hàm, thay vì kiểm tra điều kiện tường minh trong bytecode: mỗi mục của bảng mô tả một khoảng địa chỉ lệnh được bảo vệ, cùng với kiểu ngoại lệ mà nó bắt và địa chỉ của trình xử lý (handler).

    Cho bảng ngoại lệ gồm mmm mục, mục thứ iii là bộ bốn (starti,endi,handleri,typei)(start_i, end_i, handler_i, type_i)(starti​,endi​,handleri​,typei​) nghĩa là: nếu tại lệnh có địa chỉ pcpcpc thoả starti≤pc<endistart_i \le pc < end_istarti​≤pc<endi​, một ngoại lệ kiểu typeitype_itypei​ được ném ra, thì điều khiển sẽ chuyển tới địa chỉ handlerihandler_ihandleri​. Ký hiệu kiểu đặc biệt * khớp với bất kỳ kiểu ngoại lệ nào (dùng cho khối bắt mọi lỗi / finally).

    Khi nhiều mục cùng khớp với một truy vấn (pc,type)(pc, type)(pc,type) (nghĩa là pcpcpc nằm trong khoảng của mục đó và kiểu khớp — hoặc mục có typei=type_i = typei​= *, hoặc typeitype_itypei​ trùng đúng typetypetype), quy tắc của JVM là chọn mục xuất hiện đầu tiên theo thứ tự khai báo trong bảng (không phải mục có khoảng hẹp nhất).

    Với mỗi truy vấn (pc,type)(pc, type)(pc,type) độc lập (không mô phỏng cả một luồng thực thi, chỉ tra cứu bảng ứng với một sự kiện ném ngoại lệ tại địa chỉ đó), hãy in ra địa chỉ handler được chọn, hoặc UNCAUGHT nếu không mục nào khớp.

    Ví dụ: bảng gồm mục (5,15,60,ValueError)(5, 15, 60, \text{ValueError})(5,15,60,ValueError) rồi mục (0,20,50,*)(0, 20, 50, \texttt{*})(0,20,50,*); truy vấn (6,ValueError)(6, \text{ValueError})(6,ValueError) khớp cả hai mục nhưng chọn mục khai báo trước, cho kết quả handler 606060.

    • Định dạng đầu vào:
      • Dòng đầu tiên chứa số nguyên mmm (0≤m≤10000 \le m \le 10000≤m≤1000) — số mục của bảng ngoại lệ.
      • mmm dòng tiếp theo, mỗi dòng bốn giá trị start end handler type cách nhau bởi khoảng trắng (start,end,handlerstart, end, handlerstart,end,handler là số nguyên không âm, start<endstart < endstart<end; type là một chuỗi không chứa khoảng trắng, có thể là *).
      • Dòng tiếp theo chứa số nguyên qqq (0≤q≤10000 \le q \le 10000≤q≤1000) — số truy vấn.
      • qqq dòng tiếp theo, mỗi dòng hai giá trị pc type cách nhau bởi khoảng trắng (pcpcpc là số nguyên không âm, type là chuỗi không chứa khoảng trắng, khác *).
    • Định dạng đầu ra:

      In ra qqq dòng, mỗi dòng ứng với một truy vấn theo đúng thứ tự vào: địa chỉ handler (số nguyên) nếu tìm thấy mục khớp đầu tiên, hoặc chuỗi UNCAUGHT nếu không có mục nào khớp.

    Ví dụ:

    Đầu vào:

    1
    0 10 100 IOError
    2
    5 IOError
    5 ValueError

    Đầu ra:

    100
    UNCAUGHT
    

    Đầu vào:

    3
    5 15 60 ValueError
    10 12 70 TypeError
    0 20 50 *
    4
    6 ValueError
    11 TypeError
    3 TypeError
    25 AnyError

    Đầu ra:

    60
    70
    50
    UNCAUGHT
    

    Đang tải editor...