Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843276] |
Thu, 22 July 2021 07:58  |
Eclipse User |
|
|
|
Hallo zusammen,
derzeit bin ich dabei, mir Xtext und Xtend anzueignen. Ich bin mir unsicher, wie UML-Klassendiagramme mit Xtend bei der Codegeneration durchlaufen werden müssen. Beispiel:
Mit gegebener Xtext-Grammatik ist das Klassendiagramm erstellt und vom ECore-Modell initialisiert worden (siehe Anhang). Das Ziel soll nun sein, eine .xsd Datei basierend auf allen „Outerelements" im folgenden Format zu erstellen:
<xs:element name="...">
<xs:complexType>
<xs:sequence>
<xs:element name="..." type="..."/>
<xs:element name="..." type="..."/>
<xs:element name="..." type="..."/>
<xs:element name="..." type="..."/>
</xs:sequence>
</xs:complexType>
</xs:element>
Mein bisheriger Lösungsansatz zur Implementierung der Funktion ist der Folgende:
def String generateElements(EList<Outerelement> outerelements) '''
«FOR o : outerelements»
<xs:element name="«o.name»">
<xs:complexType>
<xs:sequence>
<xs:element
name="«o.complextypes.sequences.innerelements.name»" type="«o.complextypes.sequences.innerelements.type»" />
</xs:sequence>
</xs:complexType>
</xs:element>
«ENDFOR»
'''
Ich iteriere durch jedes „outerelement" und greife auf den Namen zu (= o.name). Um allerdings nun auf den Namen eines „innerlements" zuzugreifen, nutze ich o.complextypes.sequences.innerelements.name. Nun zur Frage: ist das in der Art korrekt oder mache ich hier etwas falsch?
Ich bin wirklich über jede Art von Rückmeldung sehr dankbar!
Polek
|
|
|
|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843291 is a reply to message #1843288] |
Thu, 22 July 2021 16:08   |
Eclipse User |
|
|
|
Hallo Herr Dietrich,
vielen, vielen Dank für die Antwort - das hat sehr geholfen! Ich iteriere also einfach über jede der Listen und greife die entsprechenden Typen ab. Können Sie mir erklären, wie genau das bei Vererbung funktioniert? Das Beispiel im Anhang zeigt beispielhaft ein UML-Klassendiagramm einer vereinfachten Teilmenge einer Programmiersprache. Ich versuche jetzt, eine Map Fusion Funktion zu schreiben, die zwei Funktionen merged und dabei alle Statements der ersten Funktion als Input für die zweite Funktion nutzt. Der "Rohbau" für die Xtend-Funktion könnte in etwa wie folgt aussehen:
public def Function fuse(Function f1, Function f2)'''
...
'''
Beispiel:
Wir haben eine erste Funktion F1 addOne, die einfach einen Parameter um eins erhöht:
function addOne(int p){int x; x=p+1;return x;}
Daneben haben wir eine zweite Funktion F2 square, die einen Parameter quadrieren soll:
function square(int num){int y; y=num*num;return y;}
Mit der Xtend-Funktion fuse versuche ich nun unter Zuhilfename des UML-Klassendiagramms im Anhang, zwei Funktionen dieser Art zu "mergen". Sprich F1 und F2 würden kombiniert folgendes ergeben:
function addOne(int p){
int x;
x=p+1;
int y;
y=x*x;
return y;
}
Wie genau kann ich jetzt das UML-Klassendiagramm nutzen, um diesen gewünschten Output zu erzeugen?
Haben Sie vielen Dank im Voraus.
Liebe Grüße!
[Updated on: Thu, 22 July 2021 16:13] by Moderator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843328 is a reply to message #1843327] |
Fri, 23 July 2021 10:18  |
Eclipse User |
|
|
|
für die doppelvererbung müssen ifElse richtig sortiert werden. daher sieht das git aus.
alternativ würde das mit den dispatch funktionen automatisch richtig kompiliert werden
private def dispatch getBinaryOperator(Addition s){
return "+"
}
private def dispatch getBinaryOperator(Multiplication s){
return "*"
}
das sollte erlauben auf BinaryOperation getBinaryOperator aufrufen zu können
ps
wenn if + instanceof auf einer variable benutzt wird funktioniert auch den autocast
var x = s.expression
if (x instanceof Addition)
[Updated on: Fri, 23 July 2021 10:36] by Moderator
|
|
|
Powered by
FUDForum. Page generated in 0.04463 seconds