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?
@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
@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. –