Haskell:字符串解析器无法识别转义的双引号

时间:2016-01-30 14:19:49

标签: string haskell parsec

我有这个Parser(48小时写一个Lisp的练习):

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'

所以,这个代码似乎适用于所有转义字符的字符串,只有当char是\&#34;它似乎结束了String。

  • 我收到警告,因为模式匹配并非详尽无遗,一般情况应该是什么?
  • 代码似乎在&#34;某些\&#34;字符串&#34;等情况下失败,它成功但返回&#34;某些&#34;

1 个答案:

答案 0 :(得分: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"