Haskell解析器是否应该允许数字文字使用Unicode数字?


15

作为练习,我将从头开始为Haskell编写解析器。在编写词法分析器时,我注意到Haskell 2010报告中的以下规则:

ascDigit | uniDigit
ascDigit0| 1| …| 9
uniDigit →任意Unicode十进制数字
octit0| 1| …| 7
hexit数字 | A| …| F| a| …|f

十进制 { 位数 }
八进制octit { octit }
十六进制hexit { hexit }

整数十进制 | 0o 八进制 | 0O 八进制 | 0x 十六进制 | 0X 十六进制
浮点数十进制 . 十进制 [ 指数 ] | 十进制指数
指数 →(e| E)[ +| -] 十进制

十进制和十六进制文字以及浮点文字都基于digit,后者允许输入任何Unicode十进制数字,而不是ascDigit,后者仅接受ASCII的基本数字0-9。奇怪的是,八进制基于octit,它仅允许ASCII数字0-7。我猜这些“ Unicode十进制数字”是带有“ Nd”常规类别的任何Unicode代码点。但是,其中包括全角数字0-9和梵文数字०- characters。我可以看到为什么最好在标识符中允许使用这些标识符,但是我看不出任何允许使用标识符९0为文字编写的好处90

GHC似乎同意我的观点。当我尝试编译该文件时,

module DigitTest where
x1 = 

它吐出这个错误。

digitTest1.hs:2:6: error: lexical error at character '\65297'
  |
2 | x1 = 
  |      ^

但是,这个文件

module DigitTest where
x = 1

编译就好了。我阅读的语言规范不正确吗?GHC的(明智的)行为实际上是正确的,还是在技术上违反了报告中的规范?我在任何地方都找不到任何提及。


4
滑稽。我怀疑这是因为“好吧,文字就很容易由ASCII数字组成。” “别挂了,让我们考虑一下国际化,Unicode……它们还有其他数字符号,对吗?” “哦,是的,从来没有处理过……但是,好的,让我们为它插入一个子句……”“太好了。” ...然后它就被遗忘了,没有人真正为实现它而烦恼,或者注意到允许混合使用不同的数字家族是没有意义的。
大约

kes。是的,不要为此烦恼。
Boann

Answers:


8

在GHC源代码文件中compiler/parser/Lexer.x,您可以找到以下代码:

ascdigit  = 0-9
$unidigit  = \x03 -- Trick Alex into handling Unicode. See [Unicode in Alex].
$decdigit  = $ascdigit -- for now, should really be $digit (ToDo)
$digit     = [$ascdigit $unidigit]
...
$binit     = 0-1
$octit     = 0-7
$hexit     = [$decdigit A-F a-f]
...
@numspc       = _*                   -- numeric spacer (#14473)
@decimal      = $decdigit(@numspc $decdigit)*
@binary       = $binit(@numspc $binit)*
@octal        = $octit(@numspc $octit)*
@hexadecimal  = $hexit(@numspc $hexit)*
@exponent     = @numspc [eE] [\-\+]? @decimal
@bin_exponent = @numspc [pP] [\-\+]? @decimal

在此,$decdigit用于解析十进制和十六进制文字(及其浮点变量),而$digit用于字母数字标识符的“数字”部分。“ ToDo”注释清楚表明这是GHC与语言标准的公认偏差。

因此,您在正确阅读规格,GHC故意违反了规格。有一张公开票证建议至少记录下偏差,但是我认为没有人表示有解决此偏差的兴趣。


列出的所有三个偏差都非常合理。我可以看到为什么没有“修复”它们的需求。
伊恩·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.