1、第二章 文法和语言的基本知识,学习目标 字母表和字符串 文法与语言的形式定义 短语、直接短语和句柄 语法树和文法二义性 文法和语言的分类,形式语言理论是编译的重要理论基础。本章主要介编 译原理所用到的形式语言理论的基本概念。,2.1 概述,编译程序功能:高级语言翻译成等价的低级语言 。 构造编译程序,需针对特定的程序语言,故需对被编译的程序语言本身进行精确描述。 三. 程序设计语言描述语法 :由程序语言的基本符号组成程序的各个语法成分的一组规则。语义 :按语法规则构成的各个语法成分的意义,也就是各语法成分在运行阶段被计算机执行时所做的工作及及其结果。语用 :是从使用的角度去描述语言。,2.1
2、概述(续),例:s=2*3.1416*r*(h+r)语法赋值语句有一个变量、一个赋值号后跟表达式构成语义计算右部的表达式值,送入左部变量语用赋值语句用来计算和保存表达式的值,四.形式化方法 是用一套带有严格规定的符号体系来描述问题的方法。 著名语言学家Noam Chomsky(诺姆乔姆斯基)提出形式语言理论中所研究的方法。 形式语言理论是编译的重要理论基础。,2.2 字母表和符号串,1、字母表()和符号 字母表是元素的非空有穷集合 例:=01 =ab,c 字母表中元素称为符号(字符),字母表也称符号集。 不同的语言有不同的字母表。任何的语言的字母表指出了该语言允许出现的一切符号。,定义:由字母
3、表中的符号组成的任何有穷序列。 例:字母表=01上的符号串:0,00,10=a,b,c上的符号串:a,ab,aaca 在符号串中,符号是有顺序的,顺序不同,代表不同的符号串,如:ab和ba不同。 不含任何符号的符号串称为空串,用表示。注意:并不等于空集合 符号串长度:符号串中含有符号的个数。如: |abc|=3 |=0,2.符号串(字),2.2 字母表和符号串,符号串的连接:设x,y是符号串,则符号串xy称为它们的连接,即xy是把y的符号写在x的符号之后得到的符号串。例如 x=“ST“,y=“abu“ ,则 xy=“STabu“ 任意符号串x,则有x = x=x 符号串的方幂:把符号串a自身连
4、接n次得到的符号串an = aaaa例如:a0 a1 a2 ana0= a1=a a2=aa an =a an-1(n0),3. 符号串的运算,2.2 字母表和符号串,定义: 若集合A中所有元素都是某字母表上的符号串,则称A为字母表上的符号串集合。 符号串集合的乘积:符号串集合A和B的乘积定义为:AB =xy|xA且yB,即AB是由A中的串x和B中的串y连接而成的串xy组成的集合。 例:若集合A = ab,cde B = 0,1则 AB = ab0,ab1,cde0,cde1显然 A = A = ? 注意:是符号串,不是集合。与= 不同。,4、符号串集合,2.2 字母表和符号串,符号串集合的方
5、幂: 设A是符号串的集合,则称Ai为符号串集A的方幂,其中i是非负整数。具体定义如下: A0 = A1 = A , A2 = A A AK = AAA (k个)=AAk-1=Ak-1 A 例:A=0,1,2.2 字母表和符号串,设A是符号串集合,则A的闭包A*以及正闭包A+定义如下:A * = A 0 A 1 A 2 A 3 A nA + = A 1 A 2 A 3 A n 例:设有字母表=0,1则*=012=,0,1,00,01,10,11,000,即+表示上0,1构成的所有符号串的集合, *比+多含一个空符号串。,5、集合闭包,2.2 字母表和符号串,2.3 文法和语言的形式定义,形式语言
6、是指基于某字母表并按某种规则构成的所有符号串的集合。(不考虑语义) 形式语言的描述: 枚举法当语言为有穷集合时 文法当语言为无穷集合时 例:=a,b L1=a,b,ab L2=aa,bb,aabb L3=a,b,aa,ab,ba,bb,aab,aba,abb,baa=+,2.3.1 形式语言,2.3.2 文法的形式定义,文法是定义或描述语言的语法结构的一组形式规则。 文法目的就是用适当条数的规则把程序语言全部成分描述出来。规则要求: 准确的和易于理解的。 具有相当强的描述能力,足以描述语言中的各种不同结构。 由这些规则生成的语言应有利于句子的分析和翻译,且能设计出高效的语法分析程序。,2.3.
7、2 文法的形式定义(续),规则(产生式或生成式)是形如或=的(,)有序对。其中(VNVT)+, (VNVT)* 。 称为规则的左部;称为规则的右部。左部用右部定义或左部生成右部。规则包含符号种类:非终结符号(大写字母或尖括号,在规则左部)和终结符号(小写字母,在规则右部);,例:A0 A1 AA 0 AA 1,1. 规则,2.3.2 文法的形式定义(续),终结符号是组成语言的基本符号,一个具体的保留字、运算符、界限符等都是终结符号。如if、+、,等。终结符号是语言的不可再分的基本符号。终结符号形成集合记为VT。 非终结符号是用来表示语言的语法成分,例如 “赋值语句”、“表达式”等。非终结符号所
8、形成的集合记为VN。,2. 终结符号和非终结符号,定义为四元组(VN,VT,P,S)VN (Nonterminal):规则中非终结符集VT (Terminal):规则中终结符集P (Production):产生式(规则)集合S:开始符号或识别符号 说明: V=VNVT,V称为文法G的字汇表 P中产生式形如:,其中V+且至少含一个非终结符,V* VNVT= S是一个非终结符,且至少要在一条产生式的左部出现,2.3.2 文法的形式定义,3.文法G(Grammar):是规则的非空有穷集合。,2.3.2 文法的形式定义,例1 文法G=(VN,VT,P,S)VN = S , VT = 0, 1 P =
9、S0S1, S01 S为开始符号,例2. 文法G=(VN,VT,P,S)VN =I,L,DVT =a,b,c,x,y,z,0,1,9P = I LI ILI IDL a | b | c | | x | y | zD 0 | 1 | 2 | 3 | | 9 S = I,2.3.2 文法的形式定义,2.3.2 文法的形式定义,简化表示法:通常不用将文法的四元组表示出来, 只写出产生式 约定: 第一条产生式的左部是文法开始符号或用GS表示S是开始符号 用大写字母(或用尖括号括起来)表示非终结符 用小写字母表示终结符 左部相同的产生式A,A可以记为A|,其中“|”是“或”的意思,,分别称为侯选式,3文
10、法的简化表示法,例3 文法 G =(VN,VT,P,S)VN = S , VT = 0, 1 P = S0S1, S01 S为开始符号,可写成:GS:S0S1S01,或写成:GS:S0S1 01,注:把 “0S1” 和 “01” 称为产生式 S0S1 01 的候选式,2.3.2 文法的形式定义,设计文法的实例:例2.1,例2.2,2.3.3 语言的形式定义,直接推导(): Aa是文法G的产生式,若有v,w满足: v=xAy,w=xay, x,y V*则称v直接推导出w,记作 v w 直接推导就是用产生式的右部替换产生式的左部的过程(仅使用一次产生式) 推导与规则的区别 形式上的区别“”和“”
11、推导的依据是规则,1直接推导,文法已知时如何确定该文法所对应的语言呢?,例 文法GS: S0S1,S01 有直接推导: S 0S1 ( S0S1 )0S1 00S11 ( S0S1 )00S11 000S111 ( S0S1 )000S111 00001111( S01 ),2.3.3 语言的形式定义,2.推导和广义推导 若有0 1 2 . n直接推导序列 则称0推导出n ,或n归约到0,记为0 n 若有0 n ,或0 = n ,则记作0 n (广义推导),2.3.3 语言的形式定义,+ ,+ ,* ,注: 包含0步推导;而 不包含0步推导。,* ,+ ,例 文法GS: S0S1, S01S
12、0S1 00S11 000111 S 000111 或 S 000111,+ ,* ,2.3.3 语言的形式定义,例: 文法GE: EE+T|TTT*F|FF(E)|i,对i+i*i的直接推导序列,E E+T,T+T,F+T,i+T,i+T*F,i+F*F,i+i*Fi+i*i,2.3.3 语言的形式定义,3.句型与句子 设有文法GS,若符号串x是从开始符推导出来的,即 S x , x( VNVT)*则称x是文法G的句型。 若x仅由终结符组成,即 (即S x,且xVT*),则称x是文法G的句子。 例 文法GS: S0S1, S01S 0S1 00S11 000S111 00001111S,0S
13、1 ,00S11 ,000S111,00001111都是G的句型00001111是G的句子,* ,* ,2.3.3 语言的形式定义,例: 文法GE:EE+T|TTT*F|FF(E)|i,对i+i*i的直接推导序列,E E+T,T+T,F+T,i+T,i+T*F,i+F*F,i+i*Fi+i*i,5.语言的形式定义 由文法G生成的语言记为L(G),它是文法G的一切句子的集合,即L(G)=x|S x,且 xVT* 即:文法描述的语言是该文法一切句子的集合。,* ,6.从已知文法确定语言的方法从文法的开始符号出发,反复连续的使用规则,对非终结符实行替换和展开,找出句子规律。 例 : 文法GS: S0
14、S1,S01求该文法所定义语言 S0S1 00S11 03S13 0n-1S1n-1 0n1n L(G)=0n1n|n1 例:文法G1A:A c|Ab,G1A的语言解:LG1=c,cb,cbb, =cbn|n 0。 例:文法G2S:S AB,A aA|a,B bB|b,求G2S的语言?解:L(G2)=ambn|m,n0,2.3.3 语言的形式定义,2.3.3 语言的形式定义,7. 从语言构造文法具体步骤:(一般采用“凑规则”的方法) 找出语言的若干句子; 分析句子的特点; 根据句子的特点凑规则; 形成文法; 检验两个方面:语言的所有句子是否都能由文法的开始符推导得到;文法推导出的所有终结符号串
15、是否都是语言的句子。 注意:得到的文法是不唯一的。,2.3.3 语言的形式定义,8. 设计文法基本产生式(规则) 基本式: A, 是终结符号串 嵌套式: AB, , 是终结符串,B是一个非终结符,A所定义的终结符串是每个B所定义的语句前边加上串并且后边加。 递归式: AA|或AA|,其定义的语言为L(A)=n|n 1 成对符号递归:AB|,A所定义的语言为L(A)=nn|n 1,例:给出语言为anbn|n1的文法。解:G3S:S aSbS ab 例:给出语言为ambn|1nm2n的文法。解:G4S: S aSb | aaSbS ab | aab,9.文法与语言的关系:给定一个文法,就能从结构上
16、唯一的确定其语言,即G L(G)给定一种语言,能确定其文法,但这种文法不是唯一的,即LG1、G2等若L(G1) = L(G2),则称文法G1和G2是等价的。,2.3.4 规范推导和规范规约,同一个句型(句子)可有不同的推导序列 在推导过程中与所选择非终结符的次序无关 为了使句型或句子按一种确定推导序列产生以便对句子结构进行确定性的分析。 最右(最左)推导:在推导的任何一步,其中、是句型,都是对中的最右(左)非终结符进行替换。 最右推导被称为规范推导 由规范推导所得的句型称为规范句型 规范推导的逆过程,称为最左规约,也称为规范规约。符号:,2.3.4 规范推导和规范规约,例:设有文法GS:S-A
17、BA-A0|1BB-0|S1 请给出句子101001的规范推导和规范规约,S ,AB,AS1,AAB1,AA01,A1B01,A1001,1B1001,101001,规范规约推导:,S,AS1,AAB1,AA01,A1B01,A1001,101001.,规范推导:,AB,1B1001,.递归规则与文法的递归性,1.递归规则是指规则的左部和右部具有相同非终结符的规则 A-A 规则左递归 A-A 规则右递归 A-A 规则递归 2.文法递归性是指对文法中任一非终结符,若能建立一个推导过程,在推导所得的符号串中又出现该非终结符本身。 A +A; 文法左递归 A + A 文法右递归 A + A 文法递归
18、,.递归规则与文法的递归性,使用递归规则的目的,用有限的规则刻画无穷的语言。 含有递归规则的文法,一定是递归的。不含递归规则的文法也可能是递归的。 例:U-Vx V-Uy|z U Vx Uyx 规则不递归,文法左递归 例:A-aB|bB B-a|b 是否递归?描述的语言是什么? aa,ab,ba,bb文法无递归性,描述的有穷语言 若描述无穷语言,文法一定递归。 程序设计语言是无穷集合,描述它们的文法一定递归。,设是文法GS中的一个句型, 如果有S=*A且A=+,则称是句型相对于非终结符A的短语 如有A=,则称是句型的直接短语。 短语与直接短语的区别在于第二个条件。直接短语第二条件表示有文法规则
19、A. 一个句型的最左直接短语称为该句型的句柄 是直接短语 具有最左性 短语是相对于某个句型的(即句型的一部分),2.4 短语、直接短语和句柄,例题:文法GN1:N1N NND|D D0|1|2 求句型ND的短语 解:N1=* N1;N1=+ND,例题:文法GT:SAB AAa|bB Ba|Sb 求句型baSb的短语、直接短语和句柄,结论:根据短语定义,可从句型的推导过程中寻找其短语、直接短语和句柄。,2.4 短语、直接短语和句柄,2. 5 语法树与文法的二义性,1.语法树(推导树Parse Tree) 对句型的推导过程一种图形表示方式。 设文法G=(VN,VT,P,S),对文法任何句型可构造满
20、足下列条件的语法树 每个结点有一标记X, X VN VT ; 根的标记为S(文法开始符); 若结点X有后继,则XVN; A有k个后继,自左至右为X1, X2, , Xk,则A X1X2Xk P,2.5.1语法树,2. 5 语法树与文法的二义性,2. 语法树生成过程 以文法开始符号作为根结点,从它开始对每一步的直接推导向下画分支,分支结点的标记是直接推导中替换非终结符的文法符号。按此方法逐步向下画出每一步直接推导的分支直到该语法树再无分支可画。 语法树中从左到右的结点构成由该语法树所表示的推导出句型或句子(树叶)。 一棵语法树表示一个句型的多种可能的不同推导过程,包括最左(右)推导。,例:文法G
21、:EE+T|T;TT*F|F; F(E)|i句型i+i*i的推导过程与语法树,E E+T E+T*F E+T*iE+F*iE+i*i T+i*iF+i*ii+i*i,E E+T T+T F+T i+T i+T*F i+F*F i+i*F i+i*F i+i*i,2. 5 语法树与文法的二义性,2.5 语法树与文法的二义性,3.语法树的子树与简单子树 子树是由某一节点连同所有分支组成的部分。 简单子树是指只有单层分支的子树。 举例,4.子树与短语的关系 短语:子树的末端节点形成的符号串是相对于子树根的短语。 直接短语:简单子树的末端节点形成的符号串是相对于简单子树根的直接短语。 句柄:最左简单子
22、树的末端节点形成的符号串。,例:GE:EE+T|T TT*F|F F(E)|i 求句型i1*i2+i3的短语、直接短语和句柄。,短语:i1 , i2 , i3 , i1*i2 ,i1*i2+i3直接短语:i1,i2 ,i3句柄:i1,短语、直接短语和句柄特指句型中的哪些符号串。,例:GE: E iE E+EE E*EE (E),句型 i*i+i 的两个不同的最左推导: 推导1:E E+E E*E+E i*E+E i*i+E i*i+i 推导2:E E*E i*E i*E+E i*i+E i*i+i,2.5.2 文法的二义性(Ambiguity),如果使用最左(右)推导,则一个最左(右)推导与语
23、法树一一对应。 一个句型是否只对应唯一一棵语法树?,文法的二义性定义如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。或二义性文法存在某个句子,它有两个不同的最左(右)推导。 对于一个程序设计语言来说,希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。 二义性文法给编译程序分析句子语法结构带来不确定性,从而导致语义处理的不确定性。,2.5.2 文法的二义性(Ambiguity),2.5.3 文法二义性消除(不讲),不改变文法中原有的语法规则,仅加一些语法非形式规定。 例如 i*i+i的归约过程中,若规定*比+优先级高,则可强制性地让系统先按E*E进行归约,而不是先
24、按E+E进行归约;,构造一个等价的无二义性文法,即把排除二义性的规则合并到原有文法中,改变原有的文法。,文法G1: E E+E| EE|(E)| i,文法G2: ET|E+T TF|TF F(E)| i,2.6 文法和语言的分类,文法的四元组表示是由N.Chomsky(乔姆斯基)于1956年描述形式语言时给出的。他还对产生式的形式给予不同的限制而定义了四类基本文法。,2.6 文法和语言的分类,0型文法(无限制文法):对任一产生式,都有(VNVT)*且至少含有一个非终结符, 而(VNVT)* 0型文法描述的是0型语言(无限制语言) ,均是文法的终结符和非终结符组成的符号串,且可能为空。 例:GS
25、: S-0AB1B-0B-SA|01A1-SB1 A0-S0B,2.6 文法和语言的分类,1型文法(上下文有关):文法G中每一条规则的形式为A u,都有、(VNVT)*,AVN , u(VNVT)+。称G是1型文法。 说明:利用规则A替换成u时,只有在,上下文环境中才可以替换。 |A|?| u | 1型文法描述的是1型语言(上下文有关语言),例:1型(上下文有关)文法文法GS: SaSBESaBEEBEBaBabbBbbbEbeeEee,2.6 文法和语言的分类,2.6 文法和语言的分类,2型文法(上下文无关文法):它是1型文法的特例,对任一产生式,都有VN , (VNVT)*,则称G是2型文
26、法。 2型文法产生式的一般形式是: A,它表示不管A的上下文如何都可把A替换成,因此被称为上下文无关文法。 2型文法描述的是2型语言(上下文无关语言) 通常程序设计语言的文法,可用2型文法来描述,因此我们重点研究2型文法。,例:2型(上下文无关)文法文法GS: SaB|bAAa|aS|bAABb|bS|aBB,2.6 文法和语言的分类,3型文法(正规文法):任一产生式的形式都为 AaB或Aa;(ABa或Aa)其中A ,BVN ,aVT*。 3型文法描述的是3型语言(正规语言)。 在程序设计语言中,3型文法通常用来描述单词的结构。 例:3型文法GS:S0A|1B|0A0A|1B|0SB1B|1|0,四种文法之间的逐级“包含”关系,2.7 有关文法实用限制和变换,有关文法的实用限制,有害规则:形如AA ,无用且引起文法的二义性 多余规则:所有句子推导都用不到的规则,表现形式: 文法中某些非终结符不在任何规则的右部出现,该非终结符称为不可到达的 文法中某些非终结符,由它不能推出终结符号串来,称为不可终止的。,例:文法GS: (1)SBe (2)BCe (3)BAf (4)AAe (5)Ae (6)CCf (7)Df,多余规则为:(7)不可到达(6)不可终止(2)也是多余的,