编译原理第二章文法和语言
- 格式:doc
- 大小:149.50 KB
- 文档页数:8
第二章文法和语言本章讲述目前广泛使用的上下文无关文法。
即用上下文无关文法作为程序设计语言语法的描述工具。
阐明语法的一个工具是文法。
本章将介绍文法和语言的概念。
本章重点:上下文无关文法及其句型分析中的有关问题。
第一节文法的直观概念当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。
以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如:“我是大学生”。
是汉语的一个句子。
汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语,我们采用EBNF来表示这种句子的构成规则:〈句子〉∷=〈主语〉〈谓语〉〈主语〉∷=〈代词〉|〈名词〉〈代词〉∷=我|你|他〈名词〉∷=王明|大学生|工人|英语〈谓语〉∷=〈动词〉〈直接宾语〉〈动词〉∷=是|学习〈直接宾语〉∷=〈代词〉|〈名词〉“我是大学生”的构成符合上述规则,而“我大学生是”不符合上述规则,我们说它不是句子。
这些规则成为我们判别句子结构合法与否的依据。
一旦有了一组规则以后,我们可以按照如下方式用它们去推导或产生句子。
我们开始去找∷=左端的带有〈句子〉的规则并把它表示成∷=右端的符号串,这个动作表示成:〈句子〉⇒〈主语〉〈谓语〉,然后在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应的规则∷=右端代替之。
比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:〈主语〉〈谓语〉⇒〈代词〉〈谓语〉,重复做下去,我们得到句子:“我是大学生”的全部动作过程是:〈句子〉⇒〈主语〉〈谓语〉⇒〈代词〉〈谓语〉⇒我〈谓语〉⇒我〈动词〉〈直接宾语〉⇒我是〈直接宾语〉⇒我是〈名词〉⇒我是大学生符号⇒的含义是,使用一条规则,代替⇒左边的某个符号,产生⇒右端的符号串。
显然,按照上述办法,不仅生成“我是大学生”这样的句子,还可以生成“王明是大学生”,“王明学习英语”,“我学习英语”,“他学习英语”,“你是工人”,“你学习王明”等几十个句子。
第二章文法和语言本章讲述目前广泛使用的上下文无关文法。
即用上下文无关文法作为程序设计语言语法的描述工具。
阐明语法的一个工具是文法。
本章将介绍文法和语言的概念。
本章重点:上下文无关文法及其句型分析中的有关问题。
第一节文法的直观概念当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。
以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如:“我是大学生”。
是汉语的一个句子。
汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语,我们采用EBNF来表示这种句子的构成规则:〈句子〉∷=〈主语〉〈谓语〉〈主语〉∷=〈代词〉|〈名词〉〈代词〉∷=我|你|他〈名词〉∷=王明|大学生|工人|英语〈谓语〉∷=〈动词〉〈直接宾语〉〈动词〉∷=是|学习〈直接宾语〉∷=〈代词〉|〈名词〉“我是大学生”的构成符合上述规则,而“我大学生是”不符合上述规则,我们说它不是句子。
这些规则成为我们判别句子结构合法与否的依据。
一旦有了一组规则以后,我们可以按照如下方式用它们去推导或产生句子。
我们开始去找∷=左端的带有〈句子〉的规则并把它表示成∷=右端的符号串,这个动作表示成:〈句子〉⇒〈主语〉〈谓语〉,然后在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应的规则∷=右端代替之。
比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:〈主语〉〈谓语〉⇒〈代词〉〈谓语〉,重复做下去,我们得到句子:“我是大学生”的全部动作过程是:〈句子〉⇒〈主语〉〈谓语〉⇒〈代词〉〈谓语〉⇒我〈谓语〉⇒我〈动词〉〈直接宾语〉⇒我是〈直接宾语〉⇒我是〈名词〉⇒我是大学生符号⇒的含义是,使用一条规则,代替⇒左边的某个符号,产生⇒右端的符号串。
显然,按照上述办法,不仅生成“我是大学生”这样的句子,还可以生成“王明是大学生”,“王明学习英语”,“我学习英语”,“他学习英语”,“你是工人”,“你学习王明”等几十个句子。
事实上,使用文法作为工具,不仅为了严格地定义句子的结构,也是为了用适当条数的规则把语言的全部句子描述出来,是以有穷的集合刻划无穷的集合的工具。
第二节符号和符号串符号和符号串,在形成语言中和编译技术中是很重要的概念。
任何一种语言,都是由许多语言的基本符号组成的符号串的集合。
如:英语的基本符号有26个字母和一些标点符号,英语,就是由这些符号所组成的符号串的集合。
(一)字母表和符号串字母表是元素的非空有穷集合,字母表中的元素称为符号。
由字母表中的符号所组成的任何有穷序列称之为“符号串”。
例如:00,01,10 是字母表Σ={0,1}上的符号串,又如ab,abc,bc 是字母表Σ={a,b,c}上的符号串。
还允许有空符号串。
空符号串是不包含任何符号的符号串。
用ε表示,其长度为0,即|ε|=0。
(二)符号串的运算相等X=Y当且仅当组成X的诸符号与组成Y的诸符号依次相等,Σ={a,b ,c}X=abbc Y=abbc X=Y X=ab Y=ba X≠Y①符号串的长度,X是符号串,则其长度用|X|表示。
其数值等于组成该符号串的符号个数。
如:X=STV |X|=3 而|ε|=0②符号串s的前缀:移走符号串s尾部的零个或多于零个符号得到的符号串.如:b是符号串banana的一个前缀.符号串s的后缀:删去符号串s头部的零个或多于零个符号得到的符号串.如:nana是符号串banana的一个后缀.Z=abc,那么Z的前缀.是ε,a,ab,abcZ的后缀.ε,c,bc,abc③符号串的联接,X和Y是符号串,它们的联接XY是把Y的符号写在X的符号之后,得到的符号串。
X=ST Y=abu XY=STabu|X|=2 |Y|=3 |XY|=5 由于ε的含义显然有εX=Xε=X④符号串的方幂,X是符号串,把X自身连接几次得到的符号串Z,Z=XX……XX ,Z=X nX0=εX1=XX2=XXX=abc X0=εX1=abc X2=abcabc……n>0有X n=XX n-1=X n-1x⑤集合的乘积运算符号串的集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上的符号串集合。
AB={XY|X∈A,Y∈B}如:A={a,b} B={c,d} AB={ac,ad,bc,bd}∵对于任意符号串X总有εX=Xε=X∴{ε}A=A{ε}=A⑥集合A的闭包A*和集合A的正闭包A+A+=A1∪A2∪A3……A n∪……A*=A0∪A+A={a,b}A+={a,b,aa,ab,ba,bb,aaa,aab……}A*={ε,a,b,aa,ab,ba,bb……}第三节文法和语言的形式定义规则,也称重写规则、产生式,是形如α→β或α∷=β的(α,β)有序对,α是规则的左部,β是规则右部。
α∈V+β∈V* V为某字母表①定义1 文法G定义为四元组(V N,V T,P,S)。
其中V N为非终结符号集V T终结符号集非空有穷集P产生式的集合S称为识别符号或开始符号,它是一个非终结符,它至少要在一条规则中作为左部出现。
Vn∩V T=φV=Vn∪V T V称为文法G的字母表。
②定义2,如α→β是文法G=(V N,V T,P,S)的规则,γ和δ是V*中的任意符号,若有符号串V,W满足V=γαδ,W=γβδ则说V(应用规则α→β)直接产生W或说W是V的直接推导或说W直接归约到V记作V⇒W 如,对于G[S] :S→0S1,S→01V=0S1 W=0011 直接推导:0S1⇒0011,使用的规则S→01 这里γ=0 ,δ=1 V=S,W=0S1 直接推导:S→0S1 使用的规则:S→0S1,这里γ=ε,δ=ε③定义3,如果存在直接推导的序列:V=Wo⇒W1⇒W2……⇒W n=W(n>0)则称V推导出W或称W归约到V。
记作V+⇒W。
④定义4 若有V+⇒W,或V=W,则记作V* ⇒W如,对于G[S] S→0S1,S→01存在直接推导序列V=0S1⇒00S11⇒000S111⇒00001111=W,即0S1+⇒00001111也可记作0S1* ⇒00001111⑤定义5,设G[S]是一文法,如果符号串X是从识别符号推导出来的,即S* ⇒X,则称X是文法G[S]的句型。
若X仅由终结符号组成,即S* ⇒X X∈V T* S:识别符号,则称X是文法G[S]的句子。
⑥定义6,文法G所产生的语言L(G)={X|S* ⇒X,X∈V T* ,S:识别符号},即文法G[S]所产生的所有句子的集合。
形式语言理论可以证明如下两点:A、给定一个文法,就能从结构上唯一地确定其语言G→L(G)B、给定一种语言,能确定其文法,但这种文法不是唯一的L→G1或G2,……在此我们用例子说明。
如文法G[Z]:(1)Z→aZb(2)Z→ab由该文法所确定的语言为:用规则(1):Z⇒a Zb⇒a2Zb2⇒…⇒a n-1Zb n-1用规则(2):⇒a n b n所以,:L(G[Z])={ a n b n |n≥}。
又如已知语言为:L(G)={ab n a|n≥1} 可构造其文法G:G:Z→ a B a B→ b B|b对于上述语言,还可构造文法G′G′:Z→a B a/B→Bb|b很显然,G不同于G′。
对上述语言还可以构造出其他文法。
⑦定义7,若L(G1)=L(G2)则称文法G1和G2是等价的。
第四节文法的类型乔姆斯基把文法分成四种类型,即0型、1型、2型和3型。
这几类文法的差别在于对产生式施加不同的限制。
1、设G=(V N,V T,P,S),如果它的每个产生式α→β是这样一种结构:α∈( V N∪V T) *且至少含有一个非终结符,而β∈( V N∪V T) *,则G是一个0型文法。
0型文法也称短语方法。
一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。
2、设G=(V N,V T,P,S)为一文法,若P中的每一个产生式α→β均满足| β |≥| α |,| α |指符号串α的长度,仅仅S→ε除外,则文法G是1型或上下文有关的。
3、设G=(V N,V T,P,S),若P中的每一个产生式α→β满足:α是一非终结符,β∈( V N∪V T) * 则此文法称为2型的或上下文无关的。
例G=({S,A,B},{a, b},P,S),其中P由下列产生式组成:S→aB A→bAAS→bA B→bA→a B→bSA→aS B→aBB有时,为书写简洁,常把相同左部的生产式,形如A→α1A→α2...A→αn缩写为:A→α1|α2|…|αn这里的元符号“|”读做“或”。
上例的P可写为:S→aB | bAA→a |aS| bAAB→b |bS| aBB4、设G=(V N,V T,P,S),若P中的每一个产生式的形式都是A→aB或A→a,其中A和B 是非终结符,a是终结符,则G是3型文法或正规文法。
例文法G=({S,A,B},{0,1},P,S),其中P由下列产生式组成:S→0A A→1BS→1B B→1BS→0 B→1A→0A B→0A→0S显然G是正规文法。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
第五节上下文无关文法及其语法树上下文无关文法有足够能力描述现今程序设计语言的语法结构,如算术表达式,各种语句等。
(一)语法树:上下文无关文法句型推导的图解过程给定文法G=(V N,V T,P,S)对于G的任何句型都能构造与之关联的语法树。
这棵树满足下列4个条件:1、每个结点都有一个标记,此标记是V的一个符号。
2、根的标记是S3、若一结点n至少有一个它自己除外的子孙,并且有标记A,则A肯定在V N中。
4、如果结点n的直接子孙,从左到右的次序是结点n1,n2,…,n k,其标记分别为A1,A2,…,A K,那么A→A1A2…A K一定是P中的一个产生式。
从一个例子来说明某语法树的构造。
例1 G[S] =({S,A},{a, b},P,S),其中P为:(2)A→SbA(3)A→SS(4)S→a(5)A→ba图2-5-1是G[S]的一棵语法树图2-5-1的语法树是G[S]的文法的句型aabbaa的推导过程非常直观自然的描述,从左至右读出图2-5-1的语法树的叶子标记,得到的就是句型aabbaa。
最左(最右)推导:在推导的任何一步α⇒β,其中α、β是句型,都是对α中的最左(最右)非终结符进行替换,则称这种推导为最左(最右)推导。
最右推导常被称为规范推导。
由规范推导所得的句型称规范句型。
例如,S⇒aAS⇒aAa⇒aSbAa⇒aSbbaa⇒aabbaa(二)递归规则与递归文法递归的概念在编译技术中是一个很重要的概念。