haskell - 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
解决方案
第二种选择pString
接受空字符串:many' pChar >>= \s -> return (...)
. 从而many' pString
不断地消耗空字符串。
推荐阅读
- python - 向量化一个删除重复值的 iterrows 函数,只保留第一个
- neo4j - Neo4j:Cypher 查询以并行化先前查询的一行结果
- javascript - 放置在环上的 SVG 文本
- html - 如何使 tbody 垂直可滚动,整个表格可水平滚动?
- angular - TypeError:无法读取未定义的属性(读取“过滤器”)
- javascript - Javascript填充未排序列表自动滚动
- reactjs - 当使用 reactjs 将 sold_out 的值设置为 true 时,将产品显示为已售罄
- k6 - 有没有办法在长时间测试中每隔几分钟重新运行一次设置步骤?
- c# - C# 在图片框中播放视频
- vim - 使用 for 循环插入在 vim 中附加索引的单词