Racket и Xtext рассматриваются как языковые рабочие места, но они основаны на разных концепциях и рабочих процессах.
Как опытный пользователь Xtext, я нахожу это трудно адаптировать свой мыслительный процесс к Racket.
В Xtext грамматика языка преобразуется в набор классов (также называемых метамоделью ) или отображается на них. Xtext также генерирует синтаксический анализатор, который преобразует исходный файл в набор экземпляров этих классов. API определения области действия позволяет разрешать именованные ссылки, так что результатом является граф объектов (также называемый моделью ), а не абстрактное синтаксическое дерево (AST). Такую модель можно запросить, преобразовать или передать в механизм шаблонов для генерации кода.
В Racket средство чтения создает AST в форме синтаксического объекта. Однако в большинстве примеров, которые я нашел, кажется, этот синтаксический объект используется специально c. Либо это игрушечные языки, которым не нужен полный граф объектов, либо они слишком сложны, и из них трудно вывести общую методологию.
Для моего текущего языкового проекта, после борьбы с синтаксическими объектами, я создал эквивалент метамодели с использованием структур Racket. Тогда было довольно легко преобразовать объект синтаксиса в граф объектов, которым я мог управлять, как если бы это была модель в EMF. Однако мне кажется, что я не использую объекты синтаксиса так, как они задуманы.
Вот мои вопросы:
- Какие инструменты или API доступны для работы с объектами синтаксиса и достичь такой же простоты использования, как и фреймворк, управляемый моделями?
- Существуют ли документы, описывающие общую методологию разработки языка в Racket, которая может быть применена к нетривиальным языкам? * Существуют ли документы, объясняющие способ Racket по сравнению с Xtext или любой другой структурой языка на основе моделей?
EDIT:
На основе документации для помощников по метапрограммированию 1032 *, классы синтаксиса могут использоваться для определения и составления шаблонов синтаксиса и присоединения атрибутов к их элементам. Они могут достичь той же цели, что и классы метамодели. Однако, насколько я понимаю, классы синтаксиса не являются классами, а объекты синтаксиса не связаны с классами синтаксиса в отношениях класс-экземпляр. Это имеет следующие последствия:
- Синтаксические классы не поддерживают наследование напрямую, но мы можем добиться аналогичного эффекта с
~or*
и объявлениями атрибутов для подклассов. - Синтаксические классы не поддерживают поставляются с аксессуарами для своих атрибутов: вы должны вызывать
syntax-parse
каждый раз, когда хотите прочитать атрибут.
На данный момент есть еще две недостающие функции, которые не рассматриваются в документации, Я нашел:
- Обход синтаксического дерева от дочернего к родительскому: как мне получить ссылку на синтаксический объект, содержащий данный синтаксический объект?
- Область действия: как я могу определить указать c правила области действия для моего языка?