У меня есть синтаксический анализатор для строк в двойных кавычках, который в основном работает нормально, но когда конечная кавычка отсутствует, он зацикливается навсегда и вылетает приложение.
Это часть веб-приложения, написанного на Elm, и использует elm / parser .
Он основан на примере из Elm Github.
Вот минимальный пример ( run это в Ell ie; измените наParse на "\", и он вылетит на вкладке.)
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 , но я не могу понять, как это сделать в этом случае.