2017-04-22 1 views
2

Ich habe eine einfache DSL in JetBrains MPS für eine Automatisierungsaufgabe erstellt. Das DSL erlaubt die Definition von Informationsobjekten, die wiederum für die Codegenerierung verwendet werden sollen. Ich bin in der Lage meiner Modelle zu generieren - aber ich kämpfen, um einen Weg zu finden, eine zusätzliche Text gen Komponente auf das gleiche Sprache Konzept zuweisen, das heißt, was ich versuche zu erreichen ist:Wie können Sie mehrere Konzepte pro Textgenerierungskomponente in Jetbrains MPS 2017.1 verwenden?

  • Informationsobjekt zu db-Modell (python)
  • Informationsobjekt zu db Methoden Zugriffsschicht (python)
  • Informationsobjekt Nachricht
  • ...

ich fühle mich protobuf, dass ich ein falsches Verständnis darüber, wie kam diese zu verwenden. Irgendwelche Ideen, wie man für das gleiche Sprachkonzept unterschiedliche Ergebnisse erzielen kann?

+0

Jeder dieser Informationsobjekte sollten sie eigene Datei haben oder haben Sie sie alle in einer einzigen Datei erstellen? – Kolja

+1

Idealerweise gibt es für jede Schicht unterschiedliche Ausgabedateien, dh eine Ausgabedatei mit allen Modelldefinitionen, eine Ausgabedatei mit den ProtoBuf-Schemadefinitionen usw. Ich habe hier eine Lösung gefunden [https: // mps-support .jetbrains.com/hc/de-us/community/posts/206613545-TextGen-multiple-files-output-per-concept-instance- # community_comment_203694104) - das ist, das wird mir immer noch nicht erlauben, verschiedene Text-Gen-Komponenten für meine nicht zu spezifizieren -root Konzepte. –

+0

eine andere Idee kam mir in den Sinn: Entfernen Sie alle Text-Gen-Komponenten aus meiner eigentlichen Sprache und definieren Sie eine Sprache, die meine Basissprache für jede Ebene/Datei zu generieren erweitert. Diese zusätzlichen Sprachen umfassen nur Textgen-Transformationen, aber keine eigentlichen Sprachkonzepte. Was denken Sie? –

Antwort

3

MPS ermöglicht nur die Definition von Textgens pro Konzept.

Die MPS-Art zu tun, was Sie tun möchten, ist dies vor Textgen mit einem Modell zu modellieren Transformation.

Definieren Sie ein zusätzliches Konzept für Ihre drei Objekte, die Sie erstellen möchten. Ihr Inhalt ist im Grunde der gleiche wie im Stammkonzept, das Sie bereits haben. Dieses Konzept wird nur zur Definition Ihres Textgens verwendet. Als nächstes definiere das Textgen für diese Konzepte.

Jetzt müssen Sie noch Instanzen von diesen erstellen, da Sie natürlich nicht möchten, dass der Benutzer diese Informationen mehrfach angibt. Um dies zu tun, müssen Sie einen Generator definieren. Generatoren werden für Modell-zu-Modell-Transformationen in MPS verwendet.

Standardmäßig sollte Ihre Sprache bereits einen Generator haben. Im Generator ist eine Mapping-Konfiguration main. Dort erstellen Sie eine Root-Zuordnung für jedes der drei neuen Konzepte, die Sie erstellt haben. Jede dieser Regeln hat als Eingabekonzept die vom Benutzer angegebene und als Vorlage eines der neuen Konzepte. Sie können eine neue Vorlage erstellen, indem Sie im Editor auf alt + enter klicken und das Konzept auswählen, das Sie erstellen möchten. Stellen Sie sicher, dass Sie keep input root auf true statt default setzen.

Innerhalb der Vorlage geben Sie eine COPY_SRC an, um den gesamten Inhalt vom Eingang zum Ausgang zu kopieren.

Was dann während der Generierung passiert ist, dass MPS drei neue Konzepte erstellen wird, von denen, die der Benutzer im ursprünglichen Modell erstellt hat und nach dem Ausführen der Textgen für alle von ihnen. Dies ermöglicht Ihnen auch, verschiedene Dateien für jeden Root zu erstellen.

Ich denke, das Projekt DEMO 1 zeigt einige der Dinge, die Sie dafür benötigen.

+0

Danke für die ausführliche Antwort. Ich kämpfe immer noch an einem Punkt - ich bin mir nicht sicher, was ich wählen sollte, wenn ich "alt + enter" drücke, um die Wurzelvorlage einer Zuordnungsregel zu setzen (siehe [screenshot] ( –

+1

) "Vergessen Sie meine Frage. Vergessen Sie, die Sprache zu" Used languages ​​"hinzuzufügen. Funktioniert jetzt wie ein Zauber! –

+0

@JanWendland Könnten Sie bitte näher ausführen, was Sie getan haben? Ich kann alle hier beschriebenen Schritte ausführen, aber bei der Vorschau erzeugten Text bekomme ich Fehler. – davidmpaz

Verwandte Themen