一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种支持复杂模型结构转换的代码生成方法与流程

2021-11-09 20:42:00 来源:中国专利 TAG:


1.本发明属于系统工程、复杂系统设计领域,尤其涉及一种支持复杂模型结构转换的代码生成方法。


背景技术:

2.基于模型的系统工程(mbse,model based system engineering)是支持复杂系统开发的新兴技术。mbse使用形式化的模型对系统开发全生命周期的需求、设计、分析、验证和确认等功能活动进行描述,以模型为核心驱动系统开发。代码生成是模型驱动系统开发的一种关键技术,也称为模型至文本的转换,它通过模型查询获取源模型中的元素信息,按照源模型元素至目标代码或者文本(例如xml文本)的映射规则,转换生成目标代码或者文本。通过代码生成,可将抽象层次高的系统架构模型自动/半自动化地转化为初步的详细设计模型(代码、仿真器、测试用例等),提高设计效率和质量。目前常常使用专门的代码生成器或可扩展性强的代码生成语言来实现从系统架构模型生成代码。专门的代码生成器针对某一领域的模型,生成特定的目标代码,难以应对复杂系统开发全生命周期多领域模型的代码生成;主流使用的代码生成语言例如acceleo通过使用模板对模型进行转换,对源模型元素的查询较为简单,缺乏将复杂的模型结构作为一个整体进行查询和转换的能力,因此,降低了转换效率。
3.专利公布号是cn107291450a的中国发明专利公开了一种编程友好型的敏捷代码自动生成方法。该方法实施的对象为结构化的数据,通过对待生成代码的数据进行描述,该描述使用xml格式进行存储,然后按照逻辑功能模块配置代码模板,其次通过描述解析器对待生成代码的数据描述进行解析,查询抽取出xml文档中的所有属性。最后通过扫描相应的代码模板的占位符,找到描述解析器解析出的相应数据进行填充,组装成相应功能模块的初始代码。实现了由xml描述文档到目标代码的转换,解决了现有技术下代码生成器局限性大,扩展性差的问题。此方案转换的对象为结构化的数据,而本文转换的对象为复杂系统架构模型,故无法满足本文所提出领域的需求。
4.专利公布号为cn104932915a的中国专利公开了一种aadl到c语言的代码自动生成方法。该方法面向的对象为aadl构建的架构模型,首先根据aadl元模型的语义、目标运行环境的语义和c语言语法语义定义aadl元模型到c语言的转换规则,其次根据aadl模型的元模型及其语义、aadl元模型到c语言的转换规则制定代码生成模板;然后根据代码自动生成模板编写模板转换引擎;最后对输入的aadl源模型解析,提取aadl元模型信息,按照代码自动生成模板,通过模板转换引擎将aadl元模型信息生成c语言代码。此专利所提出的技术特定于aadl模型,目标代码特定于c语言,对于其他领域及其其他目标语言则不适用。
5.现有代码生成器专有性强,通常面向特定的领域模型或数据文件构建特定目标语言的代码生成器,可扩展性和通用性不强,缺乏对复杂产品研发过程中涉及的多领域模型进行代码生成的能力。而灵活性较强的代码生成语言,采用基于模板的方式能够支持多种目标语言代码的生成,但主流使用的代码生成语言通常能够支持对模型中的单个元素的查
询和转换进行描述,而缺乏对具有多个模型元素的模型结构的查询和转换进行描述的能力,而某些形式的目标代码中的数据由完整的模型结构中的元素信息得出,通过层层单个元素的组合嵌套查询虽然也能获取到多个元素构成的模型结构,但增大了描述的复杂性,降低了转换效率。


技术实现要素:

