Выбор технологии разбора для большого проекта - PullRequest
2 голосов
/ 29 октября 2011

Мне приходится иметь дело с множеством разных форматов файлов. Не менее 50, а может и более 100.

Я играл с Antlr в прошлом. Однако я не уверен, что Antlr подойдет для этого проекта по нескольким причинам:

  • Трудно комбинировать и повторно использовать грамматики и / или кусочки грамматик
  • Antlr выполняет генерацию кода - для внесения изменений в существующий синтаксический анализатор необходимо вернуться в Antlr, внести изменения, восстановить код, интегрировать код обратно в кодовую базу и запустить модульные тесты
  • для построения дерева / обработки требуется работа с другим языком внутри Antlr - потенциальная проблема для будущих разработчиков

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

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

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

  1. Подходит ли Antlr / предназначен для такого масштабного проекта разбора?
  2. Какие есть другие варианты крупномасштабного анализа в Java?

Примечание: некоторые форматы файлов - это CSV или табуляция, некоторые более сложные, некоторые такие же сложные, как Java. С точки зрения семантики, они также могут быть довольно сложными (хотя и не все).

Ответы [ 2 ]

0 голосов
/ 29 октября 2011

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

Я бы никогда не посчитал недостатком средства генерации кода и хороший декларативный DSL, но, вероятно, я слишком далек от субкультуры Java. Если эти проблемы как-то актуальны, тем не менее, это не проблема - вы можете реализовать Packrat с помощью комбинаторов. Это может быть немного неуклюжим в Java (из-за отсутствия правильных замыканий и лямбд), но все же гораздо более читабельным, чем типичный анализатор рекурсивного спуска.

0 голосов
/ 29 октября 2011

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

...