2010-05-01 4 views
1

Ce qui suit est la grammaire Xtext pour mon DSL.Pourquoi la liaison ne fonctionne-t-elle pas dans mon langage DSL basé sur Xtext?

Model: 
    variableTypes=VariableTypes predicateTypes=PredicateTypes variableDeclarations= 
    VariableDeclarations rules=Rules; 

VariableType: 
    name=ID; 

VariableTypes: 
    'var types' (variableTypes+=VariableType)+; 

PredicateTypes: 
    'predicate types' (predicateTypes+=PredicateType)+; 

PredicateType: 
    name=ID '(' (variableTypes+=[VariableType|ID])+ ')'; 

VariableDeclarations: 
    'vars' (variableDeclarations+=VariableDeclaration)+; 

VariableDeclaration: 
    name=ID ':' type=[VariableType|ID]; 

Rules: 
    'rules' (rules+=Rule)+; 

Rule: 
    head=Head ':-' body=Body; 

Head: 
    predicate=Predicate; 

Body: 
    (predicates+=Predicate)+; 

Predicate: 
    predicateType=[PredicateType|ID] '(' (terms+=Term)+ ')'; 

Term: 
    variable=Variable; 

Variable: 
    variableDeclaration=[VariableDeclaration|ID]; 

terminal WS: 
    (' ' | '\t' | '\r' | '\n' | ',')+; 

Et, ce qui suit est un programme dans le DSL ci-dessus.

var types 
    Node 

predicate types 
    Edge(Node, Node) 
    Path(Node, Node) 

vars 
    x : Node 
    y : Node 
    z : Node 

rules 
    Path(x, y) :- Edge(x, y) 
    Path(x, y) :- Path(x, z) Path(z, y) 

Ce qui suit est ma sous-classe de la classe Switch généré qui démontre les getPredicateType() NULL retourne sur un nœud Predicate.

public class ModelPrinter extends MyDSLSwitch<Object> { 

    protected Object visitChildren(EObject object) { 
     for (EObject eobj : object.eContents()) { 
      doSwitch(eobj); 
     } 
     return object; 
    } 

    @Override 
    public Object casePredicate(Predicate object) { 
     System.out.println(object.getPredicateType()); 
     return object; 
    } 

    @Override 
    public Object defaultCase(EObject object) { 
     return visitChildren(object); 
    } 

} 

Quand je la classe ModelPrinter pour traverser le modèle d'objet EMF correspondant au programme ci-dessus, je compris que les nœuds ne sont pas liés ensemble correctement. Par exemple, la méthode getPredicateType() sur un nœud Predicate renvoie null. Après avoir lu le guide de l'utilisateur de Xtext, j'ai l'impression que la sémantique de liaison par défaut de Xtext devrait fonctionner pour mon DSL. Mais, pour une raison quelconque, les nœuds AST de mon DSL ne sont pas correctement liés. Quelqu'un peut-il m'aider à diagnostiquer ce problème?

Répondre

1

Enfin, j'ai compris le problème. Les liens n'étaient pas correctement définis car je ne chargeais pas correctement le modèle. Je venais d'utiliser l'analyseur pour charger le modèle. Donc, je n'ai pas eu les liens. Par conséquent, j'ai utilisé l'extrait de code suivant de Xtext FAQ pour charger le modèle correctement. Ensuite, j'ai passé le modèle retourné à ma classe de commutateur.

// "workspace" is a string that contains the path to the workspace containing the DSL program. 
new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri(workspace); 

Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration(); 
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class); 
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE); 

// "DSLProgram" is a string that contains the path to the file of the DSL program relative to the workspace set above. 
Resource resource = resourceSet.getResource(URI.createURI("platform:/resource/" + DSLProgram), true); 
Model model = (Model) resource.getContents().get(0); 
0

Je l'ai essayé, mais je ne suis pas familier avec le commutateur, j'ai plutôt utilisé Xpand/Xtend pour accéder à predicateTypes de Predicate et a généré leurs noms.

Template.xpt:

 
«IMPORT myDsl»; 

«DEFINE main FOR Model-» 
«FILE "output.txt"-» 
«FOREACH this.rules.rules.body.last().predicates AS p-» 
«p.predicateType.name» 
«ENDFOREACH-» 
«ENDFILE-» 
«ENDDEFINE» 

et sortie.txt:

 
Path 
Path 

Je suppose que cela est le comportement attendu.

+0

@Gabriel Ščerbák, je ne veux pas générer de code à partir de mon DSL. Au lieu de cela, je voudrais convertir le modèle sémantique de mon programme d'entrée DSL dans un autre modèle de domaine. J'ai mis à jour ma question par le morceau de code qui démontre que la liaison n'est pas configurée correctement. – reprogrammer

+0

@reprogrammer comme je l'ai mentionné dans une réponse à votre autre question, il est possible de faire la transformation du modèle (de modèle en modèle, si elles partagent le même métamodèle tant que le métamétamodèle est supporté ...) en utilisant Xtend (qui est apparemment maintenant partie de Xpand ..) et il a certains avantages sur votre approche à travers Java. Cependant, pour une bonne réponse à votre question exacte, écoutez Sebastian Zarnekow, il est core dev de Xtext AFAIK. –

Questions connexes