Двоичный анализ Haskell

Я пытался реализовать синтаксический анализатор протокола в haskell, и я довольно плохо знаком с языком, особенно когда дело доходит до монад. Я использовал бинарный-0.5.0.2 и описал заголовок и все полезные данные моего протокола. сообщения, которые я хотел бы проанализировать, выглядят примерно так: header + (полезная нагрузка A, полезная нагрузка B, ..), где поле в заголовке указывает, какой тип полезной нагрузки имеет сообщение.

Я успешно разбираю первое сообщение в строке байтов, но не могу понять, как читать следующие сообщения, отбрасывая байты, которые были прочитаны при обработке первого сообщения.

Это может быть довольно расплывчато, но я бы предпочел получить информацию об обобщенном синтаксическом анализаторе, чем изменить мой уродливый код для работы таким образом.

Спасибо за помощь

2 ответа

Решение

Просто используйте последовательность операций синтаксического анализа, и они будут использовать ввод по мере продвижения.

parseAll = do
    hdr <- parseHeader
    pa <- parsePayloadA
    pb <- parsePayloadB
    ...

Второй элемент кортежа возвращается runGetState от Data.Binary.Get остальное ByteString, Вы можете просто продолжать применять свой анализатор, пока не получите ошибку или не исчерпаете байты.

Другие вопросы по тегам