6.为解决上述问题,本发明提供一种支持复杂模型结构转换的代码生成方法,通过定义模型模式,既能查询单个模型元素又能查询多个元素构成的复杂模型结构,使用合适的模型模式,有利于减少脚本代码数量,提高转换效率。
7.一种支持复杂模型结构转换的代码生成方法,用于生成所需设计系统对应的目标代码,其中,目标代码为所需设计系统的初步实现代码、所需设计系统的测试用例或者用于生成验证所需设计系统的仿真器的代码;
8.所述方法包括以下步骤:
9.s1:根据根据gopprr元模型概念定义不同类别的模型模式、使用karma建模语言建立所需设计系统不同类型的架构模型、根据所需要生成的目标代码定义代码模板,并确定代码模板中固定不变的代码信息和需要填充的代码信息;
10.s2:在步骤s1得到的不同类型的架构模型中,找到可以获取到目标代码中所需要填充的代码信息的模型元素,从而完成架构模型中的模型元素与目标代码中所需要填充的代码信息的映射关系的建立,其中,模型元素包括gopprr元模型概念中的对象、关系、角色、点;
11.s3:确定用于生成目标代码所需要填充代码信息的模型元素所在的模型结构,再从步骤s1中所定义的模型模式中分别为步骤s2中确定下来的每个模型结构选择对应的模型模式;
12.s4:采用步骤s3中选择的模型模式分别描述各模型模式对应的模型结构,得到各模型结构中每一个模型元素的类型以及模型元素与模型元素之间的连接形式,并对每个模型结构中各模型元素包含的属性的值进行约束;
13.s5:根据模型模式所描述的模型结构,对步骤s1中得到的不同类型的架构模型进行查询,得到架构模型中所有与步骤s3中选择的模型模式所描述的模型结构具有相同结构的模型结构,然后根据模型模式中所描述的约束条件,对查询得到的模型结构进行过滤,筛去不符合约束条件的模型结构;
14.s6:获取剩余模型结构中与目标代码具有映射关系的属性,将获取到的属性的值根据映射关系填充至步骤s1中所需要生成的目标代码的代码模板中。
15.进一步地,不同类别的模型模式根据gopprr元模型概念描述的图、对象、点、属性、关系以及角色之间的联系来定义,其中,模型模式是一个由模型结构和模型约束组成的规范;同时,所述gopprr元模型概念描述的图、对象、点、属性、关系以及角色之间的联系具体为:
16.图表示对象以及各对象之间的关系的集合;对象是图中的实体,通过角色与关系相连;关系具有方向性,方向通过依附在关系两端的角色表征,且角色具有起点和终点两种类型;点代表对象的一个端口,依附于对象存在;属性用于描述图、对象、角色、关系和点的
特性。
17.进一步地,模型模式的类别包括单元素模式、简单模式、基数模式以及分组模式,其中,所述简单模式包括直接绑定子模式、间接绑定子模式以及混合绑定子模式,所述基数模式包括一对多对象基数模式、多对多对象基数模式、一对多关系基数模式、一对多点基数模式、多对多点基数模式以及混合基数模式;
18.其中,当模型模式的类别为单元素模式时,模型结构中仅包含一个对象;
19.当模型模式的类别为直接绑定子模式时,模型结构中所有对象和角色之间的连接方式均为直接连接;当模型模式的类别为间接绑定子模式时,模型结构中所有对象和角色之间通过点来连接;当模型模式的类别为混合绑定子模式时,模型结构中一部分对象和角色之间的连接方式为直接连接,另一部分对象和角色之间通过点来连接;
20.当模型模式的类别为一对多对象基数模式时,模型结构中仅存在一个对象采用相同的直接绑定方式与两个以上的对象连接;当模型模式的类别为多对多对象基数模式时,模型结构中存在两个以上的对象采用两个以上的同类型的直接绑定方式连接两个以上的对象;当模型模式的类别为一对多关系基数模式时,模型结构中存在的两个对象之间采用两个以上的同类型的直接绑定方式进行连接;当模型模式的类别为混合基数模式时,模型结构中仅存在一个对象采用两个以上的同类型的直接绑定方式与两个以上的对象连接;当模型模式的类别为一对多点基数模式时,模型结构中存在一个对象仅通过一个点以同类型的间接绑定方式连接另一个对象上两个以上的点;当模型模式的类别为多对多点基数模式时,模型结构中存在一个对象通过两个以上的点以两个以上的同类型的间接绑定方式连接另一个对象上两个以上的点的;
21.当模型模式的类别为分组模式时,模型结构具有一个主模型模式,主模型模式中具有两个以上的子模型模式,子模型模式的类型为单元素模式、简单模式或基数模式。
22.进一步地,若步骤s3中选择的模型模式的类别为一对多对象基数模式,则描述一对多对象基数模式下的模型结构时,采用a:o1—b:o2<n>表示a类型的对象o1以相同的直接绑定方式连接n个b类型的对象o2,其中,n至少为2,o1表示a类型的对象的标识,o2表示b类型的对象的标识;
23.若步骤s3中选择的模型模式的类别为多对多对象基数模式,则描述多对多对象基数模式下的模型结构时,采用a:o1<i>

