Como ejercicio, estoy escribiendo un analizador para Haskell desde cero. Al hacer el lexer, noté las siguientes reglas en el Informe Haskell 2010 :
dígito → ascDigit | uniDigit
ascDigit →0|1El | ... |9
uniDigit → cualquier dígito decimal Unicode
octit →0|1El | ... |7
hexit → dígito |AEl | ... |FEl |aEl | ... |fdecimal → dígito { dígito }
octal → octit { octit }
hexadecimal → hexit { hexit }entero → decimal |
0ooctal |0Ooctal |0xhexadecimal | flotante0Xhexadecimal → decimal decimal [ exponente ] | decimal exponente exponente → ( | ) [ | ] decimal
.
eE+-
Los literales decimales y hexadecimales, junto con los literales flotantes, se basan en dígitos , que admiten cualquier dígito decimal Unicode, en lugar de ascDigit , que admite solo los dígitos básicos 0-9 de ASCII. Curiosamente, octal se basa en octit , que en cambio solo admite los dígitos ASCII 0-7. Supongo que estos "dígitos decimales Unicode" son puntos de código Unicode con la categoría general "Nd". Sin embargo, esto incluye caracteres como los dígitos de ancho completo 0-9 y los números de Devanagari ०-९. Puedo ver por qué sería deseable permitir estos en los identificadores, pero no veo ningún beneficio por permitir que uno escriba ९0para el literal 90.
GHC parece estar de acuerdo conmigo. Cuando intento compilar este archivo,
module DigitTest where
x1 = 1
escupe este error.
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
Sin embargo, este archivo
module DigitTest where
x1 = 1
compila muy bien. ¿Estoy leyendo la especificación del idioma incorrectamente? ¿Es correcto el comportamiento (sensible) de GHC, o técnicamente va en contra de la especificación en el Informe? No puedo encontrar ninguna mención de esto en ningún lado.