Открыть сервис

Инструмент генерации парсеров ANTLR

ANTLR (англ. ANother Tool for Language Recognition) — генератор парсеров, программный инструмент, который на основе формальной грамматики автоматически создаёт синтаксический анализатор (парсер) и лексический анализатор (лексер) для заданного языка программирования или формата данных. Инструмент разрабатывается под руководством профессора Теренса Парра и поддерживает генерацию кода на нескольких целевых языках, включая Java, C#, Python, JavaScript, Go и C++.

История

Разработка ANTLR началась в 1989 году в Университете Колорадо. Первая версия, ANTLR 1.x, была создана на языке C и использовала подход LL(k)-разбора. В 1997 году вышла версия 2.x, которая значительно расширила возможности инструмента. Версия 3.0, выпущенная в 2005 году, была полностью переписана на Java и представила новую грамматическую нотацию, основанную на адаптивном LL()-разборе. В 2013 году вышла версия ANTLR 4, которая стала наиболее значительным обновлением: в ней появился алгоритм ALL() (Adaptive LL(*)), позволяющий обрабатывать более широкий класс грамматик без ручной оптимизации. Текущая стабильная версия — 4.13, выпущенная в 2023 году.

Принцип работы

ANTLR работает по следующей схеме:

  1. Разработчик описывает грамматику языка в специальном файле с расширением .g4, используя синтаксис, близкий к расширенной форме Бэкуса — Наура (EBNF).
  2. Инструмент анализирует грамматику и генерирует исходный код лексера и парсера на целевом языке.
  3. Сгенерированный парсер разбирает входной поток символов, строя дерево разбора (parse tree), которое может быть обработано с помощью встроенных механизмов обхода — слушателей (listeners) и посетителей (visitors).

Ключевой особенностью ANTLR 4 является алгоритм ALL(*), который устраняет необходимость в ручном устранении левой рекурсии и позволяет писать грамматики в естественном виде, без сложных преобразований. Инструмент автоматически разрешает конфликты разбора, выбирая первую подходящую альтернативу, что упрощает разработку, но требует осторожности при написании грамматик.

Структура грамматики

Грамматика ANTLR состоит из двух основных частей:

  • Лексические правила (фрагменты) — определяют токены, то есть минимальные значимые единицы языка: идентификаторы, числа, ключевые слова, операторы. Имена лексических правил пишутся заглавными буквами.
  • Синтаксические правила — описывают структуру предложений языка, комбинируя токены и другие синтаксические правила. Имена синтаксических правил пишутся строчными буквами.

Грамматика может быть объявлена как lexer grammar (только лексический анализатор), parser grammar (только синтаксический анализатор) или combined grammar (оба анализатора в одном файле). Для импорта частей грамматики из других файлов используется механизм import.

Применение

ANTLR широко используется в индустрии и академической среде для создания:

  • Языков программирования и скриптовых языков — например, на ANTLR построены парсеры для HiveQL, Spark SQL и частично для Groovy.
  • Форматов сериализации данныхJSON, XML, CSV, а также специализированных форматов конфигурационных файлов.
  • Инструментов анализа исходного кода — статических анализаторов, форматтеров, подсветки синтаксиса.
  • Систем обработки естественного языка — для построения ограниченных грамматик предметных областей.
  • Трансляторов и компиляторов — для преобразования одного языка в другой, например, из устаревших языков в современные.

Среди известных проектов, использующих ANTLR, — системы баз данных (Hive, Presto, VoltDB), инструменты разработки (JetBrains MPS, частично IntelliJ IDEA), а также множество открытых проектов на GitHub.

Инструменты и экосистема

Для работы с ANTLR доступны:

  • Плагины для IDE — для IntelliJ IDEA, Eclipse и Visual Studio Code, обеспечивающие подсветку синтаксиса грамматик и визуализацию дерева разбора.
  • ANTLRWorks — отдельная среда разработки грамматик с отладчиком и интерактивной визуализацией.
  • Утилита TestRig (grun) — встроенный инструмент для тестирования грамматик из командной строки, позволяющий выводить дерево разбора в текстовом или графическом виде.
  • Средства генерации дерева разбора — встроенные классы ParseTreeWalker, BaseListener и BaseVisitor, упрощающие обход и обработку результатов разбора.

Ограничения

Несмотря на мощность, ANTLR имеет ряд ограничений. Алгоритм ALL(*) может потреблять значительные объёмы памяти при разборе сложных грамматик с длинными предложениями. Инструмент не поддерживает контекстно-зависимые грамматики напрямую, поэтому для языков с существенной контекстной зависимостью (например, C или C++) требуются дополнительные пост-обработки. Также автоматическое разрешение конфликтов может приводить к неочевидному поведению, что требует внимательного тестирования грамматик.

См. также

  • Yacc и Bison — классические генераторы парсеров для C.
  • Parboiled — генератор парсеров для Java.
  • PEG.js — генератор парсеров для JavaScript на основе парсинга с выражением.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →