Что мне нужно сделать, чтобы реализовать грамматику, парсер и лексер в Antlr программно без файла грамматики? - PullRequest
2 голосов
/ 20 мая 2019

Из примеров, которые я видел в Интернете и из того, что я читал до сих пор, кажется, что типичный подход к созданию языка с использованием Antlr требует файла грамматики .g4 и инструмента, подобного maven-antlr-plugin, для генерацииИсходники Java основаны на этом.

Можно ли реализовать вещи с нуля, не имея файла грамматики и не используя такой генератор?

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

Что потребуется как минимум, чтобы реализовать это программно?Реализация лексера и парсера?Что еще?

Может кто-нибудь привести пример минималистичной реализации, которая не требует генерации кода?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Было бы лучше реализовать парсер Earley , который по сути напрямую связан с набором правил грамматики.

Хотите другой язык?Пересмотрите набор правил, передайте его механизму парсинга Earley.

Более интересный вопрос может быть: «Какой механизм разбора эффективен / действенен для грамматики, в которой некоторые правила постоянны, а некоторыединамический?»Я уже давно слежу за механизмом разбора и не вижу поставленного вопроса, не говоря уже о том, чтобы найти ответ на него.Я подозреваю, что вы могли бы получить что-то полезное, если бы вы частично сравнивали парсер Earley с вашим базовым пазером с заполнителями для изменяющихся правил, но это явно исследовательский проект.

2 голосов
/ 20 мая 2019

Я думаю, что это было бы совершенно непрактично в общем случае.Antlr - это инструмент, который генерирует парсеры из файлов грамматики ... если вы уберете генерацию парсеров (потому что это "генерирование кода") и использование файлов грамматики, то, на самом деле, вы просто заберете весь Antlr.

Возможно, вы могли бы использовать некоторые части библиотеки времени выполнения (возможно, ATN? Или некоторые вещи более низкого уровня, например CharacterStream), но в целом вам в значительной степени потребуется написать собственный общий синтаксический анализатор / лексер с нуля.

Позвольте мне перевернуть ваш вопрос: что вы хотите получить от использования Antlr?

...