范围GHC接受
这可能听起来有点可笑,但GHC无法编译我的包含培根串,羊角面包,黄瓜和土豆:范围GHC接受
main = putStrLn " "
我知道我可以很容易地编写
main = putStrLn "\x1F953 \x1F950 \x1F952 \x1F954"
达到同样的效果,但我一直认为GHC会接受其来源中的任何unicode。因此:GHC在源文件中接受的unicode字符的实际限制是什么?
BTW:我知道支持这样的事情对于GHC词法分析器(其实我遇到上述问题跑一边写测试用例词法分析器我写的)地狱,但我仍然是一个稍微有点失望。
保存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
似乎是错误出现的地方。该文件中有多个函数可以调用该错误,因此不知道它来自哪里......
我认为它来自https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer。x#L1495 - “isAny”检查字符是否可打印。 –
@ReidBarton我在读[this](https://github.com/ghc/ghc/blob/876b00ba25a615423f48b0cf9d443a9fd5dbd6f4/libraries/base/cbits/WCsubst.c)对吗? GHC是否拥有它支持的所有角色的阵列? – Alec
@Alec是的,这是如何实现'isPrint'这样的功能。该表是从Unicode标准的文件中自动生成的。 –
什么是错误消息? – melpomene
一般来说,GHC需要知道其输入中字符的Unicode字符类别(以决定什么是正常标识符与运算符等),所以我猜测答案是任何在Unicode数据库中定义的字符时GHC建成了。它看起来像GHC只允许字符串文字中的可打印字符,并且它不知道你的制作字符是否可打印。 –
什么是平台?输入文件的编码是什么? – chi