1、第三章 文法和语言,教学要求 掌握:文法的概念,语言的定义,符号串,文法的形式定义,0型文法,1型文法,2型文法,3型文法 理解:自上而下与自下而上的分析方法 了解:上下文无关文法中的规则,一个程序设计语言是一个记号系统,其完整定义应包括语法和语义两个方面。 语法是指一组规则,用它可以形成和和产生一个合法的程序,定义什么样的符号系列是合法的,与符号含义无关。 语义:类型匹配,变量作用域等 静态语义:一系列语法规则,确定哪些合乎语法的程序是合适的 动态语义:程序要做什么,3.1 文法的直观概念,文法:一种语言描述,用来定义句子的结构,用有限的规则把语言的全部句子描述出来,是以有穷的集合刻划无穷的
2、集合的工具。,当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。,以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是 由主语后随谓语而成,构成谓语的是动词和直接宾语,我们采用第2章所介绍的EBNF来表示这种句子的构成规则:,“我是大学生”。是汉语的一个句子,句子=主语谓语 主语=代词名词 代词=我你他 名词=王明大学生工人英语 谓语=动词直接宾语 动词=是学习 直接宾语=代词名词,有了一组规则以后,按
3、照如下方式用它们导出句子:开始去找=左端的带有句子的规则并把它由=右端的符号串代替,这个动作表示成: 句子 主语谓语,然后在得到的串主语谓语中,选取主语或谓语,再用相应规则的=右端代替之。,句子:“我是大学生”的全部动作过程是: 句子 主语谓语 代词谓语 我谓语 我动词直接宾语 我是直接宾语 我是名词 我是大学生,“我是大学生”的构成符合上述规则,而“我大学生是”不符合上述规则,我们说它不是句子。这些规则成为我们判别句子结构合法与否的依据,换句话说,这些规则看成是一种元语言,用它描述汉语。这里仅仅涉及汉语句子的结构描述。其中一种描述元语言称为文法。,3.2 符号和符号串,字母表:元素的非空有穷
4、集合 符号:字母表中的元素 符号串:由字母表中的符号串组成的任何有穷系列产品 x=STR,有关定义和记号回顾,符号串s的头(前缀):移走符号串s尾部的零个或多于零个符号得到的符号串. 如: b是符号串banana的一个前缀. 符号串s的尾(后缀):删去符号串s头部的零个或多于零个符号得到的符号串. 如:nana是符号串banana的一个后缀.符号串s的子串:从s中删去一个前缀和一个后缀得到的符号串. 如:ana是符号串banana的一个子串.,对于每个符号串s, s和两者都是符号串s的前缀,后缀和子串。 符号串s的真前缀,真后缀,真子串:任何非空符号串 x,相应地,是s的前缀,后缀或子串,并且
5、 s x,符号串的运算符号串的长度:符号串中符号的个数.符号串s的长度记为|s|。的长度为0 x=STR 符号串的长度:|x|=3,符号串连接:符号串x、y的连接,是把y的符号写在x的符号之后得到的符号串xy 如 x=ab,y=cd 则 xy=abcd 有a = a 符号串方幂:符号串自身连接n次得到的符号串 an 定义为 aaaa n个a a1=a, a2=aa则a0=,符号串集合:若集合A中所有元素都是某字母表上的符号串,则称A为字母表上的符号串集合。 两个符号串集合A和B的乘积定义为 AB =xy|xA且yB 若 集合A=ab,cde B = 0,1 则 AB =ab1,ab0,cde0
6、,cde1 。,使用 * 表示上的一切符号串(包括)组成的集合。*称为的闭包。上的除外的所有符号串组成的集合记为+ 。 +称为的正闭包。,例:=a,b*=,a,b,aa,ab,ba,bb,aaa,+=a,b,aa,ab,ba,bb,aaa,aab,指定字母表, *表示上的所有有穷长的串的集合。=0,1 * =,0,1,00,01,10,11,000,001,010,*= 0U 1U 2 U U n U *称为集合的闭包: 正闭包:+= 1U 2 U U n U *= 0U + = *= * ,3.3文法和语言的形式定义,如何来描述一种语言? 如果语言是有穷的(只含有有穷多个句子),可以将句子逐
7、一列出来表示 如果语言是无穷的,找出语言的有穷表示。语言的有穷表示有两个途经:,生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造。 识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要麽能停止并回答“不是”,(要麽永远继续下去。),规则(也称重写规则、产生式或生成式):是形如 或:=的(,)有序对,其中为字母表的正闭包中的符号, 为字母表的闭包中的符号, 称为规则的左部, 称为规则的右部。,文法的定义:,文法G:定义为四元组(VN,VT,P,S),其中 VN为非终结符号的集合, VT为终结符号的集合,P为产生式的集合,
8、 VN,VT,p 是非空有穷集,S为开始符,是一个非终结符,至少要在一条规则中作为左部出现。VNn VT=VNUVT=V,字母表或词汇表,例,文法G =(VN,VT,P,S),其中VN =S, VT =0,1, P =S 0S1, S 01可见该文法中非终结符中只含一个符号S, 终结符中含两个符号0和1,由两个产生式,开始符号是S.,很多时候不用将文法的四元组显式地表示出来,而只将产生式写出。 一般约定:第一条产生式的左部是识别符号;用尖括号括起来的是非终结符号;不用尖括号括起来的是终结符号。或者用大写字母表示非终结符号,小写字母表示终结符号。 如:G: S 0S1S 01,例 文法G=(VN
9、,VT,P,S)VN =标识符,字母,数字VT =a,b,c,x,y,z,0,1,9P=a, z0, 9 S=,文法的写法1 G:SaAb Aab AaAb A2 GS:SaAb Aab AaAb A3 GS:SaAbAab |aAb |,推导的定义:(、 、 ),1. 是文法G的产生式,若有v,w满足:v=,w= , 其中V*,V*则称v直接推导到w,记作 v w也称w直接归约到v,+,*,例 G: S0S1,S010S1 00S1100S11 000S111000S111 00001111S 0S1,. . . VAR;BEGIN READ()END. VAR A;BEGIN READ(
10、) END.,2. 若存在v w0 w1 . wn=w,(n0)则记为v = w,v推导出w,或w归约到v 3. 若有v =w,或v=w,则记为v = w,*,+,+,+,例:G: S0S1, S01 0S1 00S11 00S11 000S111 000S111 00001111 S 0S1 00S11 000S111 00001111 S = 00001111S = S 00S11 =00S11,+,*,*,句型、句子的定义,句型: 有文法G,若S = x,则称x是文法G的句型。 句子 有文法G,若S =x,且xVT*,则称x是文法G的句子。 例:G: S0S1, S01 S 0S1 00
11、S11 000S111 00001111 G的句型S,0S1 ,00S11 ,000S111,00001111 G的句子00001111, 01,*,*,例:GE: EE+T|T TT*F|F F(E)|a EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a 句子:用符号a,+,*,(和)构成的算术表达式,语言的定义,由文法G生成的语言记为L(G),它是文法G的一切句子的集合: L(G)=x|S = x,其中S为文法的开始符号,且x VT*例:G: S0S1, S01 L(G)=0n1n|n1,*,例 文法GS:(1)SaSBE(2)SaBE(3)EBBE(4)a
12、Bab(5)bBbb(6)bEbe(7)eEee L(G)= anbnen | n1 ,使用产生式(1)n-1次,得到推导序列: S = an-1S(BE)n-1,然后使用产生式(2)一次,得到:S = an-1S(BE)n-1 an(BE)n。然后从an(BE)n继续推导,总是对EB使用产生式(3)的右部进行替换,而最终在得到的串中,所有的B都先于所有的E。例如,若n=3,aaaBEBEBE aaaBBEEBE aaaBBEBEE aaaBBBEEE。即有: S = anBnEn,*,*,*,*,接着,使用产生式(4)一次,得到S =*anbBn-1En,然后使用产生式(5)n-1次得到:
13、S = anbnEn,最后使用产生式(6)一次,使用产生式(7)n-1次,得到:S = anbnen 也能证明,对于n1,串anbnen是唯一形式的终结符号串,*,*,*,S a S BE (SaSBE)a aBEBE (SaBE)aabEBE ( aBab ) aabBEE ( EBBE ) aabbEE (bBbb)aabbeE (bEbe)aabbee (eEee) 文法和语言的关系: G生成的每个串都在L(G)中 L(G)中的每个串确实能被G生成,文法的等价,若L(G1)=L(G2),则称文法G1和G2是等价的。 如文法G1A:A0R A01 RA1与G2S:S0S1 S01等价,3.
14、4文法的类型,通过对产生式施加不同的限制,Chomsky将文法分为四种类型: 0型文法:对任一产生式,都有(VNVT)+, (VNVT)*,1型文法:对任一产生式,都有|, 仅仅 S除外,例:1型(上下文有关文法)文法GS: SCD AbbACaCA BaaBCbCB BbbBADaD CBDbD DAabD,2型文法:对任一产生式,都有VN , (VNVT)* 例:2型(上下文无关文法) GS: SABABS|0BSA|1,3型文法:任一产生式的形式都为AaB或Aa,其中AVN ,BVN ,aVT,例: 3型文法,GS: S0A|1B|0A0A|1B|0SB1B|1|0,GI: I lTI
15、lT lTT dTT lT d,文法的类型,0型文法,四种文法之间的逐级“包含”关系,3型文法,文法和语言,0型文法产生的语言称为0型语言 1型文法或上下文有关文法产生的语言称为1型语言或上下文有关语言 2型文法或上下文无关文法产生的语言称为2型语言或上下文无关语言 3型文法或正则(正规)文法产生的语言称为3型语言正则(正规)语言,3.5上下文无关文法及其语法树,上下文无关文法有足够的能力描述程序设计语言的语法结构语法树-句型推导的直观表示,例文法G=(E,+,*,i,(,),P,E)其中P为: Ei , EE+E , EE*E , E(E) E表示算术表达式, i表示程序的“变量”,该文法定
16、义了由变量,+,*,(和)组成的算术表达式的语法结构,即:变量是算术表达式;若E1和E2是算术表达式,则E1+ E2,E1*E2和(E1)也是算术表达式,描述一种简单赋值语句的产生式: 赋值语句i=E描述条件语句的产生式: 条件语句if条件then语句 if条件then语句else语句,句型、推导,GE: EE+T|T TT*F|F F(E)|a EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a,EE+T E+T*F E+T*a E+F*a E+a*a T+a*a F+a*a a+a*aEE+T T+T T+T*F F+T*F F+F*F a+F*F a+F*a
17、 a+a*a,规范推导 规范句型,最左(最右)推导:在推导的任何一步,其中、是句型,都是对中的最左(右)非终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型,语法树,设G=( VN,VT,P,S),若一棵树满足下列4个条件,则此树称作G的语法树(推导树): 1. 每个结点都有一个标记,此标记是V的一个符号 2. 根的标记是S 3. 若一结点n至少有一个它自己除外的子孙,并且有标记A,则肯定AVN,4. 如果结点n有标记A,其直接子孙结点从左到右的次序是n1,n2,nk,其标记分别为A1,A2,Ak,那么AA1A2,Ak一定是P中的一个产生式 语法树的结果: 从左到右读出
18、叶子的标记而构成的行谓之句子,语法树-句型推导的直观表示,给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树) 定理: G为上下文无关文法,对于,有S = ,当且仅当文法G有以为结果的一棵语法树(推导树),*,构造语法树,GE: EE+T|T TT*F|F F(E)|aEE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a,E E E + T E + TTEE + TTF,EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a EE+T E+T*F E+T*a E+F*a E+a*a T+a*a F+a*a
19、a+a*a EE+T T+T T+T*F F+T*F F+F*F a+F*F a+F*a a+a*a,EE + TT T * FF F aa a 看不出句型中的符号被替代的顺序,上下文无关文法的语法树的用处,用于描述上下文无关文法句型推导的直观方法,例: GS:SaASASbAASSSaAba,Sa A SS b A aa b a,句型aabbaa的语法树(推导树),叶子结点:树中没有子孙的结点。 从左到右读出推导树的叶子标记连接成的文法符号串,为GS的句型。也把该推导树称为该句型的语法树。,上下文无关文法的语法树,推导过程中施用产生式的顺序,例: GS:SaASASbAASSSaAba,Sa
20、 A SS b A aa b a,SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa,一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。但是,一个句型是否只对应唯一的一棵语法树呢?一个句型是否只有唯一的一个最左(最右)推导呢?,例:GE: E iE E+EE E*EE (E),EE + EE * E ii i,EE * Ei E + Ei i,句型 i*i+i 的两个不同的最左推导: 推导1:E E+E E*E+E i*E+E i*i+E i*i+i
21、推导2:E E*E i*E i*E+E i*i+E i*i+i,二义文法,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的,但可以为无二义性寻找一组充分条件,文法的二义性和语言的二义性是两个不同的概念。因为可能有两个不同的文法G和G,其中G是二义的,但是却有L(G)=L(G),也就是说,这两个文法所产生的语言是相同的。 二义文法改造为无二义文法 GE: E i GE:E T|E+TE E+E T F|T*FE E*E F (E)|iE (E) 规定优先顺序和结合律如果产
22、生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。对于一个程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。,3.6句型的分析,句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序。分析算法又称识别算法。 从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号,直到分析结束。,句型的分析算法分类,分析算法可分为: 自上而下分析法: 从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。 自下而上分析
23、法: 从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。,两种方法反映了两种语法树的构造过程。,自上而下方法是从文法符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串 自下而上方法则是从输入符号串开始,以它做为语法树的结果,自底向上地构造语法树,自上而下的语法分析,例:文法G:S cAd A ab A a 识别输入串w=cabd是否为该文法的句子,S S Sc A d c A da b 推导过程:S cAd cAd cabd,自下而上的语法分析,例:文法G: S cAd A ab A a 识别输入串w=cabd是否该文法的句子,SA A c a b d c
24、 a b d c a b d 规约过程构造的推导: cAd cabd S cAd,(1)S cAd (2) A ab (3)A a 识别输入串w=cabd是否为该文法的句子 自上而下的语法分析,若S cAd 后选择(3)扩展A,S cAd cad 那将会?w的第二个符号可以与叶子结点a得以匹配,但第三个符号却不能与下一叶子结点d匹配 ?宣告分析失败(其意味着,识别程序不能为串cad构造语法树,即cad不是句子) -显然是错误的结论。 导致失败的原因是在分析中对A的选择不是正确的。,Sc A da,(1)S cAd (2) A ab (3)A a 识别输入串w=cabd是否为该文法的句子 自下而
25、上的语法分析,对串cabd的分析中,如果不是选择ab用产生式(2),而是选择a用产生式(3)将a归约到了A,那么最终就达不到归约到S的结果,因而也无从知道cabd是一个句子,c a b dc A b da,句型分析的有关问题,1)在自上而下的分析方法中如何选择使用哪个产生式进行推导?假定要被代换的最左非终结符号是B,且有n条规则:BA1|A2|An,那么如何确定用哪个右部去替代B?,2)在自下而上的分析方法中如何识别可归约的串?在分析程序工作的每一步,都是从当前串中选择一个子串,将它归约到某个非终结符号,该子串称为“可归约串”,刻画“可归约串”,文法GS 句型的短语 S = A且 A = ,则
26、称是句型相对于非终结符A的短语,*,+,句型的直接短语: 若有A ,则称是句型相对于非终结符A 的直接短语 句型的句柄: 一个句型的最左直接短语称为该句型的句柄,例i*i+i 例 :i*i+i 的短语、直接短语和句柄,E E + TT F T * F i3 短语:i1* i2+ i3, i1* i2 , F i2 i1 , i2 , i3 。 i1 直接短语: i1 , i2 , i3 。句柄: i1,GE:EE+T|T TT*F|F F(E)|i 句型:i*i+i,3.7文法实用中的一些说明,文法中不含有有害规则和多余规则 有害规则:形如UU的产生式。会引起文法的二义性 多余规则:指文法中任
27、何句子的推导都不会用到的规则 文法中不含有不可到达和不可终止的非终结符 1)文法中某些非终结符不在任何规则的右部出现,该非终结符称为不可到达。 2)文法中某些非终结符,由它不能推出终结符号串,该非终结符称为不可终止。,对于文法GS,为了保证任一非终结符A在句子推导中出现,必须满足如下两个条件: 1. A必须在某句型中出现即有S =* A,其中,属于V*2. 必须能够从A推出终结符号串t来即A =* t,其中tVT*,化简文法,例:GS : 1) SBe2) BCe D为不可到达3) BAf C为不可终止4) AAe 5) Ae6) CCf7) Df产生式 2),6),7)为多余规则应去掉。,上
28、下文无关文法中的规则,上下文无关文法中某些规则可具有形式A,称这种规则为规则 因为规则会使得有关文法的一些讨论和证明变得复杂,有时会限制这种规则的出现 两种定义的唯一差别是句子在不在语言中 文法构思的启示是要找出语言的有穷描述,而如果语言L有一个有穷的描述,则L1=L也同样有一个有穷的描述,并且可以证明,若L是上下文有关语言、上下文无关语言或正规语言,则L和L-分别是上下文有关语言、上下文无关语言和正规语言。,思考,本章目的为语言的语法描述寻求工具,以便: 对源程序给出精确无二义的语法描述。(严谨、简洁、易读) 根据语言文法的特点来进行语法分析 1.什麽是文法,什麽是它的语言? 2.我们为什麽关注上下文无关文法? 3.语法分析方法的分类?,本章小结 考察本章知识点最典型的题目是,答案1: GE EE+T|T TT*F|F F(E)|a 答案2: GE EE+E|E*E|(E)|a,2.给出语言描述,构造文法. 如:构造一文法,其定义的语言是由算符+, *, (,)和运算对象a构成的算术表达式的集合.,答案:GA定义的语言由0、1符号串组成,串中0和1的个数相同.,1.已知文法GA,写出它定义的语言描述如:GA: A 0B|1C B 1|1A|0BB C 0|0A|1CC,