Специфические для домена c языков в Racket по сравнению с модельно-ориентированными фреймворками, такими как Xtext - PullRequest
3 голосов
/ 05 мая 2020

Racket и Xtext рассматриваются как языковые рабочие места, но они основаны на разных концепциях и рабочих процессах.

Как опытный пользователь Xtext, я нахожу это трудно адаптировать свой мыслительный процесс к Racket.

В Xtext грамматика языка преобразуется в набор классов (также называемых метамоделью ) или отображается на них. Xtext также генерирует синтаксический анализатор, который преобразует исходный файл в набор экземпляров этих классов. API определения области действия позволяет разрешать именованные ссылки, так что результатом является граф объектов (также называемый моделью ), а не абстрактное синтаксическое дерево (AST). Такую модель можно запросить, преобразовать или передать в механизм шаблонов для генерации кода.

В Racket средство чтения создает AST в форме синтаксического объекта. Однако в большинстве примеров, которые я нашел, кажется, этот синтаксический объект используется специально c. Либо это игрушечные языки, которым не нужен полный граф объектов, либо они слишком сложны, и из них трудно вывести общую методологию.

Для моего текущего языкового проекта, после борьбы с синтаксическими объектами, я создал эквивалент метамодели с использованием структур Racket. Тогда было довольно легко преобразовать объект синтаксиса в граф объектов, которым я мог управлять, как если бы это была модель в EMF. Однако мне кажется, что я не использую объекты синтаксиса так, как они задуманы.

Вот мои вопросы:

  • Какие инструменты или API доступны для работы с объектами синтаксиса и достичь такой же простоты использования, как и фреймворк, управляемый моделями?
  • Существуют ли документы, описывающие общую методологию разработки языка в Racket, которая может быть применена к нетривиальным языкам? * Существуют ли документы, объясняющие способ Racket по сравнению с Xtext или любой другой структурой языка на основе моделей?

EDIT:

На основе документации для помощников по метапрограммированию 1032 *, классы синтаксиса могут использоваться для определения и составления шаблонов синтаксиса и присоединения атрибутов к их элементам. Они могут достичь той же цели, что и классы метамодели. Однако, насколько я понимаю, классы синтаксиса не являются классами, а объекты синтаксиса не связаны с классами синтаксиса в отношениях класс-экземпляр. Это имеет следующие последствия:

  • Синтаксические классы не поддерживают наследование напрямую, но мы можем добиться аналогичного эффекта с ~or* и объявлениями атрибутов для подклассов.
  • Синтаксические классы не поддерживают поставляются с аксессуарами для своих атрибутов: вы должны вызывать syntax-parse каждый раз, когда хотите прочитать атрибут.

На данный момент есть еще две недостающие функции, которые не рассматриваются в документации, Я нашел:

  • Обход синтаксического дерева от дочернего к родительскому: как мне получить ссылку на синтаксический объект, содержащий данный синтаксический объект?
  • Область действия: как я могу определить указать c правила области действия для моего языка?
...