【问题标题】:Haskell Attoparsec infinite loopHaskell Attoparsec 无限循环
【发布时间】:2018-06-29 12:50:02
【问题描述】:

代码基于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

【问题讨论】:

    标签: haskell attoparsec


    【解决方案1】:

    pString 中的第二个选项接受空字符串:many' pChar &gt;&gt;= \s -&gt; return (...)。因此many' pString 一直在无限消耗空字符串。

    【讨论】:

    • 彻底解决问题。 :) 这是否意味着在消费“v”之后,它会一直为输入“v”消费空字符串?
    猜你喜欢
    • 2016-01-27
    • 2013-10-05
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多