Flex không hỗ trợ Unicode. Tuy nhiên, Flex hỗ trợ đầu vào nhị phân "8 bit sạch". Do đó bạn có thể viết các mẫu từ vựng phù hợp với UTF-8. Bạn có thể sử dụng các mẫu này trong các khu vực từ vựng cụ thể của ngôn ngữ nhập liệu, ví dụ như mã định danh, nhận xét hoặc chuỗi ký tự.
Điều này sẽ hoạt động tốt cho các ngôn ngữ lập trình điển hình, nơi bạn có thể khẳng định với người dùng triển khai ngôn ngữ nguồn được viết bằng ASCII/UTF-8 (và không hỗ trợ mã hóa khác, dấu chấm).
Cách tiếp cận này sẽ không hoạt động nếu máy quét của bạn phải xử lý văn bản có thể ở bất kỳ chế độ mã hóa nào. Nó cũng sẽ không hoạt động (rất tốt) nếu bạn cần thể hiện các quy tắc từ vựng đặc biệt cho các phần tử Unicode. I E. bạn cần các ký tự Unicode và các regex Unicode trong chính máy quét.
Ý tưởng là bạn có thể nhận ra một mô hình trong đó bao gồm UTF-8 byte sử dụng một quy tắc lex, (và sau đó có lẽ lấy yytext
, và chuyển đổi nó ra khỏi UTF-8 hoặc ít nhất là xác nhận nó.)
Đối với một ví dụ làm việc, xem mã nguồn của ngôn ngữ TXR, đặc biệt là tập tin này: http://www.kylheku.com/cgit/txr/tree/parser.l
Cuộn xuống phần này:
ASC [\x00-\x7f]
ASCN [\x00-\t\v-\x7f]
U [\x80-\xbf]
U2 [\xc2-\xdf]
U3 [\xe0-\xef]
U4 [\xf0-\xf4]
UANY {ASC}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UANYN {ASCN}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
Như bạn có thể thấy, chúng ta có thể xác định mô hình để phù hợp với ASCII characte rs cũng như các byte bắt đầu và tiếp tục UTF-8. UTF-8 là một ký hiệu từ vựng, và đây là một trình tạo phân tích từ vựng, vì vậy ... không sao cả!
Một số giải thích: UANY
nghĩa là khớp với bất kỳ ký tự nào, ASCII một byte hoặc đa byte UTF-8. UANYN
có nghĩa là UANY
nhưng không khớp với dòng mới. Điều này rất hữu ích cho các mã thông báo không bị gián đoạn trên các dòng, như nói một nhận xét từ #
đến cuối dòng, chứa văn bản quốc tế.UONLY
có nghĩa là chỉ khớp với một ký tự mở rộng UTF-8, chứ không phải ký tự ASCII. Điều này rất hữu ích cho việc viết một quy tắc lex cần loại trừ một số ký tự ASCII cụ thể (không chỉ là dòng mới) nhưng tất cả các ký tự mở rộng đều ổn.
TỪ BỎ: Lưu ý rằng quy tắc của máy quét sử dụng chức năng gọi là utf8_dup_from
để chuyển các chuỗi ký tự rộng có chứa codepoint Unicode. Chức năng đó là mạnh mẽ; nó phát hiện các vấn đề như chuỗi quá dài và byte không hợp lệ và xử lý chúng đúng cách. I E. chương trình này không dựa vào các quy tắc lex này để thực hiện xác thực và chuyển đổi, chỉ để thực hiện nhận dạng từ vựng cơ bản. Các quy tắc này sẽ nhận dạng một biểu mẫu quá dài (như mã ASCII được mã hóa bằng cách sử dụng một vài byte) làm cú pháp hợp lệ, nhưng hàm chuyển đổi sẽ xử lý chúng đúng cách. Trong mọi trường hợp, tôi không mong đợi các vấn đề bảo mật liên quan đến UTF-8 trong mã nguồn của chương trình, vì bạn phải tin tưởng mã nguồn đang chạy nó (nhưng dữ liệu được chương trình xử lý có thể không đáng tin cậy!) viết một máy quét cho dữ liệu UTF-8 không đáng tin cậy, hãy cẩn thận!
Thêm gợi ý về giải pháp thay thế? – xiaohan2012
Tôi đã sao chép trả lời của tôi từ danh sách gửi thư đến câu trả lời. –
Cảm ơn. Có vẻ để truyền cảm hứng cho tôi rất nhiều! – xiaohan2012