Двоичный анализ Haskell
Я пытался реализовать синтаксический анализатор протокола в haskell, и я довольно плохо знаком с языком, особенно когда дело доходит до монад. Я использовал бинарный-0.5.0.2 и описал заголовок и все полезные данные моего протокола. сообщения, которые я хотел бы проанализировать, выглядят примерно так: header + (полезная нагрузка A, полезная нагрузка B, ..), где поле в заголовке указывает, какой тип полезной нагрузки имеет сообщение.
Я успешно разбираю первое сообщение в строке байтов, но не могу понять, как читать следующие сообщения, отбрасывая байты, которые были прочитаны при обработке первого сообщения.
Это может быть довольно расплывчато, но я бы предпочел получить информацию об обобщенном синтаксическом анализаторе, чем изменить мой уродливый код для работы таким образом.
Спасибо за помощь
2 ответа
Просто используйте последовательность операций синтаксического анализа, и они будут использовать ввод по мере продвижения.
parseAll = do
hdr <- parseHeader
pa <- parsePayloadA
pb <- parsePayloadB
...
Второй элемент кортежа возвращается runGetState
от Data.Binary.Get
остальное ByteString
, Вы можете просто продолжать применять свой анализатор, пока не получите ошибку или не исчерпаете байты.