В настоящее время я делаю сканер для базового компилятора, который я пишу на Haskell. Одним из требований является то, что любой символ, заключенный в одинарные кавычки ('), преобразуется в символьный литерал (тип T_Char), и это включает escape-последовательности, такие как' \ n 'и' \ t '. Я определил эту часть функции сканера, которая в большинстве случаев работает нормально:
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"]
Может распознавать все остальное, но экранированные обратные косые черты перепутаны с экранированными одинарными кавычками. Это как-то связано с кодировками символов?