b:o2<j>表示i个a类型的对象o1以2个以上同类型的直接绑定方式连接j个b类型的对象o2,其中,i和j至少为2;
24.若步骤s3中选择的模型模式的类别为一对多关系基数模式,则描述一对多关系基数模式下的模型结构时,采用a:o1‑
b:o2&re:rel<m>表示a类型的对象o1通过m个同类型的直接绑定方式连接b类型的对象o2,其中,m至少为2,re为直接绑定方式的类型标识,rel为关系的标识;
25.若步骤s3中选择的模型模式的类别为混合基数模式,则描述混合基数模式下的模型结构时,采用a:o1‑
b:o2<j>&re:rel<m>表示a类型的对象o1通过m个同类型的直接绑定方式分别与j个b类型的对象o2相连接;
26.若步骤s3中选择的模型模式的类别为一对多点基数模式,则描述一对多点基数模式下的模型结构时,采用p
a
:p1‑
p
b
:p2<k>表示a类型的对象o1通过一个p
a
类型的点p1采用同类型的间接绑定方式连接b类型的对象o2上的k个p
b
类型的点p2,k至少为2,p
a
和p
b
均为点的
类型标识,p1和p2均为点的标识;
27.若步骤s3中选择的模型模式的类别为多对多点基数模式,则描述多对多点基数模式下的模型结构时,采用p
a
:p1<l>

p
b
:p2<k>表示a类型的对象o1上的l个p
a
类型的点p1通过同类型的间接绑定方式分别连接b类型的对象o2上的k个p
b
类型的点p2,l至少为2。
28.进一步地,所述不同类型的架构模型包括需求模型、功能模型、逻辑模型以及物理模型,且四种架构模型均可通过gopprr元模型概念进行描述。
29.进一步地,步骤s1中所述的代码模板中固定不变的代码信息为静态模板要素,需要填充的代码信息为动态模板要素,其中,静态模板要素根据所需要生成目标代码的结构进行定义,不同的静态模板要素可生成不同的目标代码,同时,动态模板要素以占位符的形式写入代码模板中。
30.有益效果:
31.1、本发明提供一种支持复杂模型结构转换的代码生成方法,使用karma语言描述代码生成,支持通过定义模型模式,将多个模型元素(包括对象、关系、点、角色)构成的复杂模型结构作为一个整体进行查询和转换,一方面,便于某些特定格式目标代码的生成,另一方面,通过模型模式的形式,用户只需对所需转换的模型结构进行描述,而无需关注具体查询的细节和过程,提高了用户友好性,增强了转换的能力和效率;此外,本发明提出的karma代码生成语言以gopprr六种元素为底层查询和转换的元素,屏蔽了领域模型的具体细节,针对多种领域模型(例如sysml模型和aadl模型),都可以gopprr为底层元素,通过描述模型模式进行查询,实现模型至目标代码的转换。
32.2、本发明提供一种支持复杂模型结构转换的代码生成方法,使用脚本式的语言来描述代码生成,解决了目前专有代码生成器可扩展性较差的问题,可根据用户的需求,定义不同的代码模板,以其生成多种类型的目标代码,灵活性较强;本发明既能查询单个模型元素又能查询多个元素构成的模型结构,使用合适的模型模式,有利于减少脚本代码数量,提高转换效率。
33.3、本发明提供一种支持复杂模型结构转换的代码生成方法,对于模型结构中某个模型元素实例出现多次的场景,简单模式描述较为繁琐,例如模式中某个对象实例以同样的形式出现n次,则需要在简单模式中列举出n个对象实例,本发明采用基数模式可简化上述描述。
34.4、本发明提供一种支持复杂模型结构转换的代码生成方法,对基于gopprr元建模方法的karma语言进行扩展,能够实现对多领域架构模型的代码生成进行统一形式化描述。用户只需学习一种语言(即karma语言)即可实现多种领域系统架构模型的构建以及模型的代码生成,降低了用户的学习成本。即可。
附图说明
35.图1为本发明提供的代码生成流程图;
36.图2为本发明提供的基于m3

