2016-12-28 5 views
0

Dans ma grammaire j'ai une règle inclure comme suit:Xtext, importer mon propre fichier MyDSL

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

Include: 
    'INCLUDE' importURI=STRING 
; 

ce que je veux faire est d'inclure des fichiers même que le fichier « principal ».

Je travaille avec un interpreter qui transmet le fichier .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

ressemble plus à un 'Inclure : 'INCLUDE' includedScript = [Script | STRING]; '+ un fournisseur de nom qui a calculé le nom à partir des ressources de scripts uri. –

+0

Je ne pense pas que je comprends –

Répondre

0

Les importations Xtext ne sont pas incluses. Xtext ne supporte pas du tout. Tout ce que Xtext supporte est Cross References. Vous pouvez utiliser l'espace de nom en fonction ou importer la portée globale basée sur uri pour déterminer comment les éléments d'autres fichiers peuvent être trouvés. supposons que vous voulez vraiment suivre les inclut des fichiers dans votre interpréteur

Script: 
    includes+=(Include)* 
; 

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

Et Nom Fournisseur

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider { 

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

} 

vous pouvez suivre la référence dans votre interprète

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIQualifiedNameProvider() { 
     MyDslQNP 
    } 

} 
+0

excusez-moi, mais comment puis-je "suivre" la référence dans mon interprète. J'ai créé la classe MyDslQnp dans le paquet où j'ai l'interpréteur, n'est-ce pas? –

+0

noooooo. vous liez simplement le fournisseur de nom dans le module d'exécution et créez le autour de lui. dans votre intepreter simplement appeler myInclude.getIncludedScript() ' –

+0

Je vais faire quelque chose comme ce MyDslRuntimeModule classe étend AbstractMyDslRuntimeModule { \t override bindIValueConverterService() { MyDslValueConverters retour } \t @Override \t public class bindIQualifiedNameProvider() { \t \t retour MyDslQNP.class \t}} mais l'exécution est en Xtend et ce code en Java. J'ai des erreurs que je ne peux pas corriger, des idées? –