上一篇文章介绍了MPS入门案例Shapes中创建Concept的过程,这篇文章将介绍如果创建Shapes这个DSL的Editor,它在语言层面上描述的是某种DSL的具体语法(Concrete Syntax),也就是建模时写的代码(包含关键字、格式等),我们通常说的C++、Java、Python等的语法事实上指的就是这些语言的具体语法。

创建Editor

由于Shape是一个抽象的Concept,所以不需要定义它的Editor,从它的具体Concept开始创建Editor

创建Circle的Editor

首先打开Circle的Concept文件,我们可以通过在该文件下右键选择New→Concept Editor创建它的Editor,也可以通过点击编辑器下方的选项卡Editor,进入之后点击空白处选择,如下图所示:



创建成功之后IDE会自动生成一个Editor的框架,我们需要在上面补全我们我们需要定义的语法,MPS是以单元格(Cell)的形式让用户创建语法树的,MPS提供了各种语法模板,在这里只对该案例需要用到的模板进行介绍,其它模板请查看官方文档。首先我们选中标红处"choose cell model",在这里可以选择我们要使用的语法模板,此时最后使用Ctrl+Space快捷键来补全语法模板,以下是四种基本布局模板的解释:

  • [] text constant:常量,也就是是一些硬编码的语法,固定不变的东西
  • [- -] collection intent:单元格集合,当单元格内容满一行时自动换行
  • [/ /] collection vertical:垂直布局的单元格,比如if…else…语句的布局
    if(condition){trueStatement
    } else { falseStatement
    }
    
  • [> <] collection horizontal:水平布局的单元格,比如上面的if和condition就是水平布局

以上后面除了常量,其他三种布局都是可以相互嵌套的,这三种布局也可以嵌套常量,在这里我们选择Circle的跟布局为[- -] collection intent布局

依次输入一下内容(通过Enter键往后追加单元格,通过Ctrl+Space补全,{}包裹着属性名称表示属性值):

  • 常量:circle
  • 常量:x:
  • 属性值:{x} 一定要通过Ctrl+Space补全选择{x},手敲的会作为常量
  • 常量:y:
  • 属性值:{y} 一定要通过Ctrl+Space补全选择{y},手敲的会作为常量
  • 常量:radius:
  • 属性值:{radius} 一定要通过Ctrl+Space补全选择{radius},手敲的会作为常量

其中常量是固定不变的字符串,属性值是需要我们在建模时输入的值,定义完之后如下图所示:

创建Square的Editor

按照创建Circle Editor的步骤再来创建一个Square的Editor,包含的内容如下:

  • 常量:square
  • 常量:upperLeftX:
  • 属性值:{upperLeftX}
  • 常量:upperLeftY:
  • 属性值:{upperLeftY}
  • 常量:size:
  • 属性值:{size}

定义完之后如下图所示:

创建Canvas的Editor

Canvas的Edito比Circle和Square稍微复杂一些,因为它包含shapes这个children,需要用到(/ /) child node cell list (vertical)这个布局,如下图所示:

Canvas的Editor包含的内容如下:

  • 常量:Painting
  • 属性值:{name} 即Canvas实例的名字
  • 子节点的集合:shapes 通过Ctrl + Space补全(\ \)后输入在< no link >处补全shapes

按上述定义完Canvas的Editor后,rebuild一次项目,MPS会自动更新我们在上一节最后创建的模型MyDrawing,此时就是最新的样式:

可以发现与预期的有点不一样,原因在于我们在Painting {name}后没有换行,因此需要调整,将光标放置在shapes前的(/出,按快捷键ALT+Enter,在弹出的提示中选择Add On New Line,这样shapes就会在新的一行显示,此时再次rebuild项目,MyDrawing会更新为目标的样式



至此,所有Concept的Editor就已经定义好,我们此时就可以用自定义的语法来创建图形的实例模型了,后续需要给图形加上颜色属性,以及定义代码生成器去生成Java代码,通过调用Java的图形库来绘制图形。

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

  1. Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos /(非阿里组件))

    Spring Cloud Alibaba - Gateway 入门案例(二)(Gateway 整合 nacos)(非阿里组件) 回溯 Gateway 整合 nacos 方式一(复杂/灵活/常用) 方式 ...

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

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

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

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

  4. 【MPS】Jetbrains MPS入门案例Shapes(三)

    上一篇文章介绍了MPS入门案例中创建Editor的过程,这篇文章将介绍如何定义类似Java中枚举类型的颜色值,定义这种类型可以使用户在创建Shape实例时按照提示选择限定的一些颜色值,而不会误输入其他 ...

  5. drools的简单入门案例

    文章目录 一.背景 二.为什么要学习drools 三.实现上方这个简单的打折案例 1.引入jar包 2.编写kmodule.xml配置文件 3.编写规则文件 1.规则文件的语法 2.编写规则文件 3. ...

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

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

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

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

  8. 嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX

    嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX 本篇笔记将简单介绍RTX,包括基本架构,如何在Keil中配置.需要安装ARM-MDK和一块硬件板,笔记以STM32F4Discovery为例子 ...

  9. python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...

    (附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...

最新文章

  1. python适合零基础学习吗-零基础,经济学专业,适合自学Python吗?
  2. 1 文巾解题 191. 位1的个数
  3. 牌类游戏使用微服务重构笔记(八): 游戏网关服务器
  4. python打包exe黑框一闪而过,解决pyinstaller打包exe文件出现命令窗口一闪而过的问题...
  5. Ubuntu Server最佳方案——LAMP服务器之PHP篇
  6. 系统集成项目管理工程师目录
  7. php tcp utp链接,【黑帽seo】php随机调用友情链接技术
  8. 最新!中科院分区发布2021年期刊重大调整
  9. Flash游戏开发中的人物走动实现方法
  10. input函数使用及运算符
  11. 毁掉一家公司最好的方式,就是跟员工讨价还价
  12. 计算机对写字教学的冲淡,不断改进评价方法努力促进写字教学
  13. EXCEL常规格式数字转换为日期时间格式的方法
  14. cx_Oracle报错“DPI-1047: Cannot locate a 64-bit Oracle Client library”
  15. 通用汽车将向底特律郊区一家工厂投资3亿美元
  16. [转]技术经纪人将成职业新宠
  17. 张召忠:第四次工业革命来了》课堂笔记
  18. 全网最全关闭小米手机MIUI系统广告教程
  19. 【Python爬虫】爬取云班课资源,活动
  20. Python|利用tkinter制作桌面翻译工具,结构不是很复杂不过有点糙

热门文章

  1. 微信小程序开发入门教程(七)
  2. 80后的麦当劳如何俘获年轻人的心
  3. 2017.05.19随笔
  4. 工厂设计模式有什么用?
  5. 【操作系统】-同步互斥-【2013真题】-某博物馆最多容纳500人...
  6. c 语言pets进步天梯题目,2017年9月公共英语一级pets考试样题解析
  7. Java,Android,窥探组合的用法。AndroidUI组合设计模式,Java组合设计模式
  8. 题目26:输入体重(单位:Kg)和身高(单位:m),计算BMI指数(BMI指数=体重÷身高的平方),如果BMI <18.5,输出thin;如果18.5≤BMI≤25,则输出normal
  9. 没戏,做不到,不存在的“不可能三角”
  10. SecureCRT初次使用