赞
踩
上一篇文章介绍了MPS入门案例中创建Editor的过程,这篇文章将介绍如何定义类似Java中枚举类型的颜色值,定义这种类型可以使用户在创建Shape实例时按照提示选择限定的一些颜色值,而不会误输入其他不合法的值,在该案例中之定义了black、blue、cyan、green、red、white、yellow这几种颜色,也就是说除了这几种颜色之外用户不可以定义其他值,比如gray等,自然也不会输入其他的值,比如一个字符串"string"等。
首先我们创建一个名为Color的Concept,它的属性只有name,因此只需要实现INamedConcept,并且要定义它的instance can be root项值为true(这里可能读者会有疑问,Color不应该是包含在形状里的属性吗,为什么因为可以作为根元素?这是因为在后面我们需要单独定义颜色值,此时Color就作为根元素,具体请看下方定义Accessory Model的部分):
然后再来定义一下Color的Editor,也就是表示Color的语法,layout里依次包含以下两个内容:
定义完Editor之后Rebuild一下项目。此时我们可以定义限定的几个颜色值了,首先在Language模块的根目录Shapes下右键选择选择Accessory Model(accessory以为附件、配件,因此可以理解为定义固定的几个颜色配件),然后在弹出框填好如下方第二张截图的内容:
此时多出一个accessories目录,选中下面的Shapes.colors选项,按ALT + Enter进行Used Languages的导入(作用是让这个accessory模型能够引用Shapes中的Color),导入之后先不要关闭当前小窗口,切换到Advanced选项卡,将Do Not Generate勾选上,如下方第二张截图所示:
选中accessories并邮件选择new → color,此时会出现Color的实例模型,可以看到是我们在定义Color的Editor时定义的布局(语法),到这里就能解释为什么Color需要设置instance can be root为true了,依次创建black、blue、cyan、green、red、white、yellow的颜色实例,如下方第二张截图所示:
创建ColorReference的目的是让Shape能够通过ColorReference来引用Color中限定的颜色值,在references下定义一个target : Color[1]来引用颜色值:
创建ColorReference的Concept之后需要定义它的布局(语法),只需要显示target(Color类型)颜色值名称即可,通过Ctrl + Space可以补全下图内容:
要让Shape拥有颜色需要给Shape添加childrens属性——color : ColorReference[1]
由于Shape是抽象Concept,因此没有给它定义Editor,但继承自Shape的Circle和Square需要实例化Color属性,因此需要在Shape中定义一个可以提供给Circle和Square的ColorReference编辑器,首先在Shape的编辑页面下点击编辑器左下角的加号图标,选择Editor → Editor Component,如下两张截图所示:
在新创建的Editor Component中定义布局component cell layout,依次包含以下内容:
在为Shape定义好Color及其编辑器之后,就可以在Circle和Square的编辑器中添加颜色的布局,在原来的内容上追加父类中定义好的Editor Component即# ShapeColor #(通过Ctrl +Space提示补全):
以上完成了定义颜色值得所有步骤,此时Rebuild一下项目,打开沙盒中打开MyDrawing实例可以看到新添加了一个颜色属性,颜色值可以通过Ctrl + Space补全:
至此,Shape的Concept(元模型、抽象语法)和Editor(具体语法)的定义就结束了,接下来我们需要定义Generator,也就是生成Java代码,调用Java的图形化编程库来生成图像,在DSL属于上可以成为生成执行语义。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。