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

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

Хорошо ли это использование ANTLR?

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

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

Спасибо.

dan finucane

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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