m0框架的gopprr元建模方法示意图;
37.图3为本发明提供的模型模式为单元素模式、简单模式的示例图;
38.图4为本发明提供的模型模式为对象基数和关系基数模式的示例图;
39.图5为本发明提供的模型模式为点基数模式的示例图;
40.图6为本发明提供的模型模式为分组模式的示例图;
41.图7为本发明提供的基于模板得到目标输出代码示意图。
具体实施方式
42.为了使本技术领域的人员更好地理解本技术方案,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述。
43.如图1所示,本发明提供一种支持复杂模型结构转换的代码生成方法,用于生成所需设计系统对应的目标代码,其中,目标代码为所需设计系统的初步实现代码、所需设计系统的测试用例或者用于生成验证所需设计系统的仿真器的代码;所述方法包括以下步骤:
44.s1:根据根据gopprr元模型概念定义不同类别的模型模式、使用karma建模语言建立所需设计系统不同类型的架构模型、根据所需要生成的目标代码定义代码模板,并确定代码模板中固定不变的代码信息和需要填充的代码信息;具体的:
45.s11:根据gopprr元模型概念描述的图、对象、点、属性、关系以及角色之间的联系,定义不同类别的模型模式,其中,模型模式是一个由模型结构和模型约束组成的规范,且模型模式的类别包括单元素模式、简单模式、基数模式以及分组模式;其中,所述简单模式包括直接绑定子模式、间接绑定子模式以及混合绑定子模式,所述基数模式包括一对多对象基数模式、多对多对象基数模式、一对多关系基数模式、一对多点基数模式、多对多点基数模式以及混合基数模式。
46.需要说明的是,所述gopprr元模型概念描述的图、对象、点、属性、关系以及角色之间的联系具体为:图表示对象以及各对象之间的关系的集合;对象是图中的实体,通过角色与关系相连;关系具有方向性,方向通过依附在关系两端的角色表征,且角色具有起点和终点两种类型;点代表对象的一个端口,依附于对象存在;属性用于描述图、对象、角色、关系和点的特性。当角色直接与对象绑定时,称为直接绑定;当角色与对象上的点绑定时,称为间接绑定。
47.如图2所示,gopprr元建模方法基于m3

