Hãy cài đặt một bộ quét từ vựng (lexer) cho một biểu thức viết trên một dòng, áp dụng nguyên tắc maximal munch (luôn ghép được nhiều ký tự nhất có thể cho một token).
Bảng chữ cái hợp lệ gồm: chữ cái, chữ số, dấu chấm ., dấu gạch dưới _, khoảng trắng, và các ký hiệu + - * / = < > ! ( ) , ;.
Quy tắc nhận diện token, xét theo thứ tự ưu tiên:
Nếu gặp một ký tự không khớp bất kỳ quy tắc nào ở trên, đó là lỗi từ vựng: in ra các token hợp lệ đã nhận diện được trước đó, sau đó in thêm một dòng lỗi rồi dừng ngay (không xử lý tiếp phần còn lại của dòng).
Ví dụ: với x1 = 12 + y2 * (3.5 - z); ta thu được lần lượt: DINHDANH x1, TOANTU =, SO 12, TOANTU +, DINHDANH y2, TOANTU *, DAUCAU (, SO 3.5, TOANTU -, DINHDANH z, DAUCAU ), DAUCAU ;.
Một dòng duy nhất (có thể rỗng hoặc chỉ gồm khoảng trắng) chứa biểu thức cần phân tích.
Mỗi token hợp lệ in trên một dòng theo định dạng LOAI GIA_TRI (LOAI là một trong SO, DINHDANH, TOANTU, DAUCAU), theo đúng thứ tự xuất hiện trong dòng input.
Nếu gặp ký tự không hợp lệ tại vị trí (1-based) p, sau khi in các token hợp lệ trước đó, in thêm đúng một dòng theo định dạng LOI <ky_tu> <p> rồi dừng chương trình.
Ví dụ:
Đầu vào:
x1 = 12 + y2 * (3.5 - z);
Đầu ra:
DINHDANH x1
TOANTU =
SO 12
TOANTU +
DINHDANH y2
TOANTU *
DAUCAU (
SO 3.5
TOANTU -
DINHDANH z
DAUCAU )
DAUCAU ;
Đầu vào:
a==b!=c<=d>=e
Đầu ra:
DINHDANH a
TOANTU ==
DINHDANH b
TOANTU !=
DINHDANH c
TOANTU <=
DINHDANH d
TOANTU >=
DINHDANH e
Đang tải editor...