Haskell: синтаксический анализатор строк не распознает экранированную двойную кавычку
У меня есть этот парсер (упражнение из "Напиши Лисп" за 48 часов):
import Text.ParserCombinators.Parsec
import Control.Monad
data LispVal = String String deriving Show
parseString :: Parser LispVal
parseString = do char '"'
x <- many innerChar
char '"'
return $ String x
where innerChar = noneOf ['\\','\"'] <|> escapeChar
escapeChar =
do char '\\'
c <- oneOf ['n', '"', 'r', 't']
return $ case c of
'"' -> '\"'
'n' -> '\n'
'r' -> '\r'
't' -> '\t'
Таким образом, кажется, что этот код отлично работает со строками со всеми экранированными символами, только когда символ \", кажется, он заканчивает строку.
- Я получаю предупреждение, потому что сопоставление с образцом не является исчерпывающим, каким должен быть общий случай?
- Кажется, что код не работает в таких случаях, как "some \" string ", где он успешно выполняется, но возвращает" some "
1 ответ
Я не вижу никаких проблем в этом:
λ *Main > parseTest parseString $ show "some\"string"
String "some\"string"
λ *Main > show "some\"string"
"\"some\\\"string\""
λ *Main > parseTest parseString "\"some\\\"string\""
String "some\"string"
-- This happened? Escaping is tricky.
λ *Main > parseTest parseString "\"some\"string\""
String "some"