m0建模框架
11.构建模型。m3层的元元模型是建模的底层模型概念,即gopprr六种元元模型,用于创建m2层的元模型。在众多的元建模方法中,gopprr六种元元模型具有最完整的描述能力,故具备对系统研发生命周期所涉及的多种领域模型构建元模型的能力。m2层的元模型用于设计领域的建模语言及其模型库,对元模型进行实例化构建模型。多个具有内在联系的模型进行组合用于描述m0层真实世界系统视角,用于描述真实世界的系统。以对象元元模型(object)为例,它可以实例化为uml(unified modeling language,统一建模语言)中的类(class)元模型,表示为“object[class]”,类元模型与其他元元模型实例化得到的元模型一起组成uml元模型库。在使用uml元模型库构建模型时,类元模型可最终实例化为一个具体的类,称为一个对象实例。
[0048]
s12:使用karma建模语言建立所需设计系统的架构模型:需求模型、功能模型、逻辑模型以及物理模型,且四种架构模型均可通过gopprr元模型概念进行描述。
[0049]
需要说明的是,karma文本式建模语言是对上述gopprr方法构建模型的形式化实现,故支持不同领域的架构建模语言例如sysml(system modeling language,系统建模语言)、aadl(architecture analysis and design language,架构分析和设计语言)的统一表达。为了实现对多领域架构模型代码生成过程进行统一形式化描述,本文所提出的代码
生成语言在karma的基础上进行扩展,重用karma语言gopprr模型元素的语法语义,增加支持复杂模型结构查询和转换功能的语法。
[0050]
s13:根据所需要生成的目标代码定义代码模板,并确定代码模板中固定不变的代码信息和需要填充的代码信息;所述目标代码为所需设计系统的初步实现代码、测试用例或者用于生成仿真器的代码,同时,代码模板中固定不变的代码信息为静态模板要素,需要填充的代码信息为动态模板要素,其中,静态模板要素根据所需要生成目标代码的结构进行定义,不同的静态模板要素可生成不同的目标代码,同时,动态模板要素以占位符的形式写入代码模板中。
[0051]
需要说明的是,静态模板要素描述静态数据结构,在代码生成过程中该部分数据保持不变。动态模板要素描述模板中在源模型中捕获到的信息,动态替换的数据结构。动态模板要素嵌在静态模板要素中,形成占位符,在代码生成过程中,被模型元素信息填充,然后通过模板的自动装载机制得到目标代码或文本。
[0052]
静态模板要素根据所需要生成目标代码或文本的结构进行定义,不同的静态模板要素可生成不同的目标代码。在使用模板时,需建立获取到的模型模式实例中的元素信息和动态模板要素的占位符之间的映射关系,通过该映射关系将获取到的不同模型元素信息填充至正确的位置,从而得到正确的目标代码。如图7所示,其定义了一个java类模板,描述了一个java类的简单结构,其中,“<模型信息>”即动态模板要素,其余字段为为静态模板要素。将源模型中的类的信息(例如类的名称:“student”)填充至动态部分则可以生成一个java类。。
[0053]
s2:在步骤s12得到的四种类型的架构模型中,找到可以获取到目标代码中所需要填充的代码信息的模型元素,从而完成架构模型中的模型元素与目标代码中所需要填充的代码信息的映射关系的建立,其中,模型元素包括对象、关系、角色、点;
[0054]
s3:确定用于生成目标代码所需要填充代码信息的模型元素所在的模型结构,再从步骤s11中所定义的模型模式中分别为步骤s5中确定下来的每个模型结构选择对应的模型模式;
[0055]
s4:采用步骤s3中选择的模型模式分别描述各模型模式对应的模型结构,得到各模型结构中每一个模型元素的类型以及模型元素与模型元素之间的连接形式,并对每个模型结构中各模型元素包含的属性的值进行约束;
[0056]
s5:根据模型模式所描述的模型结构,对步骤s12中得到的四种类型的架构模型进行查询,得到架构模型中所有与步骤s3中选择的模型模式所描述的模型结构具有相同结构的模型结构,然后根据模型模式中所描述的约束条件,对查询得到的模型结构进行过滤,筛去不符合约束条件的模型结构;
[0057]
s6:获取剩余模型结构中与目标代码具有映射关系的属性,将获取到的属性的值根据映射关系填充至步骤s13中所需要生成的目标代码的代码模板中。
[0058]
需要说明的是,在后续生成目标代码时,需要采用由语言编译器和执行器构成的代码生成引擎,基于antlr工具和groovy引擎构建代码生成引擎。首先对代码生成语言的具体语法语义进行定义,包括转换规则、模型模式、模板等的语法语义。在此基础上,构建g4语法文件。通过对g4语法文件进行编译,antlr自动生成一个空的语法解析器以及语法遍历器。语法解析器生成抽象语法树,而语法遍历器提供了操作抽象语法树的方法。通过重写语
法遍历器,构建语言解释器。在语法树的相应节点获取节点信息并调用对应的预定义好的stringtemplate模板,通过模板渲染组件处理得到对应的groovy中间代码,实现将代码生成语言所定义的转换规则转换为具体实现代码。然后构建语法执行器,语法执行器调用groovy类加载器,加载在上一步骤已经生成的groovy实现代码。groovy类加载器自动将groovy代码加载到内存中,由jvm负责解析执行groovy中间代码,通过模型接口,获取到模型信息,按照代码逻辑,由模型信息得到最终的目标代码。
[0059]
下面根据图3~图6,对不同类别的模型模式进行详细介绍。
[0060]
当模型模式的类别为单元素模式时,模型结构中仅包含一个对象;
[0061]
当模型模式的类别为直接绑定子模式时,模型结构中所有对象和角色之间的连接方式均为直接连接;当模型模式的类别为间接绑定子模式时,模型结构中所有对象和角色之间通过点来连接;当模型模式的类别为混合绑定子模式时,模型结构中一部分对象和角色之间的连接方式为直接连接,另一部分对象和角色之间通过点来连接。
[0062]
需要说明的是,直接绑定模式中所有的对象和角色的绑定方式均为直接绑定,图3中的b图即为直接绑定模式,在e图所示源模型中可匹配到一个模型模式实例:由(o1,ro1,rel1,ro2,o2)构成的模型结构;间接绑定模式中所有的对象和角色的绑定方式均为间接绑定,图3中的c图即为间接绑定模式,在e图所示源模型中可匹配到两个模型模式实例:由(o1,p1,ro3,rel2,ro4,p3,o3)以及(o4,p5,ro7,rel4,ro8,p2,o2)构成的模型结构;混合绑定模式中既可存在直接绑定方式也可存在间接绑定方式。图3中的d图即为混合绑定模式,在e图所示的源模型中可匹配到一个模型模式实例:由(o4,p4,ro5,rel3,ro6,o3)构成的模型结构。
[0063]
进一步地,对于模型结构中某个模型元素实例出现多次的场景,简单模式描述较为繁琐。例如模式中某个对象实例以同样的形式出现n次,则需要在简单模式中列举出n个对象实例,采用基数模式可简化上述描述。基数模式支持描述模型结构中对象、点、角色、关系的实例在源模型中出现的次数,该次数是通过基数指定的。基数可以是具体数字,也可以是一个数字范围,或者为n,代表可匹配任意多个模型元素实例,具体的:
[0064]
当模型模式的类别为一对多对象基数模式时,模型结构中仅存在一个对象采用相同的直接绑定方式与两个以上的对象连接;当模型模式的类别为多对多对象基数模式时,模型结构中存在两个以上的对象采用两个以上的同类型的直接绑定方式连接两个以上的对象;当模型模式的类别为一对多关系基数模式时,模型结构中存在的两个对象之间采用两个以上的同类型的直接绑定方式进行连接;当模型模式的类别为混合基数模式时,模型结构中仅存在一个对象采用两个以上的同类型的直接绑定方式与两个以上的对象连接;当模型模式的类别为一对多点基数模式时,模型结构中存在一个对象仅通过一个点以同类型的间接绑定方式连接另一个对象上两个以上的点;当模型模式的类别为多对多点基数模式时,模型结构中存在一个对象通过两个以上的点以两个以上的同类型的间接绑定方式连接另一个对象上两个以上的点的。
[0065]
也就是说,gopprr方法所构建的模型中具有以下四种基数模式:
[0066]
对象基数模式:用于描述直接绑定方式时,模型结构中同类型的对象实例以同样的连接形式出现多次的情况。图4中的a图为1

