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:
if, else, while, for, return, int, float, void, break, continue.+ - * / % = == != < > <= >= && || !.( ) { } ; ,.., 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)._, các ký tự còn lại (nếu có) là chữ cái, chữ số hoặc _.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
Dòng đầu tiên là số nguyên n (0≤n≤1000) — số lượng token. n 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).
In ra n dòng, dòng thứ i 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=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...