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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top