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] Tách token bằng bảng toán tử tùy biến (maximal munch)

    Một lexer tổng quát nhận một bảng toán tử tùy biến gồm mmm chuỗi phân biệt, mỗi chuỗi dài 1 đến 4 ký tự lấy từ bộ ký tự +-*/=<>!&|:.%^~? (không chứa chữ cái, chữ số, khoảng trắng). Chuỗi nguồn sss chỉ gồm các chữ cái thường (tạo thành định danh) và/hoặc các ký tự thuộc bộ ký tự nói trên (phải khớp với bảng toán tử), không có khoảng trắng.

    Lexer quét sss từ trái sang phải:

    • Nếu ký tự hiện tại là chữ thường, gộp tối đa dãy chữ thường liên tiếp thành một token định danh, in ra dưới dạng ID(<dãy_chữ>).
    • Ngược lại, xét tất cả toán tử trong bảng là tiền tố của phần còn lại của sss kể từ vị trí hiện tại; chọn toán tử dài nhất khớp được (nguyên tắc so khớp dài nhất — maximal munch) làm token, in ra chính chuỗi toán tử đó.
    • Nếu tại một vị trí không có toán tử nào trong bảng khớp và ký tự đó cũng không phải chữ thường, quá trình phân tích dừng lại với lỗi.

    Ví dụ: với bảng toán tử {==, =, <=, <, !=, ->} và s=s = s= x<=y->z, kết quả token hóa là ID(x) <= ID(y) -> ID(z).

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

      Dòng 1: số nguyên mmm (0≤m≤500 \le m \le 500≤m≤50) — số toán tử trong bảng. Dòng 2: mmm toán tử cách nhau bởi dấu cách (nếu m=0m=0m=0 thì đây là dòng rỗng, vẫn phải có mặt). Dòng 3: chuỗi nguồn sss (0≤∣s∣≤10000 \le |s| \le 10000≤∣s∣≤1000, có thể rỗng).

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

      Nếu sss được token hóa hoàn toàn thành công: in ra một dòng chứa các token theo đúng thứ tự tìm được, cách nhau một dấu cách (nếu không có token nào, in ra một dòng rỗng). Nếu gặp lỗi tại vị trí không token hóa được: in ra ERROR p, với ppp là vị trí 1-based của ký tự gây lỗi trong sss.

    Ví dụ:

    Đầu vào:

    6
    == = <= < != ->
    x<=y->z
    

    Đầu ra:

    ID(x) <= ID(y) -> ID(z)
    

    Đầu vào:

    3
    + - *
    foo+bar#baz
    

    Đầu ra:

    ERROR 8
    

    Đang tải editor...