Elm Parser.loop实现rawData时无限循环问题求助
Elm Parser递归loop无限循环问题排查与解决
问题成因分析
你的rawData陷入无限循环的核心原因是**dataChunk在无剩余输入时仍能成功解析出空的命令列表和内容列表**,导致loopHelper永远触发Loop分支,无法终止循环:
commands基于loopHelper command实现,允许解析0个或多个命令(无命令时command解析失败,loopHelper返回Done [])contents同理,允许解析0个或多个内容- 当输入完全解析完毕后,
dataChunk仍能生成( [], [] )的有效结果,此时loopHelper dataChunk会判定解析成功,持续执行Loop,直至栈溢出 - 其他函数(如
files/directories)无此问题,是因为无对应内容时,单个file/directory解析器会直接失败,触发loopHelper的Done分支终止循环
解决方案
要修复问题,需确保dataChunk必须包含至少一个命令,即让commands强制解析出至少一个命令,而非允许空列表。
修改方案1:重构commands解析器
将原来允许空列表的commands改为强制至少一个命令:
commands : Parser (List TermCmd) commands = command |> andThen (\firstCmd -> loop [firstCmd] <| \reversedCmds -> oneOf [ succeed (\cmd -> Loop (cmd :: reversedCmds)) |= command , succeed () |> map (\_ -> Done (List.reverse reversedCmds)) ] )
修改方案2:直接约束dataChunk
在dataChunk中直接限制命令列表非空:
dataChunk : Parser ( List TermCmd, List Content ) dataChunk = succeed (\cmds ctnt -> ( cmds, ctnt )) -- 强制至少解析一个命令 |= (command |> andThen (\first -> loop [first] (\rev -> loopHelper command rev))) |= contents
修改后,当无剩余命令时dataChunk会解析失败,loopHelper会触发Done分支,rawData的循环将正常终止,且能正确解析你的示例输入,得到与手动调用4次dataChunk一致的结果。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

