GHC接受的Unicode字符范围

15

这可能听起来有点荒谬,但 GHC 无法编译我的字符串,其中包含培根、羊角面包、黄瓜和土豆:

main = putStrLn "      "

我意识到我可以轻松地写出

main = putStrLn "\x1F953  \x1F950  \x1F952  \x1F954"

对此的效果是相同的,但我一直认为 GHC 会接受其源文件中的任何 Unicode 字符。那么:GHC在源文件中接受哪些实际的 Unicode 字符限制是什么


顺便说一下:我意识到支持这种东西对于 GHC 词法分析器来说是非常困难的(实际上,我在编写自己的词法分析器时遇到了上述问题),但我仍然有点失望。


3
错误信息是什么? - melpomene
1
通常情况下,GHC需要知道其输入中字符的Unicode字符类别(以决定什么是普通标识符而不是运算符等),因此我猜答案就是在构建GHC时定义在Unicode数据库中的任何字符。看起来,GHC只允许字符串字面量中的可打印字符,并且它不知道您编造的字符是否可打印。 - Reid Barton
2
什么是平台?输入文件的编码是什么? - chi
1
@ReidBarton 我认为 Unicode 的设计特别是为了防止这个问题。我的意思是,人们应该能够将 utf8 解码为 Unicode 码点,而不必关心它们是什么。在引号之间,并且符合通常的转义规则,我相信 GHC 不应该关心码点属于哪个类别。如果它在引号内出现有效的 Unicode 时发生错误,那么在我看来,这看起来像是一个 bug。 - chi
1
我认为GHC在字符串字面量方面比报告所述的更加宽容。(词法语法底层是像“任何Unicode小写字母”,“任何Unicode符号或标点符号”等这样的东西。从未出现过“任何Unicode字符”。) - Reid Barton
显示剩余2条评论
1个回答

10

main = putStrLn " " 保存为 UTF-8 格式并在 macOS 上使用 ghc 8.0.1 运行,我得到了以下结果:

lexical error in string/character literal at character '\129365'

我找到了这个相关的(但已关闭的)ghc bug报告

The cause (for both problems) was that older versions of GHC support a older version of Unicode:

$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'"
NotAssigned
所以问题似乎是我们正在使用的ghc版本还不支持更新的表情符号 - 即使在较新的unicode版本中将其分配给表情符号,它仍然认为unicode代码点未分配并出现错误。
相关的 ghc bug票 讨论了允许哪些空白字符。
最后,在Lexer.x文件中的lit_error函数似乎是错误的来源。该文件中有多个调用该错误的函数,因此不确定确切的来源...

2
我认为它来自这里 https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1495 -- isAny 检查字符是否可打印。 - Reid Barton
1
@ReidBarton 我是否正确地理解了这个? GHC是否有一个包含其支持的所有字符的数组?! - Alec
1
@Alec 是的,这就是像 isPrint 这样的函数是如何实现的。该表格是从 Unicode 标准的文件自动生成的。 - Reid Barton
@ReidBarton。非常感谢! - Alec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接