Xtext: ссылки на объекты из других языков; пространства имен и псевдонимы для importURI?

Я разрабатываю язык на основе xtext, который должен ссылаться на объекты, определенные в формате файла, специфичном для поставщика.

Например. этот формат файла определяет сообщения, мой язык должен определять правила, которые работают с этими сообщениями. Конечно, я хочу использовать функции xtext, например. для автозаполнения/проверки имен сообщений, атрибутов и т. д.

Не уверен, что это хорошая идея, но я придумал следующее:

  • Используйте один проект xtext для описания формата файла
  • Добавьте зависимость для этого проекта в мой проект DSL, импортируйте грамматику формата файла в мою грамматику
  • импортировать файлы описания через importURI

Грамматика формата файла:

grammar com.example.xtext.fileformat.FileFormat;
generate fileformat "http://xtext.example.com/fileformat/FileFormat"
[...]

DSL-грамматика:

grammar com.example.xtext.dsl.DSL;
import "http://xtext.example.com/fileformat/FileFormat" AS ff;
Model:
    rules += Rule*;

Rule: ImportFileRule | SampleRule;
ImportFileRule: "IMPORT" importURI=STRING "AS" name=ID ";";
SampleRule: "FORWARD" msg=[ff::Message] ";"

Прежде всего: это отлично работает.

Теперь разные импортированные файлы могут определять сообщения с конфликтующими именами, и я все равно хочу использовать полные имена для сообщений. Префикс для имен сообщений должен быть определен в моем DSL, например. имя правила импорта файла.

Итак, я хотел бы использовать что-то вроде:

IMPORT "first-incredibly-long-filename-with-version-and-stuff.ff" AS first;
IMPORT "second-incredibly-long-filename-with-version-and-stuff.ff" AS second;

FORWARD first.msg_1; // references to msg_1 in first file
FORWARD second.msg_1; // references to msg_1 in second file

К сожалению, я не вижу простого способа добиться этого с помощью xtext.

На данный момент я использую идентификатор для квалификатора пространства имен и пользовательских классов ProposalProvider/Validator, который уродлив в деталях и обходит индекс EMF, становясь медленным с файлами из 1000 сообщений и 50000 атрибутов...

Будет ли правильный способ сделать это? Было ли хорошей идеей использовать xtext для разбора файлов определений в первую очередь?


person Hubert Denkmair    schedule 24.07.2013    source источник


Ответы (2)


У меня есть две идеи, что проверить.

  1. Xtext имеет специальный поставщик глобальной области видимости, который называется ImportedNameSpaceAwareScopeProvider. Используя переопределенную версию этого, вы можете указать другие заголовки для рассмотрения.
  2. Проверьте реализацию грамматики xtext. себя, так как он поддерживает такую ​​функцию с импортом EPackage. Я не совсем уверен, как это работает, но должно работать именно так.
person Zoltán Ujhelyi    schedule 25.07.2013
comment
Спасибо! Переопределение ImportedNameSpaceAwareScopeProvider было правильным решением. - person Hubert Denkmair; 07.08.2013

Наконец, я использовал SimpleNamesFragment, ImportURIScopingFragment и пользовательский ScopeProvider, производный от AbstractDeclarativeScopeProvider.

Таким образом, мне пришлось реализовывать методы ScopeProvider для отключения нескольких правил, но я был гораздо более гибким в использовании моего «префикса пространства имен». Например. просто реализовать такие синтаксисы, как

FORWARD FROM first: msg_01, msg_02;
person Hubert Denkmair    schedule 13.08.2013