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"
Другие вопросы по тегам