Comme exercice, j'écris un analyseur pour Haskell à partir de zéro. En faisant le lexer, j'ai remarqué les règles suivantes sur le rapport Haskell 2010 :
digit → ascDigit | uniDigit
ascDigit →0|1| … |9
uniDigit → tout
octet de chiffre décimal Unicode →0|1| … |7
hexit → chiffre |A| … |F|a| … |fdécimal → chiffre { chiffre }
octal → octit { octit }
hexadécimal → hexit { hexit }entier → décimal |
0ooctal |0Ooctal |0xhexadécimal | float0Xhexadécimal → décimal décimal [ exposant ] | exposant décimal exposant → ( | ) [ | ] décimal
.
eE+-
Les littéraux décimaux et hexadécimaux, ainsi que les littéraux flottants, sont tous basés sur digit , qui admet tout chiffre décimal Unicode, au lieu de ascDigit , qui n'admet que les chiffres de base 0-9 de ASCII. Étrangement, octal est basé sur octit , qui n'admet à la place que les chiffres ASCII 0-7. Je suppose que ces "chiffres décimaux Unicode" sont des points de code Unicode avec la catégorie générale "Nd". Cependant, cela inclut des caractères tels que les chiffres pleine largeur 0-9 et les chiffres Devanagari ०-९. Je peux voir pourquoi il pourrait être souhaitable de les autoriser dans les identifiants, mais je ne vois aucun avantage à permettre d'écrire ९0pour le littéral 90.
GHC semble d'accord avec moi. Lorsque j'essaie de compiler ce fichier,
module DigitTest where
x1 = 1
il crache cette erreur.
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
Cependant, ce fichier
module DigitTest where
x1 = 1
compile très bien. Suis-je en train de lire la spécification de langue de manière incorrecte? Le comportement (sensé) de GHC est-il réellement correct ou va-t-il techniquement à l'encontre des spécifications du rapport? Je ne trouve aucune mention de cela nulle part.