代码基于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发布于 2018-06-29 04:50:02
pString中的第二个选项接受空字符串:many' pChar >>= \s -> return (...)。因此,many' pString一直在无限地使用空字符串。
https://stackoverflow.com/questions/51093771
复制相似问题