首页 > 解决方案 > Haskell Attoparsec 无限循环

问题描述

该代码是基于Haskell Attoparsec,当我使用时parseOnly pString "v",它给了我正确的答案Right (DontNeedTrim, "v")

虽然当我使用指令时parseOnly (many' pString) "v",它似乎掉入infinite loop并最终因溢出堆栈而失败。

data Signal = NeedTrim
              | DontNeedTrim
              deriving (Show)

pString :: Parser (Signal, [Char])
pString = ((char '\"' *> many' pChar' <* char '\"') >>= \s -> return (NeedTrim, s))
          <|> (many' pChar >>= \s -> return (DontNeedTrim, s))

pChar :: Parser Char
pChar = char '\\' *> (pEscape <|> spaces *> endOfLine *> pChar)
        <|> satisfy (`C.notElem` "\"\\\n#;")

pChar' :: Parser Char
pChar' = char '\\' *> pEscape
         <|> satisfy (`C.notElem` "\\\"")

pEscape :: Parser Char
pEscape = choice (zipWith decode "bnt\\\"" "\b\n\t\\\"")
  where decode c r = r <$ char c

标签: haskellattoparsec

解决方案


第二种选择pString接受空字符串:many' pChar >>= \s -> return (...). 从而many' pString不断地消耗空字符串。


推荐阅读