2010-02-15 57 views
2

我目前正在爲我在Haskell編寫的基本編譯器製作掃描器。其中一個要求是,用單引號(')括起來的任何字符都被轉換爲字符文字標記(類型T_Char),並且這包括轉義序列,如'\ n'和'\ t'。我定義掃描功能,在大多數情況下工作好,這部分:Haskell:解析單引號中的轉義字符

scanner ('\'':cs)  | (length cs) == 0   = error "Illegal character!" 
         | head cs == '\\'    = mkEscape (head (drop 1 cs)) : scanner (drop 3 cs) 
         | head (drop 1 cs) == '\'' = T_Char (head cs) : scanner (drop 2 cs) 


         where 
          mkEscape  :: Char -> Token 
          mkEscape 'n' = T_Char '\n' 
          mkEscape 'r' = T_Char '\r' 
          mkEscape 't' = T_Char '\t' 
          mkEscape '\\' = T_Char '\\' 
          mkEscape '\'' = T_Char '\'' 

然而,這出現在當我在GHCI運行:

Main> scanner "abc '\\' def" 
[T_Id "abc", T_Char '\'', T_Id "def"] 

它可以識別一切,但得到逃脫的反斜槓與逃脫的單引號混淆。這與字符編碼有關嗎?

回答

5

我不認爲關於你的問題解析器有什麼問題。對於Haskell,字符串將被讀爲

abc '\' def 

因爲Haskell也有字符串轉義。因此,當它達到第一個引號時,cs包含字符序列\' def。顯然head cs是一個反斜槓,所以它會運行mkEscape

給出的參數是head (drop 1 cs),即',因此mkEscape將返回T_Char '\'',這就是您所看到的。


也許你應該叫

scanner "abc '\\\\' def" 

\第一級是Haskell的解釋,而第二級是scanner

+0

我明白了。這是否意味着在閱讀文件而不是使用解釋器時它可以正常工作? – benwad 2010-02-15 13:28:50

+0

@benwad:是的。 _ – kennytm 2010-02-15 13:31:17