Xét một ngôn ngữ mini với 3 loại token:
+ - * / ( ) là một token riêng biệt.Cho một xâu S liên tục (không chứa khoảng trắng). Hãy quét S từ trái sang phải theo nguyên tắc so khớp dài nhất (maximal munch): tại mỗi vị trí, nếu ký tự hiện tại là chữ số, nuốt chuỗi dài nhất khớp mẫu NUMBER; nếu là chữ cái hoặc _, nuốt chuỗi dài nhất khớp mẫu IDENT; nếu là một trong +-*/(), nuốt đúng 1 ký tự đó làm token tương ứng.
Nếu tại một vị trí, ký tự hiện tại không khớp bất kỳ trường hợp nào ở trên (ví dụ ký tự đặc biệt như @, #, $, hoặc dấu chấm thứ hai liên tiếp trong một số như ở 1.2.3 sau khi đã nuốt 1.2), đây là một lỗi từ vựng (lexical error): hãy in ra tất cả token đã nhận diện được trước đó, sau đó in thêm đúng 1 dòng LEXICAL ERROR AT POSITION p với p là vị trí (1-indexed) của ký tự gây lỗi, rồi dừng xử lý ngay, không xét tiếp phần còn lại của S.
Ví dụ 1: Input 1.2.3 → Output:
NUMBER 1.2
LEXICAL ERROR AT POSITION 4
(Sau khi nuốt 1.2, ký tự tiếp theo là dấu . ở vị trí 4, không khớp mẫu nào nên báo lỗi tại vị trí 4.)
Ví dụ 2: Input x1+42*(y-3.5) → 9 dòng token, không có lỗi (token cuối là RPAREN).
Một dòng duy nhất chứa xâu S (0≤∣S∣≤300), gồm các ký tự chữ cái, chữ số, _, ., các ký tự trong +-*/(), và có thể chứa các ký tự khác dùng để kiểm tra lỗi từ vựng; không chứa khoảng trắng.
In ra danh sách token nhận diện được (mỗi token một dòng, dạng NUMBER value, IDENT value, hoặc một trong PLUS/MINUS/TIMES/DIVIDE/LPAREN/RPAREN), theo đúng thứ tự; nếu gặp lỗi từ vựng, in thêm dòng cuối LEXICAL ERROR AT POSITION p rồi dừng. Nếu S rỗng, không in token nào (không có lỗi).
Ví dụ:
Đầu vào:
1.2.3
Đầu ra:
NUMBER 1.2
LEXICAL ERROR AT POSITION 4
Đầu vào:
x1+42*(y-3.5)
Đầu ra:
IDENT x1
PLUS
NUMBER 42
TIMES
LPAREN
IDENT y
MINUS
NUMBER 3.5
RPAREN
Đang tải editor...