2017-01-03 92 views
14

這可能聽起來有點可笑,但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

回答

10

保存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標準的文件中自動生成的。 –