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] Bộ quét từ vựng và lỗi ký tự không hợp lệ

    Xét một bộ quét từ vựng (lexer) tối giản cho định danh (identifier). Luật xác định token như sau, áp dụng theo nguyên tắc vét cạn tối đa (maximal munch): tại mỗi vị trí, lấy dãy liên tiếp dài nhất gồm các ký tự thuộc {\{{chữ cái, chữ số, _}\}} làm một "cụm".

    • Nếu cụm bắt đầu bằng chữ cái hoặc _: đó là 1 token định danh hợp lệ.
    • Nếu cụm bắt đầu bằng chữ số: toàn bộ cụm này là lỗi từ vựng; cụ thể mỗi ký tự trong cụm đó được tính là 1 lỗi riêng biệt (mô phỏng việc trình quét xoá từng ký tự một để phục hồi).
    • Ký tự khoảng trắng (dấu cách, tab, xuống dòng) chỉ đóng vai trò phân tách, không sinh token và không phải lỗi.
    • Bất kỳ ký tự nào khác (không phải chữ cái/chữ số/_/khoảng trắng) là 1 lỗi từ vựng riêng lẻ (1 ký tự = 1 lỗi).

    Cho văn bản đầu vào (có thể gồm nhiều dòng), hãy đếm: số token định danh hợp lệ, và tổng số lỗi từ vựng.

    Ví dụ: với đầu vào abc123 _foo 9bad @ hello_world:

    • abc123 bắt đầu bằng chữ cái ⇒\Rightarrow⇒ 1 token hợp lệ.
    • _foo bắt đầu bằng _ ⇒\Rightarrow⇒ 1 token hợp lệ.
    • 9bad bắt đầu bằng chữ số, độ dài 4 ⇒\Rightarrow⇒ 4 lỗi.
    • @ ⇒\Rightarrow⇒ 1 lỗi.
    • hello_world ⇒\Rightarrow⇒ 1 token hợp lệ.

    Kết quả: 3 token hợp lệ, 5 lỗi.

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

      Toàn bộ nội dung nhập vào (có thể nhiều dòng, tổng tối đa 10510^5105 ký tự), đọc đến hết input (EOF).

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

      Một dòng gồm 2 số nguyên cách nhau bởi 1 dấu cách: số token định danh hợp lệ, và tổng số lỗi từ vựng.

    Ví dụ:

    Đầu vào:

    abc123 _foo 9bad @ hello_world

    Đầu ra:

    3 5
    

    Đầu vào:

    Đầu ra:

    0 0
    

    Đang tải editor...