Эта статья также опубликована на моем сайте: https://fwouts.com/articles/parsing-with-antlr-intro

Вы когда-нибудь хотели написать свой собственный язык программирования? Допустим, да, потому что это мой повод показать вам, как работает ANTLR4.

Мы рассмотрим пример сверхпростого функционального языка, на котором вы можете вызывать методы со строками:

print(concat("Hello ", "World"))

Мы будем называть наш язык «C3PO». Звучит как хорошее имя.

Перво-наперво. Как вы определяете структуру языка?

Знакомство с грамматиками ANTLR4

ANTLR4 - это, как вы уже догадались, четвертая версия ANTLR. ANTLR расшифровывается как Другой инструмент для распознавания языков. Почему бы и нет.

ANTLR позволяет вам определять «грамматику» вашего языка. Как и в английском, грамматика позволяет вам объяснить, какая структура разрешена (а какая нет). Однако, в отличие от английского, грамматика следует логике и легко понимается компьютером. Позвольте мне показать вам, как это выглядит!

Каждый из этих блоков (methodCall, methodCallArguments, expression, NAME, STRING) называется правилом. А пока не беспокойтесь о разнице между правилами нижнего и верхнего регистра.

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

Проверка грамматики

Возвращаясь к нашему примеру, давайте посмотрим, как наш код соответствует грамматике, которую мы определили выше.

Сначала настройте ANTLR4, следуя официальной инструкции. Затем выполните следующие команды:

Наш код успешно проанализирован!

А теперь, просто для удовольствия, давайте попробуем какой-нибудь неправильный код:

Почему это не удалось? Поскольку мы не определяли грамматических правил для чисел или знака сложения, 1 + 2 является незаконным в нашем языке.

Как мне использовать это из кода?

Вероятно, вы не захотите запускать команду оболочки всякий раз, когда вам нужно разобрать код. В идеале вы хотите, чтобы API обращался к каждому узлу в анализируемом дереве.

Оказывается, ANTLR4 позволяет генерировать код парсера на разных языках: Java, C #, Python, Go, C ++, Swift, JavaScript и даже TypeScript!

Например, в TypeScript это может выглядеть (после настройки antlr4ts) вот как:

Образец проекта доступен по адресу https://github.com/fwouts/sample-antlr4-typescript, если вы хотите увидеть это в действии.

Теперь, когда вы увидели, насколько легко анализировать собственный язык, вы можете задаться вопросом: а как насчет существующих языков программирования? Могу я их тоже разобрать? Ответ: ДА. Фактически, нужная вам грамматика, вероятно, уже определена в репозитории grammars-v4.

Вам понравилась эта статья? Обязательно нажмите кнопку «Рекомендовать» или отправьте мне свой отзыв: f «at» codonut.com

Хорошего дня!

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

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!