gpt4 book ai didi

haskell - Haskell 解析器应该允许数字文字中的 Unicode 数字吗?

转载 作者:行者123 更新时间:2023-12-02 01:33:16 24 4
gpt4 key购买 nike

作为一个练习,我正在从头开始为 Haskell 编写一个解析器。在制作词法分析器时,我注意到 Haskell 2010 Report 上的以下规则:

digitascDigit | uniDigit
ascDigit0 | 1 | … | 9
uniDigit → any Unicode decimal digit
octit0 | 1 | … | 7
hexitdigit | A | … | F | a | … | f

decimaldigit{digit}
octaloctit{octit}
hexadecimalhexit{hexit}

integerdecimal | 0o octal | 0O octal | 0x hexadecimal | 0X hexadecimal
floatdecimal . decimal [exponent] | decimal exponent
exponent → (e | E) [+ | -] decimal



十进制和十六进制文字以及浮点文字都基于 digit,它接受任何 Unicode 十进制数字,而不是 ascDigit,它只接受 ASCII 中的基本数字 0-9。奇怪的是,八进制是基于八进制的,它只承认 ASCII 数字 0-7。我猜这些“Unicode 十进制数字”是任何具有“Nd”通用类别的 Unicode 代码点。但是,这包括全角数字 0-9 和梵文数字 ०-९ 等字符。我明白为什么在标识符中允许使用这些可能是可取的,但我看不出允许人们写 ९0 没有任何好处。对于文字 90 .

GHC 似乎同意我的看法。当我尝试编译这个文件时,
module DigitTest where
x1 = 1

它吐出这个错误。
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^

然而,这个文件
module DigitTest where
x1 = 1

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

最佳答案

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 是在半有意地违反规范。有一个 open ticket这表明至少记录偏差,但我认为没有人表示有兴趣修复它。

关于haskell - Haskell 解析器应该允许数字文字中的 Unicode 数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com