Folgendes Problem: Die Bezeichnungen "int" oder "double" sind einfach hässlich. Welcher "normale" Mensch weiß denn, was double bedeutet? .. Ok, ich gehe davon aus, dass jeder Leser hier tatsächlich weiß, wofür das steht. Dennoch möchte man eventuell den primitiven Datentypen andere Namen geben. Zum Beispiel zum Entwicklung einer Programmiersprache bestehend aus "How I Met Your Mother"-Zitaten, bei der "Ted" für den Datentyp "int" und "Robin" für "double". steht. Nun zum technischen:
Zunächst muss die Variablendeklaration definiert werden. Diese wird anschließend als zusätzliche XPrimaryExpression hinzugefügt.
Normalerweise wird bei Xbase im feld type der XVariableDeclaration eine JvmTypeReference gesetzt, die auf den Java Typen zeigt. Da dies hier nicht gesetzt wird (und dementsprechend null ist), ist zunächst ein Umschreiben der Typberechnung im TypeComputer der DSL nötig. Hierbei wird anhand des gegebenen Typs die richtige Typreferenz gesetzt.
Nun wird der Typ der Variablen - abhängig vom eingegebenen String des Datentyps - korrekt im AST gesetzt. Dadurch kann auch die Variable richtig weiterverwendet werden und das Typechecking wird von Xbase übernommen. Zu beachten ist, dass auch das Assignment von Feldern überschrieben werden muss.
Auch das kompilieren der Variable muss geändert werden. Diese Änderung ist allerdings eher trivial, wenn das allgemeine Verständnis des Xbase Compiler vorhanden ist:
Anschließend können noch Fehler im Validator auftreten. Deren Überschreibung sei dem interessiertem, Xtext erfahrenen, Leser überlassen ;-).
Im Allgemeinem ist das Umwandeln nicht alzu komplex, jedoch sind es viele kleine Hürden, die genommen werden müssen bis zum (halbwegs) funktionierendem Endprodukt.
Zunächst muss die Variablendeklaration definiert werden. Diese wird anschließend als zusätzliche XPrimaryExpression hinzugefügt.
Variable returns XVariableDeclaration:
{Variable} writeable?='variable' simpleName=ID ':' typing=('Ted'|'Robin' /* more types */);
Normalerweise wird bei Xbase im feld type der XVariableDeclaration eine JvmTypeReference gesetzt, die auf den Java Typen zeigt. Da dies hier nicht gesetzt wird (und dementsprechend null ist), ist zunächst ein Umschreiben der Typberechnung im TypeComputer der DSL nötig. Hierbei wird anhand des gegebenen Typs die richtige Typreferenz gesetzt.
protected def _computeTypes(Variable vr, ITypeComputationState state) {
if (vr.typing.equals('Ted')) {
state.assignType(vr, getRawTypeForName(Integer.TYPE,state))
} else if (vr.typing.equals('Robin')) {
state.assignType(vr, getRawTypeForName(Double.TYPE, state))
} else {
/* Unknown input */
}
}
Nun wird der Typ der Variablen - abhängig vom eingegebenen String des Datentyps - korrekt im AST gesetzt. Dadurch kann auch die Variable richtig weiterverwendet werden und das Typechecking wird von Xbase übernommen. Zu beachten ist, dass auch das Assignment von Feldern überschrieben werden muss.
Auch das kompilieren der Variable muss geändert werden. Diese Änderung ist allerdings eher trivial, wenn das allgemeine Verständnis des Xbase Compiler vorhanden ist:
override _toJavaStatement(XVariableDeclaration variable, ITreeAppendable a, boolean isReferenced) {
if (variable instanceof Variable) {
a.newLine()
if (variable.typing.equals('Ted')) {
a.append("int" + " " + variable.simpleName + ";")
}else if(variable.typing.equals('Robin')){
a.append("double " +variable.simpleName + "=" + "null;")
}
} else {
super._toJavaStatement(variable, a, isReferenced)
}
}
override assignmentToJavaExpression(XAssignment expr, ITreeAppendable b, boolean isExpressionContext){
var feature = expr.getFeature();
if(feature instanceof Variable){
b.append(feature.simpleName + " = ")
internalToJavaExpression(expr.value, b)
}else{
super.assignmentToJavaExpression(expr, b,isExpressionContext)
}
}
Anschließend können noch Fehler im Validator auftreten. Deren Überschreibung sei dem interessiertem, Xtext erfahrenen, Leser überlassen ;-).
Im Allgemeinem ist das Umwandeln nicht alzu komplex, jedoch sind es viele kleine Hürden, die genommen werden müssen bis zum (halbwegs) funktionierendem Endprodukt.
Kommentare
Kommentar veröffentlichen