上下文无关语言和非上下文无关语言
- 格式:doc
- 大小:130.00 KB
- 文档页数:10
形式语言与自动机课程设计一、课程简介《形式语言与自动机》是计算机科学中的一门基础课程,是考研计算机科学与技术专业的必修课程之一。
本课程主要介绍正则语言、上下文无关语言、上下文有关语言和递归可枚举语言等形式语言及其计算能力,以及与这些形式语言相关的自动机、文法和图灵机等自动机理论。
二、课程目标本课程旨在培养学生对形式语言及其计算能力的理解和掌握,让学生了解自动机理论的概念和应用,以及自动机理论在计算机科学中的重要性。
三、课程内容1. 正则语言与有限状态自动机本部分主要介绍正则表达式及其计算能力、确定型有限状态自动机(DFA)和非确定型有限状态自动机(NFA)等知识点。
2. 上下文无关语言和上下文有关语言本部分主要讲解上下文无关文法及其等价的推导关系、上下文有关文法,以及上下文无关语言和上下文有关语言之间的关系。
3. 图灵机和可计算性理论本部分将介绍图灵机,包括图灵机的定义、图灵机模型和图灵机的计算能力,以及图灵机与其他自动机之间的关系。
最后,将讲解可计算性理论,包括停机问题、递归可枚举语言等相关知识点。
四、课程设计本课程设计旨在让学生进一步掌握所学的形式语言与自动机的知识,以及将所学的知识应用于实际问题的能力。
具体设计如下:1. 双向转换器设计给定一个正则表达式和一个上下文无关文法,设计一个双向转换器,使得正则表达式可以转换成等价的上下文无关文法,同时上下文无关文法可以转换成等价的正则表达式。
2. 自动机实现设计一个自动机用于识别一个简单的编程语言,包括关键字、符号和变量等基本元素,并实现该自动机。
3. 可计算性问题给定一个关于图灵机的问题,让学生分析其可计算性,即该问题是否可以通过图灵机计算,分析理由并给出证明。
五、结语通过本课程的学习和设计,学生不仅可以对形式语言与自动机的理论有更深层次的理解,同时也可以实践将所学知识应用于实际问题的能力。
我们希望本课程可以让学生更好地掌握形式语言与自动机的理论,为他们未来在计算机科学领域的研究和实践打下坚实的基础。
第 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的花园里听到的第一句话)。
形式语言理论中的上下文无关文法引言形式语言理论是计算机科学领域中的一个重要分支,用于研究各种形式语言的结构和性质。
其中,上下文无关文法是形式语言理论中的重要概念,用于描述自然语言、编程语言等形式语言的语法结构。
本文将介绍上下文无关文法的概念、特性和应用,以及与其相关的知识点。
通过本文的阅读,读者将能够全面了解上下文无关文法在形式语言理论中的重要性和应用价值。
一、上下文无关文法的定义上下文无关文法是形式语言理论中描述形式语言结构的一种形式化工具。
它由四个部分组成,包括一个非终结符集合、一个终结符集合、一个产生式规则集合和一个开始符号。
1.1 非终结符集合非终结符是上下文无关文法中的符号,代表语言中的各种语法成分。
一个上下文无关文法通常包含多个非终结符,用于描述语法结构的不同部分。
非终结符通常用大写字母表示,例如S、A、B等。
1.2 终结符集合终结符是上下文无关文法中的符号,代表语言中的实际词汇。
终结符是不可再分解的基本单位,可以是字母、数字、标点符号等。
终结符通常用小写字母或符号表示,例如a、b、c等。
1.3 产生式规则集合产生式规则是上下文无关文法中的规则,用于描述语法结构中的转换和推导关系。
每个产生式规则由一个非终结符和一个符号串组成,表示将一个非终结符替换为一个符号串的过程。
例如,A → α表示将非终结符A替换为符号串α。
1.4 开始符号开始符号是上下文无关文法中的非终结符,用于描述整个语法结构的起始点。
通过推导和替换产生式规则,可以从开始符号构建出整个语言的句子。
二、上下文无关文法的特性上下文无关文法具有以下几个重要特性,决定了它在形式语言理论中的重要地位。
2.1 生成能力上下文无关文法能够描述形式语言中的语法结构。
通过推导和替换产生式规则,可以使用上下文无关文法生成出该语言中的句子。
因此,上下文无关文法具有强大的生成能力,可以表示多种复杂语言的结构。
2.2 上下文无关性上下文无关文法的产生式规则只依赖于被替换的非终结符本身,而不依赖于该非终结符在语法结构中的上下文环境。
《计算理论》复习题总结1、自动机、可计算性、复杂性内涵及关系;计算理论的三个传统的核心领域:自动机、可计算性和复杂性。
通过“计算机的基本能力和局限性是什么?“这一问题将这三个领域联系在一起。
可计算理论与复杂性理论是密切相关的,在复杂性理论中,目标是把问题分成容易计算的和难计算的;而在可计算理论中,是把问题分成可解的和不可解。
自动机阐述了计算的数学模型的定义和性质,主要包含两种模型:有穷自动机模型;上下文无关文法模型。
可计算性理论和复杂性理论需要对计算机给了一个准确的定义。
自动机理论允许在介绍与计算机科学的其他非理论领域有关的概念时使用计算的形式化定义。
2、有穷自动机、正则语言、正则表达式、非确定有穷自动机、非正则语言;有穷自动机:描述能力和资源极其有限的计算机模型。
是一个5元组(Q,∑,δ,q0,F),其中1)Q是一个有穷集合,称为状态集。
2)∑是一个有穷集合,称为字母表。
3)δ:Q×∑→Q是转移函数。
4)q0∈Q是起始状态。
5)F⊆Q是接受状态集。
正则语言:如果一个语言能被有穷自动机识别。
正则表达式:用正则运算符构造描述语言的表达式。
称R是正则表达式,如果R是:1)a,a是字母表中的一个元素;2)ε;3)∅;4)(R1⋃R2);5)(R1 R2);6)(R1*)非确定有穷自动机:是一个5元组(Q,∑,δ,q0,F),其中1)Q是有穷状态集。
2)∑是有穷字母表。
3)δ:Q×∑ε→P(Q)是转移函数。
4)q0∈Q是起始状态。
5)F⊆Q是接受状态集。
3、上下文无关语言及上下文无关文法、歧义性、乔姆斯基范式、下推自动机、等价性、非上下文无关语言;上下文无关语言:用上下文无关文法生成的语言。
上下文无关文法:是一个4元组(V,∑,R,S)且1)V是一个有穷集合,称为变元集2)∑是一个与V不相交的有穷集合,称为终结符集3)R是一个有穷规则集,每条规则由一个变元和一个由变元及终结符组成的字符串构成,4)S∈V是起始变元歧义性:如果字符串W在上下文无关文法G中有两个或者两上以上不同的最左派生,则称G歧义地产生的字符串W。
形式语言与自动机理解形式语言是一种特殊的语言,它是由一组符号和规则组成的,用来描述各种抽象结构和过程。
形式语言在计算机科学、数学和逻辑学等领域有着广泛的应用。
自动机是一种抽象的数学模型,用来描述计算过程或运算过程。
自动机理论是计算机科学中的一个重要分支,它研究自动机的性质、行为和应用。
形式语言可以分为四种类型:无限制文法、上下文相关文法、上下文无关文法和正规文法。
这些文法分别对应着Chomsky文法的四种类型,用来描述不同类型的语言结构。
在自动机理论中,也有对应的四种自动机模型:图灵机、线性有限自动机、下推自动机和有限状态自动机。
这些自动机模型分别对应着Chomsky层次结构中的四种语言类型。
有限状态自动机是最简单的自动机模型,它由一个有限个状态和一组状态转移函数组成。
有限状态自动机可以接受或拒绝一个输入字符串,从而判断该字符串是否符合某种模式。
有限状态自动机广泛应用于词法分析、编译器设计、模式匹配等领域。
正规文法对应着正规语言,正规语言可以被有限状态自动机接受。
正规语言是最简单的语言类型,它包括正则表达式描述的字符串集合。
正规文法和有限状态自动机之间存在着一一对应的关系,它们可以互相转换,从而描述同一个语言。
上下文无关文法对应着上下文无关语言,上下文无关语言可以被下推自动机接受。
下推自动机是一种更加复杂的自动机模型,它具有一个栈用来存储中间结果。
下推自动机广泛应用于编译原理、自然语言处理、生物信息学等领域。
上下文相关文法对应着上下文相关语言,上下文相关语言可以被线性有限自动机接受。
线性有限自动机是一种更加复杂的自动机模型,它具有一个线性有限控制器和一个栈用来存储中间结果。
线性有限自动机广泛应用于形式语言理论、计算理论、自动机理论等领域。
形式语言与自动机理论是计算机科学中非常重要的基础理论,它们为计算机科学的发展提供了理论基础和方法工具。
形式语言和自动机理论不仅在计算机科学中有着广泛的应用,也在数学、逻辑学、语言学等领域具有重要意义。
⽂法的分类【编译原理】编译原理4种⽂法类型1956年,Chomsky建⽴形式语⾔的描述。
通过对产⽣式的施加不同的限制,Chomsky把⽂法分为4种类型 ⾸先定义⼀个产⽣式 α→β0型⽂法定义:0型⽂法(PSG):α∈(V N∪V T)* ,且⾄少含⼀个V Nβ∈(V N∪V T)*对产⽣式没有任何限制例如:A0→A0 , A1→B0型⽂法说明:0型⽂法也称为短语⽂法。
⼀个⾮常重要的理论结果是,0型⽂法的能⼒相当于图灵机(Turing)。
或者说,任何0型语⾔都是递归可枚举的;反之,递归可枚举集必定是⼀个0型语⾔。
对0型⽂法产⽣式的形式作某些限制,以给出1,2和3型⽂法的定义。
(注意)⽂法G 定义为四元组(V N ,V T ,P,S)¨V N:⾮终结符集¨V T:终结符集¨P :产⽣式集合(规则集合)¨S :开始符号(识别符号)1型⽂法(上下⽂有关⽂法context-sensitive): 对任⼀产⽣式α→β,都有|β|>=|α|,仅仅 S→ε除外 产⽣式的形式描述:α1Aα2→α1βα2 (其中,α1、α2、β∈(V N∪V T)*,β≠ε,A∈VN) 即:A只有出现在α1α2的上下⽂中,才允许⽤β替换。
产⽣的语⾔称“上下⽂有关语⾔”但S不能出现在产⽣式的右部。
例如:0A0→011000 1A1→1010112型⽂法(CFG):对任⼀产⽣式α→β,都有α∈V N,β∈(V N∪V T)* 产⽣式的形式描述:A→β(A∈V N) 即β取代A时,与A所处的上下⽂⽆关。
产⽣的语⾔称“上下⽂⽆关语⾔” 例如:G[S]:S→01 S→0S13型⽂法(RG):也称正规⽂法 每个产⽣式均为 “A→aB”或“A→a” —— 右线性 “A→Ba”或“A→a” —— 左线性 其中,A、B∈V N,a∈V T* 产⽣的语⾔称“正规语⾔” 例如:G[S]: S→0A | 0 A→1B | B B→1 | 04个⽂法类的定义是逐渐增加限制的,因此每⼀种正规⽂法都是上下⽂⽆关的,每⼀种上下⽂⽆关⽂法都是上下⽂有关的,⽽每⼀种上下⽂有关⽂法都是0型⽂法。
文法的分类自从乔姆斯基(Chomsky)于1956年建立形式语言的描述以来,形式语言的理论发展很快。
这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
乔姆斯基把文法分成四种类型,即0型、1型、2型和3型。
这几类文法的差别在于对产生式施加不同的限制。
多数程序设计语言的单词的语法都能用正规文法或3型文法来描述。
3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。
正规文法所描述的是VT*上的正规集。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
称0型文法产生的语言为0型语言。
上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。
类型说明文法G定义为四元组(VN,VT,P,S )其中VN:非终结符号(或语法实体,或变量)集;VT:终结符号集;P: 规则的集合;VN,VT和P是非空有穷集。
S:称作识别符号或开始符号的一个非终结符,它至少要在一条产生式中作为左部出现。
VN和VT不含公共的元素,即VN ∩ VT = φ用V表示VN ∪VT ,称为文法G的字母表或字汇表规则,也称重写规则、产生式或生成式,是形如α→β或α∷=β的(α,β)有序对,其中α是字母表V的正闭包V+中的一个符号,β是V*中的一个符号。
α称为规则的左部,β称作规则的右部。
设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈( VN∪VT )*且至少含有一个非终结符,而β∈( VN∪VT )*,则G是一个0型文法。
0型文法也称短语文法。
一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。
上下文无关文法的概念1. 引言上下文无关文法(Context-Free Grammar,CFG)是形式语言理论中的一种重要概念。
它提供了一种形式化的方法来描述一类形式语言。
CFG在计算机科学、自然语言处理、编译原理等领域有着广泛的应用。
本文将从概念、结构、性质和应用等方面全面介绍上下文无关文法。
2. 上下文无关文法的定义上下文无关文法由四个部分组成:终结符集合、非终结符集合、产生式规则集合和起始符号。
形式上,CFG可以表示为一个四元组G=(V, T, P, S),其中: - V是非终结符集合。
- T是终结符集合。
- P是产生式规则集合,每个产生式规则形如A → α,其中A是非终结符,α是终结符和非终结符的序列。
- S是起始符号,它是一个特殊的非终结符。
3. 上下文无关文法的结构上下文无关文法的产生式规则描述了非终结符之间的替换关系。
例如,A → α表示在推导过程中可以用非终结符A替换成序列α。
产生式规则可以形象地表示为树状结构,其中非终结符是内部节点,终结符是叶子节点。
通过不断地应用产生式规则,可以从起始符号推导出一个语言的句子。
4. 上下文无关文法的性质上下文无关文法的性质对于理解其特点和应用非常重要。
4.1 文法的一致性对于一个给定的上下文无关文法,如果存在至少一种推导方式,可以从起始符号推导出一个句子,那么它是一致的。
4.2 文法的二义性一个上下文无关文法如果存在至少一种句子可以有两个或以上不同的解析树,那么它是二义的。
二义性文法在语言理解和编译的过程中会导致歧义,因此设计文法时需要尽可能避免二义性。
4.3 文法的生成能力上下文无关文法可以生成一类形式语言,包括正则语言和上下文有关语言。
正则语言是最简单的一类形式语言,而上下文有关语言的生成需要更复杂的规则。
4.4 文法的规范形式上下文无关文法可以通过一系列转换规则转化为规范的形式,如Chomsky范式。
规范形式的文法能够更方便地进行分析和转换。
上下文无关文法(Context-Free Grammar,CFG)是一种形式文法,其产生式的结构对于上下文无关,即产生式的应用不受其在句子中的位置和周围词汇的影响。
它是理论计算机科学和自然语言处理中的重要概念,被广泛应用于语言分析、编译器设计、自然语言理解等领域。
本文将探讨上下文无关文法的产生式结构以及其在不同领域中的应用。
一、上下文无关文法的定义1. 产生式结构在上下文无关文法中,产生式的结构遵循一定的形式,通常表示为A -> β,其中A为非终结符,β为由终结符和非终结符组成的串。
该产生式表示了A可以被替换为β,其中A的替换不受上下文影响。
这种清晰简洁的产生式结构使得上下文无关文法易于理解和应用。
2. 语言描述上下文无关文法可以用来描述上下文无关语言,也就是能够由上下文无关文法生成的语言。
这些语言的句子结构不受上下文影响,只与语言的语法规则相关。
上下文无关文法在语言分析和形式语言理论中具有重要地位。
二、上下文无关文法的应用1. 编译器设计在编译器设计中,语法分析是编译器的重要组成部分,而上下文无关文法常常被用来描述编程语言的语法结构。
通过使用上下文无关文法,可以定义语言的语法规则,并用于解析和分析源代码,为后续的语义分析和代码生成提供基础。
2. 自然语言处理在自然语言处理领域,上下文无关文法也被广泛地应用于句法分析和语言模型的构建。
通过定义自然语言的语法规则,可以利用上下文无关文法进行句子结构的分析和推导,从而实现对自然语言的理解和处理。
3. 语言理论研究在语言理论研究中,上下文无关文法是描述和分析形式语言的重要工具。
通过研究上下文无关文法的性质和应用,可以深入理解形式语言的结构和特性,为语言理论的发展和应用提供理论支持。
三、总结上下文无关文法的产生式结构对于理解和应用上下文无关文法具有重要意义。
其形式简洁明了,具有广泛的应用价值。
在编译器设计、自然语言处理和语言理论研究等领域,上下文无关文法都扮演着重要角色。
四种文法的类型(编译原理)在编译原理中,文法是描述一种语言的形式规则的形式化规范。
根据规则的定义方式和特点,可以将文法分为四类类型,分别是正规文法、上下文无关文法、上下文有关文法和无限制文法。
下面将对这四种文法类型进行详细介绍。
1. 正规文法(Regular Grammar):正规文法是一种最简单的文法类型,也是最严格的限制。
它的产生式右部只能是终结符或一个终结符紧跟一个非终结符,不允许使用任何其它的形式。
正规文法通常用于描述正则语言,而正则语言可以用有限自动机(如DFA、NFA)来识别和生成。
正规文法常用于词法分析中的正则表达式的产生。
2. 上下文无关文法(Context-Free Grammar):上下文无关文法是一种描述语言结构的文法,它具有比正规文法更高的表达能力。
这种文法的产生式右部可以是终结符或非终结符的任意组合顺序。
上下文无关文法通常用于描述上下文无关语言,而上下文无关语言可以用上下文无关文法来生成和识别。
上下文无关文法是编译器设计和分析的主要方法之一,包括语法分析和语法制导翻译等。
3. 上下文有关文法(Context-Sensitive Grammar):上下文有关文法是一种更加灵活的文法,它的产生式右部除了可以是终结符和非终结符的任意组合外,还可以根据上下文条件改变生成式。
产生式的左部和右部可以有相同数量的非终结符,但右部至少有一个符号。
上下文有关文法常用于描述上下文有关语言,也被用于描述自然语言处理等。
4. 无限制文法(Unrestricted Grammar):无限制文法是一种最灵活的文法类型。
它的产生式左部和右部可以是任意长度的终结符和非终结符的组合,没有任何限制和约束条件。
无限制文法通常用于描述递归可枚举语言,递归可枚举语言是图灵机可以识别的语言。
无限制文法被广泛应用于编译器的各个阶段,包括语法制导翻译和语义分析等。
综上所述,正规文法、上下文无关文法、上下文有关文法和无限制文法是编译原理中常用的四种文法类型。
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 接受语言的能力(唯一的影响是不能接受空字符,由于此处仅仅关心足够长的字符串,因此这个影响可以忽略)。
自动机和形式语言的分类
自动机和形式语言是计算机科学中的重要概念,它们被广泛应用于理论计算机科学、编译器设计、自然语言处理等领域。
根据其属性和特征,自动机和形式语言可以被划分为不同的类型和分类。
自动机可以分为有限状态自动机和下推自动机两种类型。
有限状态自动机包括确定性有限状态自动机和非确定性有限状态自动机,它们用于识别有限长的字符串语言。
下推自动机包括确定性下推自动机和非确定性下推自动机,它们用于识别上下文无关文法生成的无限长字符串。
形式语言可以分为正则语言、上下文无关语言、上下文相关语言和递归可枚举语言四种类型。
正则语言是由正则表达式描述的语言,它们可以被有限状态自动机识别。
上下文无关语言是由上下文无关文法描述的语言,它们可以被下推自动机识别。
上下文相关语言是由上下文相关文法描述的语言,它们可以被线性有界非确定性图灵机识别。
递归可枚举语言是由递归函数描述的语言,它们可以被图灵机识别。
在计算机科学中,自动机和形式语言是非常重要的概念和工具,其分类和类型的理解对于相关领域的研究和应用具有重要意义。
- 1 -。
对应chomsky四种文法的四种语言之间的关系NoamChomsky是20世纪最重要的语言学家之一。
他提出了一套语言理论,其中包括了四种文法类型。
这些文法在语言学研究中起着重要作用,因为它们提供了一种方式来描述不同类型的语言结构。
在本文中,我们将探讨这四种文法类型以及它们之间的关系。
1. 正则文法正则文法也称为类型3文法,是最简单的文法类型。
它由一组规则组成,这些规则定义了一种语言的基本结构。
正则文法可以描述一些简单的语言结构,例如正则表达式和有限自动机。
正则文法的语言特征是具有线性结构,其中每个符号只能出现一次。
这种文法的规则只能是一些形如A -> aB或者A -> a的形式。
其中A和B是非终结符,a是终结符。
正则文法只能描述一些简单的语言,例如a^n b^n,其中n是任意正整数。
这种语言可以使用有限自动机来识别。
2. 上下文无关文法上下文无关文法也称为类型2文法,它比正则文法更强大。
这种文法的规则可以定义为A -> α,其中A是一个非终结符,α是一个符号串。
这意味着一个非终结符可以被替换为任何符号串,而不管它周围的上下文是什么。
上下文无关文法可以描述一些复杂的语言结构,例如二元表达式和HTML文档。
上下文无关文法的语言特征是具有树形结构,其中每个符号可以出现多次。
这种文法的规则只能是一些形如A -> α的形式。
其中A是非终结符,α是一个符号串。
上下文无关文法可以描述一些复杂的语言,例如a^n b^n c^n,其中n是任意正整数。
这种语言可以使用语法分析器来识别。
3. 上下文相关文法上下文相关文法也称为类型1文法,它比上下文无关文法更强大。
这种文法的规则可以定义为αAβ -> αγβ,其中A是一个非终结符,α和β是符号串,γ是一个符号串,它可以替换A。
上下文相关文法可以描述一些非常复杂的语言结构,例如自然语言。
上下文相关文法的语言特征是具有树形结构,其中每个符号可以出现多次。
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 接受语言的能力(唯一的影响是不能接受空字符,由于此处仅仅关心足够长的字符串,因此这个影响可以忽略)。
因此我们的讨论可以局限在Chomsky范式(CNF)表示的CFG,显然这类文法得到的推导树都是二叉树,即每个父节点至多有两个子节点。
我们先定义几个与二叉树相关的概念。
路径是一串节点组成的序列,前后节点之间有父子关系;路径的长度是路径包含的节点的个数;二叉树的高度是最长路径的长度。
由于非终结符数目有限,如果推导树足够高,那么存在一个路径,某个非终结符在该路径上出现了两次,即出现了前面提到的嵌套重复现象。
引理8.1 任给h>=1,如果二叉树的叶结点个数>2h-1,那么该二叉树的高度>h。
证明:这是一个数学问题。
我们用数学归纳法证明它的逆反命题:如果二叉树的高度<=h,那么二叉树的叶节点个数<=2h-1。
1.归纳基础,h=1,此时二叉树只有一个根节点,它也是唯一的叶结点,命题成立。
2.归纳推理,设k>=1时,命题成立。
要证明k+1时,命题也成立。
设二叉树T的高度为k+1,则它的根节点的两个子树(以子节点为跟的二叉树)的叶节点数都<=2k-1,因此T的叶节点数<=2k-1+2k-1=2k。
得证。
定理8.1 G=(V, ∑, S, P)是形式为CNF的CFG,共有p个非终结符,则对每个长度>=2p+1的属于L(G)的字符串,都能找到5个字符串v, w, x, y, z满足下面的条件:u=vwxyz|wy|>0|wxy|<=2p+1vw m xy m z∈L(G), ∀m>=0证明:根据引理8.1,任何一个生成u的推导树高度>=p+2,即至少存在一个长度>=p+2的路径,不妨设d是其中的一个,显然d的最底部是一个终结符,其上的符号都是非终结符,共有p+1个,而不同的非终结符只有p个,根据鸽笼法则,至少存在一个非终结符A在路径d上出现了至少两次,分别将其中最接近根和最接近叶的标记为A1和A2,设A2生成的字符串是x,A1生成的字符串是wxy。
在wxy之前的字符串记为v,在wxy之后的字符串记为z。
图8-1直观地给出了这5个字符串在推导树上的位置。
由于A1为根的推导树高度<=p+2,因此|wxy|<=2p+1。
由于A1为根的推导树是二叉树,因此出了存在从A1到A2的路径,还存在其他路径,则|wy|>0。
最后,存在如下的嵌套重复,S⇒*vAz⇒*vwAyz⇒*vwxyz因此满足第4个条件。
类似有限自动机的泵引理,我们也给出一系列CFG的泵引理。
定理8.1a (CFL的泵引理)语言L是CFL,则存在一个整数n,使得对每个u∈L,|u|>=n,都存在5个字符串v, w, x, y, z,满足下面的条件,u=vwxyz (8.1)|wy|>0 (8.2)|wxy|<=n (8.3)vw m xy m z∈L(G), ∀m>=0 (8.4)证明:L是CFL,则存在一个CNF形式的CFG生成L-{Λ},它的非终结符个数是p,则令n=2p+1,根据定理8.1直接得到定理8.1a的结论。
类似FA的泵引理(见第5章),本节的泵引理也常常用来证明某个语言不是CFL。
通常采用反证法,即要证明对任给的整数n,都存在一个u∈L,|u|>n,找不到满足上面4个条件的5个字符串。
还有另外的方法说明一个语言不是CFL。
根据第7章,由一个FA加一个辅助存储空间(栈)组成的PDA能够接受一个CFL,如果我们能够说明接受一个语言的抽象机至少需要两个栈,那么就能说明这个语言不是CFL。
比如我们知道接受语言a i b i的抽象机只需要一个栈,即用一个栈记住前面的a的个数,然后与后面的b比较。
那么容易想到,仅仅一个栈不能接受语言a i b i c i。
下面我们用泵引理来证明我们的直观判断。
例子8.1 语言L={a i b i c i | i>=1},证明L不是CFL。
分析:反证法。
假设L是CFL,则存在定理8.1a定义的n,选择u=a n b n c n,显然|u|>n,设存在5个字符串v, w, x, y, z满足式子(8.1)-(8.4)。
由于|wxy|<=n,因此w, x和y至多包含两种字符,又因为|wy|>0,因此无法满足式子vw m xy m z∈L(G), ∀m>=0,得到矛盾,得证。
显然这个方法实际上证明了更大的语言L1={u∈{a, b, c}* | n a(u)=n b(u)=n c(u)}是非CFL(选取同样的u)。
例子8.2 语言L={ss | s∈{a, b}*}是非CFL。
分析:前面我们讨论了语言{ss r | s∈{a, b}*}是CFL。
例子8.1揭示了一个栈不够用的情况,这个例子则显示了数据结构栈不合适的情况。
显然,如果PDA用到的辅助空间不是栈,而是队列,那么就能够类似接受回文语言那样接受L。
反证法,设L是CFL,则存在n,选择u(n)=a n b n a n b n,设存在v, w, x, y, z满足式子(8.1)-(8.4),我们来发现其中的矛盾。
类似例子8.1,由于|wxy|<=n,则wxy至多包含上面4组字符串的两组,我们分情况讨论。
1. wxy包含第1组和第2组,则vw0xy0z=a i b j a n b n, i<n, j<n,显然vw0xy0z∉L,矛盾;2. wxy包含第2组和第3组,则vw0xy0z=a n b i a j b n, i<n, j<n,显然vw0xy0z∉L,矛盾;3. wxy包含第3组合第4组,则vw0xy0z=a n b n a i b j, i<n, j<n,显然vw0xy0z∉L,矛盾;其他情况可类似证明。
类似例子8.1,例子8.2可用于证明其他一些语言不是CFL ,比如{a i b i a i b i | i>=0}, {a i b j a i b j | i,j>=0}, {scs | s ∈{a, b}*, c 是特殊字符}等。
上面证明中如何选择u 成为关键,尽管正确的选择可能不止一个,但大多数选择不能导出矛盾。
一旦u 选好后,则往往需要分情况讨论。
比如例子8.2,可以分下面7种情况讨论,1. wy 只包含第一组的a2. wy 包含第一组的a 和第二组的b3. wy 只包含第二组的b4. wy 包含第二组的b 和第三组的a5. wy 只包含第三组的a6. wy 包含第三组的a 和第四组的b7. wy 只包含第四组的b这些情况的讨论中,常常有相似之处,可以互相借用。
最后要选择m 的值来导致矛盾,通常有多种值可选择,不过用得最多的是m=0或m=2。
例子8.3 语言L={x ∈{a, b, c}* | n a (x)<n b (x) and n a (x)<n c (x)}不是CFL 。
分析:这个例子与例子8.1很像,PDA 只有一个栈,可以用来比较a 和b 的数目,也可以用来比较a 和c 的数目,但不能同时完成两个比较,因此问题源于栈数目不够。
反证法,设L 是CFL ,则存在n ,令u=a n b n+1c n+1,设存在满足式子(8.1)-(8.4)的v, w, x, y, z 。
分两种情况讨论:1. wy 中至少含有一个a ,则wy 不能含有c ,因此vw 2xy 2z ∉L ;2. wy 中不含a ,则vw 0xy 0z ∉L 。
两种情况都导致矛盾,得证。
注意,上面的方法还可用于说明语言{a i b j c k | i<j and i<k}不是CFL 。
例子8.4 在5.5节我们说明了程序设计语言C 存在不能成为正则语言的特征,在第6章,我们用CFG 描述了高级程序设计语言的部分语法,本例我们将说明整个高级程序设计语言,比如C ,不是CFL 。
分析:C 语言的一个特点是,变量在使用之前必须先声明,这个规则等同于规定字符串具有这样的形式,xcx 。
其中,x 是标识符,c 是两个标识符之间的字符串。
例子8.2已经说明了语言{xcx | x ∈{a, b}*}不是CFL ,本例扩大了x 的字母表,c 变成了字符串,但问题的实质没有改变。
反证法,设L 是CFL ,则存在n 。
选择⎭⎬⎫⎩⎨⎧=;...;...;...int ()321321321n n n a aa a aa a aa main uu 中只有一个空格在int 之后,这个句子可能带来编译器的警告,但能够通过编译器并得到可执行程序,即先声明了aa...a ,然后两次使用aa...a 。
根据泵引理,存在u=vwxyz ,|wxy|<=n ,分情况讨论xy :1. wy 包含空格,则vw 0xy 0z 不再是合法的C 程序;2. wy 不包含空格,wxy 只在第一组aa...a ,则vw 0xy 0z 将改变生命,后面引用非法,不是合格的C 程序;3. 类似讨论其他情况,vw 0xy 0z 都不再是合法C 程序。