Комбинаторы парсеров — это функции, которые принимают входную строку и возвращают разобранное значение вместе с оставшейся неразобранной строкой. Parser<T> определяется как (input: string) => [T, string]. Например, p Integer разбирает "10 20 30" на число 10 и остаток " 20 30". p Hello извлекает "Hello" из "Hello 100", оставляя " 100". p Ignore Whitespace потребляет пробелы, возвращая " " и "100". Затем p Integer разбирает "100" на число 100 и пустую строку.
Комбинаторы последовательности, такие как p Seq, позволяют объединять парсеры: p Seq(p Hello, p Ignore Whitespace, p Integer) разбирает "Hello 100" в кортеж ["Hello", null, 100]. Комбинатор p Map преобразует разобранные значения, например, превращая ["Hello", null, 100] в {greeting: "Hello", who: 100}. Аналогично, p Seq(p Number, p Semicolon) разбирает "10;20;30;" в список чисел, многократно применяя парсер для потребления каждой пары «число-точка с запятой».
В статье также показан разбор вывода сетевой команды ping, демонстрирующий, как структурированные данные извлекаются из необработанного текста с помощью этих комбинаторов. Операции fold и unfold показывают, как парсеры могут сворачивать или восстанавливать значения, например суммировать список или преобразовывать "Hello 100" в ["Hello", " ", 100] и обратно.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing