当前位置: 首页 > 工具软件 > Acceleo > 使用案例 >

Acceleo_语言介绍

钮鸿煊
2023-12-01

Acceleo 3是由OMG定义的MOFM2T规范的实现。 由OMG命名为MTL的Acceleo语言由模块内部的两种主要类型的结构(模板和查询)组成。 在Acceleo中,您可以使用OCL的子集创建表达式以查询输入模型。

1 模块

1.1导入

Acceleo模块是一个“.mtl”文件,其中包含模板(用于生成代码)和/或查询(从操纵模型中提取信息)。 该文件必须以以下格式的模块声明开始:

[module <module_name>('metamodel_URI_1', 'metamodel_URI_2')]

一个模块可以扩展另一个模块,在这种情况下,它的模板将能够覆盖其父“公共”和“受保护”模板。 它还可以访问其父母的公共和受保护的模板和查询。 模块还可以导入另一个模块以访问其公共模板和查询。

Acceleo模块通常依赖于其他模块的执行。 因此,Acceleo模块通过导入声明显式声明它们依赖的模块。具体语法如下:

import qualified::name::of::imported::module

注释:注意:可以在导入中使用非限定名称,但不建议这样做,因为如果加速模块之间发生名称冲突,它很容易导致难以理解的错误。可以调用内容助理来生成导入标记:只需输入import,然后按Ctrl +空格,完成后提出“导入”并生成一个[import ... /]标记。

1.2 静态覆盖

Acceleo允许您通过扩展和重写其中一些模板(除了不具有私有可见性的模板之外的所有模板)来覆盖另一个模块的部分行为。 重复使用模块的某些常见部分以及像在面向对象编程中一样为多个模块创建共同父项可能非常有用。

2 模板

模板是用于生成文本的一组Acceleo语句。 它们由[template ...] [/ template]标签分隔。

要创建一个新模板,只需将光标放在相关位置(即可以插入模板的位置)的Acceleo模块文件中,然后按Ctrl +空格(根据自己环境中的快捷键进行设置,笔者的快捷键为Alt+/)。 除其他外,内容助理建议创建一个新模板。 也可以键入模板,Ctrl +空格(根据自己环境中的快捷键进行设置,笔者的快捷键为Alt+/),然后返回,并创建一个新模板:您可以填写其名称,参数名称和参数类型。 只需点击Tab从一个元素传递到下一个。

模板也可以有可选的元素:
覆盖(将在“覆盖视图”中详细说明);
先决条件(或警戒条件);
后处理;
变量初始化。

内容助理再一次可以在这里帮助你。 只需在模板声明的最后]按Ctrl +空格键,然后查看它的建议。

2.1 先验条件

想象一下,您希望根据特定条件为模板实施不同的行为。

做到这一点的一种方法是使用if块来区分这些情况。 另一种更优雅的方式是使用先决条件。 假设您想为关联生成不同的代码,无论它们是否被声明为有序。上面的例子显示了? (条件)语法,告诉Acceleo模板只有在满足前提条件时才能运行。模块中模板的声明顺序很重要:将执行guard条件评估为true的第一个模板。 模板上的守卫条件是否完全等同于? (true)。前提条件也存在于块中。

2.2 后处理

在实际将其写入输出文件之前,对模板生成的文本应用某些处理方法通常很有用,特别是对于代码格式化。例如,修剪模板的结果对于确保格式的同时保持模板的可读格式非常有用。

在上面的例子中,如果没有后处理帖子(trim()),模板调用会写入名字后跟回车符。 通过后期处理,无论何时调用模板,它都会写出预期的名称,而不用回车,这可能就是您需要的。后处理最常见的用途是输出代码格式,归功于post(trim())。 这取决于你自己想要用它来做什么!

 

2.3 变量初始化

模板(以及其他模块)可以定义一些变量并直接在其主语法块中初始化它们。

3 查询

查询用于从模型中提取信息。 查询返回值或值的集合。 他们使用OCL,包含在[query ... /]标签中。查询被指定为每次使用相同参数调用时总是返回相同的值。

3.1 包装Java服务

从Acceleo模板中调用一些java代码有时很有用。 Acceleo非标准库提供了一个允许这样做的服务调用。 调用的java服务可以包装在Acceleo查询中。创建一个Acceleo模块,并为原始Java类中的每个服务提供查询。

4 语言元素

4.1 File标签

文件标签用于告诉Acceleo引擎它必须在实际文件中生成[file ...]标签的内容。语法如下:

[file(<uri_expression>, <append_mode>, <output_encoding>)] (...) [/file]

<uri_expression>表示输出文件名;

<append_mode>(可选)指示输出文本是否必须附加到文件或替换其内容;
<output_encoding>(可选)表示用于输出文件的编码。 该编码不需要与模块的编码相同。

注意:包含[file]标签的模板不一定有注解@main。 @main注释用于向Acceleo eclipse插件指示必须生成一个java类来封装运行代的所需代码。 @main注释可以放在没有[file]标签的模板上,但是如果你想得到结果,这些模板最终必须调用一个或多个有[file]标签的模板!

