2017-01-03 27 views
14

này nghe có vẻ hơi vô lý, nhưng GHC thất bại trong việc biên dịch chuỗi chứa thịt xông khói của tôi, một croissant, dưa chuột, và một củ khoai tây:Phạm vi của các ký tự unicode GHC chấp nhận

main = putStrLn "  " 

Tôi nhận ra tôi có thể dễ dàng viết

main = putStrLn "\x1F953 \x1F950 \x1F952 \x1F954" 

có cùng tác dụng, nhưng tôi đã luôn giả định GHC sẽ chấp nhận bất kỳ mã unicode nào trong nguồn của nó. Vì vậy: những hạn chế thực tế đối với các ký tự unicode GHC chấp nhận trong các tệp nguồn là gì?


BTW: Tôi nhận ra rằng việc hỗ trợ các loại điều này là địa ngục cho lexer GHC (thực sự tôi chạy băng qua vấn đề trên trong khi viết các trường hợp thử nghiệm cho một lexer tôi đã viết), nhưng tôi vẫn là một chút chút thất vọng .

+3

Thông báo lỗi là gì? – melpomene

+1

Nói chung GHC cần biết các ký tự Unicode của các ký tự trong đầu vào của nó (để quyết định định danh bình thường so với toán tử, v.v.), vì vậy tôi đoán câu trả lời là bất kỳ ký tự nào được định nghĩa trong cơ sở dữ liệu Unicode khi GHC được xây dựng. Có vẻ như GHC chỉ cho phép các ký tự in được trong chuỗi ký tự chuỗi và không biết liệu các ký tự được tạo của bạn có thể in được hay không. –

+2

Nền tảng là gì? Mã hóa của tệp đầu vào là gì? – chi

Trả lời

10

Tiết kiệm main = putStrLn " " như UTF-8 và chạy nó với ghc 8.0.1 trên hệ điều hành MacOS, tôi nhận:

lexical error in string/character literal at character '\129365' 

tôi thấy có liên quan này (nhưng đóng cửa) ghc bug report:

Nguyên nhân (đối với cả hai vấn đề) là các phiên bản cũ hơn của GHC hỗ trợ phiên bản Unicode cũ hơn:

$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'" 
NotAssigned 

Vì vậy, vấn đề dường như là phiên bản ghc chúng tôi đang sử dụng không hỗ trợ biểu tượng cảm xúc mới hơn - nó cho rằng điểm mã unicode chưa được gán và lỗi mặc dù nó được gán cho biểu tượng cảm xúc trong các phiên bản mới hơn của unicode.

Một liên quan open ghc bug ticket mà chủ yếu thảo luận về khoảng trống nào được cho phép.

Cuối cùng, lit_error function in Lexer.x dường như là nơi xảy ra lỗi. Có nhiều chức năng trong tệp đó gọi là lỗi đó, vì vậy không chắc chắn nó đến từ đâu ...

+2

Tôi nghĩ nó đến từ đây https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x # L1495 - 'isAny' kiểm tra xem ký tự có thể in được hay không. –

+1

@ReidBarton Tôi có đọc [this] (https://github.com/ghc/ghc/blob/876b00ba25a615423f48b0cf9d443a9fd5dbd6f4/libraries/base/cbits/WCsubst.c) đúng không? GHC có một mảng tất cả các nhân vật mà nó hỗ trợ không !? – Alec

+1

@Alec yes, đây là cách các hàm như 'isPrint' được triển khai. Bảng được tạo tự động từ các tệp từ tiêu chuẩn Unicode. –

Các vấn đề liên quan