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] Đồng bộ hoá theo tập FOLLOW cho nhiều phi kết thúc

    Trong phục hồi lỗi panic-mode theo tập FOLLOW, khi phân tích một phi kết thúc (nonterminal) AAA gặp lỗi tại một vị trí trong dòng token, bộ phân tích sẽ bỏ qua các token tiếp theo cho tới khi gặp một token thuộc FOLLOW(A)\text{FOLLOW}(A)FOLLOW(A) (tập token có thể xuất hiện ngay sau AAA), rồi coi như đã phục hồi tại đó.

    Cho một dãy nnn token gốc (không bị chỉnh sửa qua các truy vấn) và kkk tập FOLLOW của kkk phi kết thúc khác nhau, hãy trả lời độc lập qqq truy vấn phục hồi. Mỗi truy vấn cho biết vị trí pospospos (1-based, 1≤pos≤n1 \le pos \le n1≤pos≤n) nơi phát hiện lỗi khi đang phân tích phi kết thúc tên namenamename: hãy bỏ qua các token kể từ vị trí pos+1pos+1pos+1 cho tới khi gặp token đầu tiên thuộc FOLLOW(name)\text{FOLLOW}(name)FOLLOW(name) (token này được coi là điểm phục hồi) hoặc hết dãy token. Mỗi truy vấn được tính độc lập trên dãy token gốc, không ảnh hưởng lẫn nhau.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000).
      • Dòng 2: nnn token cách nhau bởi khoảng trắng (có thể là dòng rỗng nếu n=0n=0n=0).
      • Dòng 3: số nguyên kkk (1≤k≤201 \le k \le 201≤k≤20) — số tập FOLLOW.
      • kkk dòng tiếp theo, mỗi dòng có dạng name s tok1 tok2 ... toks: tên phi kết thúc namenamename, số lượng phần tử sss, và sss token thuộc FOLLOW(name)\text{FOLLOW}(name)FOLLOW(name).
      • Dòng tiếp theo: số nguyên qqq (1≤q≤2001 \le q \le 2001≤q≤200) — số truy vấn.
      • qqq dòng tiếp theo, mỗi dòng có dạng pos name (1≤pos≤n1 \le pos \le n1≤pos≤n, namenamename là tên một phi kết thúc đã định nghĩa ở trên).
    • Định dạng đầu ra:

      Với mỗi truy vấn thứ iii (theo đúng thứ tự trong input, iii đánh số từ 1), in một dòng:

      • Nếu tìm thấy điểm phục hồi tại vị trí rrr với token toktoktok: Query {i}: bo qua {c} token, phuc hoi tai vi tri {r} (token='{tok}')
      • Nếu không tìm thấy (quét hết dãy): Query {i}: bo qua {c} token, phuc hoi tai EOF

      trong đó ccc là số token bị bỏ qua (không tính token tại vị trí rrr nếu có).

    Ví dụ:

    Đầu vào:

    3
    id id id
    1
    EXPR 1 ;
    1
    1 EXPR
    

    Đầu ra:

    Query 1: bo qua 2 token, phuc hoi tai EOF
    

    Đầu vào:

    11
    id + id * ) id ; id = id ;
    2
    EXPR 2 ; )
    STMT 1 ;
    3
    3 EXPR
    6 STMT
    1 EXPR
    

    Đầu ra:

    Query 1: bo qua 1 token, phuc hoi tai vi tri 5 (token=')')
    Query 2: bo qua 0 token, phuc hoi tai vi tri 7 (token=';')
    Query 3: bo qua 3 token, phuc hoi tai vi tri 5 (token=')')
    

    Đang tải editor...