n对象基数模式(即一对多对象基数模式),o2~o5均为b类型的对象实例,且通过同类型的关系、角色与对象o1相连,可使用“o2<4>”表示b类型对象实例出现了四次。图4中的b图为n

n对象基数模式(即多对多对象基数模式),a、b
类型的对象实例均出现2次。
[0067]
关系基数模式:用于描述模型结构中同种类型的关系实例(以及关系上的角色)以同样的连接形式出现多次的情况。如图4中的c图所示,关系rel1~rel4始末两端以同类型的角色与对象o1、o2相连,则可使用“rel1<4>”表示该关系实例出现了四次。
[0068]
点基数模式:用于描述间接绑定方式时,模型结构中点实例以同样的连接形式出现多次的情况。图5中的a图为1

n点基数模式(即一对多点基数模式),b图为n

n点基数模式(即多对多点基数模式)。
[0069]
混合基数模式:用于描述由对象、关系、点、角色的实例构成的模型结构组合出现多次的情况。对于模式中不包含点实例的情况,可通过指定对象实例和关系实例的基数的方式直接进行描述,如图4中的d图所示,该模式为对象、关系混合基数模式,通过“o2<3>”指定对象基数,通过“rel1<2>”指定关系基数。对于模式中包含点实例的情况,则需要分组模式来进行描述。
[0070]
进一步地,当模型模式的类别为分组模式时,模型结构具有一个主模型模式,主模型模式中具有两个以上的子模型模式,子模型模式的类型为单元素模式、简单模式或基数模式。
[0071]
由此可见,分组模式应用于复杂模型结构的场景,是一种可将上述三种模式作为子模式(sub patttern)组合起来的模型结构。分组模式描述了主模式和子模式之间的嵌套关系,可以定义一个主模式,主模式中嵌套若干个子模式。如图6中的c图所示,将{p2,o2,ro5,rel3,ro7,o4}的元素组合定义为子模式sp1,则该模式可简化为对象o1与两个子模式sp1通过关系相连。
[0072]
对于包含点的混合基数模式,可以使用分组模式来进行描述。图6中的a图中,将包含对象、关系、角色、点的组合{p1,ro1,rel1,ro3,p3,o2}定义为子模式sp2,则该混合基数模式1可简化为{o1,sp2<2>}。图6中的b图中,则可将包含点、关系、角色的组合{p1,ro1,rel1,ro3,p3}定义为子模式sp2,则该混合基数模式可简化为{o1,sp3<2>}。
[0073]
进一步地,若步骤s3中选择的模型模式的类别为一对多对象基数模式,则描述一对多对象基数模式下的模型结构时,采用a:o1—b:o2<n>表示a类型的对象o1以相同的直接绑定方式连接n个b类型的对象o2,其中,n至少为2,o1表示a类型的对象的标识,o2表示b类型的对象的标识;
[0074]
若步骤s3中选择的模型模式的类别为多对多对象基数模式,则描述多对多对象基数模式下的模型结构时,采用a:o1<i>

