范围GHC接受

范围GHC接受

问题描述:

这可能听起来有点可笑,但GHC无法编译我的包含培根串,羊角面包,黄瓜和土豆:范围GHC接受

main = putStrLn "  " 

我知道我可以很容易地编写

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

达到同样的效果,但我一直认为GHC会接受其来源中的任何unicode。因此:GHC在源文件中接受的unicode字符的实际限制是什么?


BTW:我知道支持这样的事情对于GHC词法分析器(其实我遇到上述问题跑一边写测试用例词法分析器我写的)地狱,但我仍然是一个稍微有点失望。

+3

什么是错误消息? – melpomene

+1

一般来说,GHC需要知道其输入中字符的Unicode字符类别(以决定什么是正常标识符与运算符等),所以我猜测答案是任何在Unicode数据库中定义的字符时GHC建成了。它看起来像GHC只允许字符串文字中的可打印字符,并且它不知道你的制作字符是否可打印。 –

+2

什么是平台?输入文件的编码是什么? – chi

保存main = putStrLn " "为UTF-8,然后用ghc 8.0.1在MacOS运行它,我得到:

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

我发现这个相关的(但收盘)ghc bug report

的原因(这两个问题)是旧版本的GHC支持旧版本的Unicode:

$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'" 
NotAssigned 

因此,问题似乎是我们使用的ghc版本不支持更新的emojis - 它认为unicode代码点是未分配的,并且即使将它分配到更新版本的unicode中的表情符号也会出错。

一个相关的open ghc bug ticket它主要讨论允许哪些空白字符。

最后,lit_error function in Lexer.x似乎是错误出现的地方。该文件中有多个函数可以调用该错误,因此不知道它来自哪里......

+2

我认为它来自https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer。x#L1495 - “isAny”检查字符是否可打印。 –

+1

@ReidBarton我在读[this](https://github.com/ghc/ghc/blob/876b00ba25a615423f48b0cf9d443a9fd5dbd6f4/libraries/base/cbits/WCsubst.c)对吗? GHC是否拥有它支持的所有角色的阵列? – Alec

+1

@Alec是的,这是如何实现'isPrint'这样的功能。该表是从Unicode标准的文件中自动生成的。 –