Является ли ANTLR подходящим инструментом для сериализации / десериализации двоичного формата данных? - PullRequest
10 голосов
/ 05 февраля 2009

Мне нужно читать и записывать потоки октетов для отправки по различным сетям для связи с интеллектуальными электросчетчиками. Существует стандарт ANSI, ANSI C12.19, который описывает двоичный формат данных. Хотя формат данных не слишком сложный, стандарт очень большой (более 500 страниц) в том смысле, что он описывает множество различных типов. Стандарт полностью описан грамматикой EBNF. Я рассматриваю возможность использования ANTLR для чтения грамматики EBNF или ее модифицированной версии и создания классов C #, которые могут читать и записывать поток октетов.

Это хорошее применение ANTLR?

Если так, что мне нужно сделать, чтобы использовать ANTLR 3.1? При поиске в архивах группы новостей мне кажется, что мне нужно реализовать новый поток, который может читать байты вместо символов. Это все, или я должен был бы также реализовать производную Lexer?

Если ANTLR может помочь мне прочитать / проанализировать поток, может ли он также помочь мне записать поток?

Спасибо.

дан финукан

Ответы [ 3 ]

16 голосов
/ 11 апреля 2009

Вы можете взглянуть на Ragel . Это компилятор / лексер конечного автомата, который полезен для реализации протокольных протоколов. Я прочитал отчеты, что он генерирует очень быстрый код. Если вам не нужен анализатор и движок шаблонов, у ragel меньше издержек, чем у ANTLR. Если вам нужен полноценный парсер, AST и хорошая поддержка шаблонного движка, ANTLR может быть лучшим выбором.

10 голосов
/ 05 февраля 2009

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

4 голосов
/ 05 февраля 2009

Мне кажется, что грамматика дает вам огромную ногу.

ANTLR 3.1 имеет функции StringTemplate и генерации кода, которые отделены от синтаксического анализа / лексирования, поэтому вы можете разложить проблему таким образом.

Мне кажется победителем, стоит попробовать.

...