Разбор двоичных данных - PullRequest
1 голос
/ 26 марта 2012

Я заинтересовался генераторами парсеров.Но у меня нет теоретического фона.Я только что прочитал несколько вещей в Интернете.

В настоящее время я пытаюсь что-то сделать с ANTLR

Итак, мои вопросы:

У меня есть специальный формат моих фреймов данных:

  • Первый байт кадра - это тег, который описывает характер данных
  • Второй байт содержит длину (количество байтов) самих данных
  • Далее следуют сами данные
  • Данные могут содержать сами кадры данных, и кадры данных могут быть перечислены один за другим

Надеюсь, мое описание понятно.Мои вопросы:

Могу ли я создать такой синтаксический анализатор с ANTLR, который читает строки кадра и затем знает, когда заканчивается кадр?

В ANTLR я могу загрузить различные теги, которые я использую, изсгенерированный файл?

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 марта 2012

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

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

1 голос
/ 26 марта 2012

Я не уверен на 100% в этом, но:

  • Генераторы синтаксического анализатора, такие как antlr, требуют грамматики, которая по крайней мере не зависит от контекста
  • использование полей длины в ваших данных делает вашу грамматику неконтекстной (я думаю, что она чувствительна к контексту)

Это последний момент, в котором я не уверен - может быть, вы хотите исследовать это подробнее.

Вы, вероятно, должны написать пакетный "синтаксический анализатор" самостоятельно (который затем должен быть синтаксическим анализатором для вашей контекстно-зависимой грамматики пакетов)

В качестве альтернативы, вы можете удалить поле длины и использовать что-то вроде s-выражений, JSON или xml; они будут разбираться чем-то, сгенерированным с помощью antlr.

...