GHC接受的unicode字符范围

Ale*_*lec 14 string unicode haskell ghc

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

main = putStrLn "      "
Run Code Online (Sandbox Code Playgroud)

我意识到我可以轻松写作

main = putStrLn "\x1F953  \x1F950  \x1F952  \x1F954"
Run Code Online (Sandbox Code Playgroud)

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


顺便说一句:我意识到支持这类事情对于GHC词法分析器来说是地狱(实际上我在为我写的词法分析器编写测试用例时遇到了上述问题),但我仍然有点失望.

mb2*_*b21 10

保存main = putStrLn " "为UTF-8并ghc 8.0.1在macOS上运行它,我得到:

lexical error in string/character literal at character '\129365'
Run Code Online (Sandbox Code Playgroud)

我发现这个相关(但已关闭)的ghc错误报告:

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

$ ghc-7.0.3 -e "Data.Char.generalCategory '\8342'"
NotAssigned
Run Code Online (Sandbox Code Playgroud)

所以问题似乎是我们使用的ghc版本还不支持更新的表情符号 - 它认为unicode代码点是未分配的,即使它被分配给较新版本的unicode中的表情符号也会出错.

一个相关的开放ghc错误票,主要讨论允许哪些空白字符.

最后,lit_error函数Lexer.x似乎是错误浮出水面的地方.该文件中有多个函数可以调用该错误,因此不确定它来自哪个...

  • 我认为它来自这里https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1495 - `isAny`检查该字符是否可打印. (2认同)