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] Phân loại và thống kê token

    Trong giai đoạn phân tích từ vựng (lexical analysis), bộ quét từ vựng (lexer) nhận một dãy token đã được tách sẵn (mỗi token là một xâu không chứa khoảng trắng) và phải gán cho mỗi token một loại (category) dựa trên các quy tắc từ vựng của một ngôn ngữ mini:

    • KEYWORD: token trùng khớp chính xác với một trong các từ khóa if, else, while, for, return, int, float, void, break, continue.
    • OPERATOR: token trùng khớp chính xác với một trong + - * / % = == != < > <= >= && || !.
    • SEPARATOR: token trùng khớp chính xác với một trong ( ) { } ; ,.
    • NUMBER: token gồm toàn chữ số, có thể chứa đúng một dấu chấm ., nhưng dấu chấm không được ở đầu hoặc cuối token (ví dụ 123, 3.14 hợp lệ; .5, 5., 1.2.3 không khớp NUMBER).
    • IDENT: token bắt đầu bằng chữ cái (a-z, A-Z) hoặc _, các ký tự còn lại (nếu có) là chữ cái, chữ số hoặc _.
    • UNKNOWN: không khớp bất kỳ quy tắc nào ở trên.

    Việc phân loại được thực hiện theo đúng thứ tự ưu tiên: KEYWORD → OPERATOR → SEPARATOR → NUMBER → IDENT → UNKNOWN (kiểm tra lần lượt, dừng ở quy tắc đầu tiên khớp).

    Với mỗi token đầu vào, hãy in ra loại của nó; sau đó in thêm một dòng thống kê tổng số token thuộc mỗi loại.

    Ví dụ: Input

    3
    if
    x1
    3.14
    

    Output

    if KEYWORD
    x1 IDENT
    3.14 NUMBER
    KEYWORD=1 IDENT=1 NUMBER=1 OPERATOR=0 SEPARATOR=0 UNKNOWN=0
    
    • Định dạng đầu vào:

      Dòng đầu tiên là số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số lượng token. nnn dòng tiếp theo, mỗi dòng là một token (xâu không rỗng, không chứa khoảng trắng, độ dài từ 1 đến 100).

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

      In ra nnn dòng, dòng thứ iii có dạng token LOẠI (token giữ nguyên, cách nhãn loại đúng 1 khoảng trắng). Sau đó in thêm đúng 1 dòng thống kê theo định dạng KEYWORD=a IDENT=b NUMBER=c OPERATOR=d SEPARATOR=e UNKNOWN=f (đúng thứ tự này, các cặp cách nhau 1 khoảng trắng). Nếu n=0n=0n=0, chỉ in dòng thống kê với mọi giá trị bằng 0.

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    KEYWORD=0 IDENT=0 NUMBER=0 OPERATOR=0 SEPARATOR=0 UNKNOWN=0
    

    Đầu vào:

    8
    if
    x1
    3.14
    ==
    (
    _temp
    )
    @bad
    

    Đầu ra:

    if KEYWORD
    x1 IDENT
    3.14 NUMBER
    == OPERATOR
    ( SEPARATOR
    _temp IDENT
    ) SEPARATOR
    @bad UNKNOWN
    KEYWORD=1 IDENT=2 NUMBER=1 OPERATOR=1 SEPARATOR=2 UNKNOWN=1
    

    Đang tải editor...