Выбор технологии синтаксического анализа для большого проекта

#java #parsing #antlr #parser-combinators

#java #синтаксический анализ #антлр #синтаксический анализатор-комбинаторы

Вопрос:

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

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

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

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

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

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

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

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

Комментарии:

1. Для ответа wothwhile отсутствует важная информация: какова сложность этих форматов как с точки зрения синтаксиса, так и с точки зрения семантики? Если сложность аналогична сложности самого языка Java, то требуются другие материалы. Если, с другой стороны, все форматы находятся на уровне CSV, тогда можно использовать гораздо более легкий подход.

2. #1 : «сложно комбинировать и повторно использовать грамматики и / или фрагменты грамматик» , я не согласен: вы можете делиться / импортировать грамматики в другие грамматики в ANTLR. #2 : это правильно. #3 : Я не знаю, что вы имеете в виду под этим. Более того, я согласен с А.Х. в том, что важная информация по-прежнему отсутствует.

3. @A.H. — спасибо за предложение, я обновил.

4. @BartKiers — я имел в виду построение дерева / хождение по дереву, чтобы преобразовать его, скажем, в модель предметной области — antlr.org/wiki/display/ANTLR3/4 . Дерево Синтаксический анализ. Прошу прощения, если моя фразеология была плохой. 🙂

5. @Мэтт, а, понятно. Нет проблем. Тогда да, я согласен #3 .

Ответ №1:

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

Комментарии:

1. Кажется, это просто набор синтаксических анализаторов. ??

2. Это инструментарий, который позволяет автоматически определять типы файлов, а также анализировать и извлекать более 70 типов mime.

Ответ №2:

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

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

Комментарии:

1. Реализация генератора синтаксического анализа выходит за рамки этого проекта. Использование грамматик — это фантастика — на самом деле, это именно то, что я хочу сделать, но мне нужен инструмент, который поможет мне в этом.

2. @Matt Fenwick, если вы выберете основанный на комбинаторах (или даже специальный) способ, вам не понадобится генератор. И, конечно, есть доступные инструменты, например: cs.nyu.edu/rgrimm/xtc

3. Это выглядит интересно; Мне нужно знать, подходит ли это для крупномасштабного проекта Java по указанным причинам — есть ли у вас опыт использования этого инструмента для такого проекта?

4. @Matt Fenwick, я оценивал только Rats! (это единственный компонент, который вам понадобится), и в итоге я все равно внедрил свой собственный встроенный Packrat (и перешел на .NET, поэтому инструменты Java для меня не будут работать). Но она должна соответствовать вашим требованиям, она масштабируема по дизайну.