《领域特定语言》一3.3 文法、语法和语义

3.3 文法、语法和语义

如果要处理一种语言的语法,文法是一种很重要的工具。文法是一组规则,用以描述如何将文本流转化为语法树。大多数程序员都会在生命中的某一刻接触文法,因为文法常用以描述我们日常使用的程序设计语言。文法由一系列产生式规则组成,每个生产规则都有一个名字(term)以及一个描述如何分解它的语句(statement)。所以,一个加法语句可能看起来就像这样: additionStatement:=number'+'number。它告诉我们,如果遇到语句5+3,解析器能够将其识别为加法语句。因为规则是可以相互引用的,所以也会有一条针对数字的规则,告诉我们如何识别合法数字。通过这些规则,我们就可以得到一种语言的文法。
一种语言可以由多种不同的文法来定义,认识到这点很重要。世界上不存在某种语言的唯一文法。一种文法就定义了语言所生成语法树的一种结构,对于一段特定的文本,可能会识别出许多不同的语法树结构。一种文法只定义一种形式的语法树;选择何种文法和语法树取决于很多因素,包括语言的文法特性以及处理语法树的方式等。
文法只定义一种语言的语法─它在语法树中如何表现。而这与语义(也就是表达式的含义)无关。根据上下文不同,5+3可能等于8,也可能等于53,语法相同,但语义可能截然不同。在“语义模型”(第11章)中,语义的定义浓缩为如何根据语法树组装语义模型,以及如何处理语义模型。特别是,如果两个表达式产生相同结构的语义模型,即使语法不同,它们的语义其实也是相同的。
如果在使用外部DSL,特别是,用到了“语法指导翻译”(第18章),我们很可能会显式地使用文法来构建解析器。如果用的是内部DSL,可能没有显式的文法,但是从文法的角度思考DSL仍然是有用的,文法有助于我们在众多内部DSL模式中进行选择。
对于内部DSL,谈论文法显得有些奇怪,原因之一是,这里解析了两遍,所以包含了两种文法。第一种是宿主语言本身的解析,这显然要依赖于宿主语言的文法。这一遍解析创建宿主语言的执行指令。当宿主语言所构建的DSL执行时,鬼魅般的语法树就会在调用栈中创建。只有在第二遍解析时,才会出现这个名义上的DSL语法。

时间: 2024-09-25 19:28:58

《领域特定语言》一3.3 文法、语法和语义的相关文章

《领域特定语言》一导读

前 言 在我开始编程之前,DSL(Domain–Specific Language,领域特定语言)就已经成了程序世界中的一员.随便找个UNIX或者Lisp老手问问,他一定会跟你滔滔不绝地谈起DSL是怎么成为他的镇宅之宝的,直到你被烦得痛不欲生为止.但即便这样,DSL却从未成为计算领域的一大亮点.大多数人都是从别人那里学到DSL,而且只学到了有限的几种技术. 我写这本书就是为了改变这个现状.我希望通过本书介绍的大量DSL技术,让你有足够的信息来做出决策:是否在工作中使用DSL,以及选择哪一种DSL

如何设计一门编程语言(十) 正则表达式与领域特定语言(DSL)

几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一开始上来就设计通用语言的.我自己第一次做这种事情是在高中写这个傻逼ARPG的时候了.当时做了一个超简单的脚本语言,长的就跟汇编差不多,虽然每一个指令都写成了调用函数的形态.虽然这个游戏需要脚本在剧情里面控制一些人物的走动什么的,但是所幸并不复杂,于是还是完成了任务.一眨眼10年过去了,现在在写Gac

《领域特定语言》一第2章 使用DSL 2.1定义DSL

