Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm(Verständnisproblem zur Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm)
Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843276] Thu, 22 July 2021 11:58 Go to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
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 #1843288 is a reply to message #1843276] Thu, 22 July 2021 16:12 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
Hi,
Was mit unklar in deinem snippet ist
Complextypes
Sequences
Innerelements
Sind alles Listen,
Du möchtest aber nur 1 Typ ausgeben ?!?

Wenn du mehrere ausgeben möchtest mache einfach verschachtelte for loops

«FOR o : outerelements»
	<xs:element name="«o.name»">
	<xs:complexType>
	<xs:sequence>
	«FOR c : o.complextypes»
		«FOR s : c.sequences»
			«FOR i : s.innerelements»
				<xs:element
				name="«i.name»" type="«i.type»" />
			«ENDFOR»
		«ENDFOR»
	«ENDFOR»
	
	</xs:sequence>
	</xs:complexType>
	</xs:element>
«ENDFOR»
'''


Or alternativ eine for loop über mit einer flatten/map combi

«FOR o : outerelements»
	<xs:element name="«o.name»">
	<xs:complexType>
	<xs:sequence>
	«FOR i : o.complextypes.map[sequences.map[innerelements].flatten].flatten»
				<xs:element
				name="«i.name»" type="«i.type»" />
	«ENDFOR»
	</xs:sequence>
	</xs:complexType>
	</xs:element>
«ENDFOR»
'''


or using guava

import static extension com.google.common.collect.Iterables.*;
...
«FOR o : outerelements»
	<xs:element name="«o.name»">
	<xs:complexType>
	<xs:sequence>
	«FOR i : o.complextypes.transform[sequences].flatten.transform[innerelements].flatten»
				<xs:element
				name="«i.name»" type="«i.type»" />
	«ENDFOR»
	</xs:sequence>
	</xs:complexType>
	</xs:element>
«ENDFOR»
'''


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Thu, 22 July 2021 16:33]

Report message to a moderator

Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843291 is a reply to message #1843288] Thu, 22 July 2021 20:08 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
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 20:13]

Report message to a moderator

Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843293 is a reply to message #1843291] Thu, 22 July 2021 20:42 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
Geht es her um das fuse oder um das generelle generieren von den Funktionen ?
Ist letzteres schon fertig?
Macht das fuse nicht einfach ein generate ohne return statements
Das sollte doch recht straight forward umsetzbar sein
(Mir ist nicht klar wo das Problem liegt)


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843294 is a reply to message #1843293] Thu, 22 July 2021 20:45 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
Ggf sind hier if else in den templates oder das Konzept der dispatch Funktionen hilfreich

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843296 is a reply to message #1843293] Thu, 22 July 2021 21:17 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
Hallo Herr Dietrich,

es geht mir hier nur um das Generieren der kombinierten Funktion basierend auf zwei Funktionen, die ich hier als gegeben annehme (z.B. in dem Beispiel zuvor F1 und F2). Die Frage ist, wie ich das umsetzen kann basierend auf dem UML-Klassendiagramm. Das erste Problem ergibt sich an folgender Stelle:

public def Function fuse(Function f1, Function f2)'''
function «f1.name»(int «f1.param»){
int «???»
...
}
'''

???: Wie greife ich jetzt bspw. an dieser Stelle auf die Variablen-Definition (VariableDef im UML-Klassendiagramm) zu, basierend auf der Funktionen F1 und F2?

Lieben Dank!
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843300 is a reply to message #1843296] Fri, 23 July 2021 04:23 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
Über die statments der Funktion iterieren ?

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Fri, 23 July 2021 04:24]

Report message to a moderator

Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843304 is a reply to message #1843300] Fri, 23 July 2021 06:32 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
Hallo Herr Dietrich,

das ist mir klar. Wie aber greife ich von einem statement auf den typ einer VariableDef, dem namen einer Variable, oder die Addition zu (siehe unten)? Mir ist nicht klar, wie ich durch das Modell "laufen" muss, um einzelne Informationen abzugreifen. Was ist hier die korrekte Schreibweise? Könnten Sie dies mit dem gegebenen Beispiel einmal erklären?

public def Function fuse(Function f1, Function f2)'''
function «f1.name»(int «f1.param»){
«FOR s:f1.statements»
Varirablen Definition: «s.VariableDef.type»
Variable: «s.VariableDef.Variable.name»
Addition: «s.Assignment.Expression.BinaryOperation.Addition»
«ENDFOR»
}
'''

Lieben Dank!
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843307 is a reply to message #1843304] Fri, 23 July 2021 07:59 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
wie schon gesagt, entweder mit ifElse oder dispatch,

	'''
	«IF s instanceof VarDef»
