Warum die Verknüpfung nicht Arbeit in meinem Xtext-basierten DSL?
-
02-10-2019 - |
Frage
Im Folgenden ist die Xtext Grammatik für mein DSL.
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' | ',')+;
Und folgende ist ein Programm, in dem über DSL.
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)
Im Folgenden ist meine Unterklasse der erzeugten Switch
Klasse, die die getPredicateType()
kehrt null auf einem Predicate
Knoten zeigt.
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);
}
}
Als ich die ModelPrinter
Klasse verwendet, um die EMF-Objektmodell zu durchqueren, um das oben genannte Programm entsprechend, wurde mir klar, dass die Knoten nicht richtig miteinander verbunden sind. Zum Beispiel gibt die Methode auf einem getPredicateType()
Predicate
Knoten null
. Lektüre Handbuch für den Xtext Benutzer, ist mein Eindruck, dass die Xtext Standard Verknüpfung Semantik sollte für meine DSL arbeiten. Aber aus irgendeinem Grunde, der AST-Knoten meines DSL nicht bekommen, zusammen richtig verbunden. Kann jemand mir helfen, dieses Problem bei der Diagnose?
Lösung
Schließlich dachte ich, das Problem. Die Links wurden nicht richtig eingestellt, weil ich nicht das Modell richtig geladen. Ich hatte gerade verwendet der Parser das Modell zu laden. Also, ich habe nicht die Links bekommen. Deshalb habe ich den folgenden Code-Schnipsel von Xtext FAQ das Modell richtig zu laden . Dann verbrachte ich das zurückgegebene Modell meiner Schalter Klasse.
// "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);
Andere Tipps
Ich habe es ausprobiert, aber ich bin nicht mit dem Switch, habe ich eher Xpand / Xtend auf Zugang predicateTypes von Prädikat und ihre Namen erzeugt.
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»
und die output.txt:
Path Path
Ich denke, das ist das erwartete Verhalten.