Haskell Attoparsec бесконечный цикл - PullRequest
0 голосов
/ 29 июня 2018

Код основан на 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

1 Ответ

0 голосов
/ 29 июня 2018

Второй вариант в pString принимает пустую строку: many' pChar >>= \s -> return (...). Таким образом, many' pString продолжает потреблять пустую строку до бесконечности.

...