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] Lexer biểu thức số học đơn giản

    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:

    1. Khoảng trắng (dấu cách): bỏ qua, không sinh token.
    2. DINHDANH (định danh): khớp biểu thức chính quy [a-zA-Z_][a-zA-Z0-9_]∗[a\text{-}zA\text{-}Z\_][a\text{-}zA\text{-}Z0\text{-}9\_]^*[a-zA-Z_][a-zA-Z0-9_]∗.
    3. SO (số): khớp digit+( . digit+)?\text{digit}^+(\,.\,\text{digit}^+)?digit+(.digit+)? — một dãy chữ số, có thể theo sau bởi dấu chấm và ít nhất một chữ số nữa (số thực); nếu sau dãy chữ số là dấu chấm nhưng không có chữ số theo sau, dấu chấm đó không thuộc token số.
    4. TOANTU (toán tử): ưu tiên thử ghép 2 ký tự trong tập {==,!=,<=,>=}\{==, !=, <=, >=\}{==,!=,<=,>=} trước; nếu không khớp thì xét 1 ký tự trong tập {+,−,∗,/,=,<,>,!}\{+, -, *, /, =, <, >, !\}{+,−,∗,/,=,<,>,!}.
    5. DAUCAU (dấu câu): một trong các ký tự {(,), ,;}\{(, ), \,, ;\}{(,),,;}.

    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 ;.

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

      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.

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

      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...