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] Khôi phục panic-mode theo dấu chấm phẩy đồng bộ

    Một chiến lược phục hồi lỗi phổ biến trong phân tích từ vựng/cú pháp là panic-mode recovery: khi gặp một token không hợp lệ, bộ quét báo lỗi rồi bỏ qua (loại bỏ) các token tiếp theo cho đến khi gặp một token đồng bộ hoá (synchronizing token) để tiếp tục quét bình thường. Trong bài này, token đồng bộ hoá được cố định là dấu ;.

    Một token được coi là hợp lệ nếu nó thuộc một trong các dạng: định danh (khớp biểu thức chính quy ^[A-Za-z_][A-Za-z0-9_]*$), số nguyên không âm (khớp ^[0-9]+$), hoặc là một trong các ký hiệu + - * / = ( ) ; ,.

    Cho một dãy nnn token, hãy mô phỏng quá trình quét như sau: quét lần lượt từ trái sang phải; nếu token hiện tại hợp lệ thì giữ lại và quét tiếp; nếu không hợp lệ thì báo lỗi tại vị trí đó, sau đó bỏ qua (loại bỏ, không giữ lại) các token liền sau cho đến khi gặp token ; đầu tiên (token ; này được giữ lại làm điểm đồng bộ) hoặc hết dãy token (EOF), rồi tiếp tục quét từ sau điểm đó.

    • Định dạng đầu vào:
      • Dòng đầu tiên: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000).
      • Dòng thứ hai: nnn token cách nhau bởi đúng một khoảng trắng (nếu n=0n = 0n=0 dòng này có thể rỗng).
    • Định dạng đầu ra:

      Với mỗi lỗi phát hiện được, theo đúng thứ tự xảy ra, in một dòng theo mẫu:

      Loi tai vi tri {p}: token khong hop le '{tok}' -> bo qua {k} token, dong bo tai '{s}'

      trong đó ppp là vị trí 1-based của token lỗi trong dãy gốc, kkk là số token bị bỏ qua (không tính token lỗi và không tính dấu ; đồng bộ), và sss là ; nếu tìm thấy điểm đồng bộ hoặc EOF nếu quét đến hết dãy mà không gặp ;. Sau khi liệt kê hết các lỗi, in hai dòng cuối: Tong so loi: {tổng số lỗi} So token hop le duoc giu lai: {số token được giữ lại}

    Ví dụ:

    Đầu vào:

    9
    x = @ 5 ; y = 10 ;
    

    Đầu ra:

    Loi tai vi tri 3: token khong hop le '@' -> bo qua 1 token, dong bo tai ';'
    Tong so loi: 1
    So token hop le duoc giu lai: 7
    

    Đầu vào:

    5
    x = 1 ; y
    

    Đầu ra:

    Tong so loi: 0
    So token hop le duoc giu lai: 5
    

    Đang tải editor...