Xtext: грамматика для языка со значительным/семантическим пробелом

Как я могу использовать Xtext для синтаксического анализа языков с семантическим пробелом? Я пытаюсь написать грамматику для CoffeeScript, и я не могу найти хорошую документацию по этому поводу.

Ответ 1

AFAIK, вы не можете.

В случае разбора Python-подобных языков вам понадобится лексер для выделения токенов INDENT и DEDENT. Для этого вам нужны семантические предикаты для поддержки внутри правил lexer (правила Xtext terminal), которые сначала проверили бы, будет ли текущая позиция в строке следующего символа int вводится равным 0 (начало строка) и является ' ' или '\t'.

Но просматривая documentation, я не вижу, что это поддерживается Xtext на данный момент. Начиная с Xtext 2.0, поддержка была добавлена ​​для семантических предикатов в производственных правилах (см. 6.2.8. Синтаксические предикаты), но не в терминальных правилах.

Единственный способ сделать это с помощью Xtext - позволить лексеру создавать терминальные пространства и разрывы строк, но это создаст полный беспорядок ваших производственных правил.

Если вы хотите разобрать такой язык с помощью Java (и Java-ориентированного генератора парсеров), я бы рекомендовал ANTLR, в котором вы можете легко выпустить токены INDENT и DEDENT. Но если вы заинтересованы в интеграции Eclipse, то я не понимаю, как вы сможете это сделать, используя Xtext, извините.

Ответ 3

Версия 2.8 Xtext поставляется с поддержкой Whitespace-Aware Languages ​​. Эта версия поставляется с "примером домашней автоматизации", который вы можете использовать в качестве шаблона.

Ответ 4

Для людей, интересующихся CoffeeScript, у Адама Шмидега есть плагин Eclipse, который использует XText.

Для людей, интересующихся разбором Python-подобной DSL в XText, код Ralf Ebert для Todotext, упомянутый выше, больше не доступен из Github, но вы можете найти его в Репозиторий тестирования Eclipse. См. исходный поток об этой работе и проблема Eclipse, которая был поднят об этом.

Сегодня я играл с этим кодом, и мой вывод заключается в том, что он больше не работает в текущей версии XText. Когда XText используется в Eclipse, я думаю, что он выполняет "частичный разбор". Это несовместимо с лексикой, поддерживающей состояние, вам нужно обрабатывать чувствительные языки отступов. Поэтому я подозреваю, что даже если вы исправляете лексер, редактор Eclipse не работает. В этом вопросе похоже, что Ральф предложил заплатки для решения этих проблем, но, глядя в источник XText, эти изменения, похоже, давно прошли? Если я ошибаюсь, и кто-то может заставить его работать, мне было бы очень интересно?

Здесь существует другая реализация но я не могу заставить это работать с текущей версией XText.

Вместо этого я переключился на parboiled, который поддерживает отступ на основе грамматики.