Я разрабатываю язык на основе 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 для разбора файлов определений в первую очередь?