1 元素直接转换
转换模板
[template public classToJava(c : Class)]
class [c.name/]
{
// Constructor
[c.name/]()
{
}
}
[/template]
最终代码
class Employee
{
// Constructor
Employee()
{
}
}
注:[c.name/]表示变量,在程序执行过程中,会将c.name转换成对应的元素
2 模板嵌套模板
[template public classToJava(c : Class)]
class [c.name/]
{
// Attribute declarations
[attributeToJava(c.attribute)/]
// Constructor
[c.name/]()
{
}
}
[/template]
[template public attributeToJava(a : Attribute)]
[a.type.name/] [a.name/];
[/template]
注释:对于c中的每一个元素均执行模板(attributeToJava)
2(1)可以通过for程序代码块将以上过程合并为一个模板
[template public classToJava(c : Class)]
class [c.name/]
{
// Attribute declarations
[for(a : Attribute | c.attribute)]
[a.type.name/] [a.name/];
[/for]
// Constructor
[c.name/]()
{
}
}
[/template]
注释:其中,a代表在for代码块中类型为Attribute的变量。
3 通过条件判断模板是否需要执行。以下模板中只有具体类才能执行
[template public classToJava(c : Class) ? (c.isAbstract = false)]
class [c.name/]
{
// Attribute declarations
[attributeToJava(c.attribute)/]
// Constructor
[c.name/]()
{
}
}
[/template]
注释:?之后表示判定的条件(真/假)
4 复杂的转换可以使用queries进行指定,以下例子表示名为allOperations的query,该query的目标是找到在类层次中所有父类为抽象类的操作。
[query public allOperations(c: Class) : Set ( Operation ) =
c.operation->union( c.superClass->select(sc|sc.isAbstract=true)->
iterate(ac : Class; os:Set(Operation) = Set{}| os->union(allOperations(ac)))) /]
[template public classToJava(c : Class) ? (c.isAbstract = false)]class [c.name/]
{
// Attribute declarations
[attributeToJava(c.attribute)/]
// Constructor
[c.name/]()
{
}
[operationToJava(allOperations(c))/]
}
[/template]
[template public operationToJava(o : Operation)]
[o.type.name/] [o.name/] ([for(p:Parameter | o.parameter)
separator(',')] [p.type/] [p.name/] [/for]);
[/template]