Như một bài tập, tôi đang viết một trình phân tích cú pháp cho Haskell từ đầu. Khi tạo ra từ vựng, tôi nhận thấy các quy tắc sau đây về Báo cáo Haskell 2010 :
chữ số → ascDigit | uniDigit
ascDigit →0
|1
| Sầu |9
uniDigit → bất kỳ
octit chữ số thập phân Unicode →0
|1
| Sầu |7
hexit → chữ số |A
| Sầu |F
|a
| Sầu |f
thập phân → chữ số { chữ số }
bát phân → octit { octit }
thập lục phân → hexit { hexit }số nguyên → thập phân |
0o
bát phân |0O
bát phân |0x
thập lục phân |0X
hexadecimal
float → thập phân.
thập phân [ mũ ] | số mũ thập phân
mũ → (e
|E
) [+
|-
] thập phân
Chữ thập phân và thập lục phân, cùng với chữ nổi, tất cả đều dựa trên chữ số , thừa nhận bất kỳ chữ số thập phân Unicode nào, thay vì ascDigit , chỉ chấp nhận các chữ số cơ bản 0-9 từ ASCII. Thật kỳ lạ, bát phân dựa trên octit , thay vào đó chỉ thừa nhận các chữ số ASCII 0-7. Tôi đoán rằng những "chữ số thập phân Unicode" này là bất kỳ loại tiền mã hóa Unicode nào với Danh mục chung "Nd". Tuy nhiên, điều này bao gồm các ký tự như chữ số Toàn chiều rộng -9 và chữ số Devanagari -. Tôi có thể thấy lý do tại sao có thể mong muốn cho phép những thứ này trong định danh, nhưng tôi có thể thấy không có lợi ích gì khi cho phép một người viết ९0
cho nghĩa đen 90
.
GHC dường như đồng ý với tôi. Khi tôi cố gắng biên dịch tệp này,
module DigitTest where
x1 = 1
nó phát ra lỗi này
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
Tuy nhiên, tập tin này
module DigitTest where
x1 = 1
biên dịch tốt Tôi đang đọc đặc tả ngôn ngữ không chính xác? Hành vi (hợp lý) của GHC có thực sự đúng hay về mặt kỹ thuật có đi ngược lại với đặc điểm kỹ thuật trong Báo cáo không? Tôi không thể tìm thấy đề cập đến điều này ở bất cứ đâu.