...
	«ELSEIF s instanceof Assignment»
	«ELSEIF s instanceof Return»
	«ELSE»
		Hier geht was schief oder fehlt was
	«ENDIF»
	'''


def xxxx(Statement s) {
	'''
	«s.compile»
	'''
}
def dispatch StringConcatenation compile(VarDef v) {
	''''''
}
def dispatch StringConcatenation compile(Assignment a) {
	''''''
}
def dispatch StringConcatenation compile(Return r) {
	''''''
}


leider habe ich keine zeit 15 minuten die eclasses nachzubauen, so dass ich konkreten code pasten call


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843319 is a reply to message #1843307] Fri, 23 July 2021 12:56 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
Hallo Herr Dietrich,

vielen Dank für die Rückmeldung. Der "instanceof"-Ansatz hat auf jeden fall schon weitergeholfen! Gar kein Problem und völlig verständlich, dass Sie für diese Dinge wenig Zeit haben - ich bin Ihnen wirklich über jeden Input sehr dankbar. Ich stolpere nach wie vor über ein paar Kleinigkeiten - anstelle dass Sie die EClasses nachbauen, wäre es Ihnen vielleicht möglich, die Lösung mit ein paar Zeilen Xtend näherungsweise zu beschreiben? Ich brauche keine Lösung, die ich 1:1 kopieren kann. Mir geht es vielmehr um das Verständnis dahinter und best-practices, mit denen Profis solche Herausforderungen lösen.

Liebe Grüße!

[Updated on: Fri, 23 July 2021 12:57]

Report message to a moderator

Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843320 is a reply to message #1843319] Fri, 23 July 2021 13:06 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
es wäre mir einfacher wenn ihre frage einfach 10 xtend classes beinhalten würden die das relevante verhalten des ecores/ums nachbildet z.b.

class Statement {
	
}

class VarDef extends Statement {
	
}

class Assignment extends Statement {
	
}

class Return extends Statement {
	
}


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843325 is a reply to message #1843320] Fri, 23 July 2021 13:33 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
Hallo Herr Dietrich,

mir liegt in diesem Beispiel leider auch nur das UML-Klassendiagramm vor und die Illustration zum erwarteten Verhalten im Anhang.

Liebe Grüße!
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843326 is a reply to message #1843325] Fri, 23 July 2021 13:41 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
wo genau ist denn aktuell das problem. wie sieht der aktuelle code aus?

Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843327 is a reply to message #1843326] Fri, 23 July 2021 13:52 Go to previous messageGo to next message
Pol Ek is currently offline Pol EkFriend
Messages: 7
Registered: July 2021
Junior Member
Ich bin mir z.B. unsicher, ob ich die Doppelverberung richtig implementiert habe (siehe Expression -> BinaryOperation -> Addition/Multiplication). Aktuell sieht der Code wie folgt aus:

public def Function fuse(Function f1, Function f2) '''
Function «f1.name»(int «f1.param.name»){
«FOR s:f1.statements»
«IF s instanceof VariableDef»
int «s.type»;
«ELSEIF s instanceof Assignment»
«s.type» = «f1.param.name» «getBinaryOperator(s)» «getConstant(s)»;
«ENDIF»
«FOR ss:f2.statements»
«IF ss instanceof VariableDef»
int «ss.type»;
«ELSEIF ss instanceof Assignment»
«ss.type» = «s.type» «getBinaryOperator(ss)» «getConstant(ss)»;
«ENDIF»
«ENDFOR»
return «ss.type»
«ENDFOR»
}
'''

private def getBinaryOperator(Assignment s){
if(s.expression instanceof BinaryOperation){
if(s.expression instanceof Addition){
return '+';
} else {
return '*';
}
}

}

private def getConstant(Assignment s){
if(s.expression instanceof BinaryOperation){
return ""+s.expression.value;
}
}
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843328 is a reply to message #1843327] Fri, 23 July 2021 14:18 Go to previous message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14661
Registered: July 2009
Senior Member
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)


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de

[Updated on: Fri, 23 July 2021 14:36]

Report message to a moderator

Previous Topic:Performance issue when doing index of resourceset
Next Topic:Two DSLs or two-tier-build?
Goto Forum:
  


Current Time: Fri Mar 29 01:24:26 GMT 2024

Powered by FUDForum. Page generated in 0.08914 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top