В качестве упражнения я пишу парсер для Haskell с нуля. При создании лексера я заметил следующие правила в отчете Haskell 2010 :
di git → ascDi git | uniDi git
ascDi git → 0
| 1
| … | 9
uniDi git → любой десятичный код Unicode di git
октит → 0
| 1
| … | 7
hexit → di git | A
| … | F
| a
| … | f
десятичный → di git { di git}
восьмеричное → октит { октит }
шестнадцатеричный → hexit { hexit }
целое число → десятичное число | 0o
восьмеричное | 0O
восьмеричное | 0x
шестнадцатеричный | 0X
шестнадцатеричный
число с плавающей запятой → десятичное число .
десятичное число [ показатель степени ] | десятичный показатель
показатель → (e
| E
) [+
| -
] десятичное число
Десятичные и шестнадцатеричные литералы, а также литералы с плавающей точкой основаны на di git, который допускает любой десятичный код Unicode di git вместо ascDi git, который допускает только базовые c цифры 0-9 от ASCII. Странно, но восьмеричное основано на восьмеричном , который вместо этого допускает только цифры ASCII 0-7. Я бы предположил, что эти "Unicode decimal di git" - это любые кодовые точки Unicode с общей категорией "Nd". Однако сюда входят такие символы, как цифры полной ширины 0-9 и цифры деванагари ०-९. Я понимаю, почему было бы желательно разрешить это в идентификаторах, но я не вижу никакой выгоды, если разрешить писать ९0
для литерала 90
.
GH C, похоже, согласен с меня. Когда я пытаюсь скомпилировать этот файл,
module DigitTest where
x1 = 1
выдает эту ошибку.
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
Однако этот файл
module DigitTest where
x1 = 1
компилируется просто отлично. Я неправильно читаю спецификацию языка? Является ли (разумное) поведение GH C действительно правильным или технически go противоречит спецификации в Отчете? Я нигде не могу упомянуть об этом.