b:o2<j>表示i个a类型的对象o1以2个以上同类型的直接绑定方式连接j个b类型的对象o2,其中,i和j至少为2;
[0075]
若步骤s3中选择的模型模式的类别为一对多关系基数模式,则描述一对多关系基数模式下的模型结构时,采用a:o1‑
b:o2&re:rel<m>表示a类型的对象o1通过m个同类型的直接绑定方式连接b类型的对象o2,其中,m至少为2,re为直接绑定方式的类型标识,rel为关系的标识;
[0076]
若步骤s3中选择的模型模式的类别为混合基数模式,则描述混合基数模式下的模型结构时,采用a:o1‑
b:o2<j>&re:rel<m>表示a类型的对象o1通过m个同类型的直接绑定方式分别与j个b类型的对象o2相连接;
[0077]
若步骤s3中选择的模型模式的类别为一对多点基数模式,则描述一对多点基数模
式下的模型结构时,采用p
a
:p1‑
p
b
:p2<k>表示a类型的对象o1通过一个p
a
类型的点p1采用同类型的间接绑定方式连接b类型的对象o2上的k个p
b
类型的点p2,k至少为2,p
a
和p
b
均为点的类型标识,p1和p2均为点的标识;
[0078]
若步骤s3中选择的模型模式的类别为多对多点基数模式,则描述多对多点基数模式下的模型结构时,采用p
a
:p1<l>

p
b
:p2<k>表示a类型的对象o1上的l个p
a
类型的点p1通过同类型的间接绑定方式分别连接b类型的对象o2上的k个p
b
类型的点p2,l至少为2。
[0079]
综上所述,本发明提供的一种支持复杂模型结构转换的代码生成方法,根据所需要生成的目标代码,确定目标代码中固定不变的信息和需要动态填充的信息,需要动态填充的信息来源于步骤s12中所建立的系统架构模型;然后确定目标代码中的所需要填充的信息来源于步骤s12中的系统架构模型中的哪些模型元素(包括对象、关系、角色、点四种类型的元素)信息,确定这些信息所在的模型结构,根据此模型结构的特点来选择步骤s11中所定义的模型模式,利用该模型模式对该模型结构进行描述(描述不能提取其中的属性值,但是后续的代码填充需要填充这些属性值),得到模型结构中每一个元素的类型和元素与元素之间的连接形式,并且可以对这些元素中包含的属性的值进行约束;然后根据模型模式所描述的模型结构,对步骤s12中的系统架构模型进行查询,获取到步骤s12中的系统架构模型中所有与该模型模式所描述的模型结构具有相同结构的模型结构,然后根据模型模式中所描述的约束条件,对这些模型结构进行过滤,筛去不符合约束条件的模型结构;其次,获取这些模型结构中与目标代码相关联的属性,利用预定义好的目标代码的模板,将获取到的属性填充至该代码模板中。
[0080]
对比已有的代码生成语言,本发明所提出的代码生成语言具有以下优势:
[0081]
(1)支持复杂模型结构的查询。既能查询单个模型元素又能查询多个元素构成的模型结构,使用合适的模型模式,有利于简化用户对源模型进行查询的过程,减少脚本代码数量,提高转换效率。
[0082]
(2)语言风格以声明式为主,转换时完全基于规则和模板,可重用性强。
[0083]
(3)所提出的代码生成语言通过扩展karma,实现以统一的形式描述模型和模型的代码生成。karma语言以gopprr六种底层元素按照元建模方法描述元模型、模型实例以及它们之间的关系,多种领域语言例如aadl、sysml、bpmn均可通过karma语言实现,karma代码生成语言的查询和转换对象是以gopprr描述的模型,其语法语义深度融合karma模型形式化描述的语法语义。使用一种语言的好处一方面是提高用户友好性,系统设计人员只需学习一种语言,降低学习成本。另一个方面是可以开发用于处理语言中断的集成编译器,促进建模环境与代码生成引擎之间的互操作性。
[0084]
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当然可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献