2016-12-28 2 views
0

В моей грамматикой у меня есть правило включают в себя следующие:XText, импортировать свой собственный mydsl файл

Script: 
    includes+=(Include)* assignments+=(Assignment)* clock=Clock? tests+=Test* 
; 

Include: 
    'INCLUDE' importURI=STRING 
; 

, что я хочу сделать, это включить файлы такие же, как «основной» файл.

Я работаю с interpreter, который передает файл .mydsl.

/* Main exec methode */ 

def dispatch void exec(Script s) { 

    s.includes.forEach[ i | i.exec] 
    s.assignments.forEach[a | a.exec] 
    s.clock.exec 
    s.tests.forEach[t|t.exec] 
} 

/* include methode */ 
def dispatch void exec(Include i) { 

    System.out.println(i.importURI + " included") 

} 
+0

больше похож на 'Включить : 'INCLUDE' includedScript = [Script | STRING]; '+ поставщик имен, который вычисляет имя из ресурсов скриптов uri. –

+0

Я не думаю, что я понимаю –

ответ

0

Импорт Xtext не включает. Xtext не поддерживает вообще. Все, что поддерживает Xtext, это Cross References. Вы можете использовать глобальное определение области на основе пространства имен или импортировать uri, чтобы определить, как можно найти элементы из других файлов. предположим, что вы действительно хотите, чтобы следовать включает в себя файлы интерпретатора

Script: 
    includes+=(Include)* 
; 

Include: 
    'INCLUDE' includedScript=[Script|STRING] 
; 

И имя поставщика

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider { 

    QualifiedName qualifiedName(Script script) { 
     return QualifiedName.create(script.eResource().getURI().trimFileExtension().lastSegment(), script.eResource().getURI().fileExtension()); 
    } 

} 

, то вы можете пройти по ссылке в вашем интерпретатором

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIQualifiedNameProvider() { 
     MyDslQNP 
    } 

} 
+0

извините, но как мне «следовать» ссылке в моем интерпретаторе. Я создал класс MyDslQnp в пакете, где у меня есть интерпретатор, верно? –

+0

noooooo. вы просто связываете имяпровайдер в модуле времени выполнения и создаете его где-то вокруг него. в вашем intepreter просто вызовите myInclude.getIncludedScript() ' –

+0

я сделаю что-то вроде этого класса MyDslRuntimeModule расширяет AbstractMyDslRuntimeModule { \t переопределение bindIValueConverterService() { возвращение MyDslValueConverters } \t @Override \t общественного класса bindIQualifiedNameProvider() { \t \t возврата MyDslQNP.class \t}} , но среда выполнения в Xtend и этого кода в Java. У меня есть ошибки, которые я не могу исправить, любые идеи? –

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