没有合适的资源?快使用搜索试试~ 我知道了~
使用Xtext和Xtend实现域特定语言(第二版)-中文翻译-第一章
4星 · 超过85%的资源 需积分: 47 35 下载量 162 浏览量
2018-01-19
07:55:11
上传
评论 1
收藏 609KB PDF 举报
温馨提示
试读
14页
了解如何使用易于理解的示例和最佳实践,使用xtext和Xtend来实现DSL。
资源推荐
资源详情
资源评论
1
第一章 实现
DSL
在本章中,我们将简要介绍域特定语言(DSL)及有关实现问题,尤其是在
上集成开发环境(IDE)背景下。在本章的开头,我们将概述在集成 IDE 实现 DSL
的主要任务。在本章结尾,我们还将向您展示如何安装 Xtext,并让你看到你能
用 Xtext 做什么。它是一个 Eclipse 的 DSL 开发框架,涵盖语言实现的各个方
面的,包括将它集成在 Eclipse IDE 中。
本章将介绍以下主题:
对 DSL 的介绍
实现 DSL 的主要步骤
典型的 DSL IDE 工具
Xtext 的第一个示例
域特定语言
域特定语言(Domain Specifc Languages),简写为 DSL,是特定问题领
域的编程语言或特定语言。并不意味它们打算解决各种问题。你可能无法实现所
有可以用 Java 或 C 实现的程序,它们都被称为通用语言(GPL)。另一方面,
如果你的问题由特定的 DSL 覆盖,那么您使用 DSL 而不是 GPL,可以更快、更
容易地解决这个问题。
实施 DSL DSL 的一些例子是 SQL(用于查询关系数据库)、Mathematica
(用于符号数学)、HTML 和许多您过去可能使用过的其他语言。然后,在 DSL
中写的程序或规范,可以解释或编译成 GPL。在其他情况下,规范可以表示成由
其他系统处理的简单数据。
对于 DSL 的更多的介绍,你可以参考 Fowler 2010,Ghosh 2010 和 Voelter
2013 写的书。
需要一种新的语言
您现在可能会想,为什么要引入新的 DSL 来描述具体数据、模型或应用程
序,而不是使用 XML——这允许您在机器中以人类可读的形式描述数据。现在有
很多工具允许您以 XML 格式读、写或交换数据,而无需根据特定语法来解析此
类数据,如 XML 模式定义(XSD)。基本上只需要学习一种语法(XML 标签语法)
来,然后所有数据都可以用 XML 表示。
当然这也有一个品味问题,但是很多人,包括我自己,发现 XML 确实是机
器可读的,但人类并不是容易可读的。以 XML 格式交换数据是很好的,如果该
格式数据是由程序生成的,则通常要求人(程序员和用户)手动在 XML 指定数
据,如,指定应用程序的特定配置。
如果说写一个 XML 文件可能是痛苦的事,读懂可能会更糟。其实,XML 往往
是冗长的,它在文档中填充了太多额外语法噪音——由于所有的标签。这些标签
2
帮助计算机处理 XML,但它们确实分散了人们读写 XML 文件时的注意力。考虑一
个非常简单的,描述人的 XML 文件例子:
<people>
<person>
<name>James</name>
<surname>Smith</surname>
<age>50</age>
</person>
<person employed="true">
<name>John</name>
<surname>Anderson</surname>
<age>40</age>
</person>
</people>
从这样的一个描述掌握一个人的实际信息不那么简单——会被所有这些标
签分散注意力。另外,写这样的描述可能是一个负担。编辑器可能以一些语法突
出显示,和早期用户对验证的反馈提供一些帮助,但仍然有太多的额外细节。
可以使用 XML 的替代方法,JSON(JavaScript Object Notation)减少
冗余。但是,人工阅读、写和维护的负担,JSON 中的对于 XML 而言仅略微降低。
以下版本是在一个特定的 DSL 中编写的:
person {
name=James
surname=Smith
age=50
}
person employed {
name=John
surname=Anderson
age=40
}
它包含较少的噪音,信息更容易掌握。我们甚至可以做更好,具有更紧凑的
规格:
James Smith (50)
John Anderson (40) employed
毕竟,由于这个 DSL 只让用户描述人的姓名和年龄,为什么不这样设计,
使得描述紧凑、易于阅读和编写?
实现一个 DSL
对于最终用户,使用 DSL 确实比编写 XML 代码更容易。然而,现在留给 DSL
开发人员的任务,是实现它。
实现 DSL,意味着在 DSL 中能,开发一个读取文本的程序,解析它、处理它、
然后可能解释它或生成另一种语言代码。根据 DSL 的目标,这可能需要几个阶
段,但是所有实现的这些大多数阶段是典型的。
3
在本节中,我们仅仅概述实现 DSL 的主要方面。对于语言实现和背后理论
的更深入介绍,感兴趣的读者可以参考 Aho 等人 2007 年。
从现在起,在整本书中,我们不会区分 DSL 和编程语言,除非文中严格要求。
解析
首先,当阅读用编程语言编写的程序时,实现必须确保程序遵循该语言的语
法。
为了这个目标,我们需要将程序拆成令牌。每个令牌是单个原子语言元素,
可以是一个关键字(如 Java 中的 class)、一个标识符(例如 Java 的类名称)
或常数,即固定值。常数的例子是字符串常数,通常由引号包围,整数常数和布
尔值包围文字(例如,true 和 false)。其他类型的令牌是操作符(如算术和
比较运算符)和分隔符(如括号和终止分号)。
例如,在前面的例子中,employed 是一个关键字,括号是分隔符,James
是一个标识符,50 是一个整数常数。
将字符序列转换为令牌序列的过程,称为词法分析,执行此类分析的程序或
过程称为词法分析器、词法分析,或简称为扫描器。这个分析通常通过使用正则
表达式语法来实现。
从输入文件中获取令牌序列是不够的,我们必须确保他们用我们的语言形成
有效的语句,也就是说,他们遵循语言的预期句法结构。这个阶段叫做解析或句
法分析。执行此类分析的程序或过程称为解析器。
让我们回想一下描述各种人的名字和年龄的 DSL,以及一个可能的输入文
字:
James Smith (50)
John Anderson (40) employed
在此示例中,输入的每一行,必须遵循以下结构:
两个标识符
分隔符(
一个整数常数
分隔符)
可选关键字 employed
在我们的语言中,令牌由空格分开,行由换行字符分隔.
您现在可以推断出,解析器依赖于词法分析器。实际上,解析器向词法分析
器查询令牌,并尝试构建有效的语言语句。
如果您从未实现过编程语言,那么您可能会对实现解析器的任务感到害怕,
通过,例如,在 Java 中实现。你可能是对的,因为这并不容易,我们刚刚使用
的示例 DSL 很小,仍然需要付出努力才能实现。如果你的 DSL 还要处理算术表
达式呢?尽管它们结构很简单,但算术表达式本身是递归的,因此,用 Java 实
现的解析器,还必须处理递归,特别是,要避免可能出现的无限循环。
有一些工具来处理解析,以便您不必手工实现解析器。特别地,有指定语言
语法的 DSL,根据这个规范,它们会自动生成词法分析器和解析器的代码。因此,
这些工具称为,解析生成器或编译编译器。在这种情况下,这种规范被称为语法。
语法是根据语言语法的有效元素,所描述的一组规则。
剩余13页未读,继续阅读
资源评论
- qq_333285362019-03-11完整的资源在哪?
大白话沟通
- 粉丝: 10
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功