?/p>
5
?/p>
上下文无关文法及语言
现在我们把注意力从正则语言转移到另外一大类语言上来,它们叫做“上下文无关?/p>
言”。这个语言类有着自然、递归的表示方法,这种表示方法叫做“上下文无关文法”?/p>
?/p>
1960
年以来,上下文无关文法一直在编译技术中扮演着重要的角色。它们能够把分析?/p>
(一类用来在编译过程中发掘源程序结构的程序)的实现从一种费时的、不通用方式的设
计工作转变成为一种能够很快完成的工作。近年来,上下文无关文法也被用来描述文档?/p>
式:
XML
?/p>
eXtensible Markup Language
可扩展标记语言)中使用?/p>
DTD
?/p>
Document-Type
Definition
文档类型定义)就是用来描?/p>
Web
上的信息交换格式的?/p>
在本章中,我们将首先介绍上下文无关文法的表示方法,然后将介绍怎样用文法来?/p>
义语言。我们将会讨论到“语法分析树”──对一个文法处在它所表示的语言的字符串?/p>
结构的图形描述。语法分析树是对一个编程语言的语法分析器的产物,也是通常用来获得
程序结构的途径?/p>
上下文无关语言还有另外一种等价的自动机表示叫做“下推自动机”。我们将在第
6
章介绍下推自动机。虽然它不如有穷自动机重要,但仍然要介绍它,原因是作为一种语言
的定义机制来说,它跟上下文无关文法具有等价性,后面在第
7
章研究如何判定上下文?/p>
关语言以及研究上下文无关语言的封闭性时,这种等价性是非常有用的?/p>
5.1
上下文无关文?/p>
这一章的内容将从非形式化地介绍上下文无关文法的表示法开始。形式化的定义会?/p>
读者了解到这些文法的一些重要的能力之后给出。届时我们将会说明怎样形式地定义一?/p>
文法,并将介绍一种叫作“推导”的过程:它能够决定在一个文法的语言中到底有哪些
串?/p>
5.1.1
一个非形式化的例子
下面来考虑一个“回文(
palindrome
)”的语言。“回文”是指正向和反向读起来都一
样的串,比如
otto
或?/p>
madamimadam
(?/p>
Madam, I
?/p>
m Adam,
”引?/p>
Eve
?/p>
Eden
的花园里
听到的第一句话)。换句话说,?/p>
w
是一个回文当且仅?/p>
w
=
w
R
。考虑简单些的情况?/p>
—只需要描述字母表
{0, 1}
上的回文,这个语言包括?/p>
0110
?/p>
11011
这样的串,也包括空串
ε
,但不包括像
011
?/p>
0101
这样的串?/p>
很容易验证这?/p>
0,1
上的回文语言
L
pal
不是正则语言,要做到这点只需要使用泵引理?/p>
可:假设
L
pal
是一个正则语言,令
n
是与其相关的常数,考虑回文?/p>
w
= 0
n
10
n
,如?/p>
L
pal
是正则的,那么我们就能够?/p>
w
写为
w
=
xyz
,其?/p>
y
由第一?/p>
0
中的若干个(但至少一
个)构成。接下来,如?/p>
L
pal
是正则的话那?/p>
xz
也应该在
L
pal
里。然而由?/p>
xz
的两端的
0
的个数不同,进而可知它不可能是回文串,由此得出的矛盾可以推翻前面关?/p>
L
pal
是正?/p>
语言的假设?/p>
对于什么样?/p>
0,1
串在
L
pal
里,有一个自然的、递归的定义,它从一个最基本的显然属
?/p>
L
pal
中的串开始,接着利用一个最直观的思想:如果一个串?/p>
L
pal
里,那么它开头和结尾