4.2 For循环

Acceleo中的循环可以用两种语法表示:

完整的语法(符合MTL规范):[for(i:E | e)] ... [/ for]

轻语法:[for(<iterable_expression>)] ... [/ for]

注意:使用light语法时,会创建一个隐式变量i,其中包含从1开始的当前迭代索引。内容助理可以帮助确保使用正确的语法。 例如,假设你想插入一个for循环,但是你不记得这些循环的Acceleo语法。完整语法的参数含义:迭代器变量名称;迭代器类型;可迭代的表达式。

4.3 If条件

[if (condition)]...[/if]

了解Acceleo中的变量是最终变量是很重要的,这意味着它们的值在初始化后不能更改。还请注意,Acceleo let与OCL let没有相同的语义和行为。

[let (variableName : VariableType = expression)]...[/let]

其中variableName是变量的名称,VariableType是变量的类型,而expression是一个表达式,如果该类型的类型对应于该变量,则该值将被赋予该变量。Acceleo的let代码块与if (expression.oclIsKindOf(VariableType))等同。

变量只存在于一个let块内。 因此,他们的一生不能超过他们的模板。 它们只在let块内可见,这意味着在该块内调用的模板不能“看见”它们。 如果您需要使用子模板来访问变量,则必须将其作为参数传递。变量对于存储一个值并防止连续多次计算它特别有用。

评论被输入到[comment /]块中,并出现在一些绿色的阴影中。 [comment /]标签可以自行关闭:

[comment 这里是一些评论的重要性 /]

但是也可以通过[comment][/comment]标签组实现。这些评论是官方MTL规范的一部分。 它们不能放置在OCL代码中,例如查询。 它们不能置于Acceleo语句的中间。

可以通过右键->source->Comment/Protected Area/For/If

行为取决于所选内容:

如果没有选择任何内容,则当前行(不是右键单击的行,但是光标所在的行)被[comment] ... [/ comment]标签包围。如果选择了某些文本,它会被[comment] ... [/ comment]标签包围,无论它是否跨越多行。

5 主模块和运行类

“main”Acceleo模块是入口点,也就是说用于以某种方式描述生成工作流程的模块。这些模块可以从标准的加速模块创建,它们只需包含@main注释。他们不需要包含[文件]标签:主要模块是可执行模块,它们不需要是实际生成文件的模块。尽管如此,Acceleo还是建议创建主要模块。 如果可能,在包管理器中右键单击包想要创建新主模块的包,但这不是必需的。 选择新建>其他...(或Ctrl + N)。 在Acceleo模型到文本类别中选择Acceleo主模块文件。

点击完成。 将创建一个新的Acceleo模块,其中包含@main注释,并因此附带生成的java文件。 该模块导入在上一个向导页面中选择的模块,并且只是一个接一个地调用它们。您现在可以自由编辑此模块的内容以实现您所需的工作流程。 创建的文件只是初始化此任务的加速器。 在大多数情况下这将是足够的,但可以随意修改。

5.1 行为

将使用给定类型在模型的所有元素上调用主模板。 主模板执行的开始初始化了这一代。 因此,如果您在UML类中定义了主模板,则将为所有类调用此模板,但这也意味着每次调用此主模板时都会初始化生成器,例如,缓存 查询将在每次通话后清除。 建议在元模型的根目录下定义主模块,然后在模型中手动导航以调用所有其他模板。 在UML模型中,通过在根概念Model而不是Class上定义生成器,可以提高性能。

6 创建一个Acceleo项目

6.1 Acceleo项目

Acceleo项目是与Acceleo性质相关的eclipse项目。 这些项目包含Acceleo模块,Java代码以及代码生成需要的任何东西。

注意:建议使用尊重eclipse插件命名约定的命名。 当然,名称前缀必须适应您的特定上下文,但请记住,使用防止命名冲突的命名约定是个好主意。

6.2 从头开始创建Acceleo项目

Acceleo项目的目标是从模型(或从一组模型中)生成文本。 在本教程中,我们将创建一个新的Acceleo模块,用于从UML模型生成Java bean。

6.3 将现有项目转化为Acceleo项目

Acceleo提供了将现有项目转换为Acceleo项目的工具。 从技术上讲,这意味着Acceleo性质将被添加到项目的性质中。

这可以通过右键单击包浏览器,然后选择新建>转换为Acceleo项目来实现。

6.4 安装示例Acceleo项目

Acceleo提供了几个示例项目,您可以使用它们开始并查看如何组织生成器项目。

7 创建一个Acceleo UI项目

此操作只能在现有的Acceleo项目上执行。

它允许您创建和初始化一个插件项目,该插件项目将包含通过eclipse中集成的弹出式菜单中的可用操作启动项目的Acceleo生成所需的所有内容。 这有助于在Eclipse平台上部署Acceleo生成器。 创建的UI插件项目配置为创建具有给定扩展名的文件的弹出式菜单,并在通过评估可定制的java表达式而找到的文件夹中生成文件。

 

 

 

 

 

 

 

 

 

 类似资料: