2016-04-26 2 views
0

Я новичок в работе с Xtext и Xtend, и я наткнулся на проблему, которая, я надеюсь, кто-то может помочь мне решить. То, что я пытаюсь достичь, - это разрешить переменные из внешнего источника, а не декларировать их явно в DSL. я получил следующий пример, чтобы продемонстрировать: Вот грамматика:Устранение переменных в моей DSL от внешнего источника

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase 

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

Model: 
configUrl=ConfigUrl 
devices+=Device* 
test=Test 
; 

ConfigUrl: 
"ConfigURL=" url=STRING 
; 

Device: 
'Device' name=ID 
'has channels: ' (channels+=Channel (',' channels+=Channel)*)? 
; 

Channel: 
name=ID 
; 

Test: 
'DoSomething' channel=[Channel|QualifiedName] 
; 

и вот пример использования:

ConfigURL="http://localhost:8080/devices" 
Device Light has channels: state 
DoSomething Light.state 

Вместо явного объявления устройств в DSL, я хотел бы решить их из и внешнего источника (переменная ConfigURL). Насколько я могу судить, то, что я ищу, связано с функциональными возможностями Xtend. Я просмотрел документацию, но не нашел много, что могло бы помочь мне дальше. Кроме того, кажется, что некоторые вещи изменились, и примеры, с которыми я столкнулся, устарели.

Спасибо,

ответ

0

Поскольку ваши элементы не разобрано XText вам нужно будет создать их, например, в провайдере возможностей. Для этого сначала создайте модель ecore, которая описывает классы устройств и каналов. Вам также понадобится ссылка в вашем DSL на эти элементы, например.

DeviceDesc: 
    'Device' deviceRef=[Device|ID] 
    'has channels: ' (channels+=[Channel] (',' channels+=[Channel])*)?; 

Тогда вам нужен собственный поставщик области действия, который реализует:

В этом методе вам нужно разрешить URL. Вы можете получить его с помощью контекстного элемента:

String url = ((Model)context.eContainer()).getConfigUrl(); 

Используйте URL, чтобы получить ваши внешние данные и создавать элементы устройств из него. Затем используйте Scopes.scopeFor(myDeviceList), чтобы создать область действия и вернуть ее в свой провайдер областей.

Возможно, вы захотите рассмотреть вопрос о кешировании элементов устройства, а не всегда воссоздавать их при запросе поставщика области.

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