Будет ли переписывание многоцелевого парсера файла журнала для использования формальных грамматик улучшить удобство обслуживания? - PullRequest
3 голосов
/ 03 февраля 2010

TLDR: если я вручную создаю многоцелевой синтаксический анализатор с различным кодом для каждого формата, будет ли он работать лучше в долгосрочной перспективе, используя один фрагмент кода синтаксического анализатора и грамматику ANTLR, PyParsing или аналогичную для определения каждого формата?

Контекст: Моя работа включает в себя множество файлов журналов тестов из ~ 50 различных тестов. Есть несколько в XML, немного HTML, несколько CSV и множество проприетарных вещей без задокументированной спецификации. Чтобы сэкономить мне и моим коллегам время ввода этих данных вручную, я написал инструмент синтаксического анализа, который обрабатывает все форматы, с которыми мы регулярно работаем, с единым интерфейсом. Дизайн, однако, не так чист.

Я написал эту вещь на Python и создал класс Parser. Каждый формат файла обрабатывается как реализация, предоставляющая собственный код для метода read () анализатора. Мне нравится идея иметь только одно определение Parser, которое использует грамматики для понимания каждого формата, но я никогда не делал этого раньше.

Стоит ли это моего времени, и другим новичкам будет легче работать в будущем, когда я закончу рефакторинг?

1 Ответ

3 голосов
/ 03 февраля 2010

Я не могу ответить на ваш вопрос со 100% уверенностью, но могу высказать ваше мнение.

Я считаю, что выбор правильной грамматики по сравнению с "парсерами" регулярных выражений, часто сводится к тому, насколько однороден ввод.

Если входные данные очень однородны, и вы уже знаете язык, который хорошо работает со строками, например, Python или Perl, то я бы сохранил ваш существующий код.

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

Кроме того, если во входном потоке есть ошибка, я обнаружил, что с ними часто легче справиться, используя Antlr против регулярных выражений. Причина в том, что при наличии нескольких опций Antlr имеет встроенную функциональность для выбора правильного пути, включая откат через предикаты.

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

...