Двоичный разбор Haskell - PullRequest
5 голосов
/ 01 апреля 2011

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 01 апреля 2011

Просто используйте последовательность операций разбора, и они будут использовать ввод по ходу процесса.

parseAll = do
    hdr <- parseHeader
    pa <- parsePayloadA
    pb <- parsePayloadB
    ...
2 голосов
/ 01 апреля 2011

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

...