M2T_基于模板的转换语法(1)

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]



猜你喜欢

转载自blog.csdn.net/shiyuwangsmile/article/details/80601039