2016-04-26 4 views
0

Ich bin neu in der Arbeit mit Xtext und Xtend und ich bin auf ein Problem gestoßen, von dem ich hoffe, dass mir jemand helfen kann, es zu lösen. Was ich versuche zu erreichen ist, Variablen von einer externen Quelle aufzulösen, anstatt sie explizit in der DSL zu deklarieren. Ich habe das folgende Beispiel zu demonstrieren: ist die Grammatik:Auflösen von Variablen in meinem DSL von einer externen Quelle

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] 
; 

und hier ist ein Beispiel für die Verwendung:

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

Statt explizit die Geräte in der DSL erklärt würde ich lösen möchte sie von und externe Quelle (die Variable ConfigURL). Soweit ich das beurteilen kann, hängt das, was ich suche, mit der Scoping-Funktionalität von Xtend zusammen. Ich habe mir die Dokumentation angeschaut, aber nicht viel gefunden, was mir weiterhelfen kann. Außerdem scheint es, dass sich einige Dinge geändert haben und die Beispiele, auf die ich gestoßen bin, veraltet sind.

Danke,

Antwort

0

Da Ihre Elemente nicht analysiert werden Xtext Sie sie erstellen benötigen, beispielsweise im Umfang Anbieter. Erstellen Sie dazu zuerst ein ecore-Modell, das Ihre Geräte- und Kanalklassen beschreibt. Sie benötigen auch eine Referenz in Ihrem DSL zu diesen Elementen, z.B.

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

Dann benötigen Sie einen eigenen Anwendungsbereich Provider, die implementiert:

Sie die URL lösen müssen in diesem Verfahren. Sie können es über das Context-Element erhalten:

Verwenden Sie die URL, um Ihre externen Daten abzurufen und Geräteelemente daraus zu erstellen. Verwenden Sie dann Scopes.scopeFor(myDeviceList), um einen Bereich zu erstellen, und geben Sie ihn in Ihrem Bereichsanbieter zurück.

Sie sollten in Erwägung ziehen, die Geräteelemente zwischenzuspeichern, anstatt sie immer neu zu erstellen, wenn der Scope-Provider gefragt wird.

Verwandte Themen