Преобразовать EBNF W3C в ANTLR

#antlr #antlr4 #bnf #ebnf #project-fluent

#antlr #antlr4 #bnf #ebnf #проект-свободно

Вопрос:

Я хочу сгенерировать анализатор Swift на основе грамматики, которая описывает синтаксис FTL.

Существует ли какой-либо инструмент для автоматического EBNF -> ANTLR преобразования? Или эти два грамматических синтаксиса, по крайней мере, конвертируемы?

Сама грамматика автоматически генерируется из набора правил, написанных на JavaScript. Другим возможным решением является обновление rules -> EBNF сериализатора для вывода синтаксиса ANTLR. Но я новичок в языках и не уверен, что смогу с этим справиться.

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

1. Эта грамматика не определяет разделение труда между лексером и синтаксическим анализатором и не следует согласованному соглашению об именовании для обозначения разделения. Следовательно, чтобы преобразовать это в Antlr, вам нужно будет определить раздел символов. Antlrvsix может исправить косвенную рекурсию влево, но здесь ее нет. Оператор «-» должен быть преобразован в семантический предикат.

2. Смотрите здесь . Полностью непроверенный.

3. Хотя по сути ничто не препятствует преобразованию синтаксиса EBNF в синтаксис Antlr4, в этой грамматике нет четкой границы между лексером и синтаксическим анализатором. Чтобы заставить его «работать», я изменил лексер на символьный лексер и преобразовал все правила EBNF в правила анализатора Antlr. Было несколько других неприятных проблем, с которыми Antlr не может справиться должным образом, например, EOF в правилах нижнего уровня. Хотя это было хорошее упражнение, оно явно не подходит для Antlr.

4. Спасибо вам за такую отличную работу и объяснения! Чтобы понять все проблемы, мне, вероятно, нужно прочитать книгу ANTRL. Но пока я решил попробовать перенести анализатор ссылок вручную. Похоже, что существующие библиотеки используют тот же подход: пользовательский анализатор на целевом языке комплексный тестовый набор для проверки.

Ответ №1:

Есть ли какой-либо инструмент для автоматического преобразования EBNF -> ANTLR?

AFAIK, такого инструмента не существует.

Или эти два грамматических синтаксиса, по крайней мере, конвертируемы?

Нет. EBNF допускает косвенные леворекурсивные правила, которые ANTLR не поддерживает (хотя он поддерживает прямые леворекурсивные правила).