首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Attoparsec无限回路

Haskell Attoparsec无限回路
EN

Stack Overflow用户
提问于 2018-06-29 03:17:52
回答 1查看 99关注 0票数 0

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

当我使用parseOnly (many' pString) "v"指令时,它似乎会掉进infinite loop中,最后由于溢出堆栈而失败。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 04:50:02

pString中的第二个选项接受空字符串:many' pChar >>= \s -> return (...)。因此,many' pString一直在无限地使用空字符串。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51093771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档