第2章 使用DSL 看过上一章的例子后,即便尚未给出DSL的一般定义,对于何为DSL,你也应该已经有了自己的认识.(第10章中有更多例子.)现在,要开始讨论DSL的定义及其优势与问题.这样就可以为下一章讨论DSL实现提供一些上下文. 2.1定义DSL "领域特定语言"是一个很有用的术语和概念,但其边界很模糊.一些东西很明显是DSL,但另一些可能会引发争议.这一术语由来已久,不过,正如软件行业中的很多东西一样,它也从未有过一个确切的定义.然而,就本书而言,定义是非常有价值的.领域特定语言

《领域特定语言》一第1章 入 门 例 子1.1 哥特式建筑安全系统

第1章 入 门 例 子 落笔之初,我需要快速地解释一下本书的内容,就是解释什么是领域特定语言(Domain– Specific Language,DSL).为达此目的,我一般都会先展示一个具体的例子,随后再给出抽象的定义.因此,我会从一个例子开始,展示DSL可以采用的不同形式.在第2章里,我会试着把这个定义概括为一些更广泛适用的东西. 1.1 哥特式建筑安全系统 在我的童年记忆里,电视上播放的那些低劣的冒险电影是模糊却持久的.通常,这些电影的场景会安排某个古旧的城堡.密室或走廊在其中起着重要的作

《领域特定语言》一1.3 为格兰特小姐的控制器编写程序

1.3 为格兰特小姐的控制器编写程序 至此,我们已经实现了状态机模型,接下来,就可以为格兰特小姐的控制器编写程序了,如下所示: Event doorClosed = new Event("doorClosed", "D1CL"); Event drawerOpened = new Event("drawerOpened", "D2OP"); Event lightOn = new Event("lightOn&quo

《领域特定语言》一2.4 广义的语言处理

2.4 广义的语言处理 本书是关于领域专用语言的,但它也涉及语言处理技术.之所以二者重合,是因为在普通的开发团队里,用到语言处理技术的情况,90%都是为了DSL.但是,这些技术也可以用于其他方面,若不讨论这些情况,将是我的失职.我曾遇到过这方面一个很好的例子,那是在一次拜访ThoughtWorks项目团队时.他们有一个任务,要与某第三方系统通信,发送的消息以COBOL copybook定义.COBOL copybook是一种用来描述记录的数据结构格式.因为系统中有很多地方要用到,所以我的同事Br

《领域特定语言》一1.4 语言和语义模型

1.4 语言和语义模型 在这个例子之初,我谈到了构建一个状态机模型.这种模型的存在,以及它同DSL的关系,是至关重要的.在这个例子里,DSL的角色就是组装状态机模型.因此,当解析定制语法的版本时,遇到: events doorClosed D1CL 会创建一个新的事件对象(new Event("doorClosed","D1CL")),把它保存在一边(在一个 "符号表"(第14章)里),这样,遇到doorClosed=>active时,就可

《领域特定语言》一3.5 宏

3.5 宏 "宏"(第15章)是一种工具,既可以用于内部DSL,也可以用于外部DSL.宏曾经得到广泛应用,但如今已不那么常见了.在大多数情况下,我建议尽量避免使用宏,但偶尔,它也有一些用处.所以,接下来,就谈论宏的运作方式以及使用时机. 宏有两种风格:文本宏和语法宏.文本宏最容易理解,简单说就是文本替换.使用文本宏会带来便利,一个很好的例子就是,在CSS文件中指定颜色.除了少数几种特定情况外,CSS强制我们以颜色代码指定颜色,比如#FFB595.这样的代码并不表意,更糟糕的是,如果要在

《领域特定语言》一1.2 状态机模型

1.2 状态机模型 一旦团队达成共识,认为对于指定控制器如何运作而言,状态机是一个恰当的抽象,那么,下一步就是确保这个抽象能够运用到软件自身.如果人们在考虑控制器行为时,也要考虑事件.状态和转换,那么,我们希望这些词汇也可以出现在软件代码里.从本质上说,这就是领域驱动设计(Domain–Driven Design)中的Ubiquitous Language [Evans DDD] 原则,也就是说,我们在领域人员(那些描述建筑安全该如何运作的人)和程序员之间构建的一种共享语言.对于Java程序来说