В связи с обсуждением рабочий пример был создан и добавлен в https://github.com/Johanvdberg/mcrl2.xtext, см. Проекты test.multiname. * И test.reflang. * Eclipse.Ссылка на DSL от другого DSl и его модели
Multiname определяется грамматикой
grammar test.multiname.dsl.MultiNameDsl with org.eclipse.xtext.common.Terminals
generate multiNameDsl "http://www.multiname.test/dsl/MultiNameDsl"
Model:
modules+=Module+;
Module:
'begin module' name=ID
vars+=Vars*
funcs+=Funcs*
'end_module';
VarName:
name=ID;
FuncName:
name=ID;
Name:
VarName | FuncName;
Funcs:
'func' left=FuncName (bracket?='(' ')')? '=' right=[Name] ';';
Vars:
'var' VarName ';';
Файлы с этой грамматике будет выглядеть
begin module test1
var t1v1;
var t1v2;
end_module
или
begin module test2
var t2v1;
var t2v2;
end_module
грамматику языка, который будет ссылаться на выше языка, RefLang
грамматика test.reflang.dsl.RefDsl с org.eclipse.xtext.common.Terminals
generate refDsl "http://www.reflang.test/dsl/RefDsl"
import "http://www.multiname.test/dsl/MultiNameDsl" as multi
Model:
ref_from=Import
refs=DataRef;
Import:
'import' imports=[multi::Module];
DataRef:
'ref_vars' data+=[multi::VarName|FQN] (',' data+=[multi::VarName|FQN])*;
FQN:
ID ("." ID)*;
и файл с указанным выше грамматики выглядит следующим образом:
import test2
ref_vars test2.t2v1, test1.t1v1
Поведение желание заключается в том, что ref_vars
может быть только из модулей, указанных в import
, в приведенном выше файле test2
и var test1.t1v1
.
Поставщик возможности для RefLang является:
override getScope(EObject context, EReference reference) {
if (context instanceof DataRef) {
if (reference == RefDslPackage.Literals.DATA_REF__DATA) {
val rootElement = EcoreUtil2.getRootContainer(context)
return super.getScope(context, reference);
}
}
return super.getScope(context, reference);
}
Но я не могу получить доступ к элементу модели test2
, определенный в multiname языка и ссылки из RefLang с помощью RootElement. Все атрибуты rootElement.ref_from.imports.{vars, funcs}
: null
.
Примечание опрошенные несколько изменились, и эти изменения были сделаны на основе комментария к старому вопросу.
Старый вопрос У меня есть два грамматик A
и B
, где грамматика B
ссылочные элементы из грамматики A
: начинает ссылаться
Model:
import_model=Import
flows=FlowData;
Import :
'import' importURI=STRING ';';
FlowData:
'flows' data+=[A::Flow|FQN] (',' data+=[A::Flow|FQN])* ';';
FQN: ID ("." ID)*;
importURI
определяют файл, который использует грамматику A
и содержит определение Flow
.
Использование контекстного меню, как в https://christiandietrich.wordpress.com/2011/10/15/xtext-calling-the-generator-from-a-context-menu/, может быть доступно для модели грамматики B
. Как можно получить доступ к модели файла, указанной в importURI
, в том же обработчике?
Update 1
Дополнение к файлу MWE2, связанные с импортом:
fragment = scoping.ImportNamespacesScopingFragment2 auto-inject {}
referencedResource="platform:/resource/.../A.genmodel"
в файле грамматики
import "http://www..../A" as A
зависимость в проекте plugin.xml DSL грамматику B к был добавлен проект dsl грамматики A
. Также была добавлена зависимость идей и проектов ui и ui, соответственно.
Необходимо получить полную модель грамматики A
. Грамматика A
определяет систему и грамматику B
определяет, где находятся данные в системе, и необходимо преобразовать объединение двух моделей.
Для каждой модели грамматики может существовать более одной конфигурации (модели) A
.
Импорт невозможен (напрямую) только импорт, а не ссылка. Достаточно ли просто следить за ссылками на поток или вам нужно также следить за неиспользованными импортами? Установили ли вы правильную настройку для работы со старым синтаксисом URI импорта? Пожалуйста, уточните –
, пожалуйста, ознакомьтесь с обновлением 1 – Johan
Импорт Uri не используется, если вы используете область импорта, основанную на именах. И еще вопрос: это об импорте Uri (ссылки на данные, которые не работают в редакторе), или это о том, чтобы следовать ссылкам с данными или загружать неиспользуемый файл importUri где-то, например. Внутри обработчика –