2017-01-31 9 views
0

В связи с обсуждением рабочий пример был создан и добавлен в 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.

+0

Импорт невозможен (напрямую) только импорт, а не ссылка. Достаточно ли просто следить за ссылками на поток или вам нужно также следить за неиспользованными импортами? Установили ли вы правильную настройку для работы со старым синтаксисом URI импорта? Пожалуйста, уточните –

+0

, пожалуйста, ознакомьтесь с обновлением 1 – Johan

+0

Импорт Uri не используется, если вы используете область импорта, основанную на именах. И еще вопрос: это об импорте Uri (ссылки на данные, которые не работают в редакторе), или это о том, чтобы следовать ссылкам с данными или загружать неиспользуемый файл importUri где-то, например. Внутри обработчика –

ответ

1

вы, кажется, парень, который на самом деле шляпы назначения в грамматик

Funcs: 
'func' left=FuncName (bracket?='(' ')')? '=' right=[Name] ';'; 

Vars: 
'var' varName=VarName ';'; 

вот scopeprovider, что отлично работает для меня

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 

    override getScope(EObject context, EReference reference) { 
     if (context instanceof DataRef) { 
      if (reference == MyDslPackage.Literals.DATA_REF__DATA) { 
       val rootElement = EcoreUtil2.getContainerOfType(context, Model) 
       val names = <Name>newArrayList 
       val importedModule = rootElement?.ref_from?.imports 
       if (importedModule !== null) { 
        for (v : importedModule.vars.map[varName]) { 
         names += v 
        } 
        for (f : importedModule.funcs.map[left]) { 
         names += f 
        } 
       } 
       // this is the unqualified variant 
       // return Scopes.scopeFor(names) 
       // this is the unqualified variant 
       return Scopes.scopeFor(names, [QualifiedName.create(importedModule.name, it.name)], IScope.NULLSCOPE) 
      } 
     } 
     return super.getScope(context, reference); 
    } 

} 

Кроме того, использование пробелов в ключевых слов код и запах может привести к непредвиденному поведению

и вы должны рассмотреть простые имена только для ссылок (в области обзора - см. мой комментарий - a nd в грамматике ref=[XXX|ID]

+0

Пространство было опечаткой, пространство должно было быть '_'. Что делают знаки '?' В 'rootElement ?.ref_from ?.import' после выполнения оператора, заполняются предыдущие поля 'null'. – Johan

+0

?. это просто нулевая безопасность x? .y.?. z дает значение null, если x равно null или y равно null или z является нулевым, но без NullPointerException –

 Смежные вопросы

  • Нет связанных вопросов^_^