我有一个双引号字符串的解析器,该解析器通常可以正常工作,但是如果缺少引号,它将永远循环并导致应用程序崩溃。
它是用Elm编写的Web应用程序的一部分,使用elm/parser。
基于Elm Github的example。>>
这里是一个最小的示例(run it in Ellie;将toParse更改为“ \”“,这会导致制表符崩溃。
module Main exposing (main) import Html import Parser as P exposing ((|.), (|=)) import Debug stringP : P.Parser String stringP = P.succeed identity |. P.token "\"" |= P.loop [] stringHelp stringHelp : List String -> P.Parser (P.Step (List String) String) stringHelp revChunks = P.oneOf [ P.token "\"" |> P.map (\_ -> P.Done (String.join "" (List.reverse revChunks))) , P.chompWhile isUninteresting |> P.getChompedString |> P.map (\chunk -> P.Loop (chunk :: revChunks)) ] isUninteresting : Char -> Bool isUninteresting char = char /= '\\' && char /= '"' toParse = "\"" main = Html.text <| Debug.toString <| P.run stringP toParse
我可以从某种程度上看到问题所在-即使到达输入结束,
chompWhile
位也会成功。我需要类似this的内容,但在这种情况下无法完全解决。
我有一个用于双引号字符串的解析器,该解析器通常可以正常工作,但是如果缺少引号,它将永远循环并导致应用崩溃。它是用Elm编写的Web应用程序的一部分,使用elm / parser。 ...
我发现解决方案是跟踪解析位置,如果位置没有增加,则退出循环。虽然不是很漂亮。也许有人会想出更好的东西。