上一篇文章介绍了MPS入门案例中创建Editor的过程,这篇文章将介绍如何定义类似Java中枚举类型的颜色值,定义这种类型可以使用户在创建Shape实例时按照提示选择限定的一些颜色值,而不会误输入其他不合法的值,在该案例中之定义了black、blue、cyan、green、red、white、yellow这几种颜色,也就是说除了这几种颜色之外用户不可以定义其他值,比如gray等,自然也不会输入其他的值,比如一个字符串"string"等。

创建Concept : Color

首先我们创建一个名为Color的Concept,它的属性只有name,因此只需要实现INamedConcept,并且要定义它的instance can be root项值为true(这里可能读者会有疑问,Color不应该是包含在形状里的属性吗,为什么因为可以作为根元素?这是因为在后面我们需要单独定义颜色值,此时Color就作为根元素,具体请看下方定义Accessory Model的部分):

创建Color的Editor

然后再来定义一下Color的Editor,也就是表示Color的语法,layout里依次包含以下两个内容:

  • 常量:Color
  • 属性值:name,敲下Ctrl + Space选择{ name }

创建Accessory Model

定义完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的颜色实例,如下方第二张截图所示:

创建Concept : ColorReference

创建ColorReference的目的是让Shape能够通过ColorReference来引用Color中限定的颜色值,在references下定义一个target : Color[1]来引用颜色值:

创建ColorReference的Editor

创建ColorReference的Concept之后需要定义它的布局(语法),只需要显示target(Color类型)颜色值名称即可,通过Ctrl + Space可以补全下图内容:

在Shape中添加颜色

要让Shape拥有颜色需要给Shape添加childrens属性——color : ColorReference[1]

添加Shape中颜色的编辑器组件

由于Shape是抽象Concept,因此没有给它定义Editor,但继承自Shape的Circle和Square需要实例化Color属性,因此需要在Shape中定义一个可以提供给Circle和Square的ColorReference编辑器,首先在Shape的编辑页面下点击编辑器左下角的加号图标,选择Editor → Editor Component,如下两张截图所示:


在新创建的Editor Component中定义布局component cell layout,依次包含以下内容:

  • 常量:color:
  • 属性值:% color %,这个属性值会去引用ColorReference的布局

修改Circle和Square的Editor

在为Shape定义好Color及其编辑器之后,就可以在Circle和Square的编辑器中添加颜色的布局,在原来的内容上追加父类中定义好的Editor Component即# ShapeColor #(通过Ctrl +Space提示补全):

更新Shape模型实例

以上完成了定义颜色值得所有步骤,此时Rebuild一下项目,打开沙盒中打开MyDrawing实例可以看到新添加了一个颜色属性,颜色值可以通过Ctrl + Space补全:

至此,Shape的Concept(元模型、抽象语法)和Editor(具体语法)的定义就结束了,接下来我们需要定义Generator,也就是生成Java代码,调用Java的图形化编程库来生成图像,在DSL属于上可以成为生成执行语义。

【MPS】Jetbrains MPS入门案例Shapes(三)相关推荐

  1. 【MPS】Jetbrains MPS入门案例Shapes(二)

    上一篇文章介绍了MPS入门案例Shapes中创建Concept的过程,这篇文章将介绍如果创建Shapes这个DSL的Editor,它在语言层面上描述的是某种DSL的具体语法(Concrete Synt ...

  2. 【MPS】Jetbrains MPS入门案例Shapes(四)

    上一篇文章介绍了MPS入门案例中添加颜色属性的过程,这篇文章将介绍如何将实例模型转换为Java代码,并且通过调用Java图形化编程库来绘制图形的方法,主要是通过MPS的生成器Generator来生成J ...

  3. 【MPS】Jetbrains MPS入门案例Shapes(一)

    JetBrains 凭借 MPS 推出新的编程范式 MPS (Meta Programming System) 是一个执行面向语言编程范式的全新概念的软件开发环境,用于创建实际应用和领域专用语言. M ...

  4. 贪心入门案例(三)---------乘船问题

    乘船

  5. 如何将JAR添加到Jetbrains MPS项目

    Jetbrains MPS是创建DSL的绝佳工具. 我们喜欢它,并在我们的咨询工作中定期使用它. 因此,我们之前已经写过关于Jetbrains MPS的文章 . 作为投影编辑器,您可以轻松创建可通过图 ...

  6. ANTLR和Jetbrains MPS:解析文件并以树符号显示AST

    Itemis再次这样做:他们刚刚为Jetbrains MPS发布了一个非常酷的新插件. 这允许定义新的树编辑器. 他们看起来像这样: 在这篇文章中,我们将看到: 如何在MPS中使用ANTLR解析器 如 ...

  7. 嵌入式OS入门笔记-以RTX为案例:三.初探进程

    嵌入式OS入门笔记-以RTX为案例:三.初探进程 1.理论     进程,英文称呼很多Process, Task 等等,一般通用操作系统称Process的比较多,各种称呼涵义稍微有不一样.一般而言,进 ...

  8. matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记

    目录 快速入门案例: 解决流程: 具体实现: 一.获取数据 二.数据探索和建模 三.分享结果 常用技巧 一.常用标点功能 二.常用操作指令 三.指令编辑操作键 四.matlab数据类型 五.开发模式 ...

  9. 2021年大数据Flink(八):Flink入门案例

    目录 Flink入门案例 前置说明 API 编程模型 准备工程 pom文件 log4j.properties Flink初体验 需求 编码步骤 代码实现 Flink入门案例 前置说明 API API ...

最新文章

  1. .NET编码解码(HtmlEncode与HtmlEncode)
  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
  3. 【软件开发底层知识修炼】五 gcc-C语言编译器
  4. 【CF566#D】 Restructuring Company (并查集---合并区间操作)
  5. 作者:​林旺群(1983-),男,博士,北京系统工程研究所助理研究员。
  6. Redis之高级特性
  7. matlab给hfss建模,HFSS-MATLAB联合建模
  8. java 构造器(constructor)是否可被重写(override)?
  9. springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
  10. 国内首家!携程周三、周五可在家“躺平”:76%员工主动报名 !网友:我酸了
  11. 登录服务器信息怎么删除,服务器端删除了用户,怎么通知客户端浏览器删除cookie...
  12. spring-aop源码分析
  13. 【数学建模】相关软件
  14. 可能是最全的h5唤起App方案
  15. 计算机电源检测软件,电脑电源检测工具
  16. iCloud备份失败怎么办?iCloud无法备份解决办法分享!
  17. 某大型合资企业审批系统上线经验教训总结
  18. java的书可以二手_基于jsp的二手书图书-JavaEE实现二手书图书 - java项目源码
  19. k8s跨namespace访问服务
  20. Windows2008 Server 常规设置及基本安全策略

热门文章

  1. 小和尚学习-CSS选择器
  2. Ubuntu20.04+RTX3090+CUDA11.4+CUDNN8.5.0安装与卸载
  3. Win10 + WSL2 + Ubuntu18.04 + CUDA 成功
  4. 马的管辖-----深搜代码
  5. HTTP协议简析《图解http》
  6. linux下如何更好地防御CC攻击
  7. 一人之下被动进阶鸿蒙,一人之下:乱金柝是“风后奇门”的核心技能?网友:是,并不完全是!...
  8. 2784Good Luck!
  9. 数学建模——光盘的数据容量
  10. 小红书招聘计算机视觉算法工程师!