Предположим, что существует какой-то парсер:Попробуйте разборе из следующего специального символа встречаемости, если анализатор провален
valid :: Parser String
valid = string "valid" <* skipWhile (/= '\n')
Это может быть использовано для получения "valid"
строк из многострочного текста:
> parseOnly (many $ valid <* optional endOfLine) "valid\nvalid\nvalid"
Right ["valid","valid","valid"]
Если является линией, где valid
Ошибка анализатора. Дальнейший текст не будет анализироваться вообще:
> parseOnly (many $ valid <* optional endOfLine) "valid\ninvalid\nvalid"
Right ["valid"]
Как получить Rigth["valid", "valid"]
вместо этого? Я думал, что try
может быть здесь полезен, но не уверен, как продолжить синтаксический анализ из следующей строки.
'<* необязательный (символ '\ п')' часть избыточна в 'rest'. Хорошее решение парсека, но вопрос касается attoparsec. –
attoparsec очень похож. Некоторые примитивные парсеры называются по-разному, но общая структура идентична. – phadej
Этот подход «Может быть» кажется разумным, спасибо. Кроме того, я удалил все связанные с текстом пакеты-распаковки, если вы не возражаете. –