Как я могу использовать Xtext для синтаксического анализа языков с семантическим пробелом? Я пытаюсь написать грамматику для CoffeeScript, и я не могу найти хорошую документацию по этому поводу.
Xtext: грамматика для языка со значительным/семантическим пробелом
Ответ 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, извините.
Ответ 2
Вот пример скрытого языка в 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, который поддерживает отступ на основе грамматики.