chapter 6-上下文无关语言
- 格式:ppt
- 大小:1.10 MB
- 文档页数:27
第三部分上下文无关语言和下推自动机前面介绍的有限自动机是计算的初级模型,它所接受的正规语言不太关心字符串自身的结构。
上下文无关文法(CFL)是一种简单的描述语法规则的递归方法,语言中的字符串由这些规则产生。
所有的正规语言都能用上下文无关文法描述,它也可以描述非正规语言。
上下文无关文法描述的语法规则更复杂多变,可以在相当大的程度上,描述高级程序设计语言的语法和其他一些形式语言。
类似正则语言对应的抽象机模型是有限自动机,CFL也有对应的抽象机模型。
CFL对应的计算模型是在有限自动机的基础上增加存储空间得到,并被设想成无限空间(对应有限自动机的有限空间),采用了一种简单的管理模式,栈(stack),这种新的计算模型(或抽象机)称为下推自动机(pushdown automata),下推是栈最典型的操作。
有必要在下推自动机中保留非确定性,确定型下推自动机不能接受所有的CFL,但给定一个CFG,容易构造一个相应的非确定型下推自动机,它在识别字符串过程中的移动模拟了文法的推导过程,这个过程称为分析(parse)。
分析不是一定需要下推自动机来完成。
CFL仍然不够通用,不能包括所有有意义的、或有用的形式语言。
采用类似第五章的技术,我们将给出一些不是CFL的简单例子,这些技术也用于解决与CFL相关的判定问题。
6 上下文无关文法6.1 上下文无关文法的定义为了描述我们在第二部分考察的各种语言,包括一些非正则语言,我们引入一种语言的递归定义方法,称为文法。
文法与我们熟悉的语言的语法描述相近,是描述语言和分析语言的有力工具。
问题:文法的形式化定义似乎可以模仿有限自动机,比如5元组或6元组之类。
例子6.1 正如我们在例子2.16中所见,字母表{a, b}上的回文语言pal可以用下面的递归方法描述:1.Λ, a, b∈pal2.对每个S∈pal,aSa和bSb也属于pal3.pal中不包含其他字符串如果将上面的符号S看成一个变量,代表了所有我们希望计算(比如某种递归算法)的pal 的元素,那么上面的规则1和规则2可以非正式地重新表述如下:1.S的值可以是Λ, a, b2.每个S可以写成aSa或bSb的形式如果我们用→表示“可以取值为”,则可以写出下面的式子:S→aSa→abSba→abΛba=abba上面的产生过程可以总结成下面的两组产生式(或称规则):S→a | b | ΛS→aSa | bSb符号“|”表示“或”的含义。
第三部分上下文无关语言和下推自动机前面介绍的有限自动机是计算的初级模型,它所接受的正规语言不太关心字符串自身的结构。
上下文无关文法(CFL)是一种简单的描述语法规则的递归方法,语言中的字符串由这些规则产生。
所有的正规语言都能用上下文无关文法描述,它也可以描述非正规语言。
上下文无关文法描述的语法规则更复杂多变,可以在相当大的程度上,描述高级程序设计语言的语法和其他一些形式语言。
类似正则语言对应的抽象机模型是有限自动机,CFL也有对应的抽象机模型。
CFL对应的计算模型是在有限自动机的基础上增加存储空间得到,并被设想成无限空间(对应有限自动机的有限空间),采用了一种简单的管理模式,栈(stack),这种新的计算模型(或抽象机)称为下推自动机(pushdown automata),下推是栈最典型的操作。
有必要在下推自动机中保留非确定性,确定型下推自动机不能接受所有的CFL,但给定一个CFG,容易构造一个相应的非确定型下推自动机,它在识别字符串过程中的移动模拟了文法的推导过程,这个过程称为分析(parse)。
分析不是一定需要下推自动机来完成。
CFL仍然不够通用,不能包括所有有意义的、或有用的形式语言。
采用类似第五章的技术,我们将给出一些不是CFL的简单例子,这些技术也用于解决与CFL相关的判定问题。
6上下文无关文法6.1上下文无关文法的定义为了描述我们在第二部分考察的各种语言,包括一些非正则语言,我们引入一种语言的递归定义方法,称为文法。
文法与我们熟悉的语言的语法描述相近,是描述语言和分析语言的有力工具。
问题:文法的形式化定义似乎可以模仿有限自动机,比如5元组或6元组之类。
例子6.1 正如我们在例子2.16中所见,字母表{a, b}上的回文语言pal可以用下面的递归方法描述:1.Λ, a, b∈pal2.对每个S∈pal,aSa和bSb也属于pal3.pal中不包含其他字符串如果将上面的符号S看成一个变量,代表了所有我们希望计算(比如某种递归算法)的pal的元素,那么上面的规则1和规则2可以非正式地重新表述如下:1.S的值可以是Λ, a, b2.每个S可以写成aSa或bSb的形式如果我们用→表示“可以取值为”,则可以写出下面的式子:S→aSa→abSba→abΛba=abba上面的产生过程可以总结成下面的两组产生式(或称规则):S→a | b | ΛS→aSa | bSb符号“|”表示“或”的含义。
上下文无关文法的概念上下文无关文法的概念一、引言上下文无关文法(Context-Free Grammar,CFG)是形式语言理论中的一种重要的语法描述工具,它是由 Noam Chomsky 在 1956 年提出的。
CFG 是一种用于产生形式语言的形式化体系,它可以描述自然语言、编程语言等各种形式语言。
二、基本概念1. 文法(Grammar)文法是一个四元组 G = (V, T, P, S)。
其中 V 是非终结符集合,T 是终结符集合,P 是产生式规则集合,S 是起始符号。
非终结符表示语法规则中可以被替换的部分,终结符表示不能被替换的部分。
2. 产生式规则(Production Rule)产生式规则也称为产生式或规则,它是一个形如A → α 的表达式。
其中A 是一个非终结符号,α 是由非终结符号和终结符号组成的字符串。
3. 推导(Derivation)推导也称为生成或演算,它是指根据 CFG 的产生式规则从起始符号开始逐步推导出一个字符串的过程。
4. 句子(Sentence)句子也称为字符串或序列,它是由 CFG 的终结符号构成的序列。
三、上下文无关文法的特征CFG 的产生式规则中,只有一个非终结符号可以被替换成一个字符串,而且这个非终结符号出现在产生式规则左侧。
四、上下文无关文法的形式定义一个 CFG G = (V, T, P, S) 是上下文无关的,当且仅当它的产生式规则集合 P 中的每个规则都是形如A → α 的形式,其中A ∈ V,α ∈ (V ∪ T)*。
五、上下文无关文法的应用CFG 可以描述自然语言、编程语言等各种形式语言。
在编译器设计和自然语言处理中,CFG 是一种常用的工具。
六、总结上下文无关文法是一种用于产生形式语言的形式化体系。
它可以描述自然语言、编程语言等各种形式语言。
CFG 的特征是产生式规则中只有一个非终结符号可以被替换成一个字符串,并且这个非终结符号出现在产生式规则左侧。
上下⽂⽆关⽂法与语⾔第 5 章上下⽂⽆关⽂法及语⾔现在我们把注意⼒从正则语⾔转移到另外⼀⼤类语⾔上来,它们叫做“上下⽂⽆关语⾔”。
这个语⾔类有着⾃然、递归的表⽰⽅法,这种表⽰⽅法叫做“上下⽂⽆关⽂法”。
从1960年以来,上下⽂⽆关⽂法⼀直在编译技术中扮演着重要的⾓⾊。
它们能够把分析器(⼀类⽤来在编译过程中发掘源程序结构的程序)的实现从⼀种费时的、不通⽤⽅式的设计⼯作转变成为⼀种能够很快完成的⼯作。
近年来,上下⽂⽆关⽂法也被⽤来描述⽂档格式:XML(eXtensible Markup Language 可扩展标记语⾔)中使⽤的DTD(Document-Type Definition ⽂档类型定义)就是⽤来描述Web上的信息交换格式的。
在本章中,我们将⾸先介绍上下⽂⽆关⽂法的表⽰⽅法,然后将介绍怎样⽤⽂法来定义语⾔。
我们将会讨论到“语法分析树”──对⼀个⽂法处在它所表⽰的语⾔的字符串中结构的图形描述。
语法分析树是对⼀个编程语⾔的语法分析器的产物,也是通常⽤来获得程序结构的途径。
上下⽂⽆关语⾔还有另外⼀种等价的⾃动机表⽰叫做“下推⾃动机”。
我们将在第6章介绍下推⾃动机。
虽然它不如有穷⾃动机重要,但仍然要介绍它,原因是作为⼀种语⾔的定义机制来说,它跟上下⽂⽆关⽂法具有等价性,后⾯在第7章研究如何判定上下⽂⽆关语⾔以及研究上下⽂⽆关语⾔的封闭性时,这种等价性是⾮常有⽤的。
5.1 上下⽂⽆关⽂法这⼀章的内容将从⾮形式化地介绍上下⽂⽆关⽂法的表⽰法开始。
形式化的定义会在读者了解到这些⽂法的⼀些重要的能⼒之后给出。
届时我们将会说明怎样形式地定义⼀个⽂法,并将介绍⼀种叫作“推导”的过程:它能够决定在⼀个⽂法的语⾔中到底有哪些串。
5.1.1⼀个⾮形式化的例⼦下⾯来考虑⼀个“回⽂(palindrome)”的语⾔。
“回⽂”是指正向和反向读起来都⼀样的串,⽐如otto或者madamimadam(“Madam, I’m Adam,”引⾃Eve在Eden的花园⾥听到的第⼀句话)。
⾃⼰动⼿开发编译器(六)上下⽂⽆关语⾔和⽂法上回我们已经学习了语法分析第⼀阶段——词法分析的原理和⼯具,介绍了正则表达式、正则语⾔和DFA等⼯具。
今次我们要开始涉及编译器前端最重要的阶段——语法分析。
简单⽽⾔,这⼀步就要完整地分析整个编程语⾔的语法结构。
上回说到词法分析的结果是将输⼊的字符串分解成⼀个个的单词流,也就是诸如关键字、标识符这样有特定意义的单词。
⼀种完整的编程语⾔,必须在此基础上定义出各种声明、语句和表达式的语法规则。
观察我们所熟悉的编程语⾔,其语法⼤都有某种递归的性质。
例如四则运算与括号的表达式,其每个运算符的两边,都可以是任意的表达式。
⽐如1+a是表达式,(1+a)*(2 – c)也是表达式,((a+b) + c) * (d – e)也是表达式。
再⽐如if语句,其if的块和else的块中还可以再嵌套if语句。
我们在词法分析中引⼊的正则表达式和正则语⾔⽆法描述这种结构,如果⽤DFA来解释,DFA只有有限个状态,它没有办法追溯这种⽆限递归。
所以,编程语⾔的表达式,并不是正则语⾔。
我们要引⼊⼀种表现能⼒更强的语⾔——上下⽂⽆关语⾔。
要介绍上下⽂⽆关语⾔,我们先来了解⼀下定义上下⽂⽆关⽂法的⼯具——产⽣式的写法。
我们还是使⽤编程语⾔的表达式作为例⼦,但这次我们假设表达式只有三种——单个表⽰变量名标识符、括号括起来的表达式和两个表达式相加。
⽐如a是⼀个变量表达式,a+b是两个变量表达式相加的表达式,(a+b)是⼀个括号表达式。
我们⽤符号E来表⽰⼀个表达式,那么这三种表达式分别可以定义为:E → idE → E + EE →( E )这种形式的定义就叫做产⽣式。
出现在→左侧符号E称作⾮终结符(nonterminal symbol),代表可以继续产⽣新符号的“⽂法变量”。
符号→表⽰⾮终结符可以“产⽣”的东西。
⽽上述产⽣式中的蓝⾊id、+、(等符号,是具有固定意义的单词,它们不再会产⽣新的东西,称作终结符(terminal symbol)。
8 上下文无关语言和非上下文无关语言8.1 上下文无关语言的泵引理从第6章到第7章,我们给出了两种描述CFL的模型,CFG和PDA。
这两种模型都没有提供直接、明确的方法来判断一个形式语言不是CFL。
然而,正如例子6.7对自然语言的一个简单考察,我们发现CFG存在描述能力的局限。
本节中,我们精确定义和讨论CFL的一个性质,它类似于正则语言的泵引理。
利用这个性质能够发现许多不是CFL的语言。
正则语言的泵引理基于这样的事实,如果一个足够长的输入字符串x导致FA在状态转移中,到达某个状态超过一次,即接受路径上存在回路,根据回路容易将x分成三部分,u是回路之前的字符串,v是回路的字符串,w是回路后的字符串,那么在回路上的多次重复,得到的新的字符串也应该被FA接受,即对任意的m>=0,uv m w被FA接受。
如果我们用CFG生成(而不是PDA移动)CFL,容易得到类似的观察。
设CFG G的一个推导出现同一个非终结符的嵌套重复,如下面的形式,S⇒*vAz⇒*vwAyz⇒*vwxyz其中,v, w, x, y, z∈∑*。
推导过程中,出现了A⇒*wAy,我们可以多次重复这个推导过程,如S⇒*vAz⇒*vwAyz⇒*vw2Ay2z⇒*vw3Ay3z⇒*...⇒*vw m Ay m z又由于A⇒*x,因此所有这类字符串vxz, vwxyz, vw2xy2z, ..., vw m xy m z都输入语言L(G)。
为了将上面的观察总结成CFL的泵引理,我们必须说明对于足够长的字符串的推导过程中都会出现非终结符的嵌套重复。
同时我们也尽量发现分解得到的5个子串:v, w, x, y, z,的一些性质。
这类似于我们处理正则语言的泵引理。
在6.6节,我们证明了所有的CFG产生式都可以改写成Chomsky范式,而不会影响CFG 接受语言的能力(唯一的影响是不能接受空字符,由于此处仅仅关心足够长的字符串,因此这个影响可以忽略)。