编译原理与技术讲义-第3章.ppt
《编译原理与技术讲义-第3章.ppt》由会员分享,可在线阅读,更多相关《编译原理与技术讲义-第3章.ppt(91页珍藏版)》请在三一办公上搜索。
1、青岛大学信息工程学院,编译原理与技术,第3章 程序语言的语法描述,编译原理与技术,2,主要内容,文法和语言文法的分类 文法的等价变换语法分析概述,编译原理与技术,3,程序语言的语法描述,程序语言的定义 程序语言通常是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。它完整的定义包括语法、语义及语用三个方面。一个程序语言的语法是指这样一组规则,使用它可以形成和产生一个合适的程序。这些规则一部分称为词法规则,另一部分称为语法规则(或产生规则)。,编译原理与技术,4,程序语言的语法描述,一个程序语言的语义是指这样一组规则,使用它可以定义一个程序的意义。静态语义是一系列
2、限定规则,确定哪些合乎语法的程序是合适的;动态语义也称作运行语义或执行语义,表明程序要做些什么,要计算什么。语用表示语言符号及其使用者之间的关系,涉及符号的来源、使用和影响。,编译原理与技术,5,3.1 文法和语言,文法的形式定义 定义3.1:定义四元组G=(VN,VT,P,S)是一个文法。其中VN,VT和 P都是非空有限集合,分别称为非终结符号集合、终结符号集合及产生式集合。S称作识别符号或开始符号,它是一个非终结符,至少要在一条产生式中作为左部出现。VN和VT不含公共元素,即VNVT=。通常用V表示VNVT,称为文法G的字母表。,编译原理与技术,6,3.1 文法和语言,例3.1:文法G1=
3、(VN,VT,P,S),其中VN=S,VT=0,1,P=S0S1,S01。该文法只有一个非终结符S,有两个终结符0和1,有两条产生式,开始符号是S。很多时候,不用将文法G的四元组显式地表示出来,而只将产生式写出。一般约定,第一条产生式的左部是开始符号,用尖括号括起来的是非终结符号,不用尖括号括起来的是终结符号,或者用大写字母表示非终结符号,小写字母表示终结符号。另外也有一种习惯写法,将G写成GS,其中S是开始符号。因此,例3.1还可以写成:G:S0S1 或 GS:S0S1 S01 S01,编译原理与技术,7,3.1 文法和语言,有时,为书写简洁,常把相同左部的产生式,形如A1,A2,An,缩写
4、为:A1|2|n。这里的元符号|读做“或”。如,例3.1的产生式可以写成S 0S1|01。注意元符号和源符号的区别:文法中使用的元符号或=表示左部由右部定义,|表示定义同一个左部的几个可选择的右部。而源符号是指文法定义的语言中的符号,全部由文法的终结符构成。,编译原理与技术,8,3.1 文法和语言,例3.2:文法G2=(VN,VT,P,S),其中 VN=标识符,字母,数字,VT=a,b,c,x,y,z,0,1,9,P=标识符字母|标识符字母|标识符数字 字母a|b|z 数字0|1|9 S=标识符,这里使用尖括号 和 括起非终结符。,编译原理与技术,9,3.1 文法和语言,例3.3:一个文法的几
5、种写法:G=(S,A,a,b,P,S)其中P=SaAb,Aab,AaAb,A G:SaAb Aab AaAb A,GS:Aab AaAb A SaAb GS:Aab|aAb|SaAb,编译原理与技术,10,3.1 文法和语言,推导与归约 定义3.2:设是文法G=(VN,VT,P,S)的产生式,和是V*中的任意符号。若有符号串v,w满足:v=,w=,则说v直接产生w,或者说,w是v的直接推导。记作vw。也可以说w直接归约到v。归约是推导的逆过程。,编译原理与技术,11,3.1 文法和语言,对例3.1文法G,可以给出直接推导的一些例子如下:v=0S1,w=0011,直接推导:0S10011,使用的
6、规则:S01,这里=0,=1。v=S,w=0S1,直接推导:S0S1,使用的规则:S0S1,这里=,=。v=0S1,w=00S11,直接推导:0S100S11,使用的规则:S 0S1,这里=0,=1。,编译原理与技术,12,3.1 文法和语言,对例3.2文法G,直接推导的例子有:v=标识符,w=标识符字母,直接推导:标识符标识符字母,使用的规则:标识符标识符字母,这里=。v=标识符字母数字,w=字母字母数字,直接推导:标识符字母数字 字母字母数字,使用的规则:标识符字母。这里=,=字母数字。v=abc数字,w=abc5,直接推导:abc 数字 abc5,使用的规则:数字5,这里=abc,=。,
7、编译原理与技术,13,定义3.3:如果存在直接推导的序列:v=w0 w1 w2 wn=w,(n0),则称v推导出w,推导长度为n。或者称w归约到v。记作v w。若有v w,或v=w,则记作v w。定义3.19:设GS是一文法,如果符号串x是从开始符号推导出来的,即有S x,则称x是文法GS的句型。若x仅由终结符号组成,即S x,xVT*,则称x为GS的句子。,3.1 文法和语言,编译原理与技术,14,3.1 文法和语言,对例3.1文法,存在直接推导序列v=0S100S11 000S111 00001111=w,即0S1 00001111,也可记作0S1 00001111。对例3.2文法,存在直
8、接推导序列 v=标识符 标识符数字 字母数字 x数字 x1=w,即标识符 x1,也可记作标识符 x1。S,0S1,000111都是例3.1的文法G的句型,其中000111是G的句子。标识符字母,字母数字,a1等都是例3.2文法G的句型,其中a1是G的句子。,编译原理与技术,15,3.1 文法和语言,例3.4:终结符号串(i*i+i)是文法 EE+E|E*E|(E)|i 的一个句子。因为有从开始符号E至终结符号串(i*i+i)的一个推导:E(E)(E+E)(E*E+E)(i*E+E)(i*i+E)(i*i+i)而E,(E),(E*E+E)等是文法的句型。,编译原理与技术,16,3.1 文法和语言
9、,定义3.4:若推导过程中每一步都是替换最左(右)边的非终结符,则称该推导为最左(右)推导。句型的最右推导称为规范推导,其逆过程最左归约称为规范归约。例3.5:文法GS:SAB AA0|1B B0|S1 给出句子101001的最左和最右推导。解:最左推导:S AB 1B B10B 10S1 10AB1 101BB1 1010B1 101001 最右推导:S AB AS1AAB1 AA01 A1B01 A1001 1B1001 101001,编译原理与技术,17,3.1 文法和语言,文法产生的语言 定义3.5:文法G的全部句子组成的集合称为G产生的语言,记为L(G),即 L(G)=x|S x,其
10、中S为开始符号,且xVT*例3.1的文法G1 的语言是L(G)=0n1n|n1。例3.2的文法G2的句子是字母打头的、由字母和数字组成的符号串,也就是程序设计语言中用于表示名字的标识符,因此产生的语言就是所有标识符的集合。,编译原理与技术,18,3.1 文法和语言,例3.6:考虑文法G1:S bA A aA|a 求它所定义的语言。解:从开始符S出发,可以推出如下句子:SbA ba SbA baA baa SbA baA baaA baaa 因此,文法G1产生以b开头、后面跟一个或多个a的所有符号串,从而L(G1)=ban|n1。,编译原理与技术,19,3.1 文法和语言,例3.7:设有文法G2
11、:S P|aPb P ba|bQa Q ab 求语言L(G2)。解:从开始符S出发,可以推出如下句子:SPba SP bQa baba SaPbabab SaPbabQabababab 文法G2共能产生4个句子,因此L(G2)=ba,baba,abab,ababab,编译原理与技术,20,3.1 文法和语言,例3.8:设G3=(VN,VT,P,S),VN=S,B,E,VT=a,b,e,P由下列产生式组成:(1)SaSBE(2)SaBE(3)EBBE(4)aBab(5)bBbb(6)bEbe(7)eEee 求语言L(G3)。解:L(G3)=anbnen|n1。,编译原理与技术,21,3.1 文法
12、和语言,语言的验证 一般来说,对“文法G产生语言L”的证明包括两部分:(1)证明由G产生的每个字符串都在L中。(2)证明L中的每个字符串都能由G产生。,编译原理与技术,22,3.1 文法和语言,例3.9:验证文法G1:S(S)S|产生语言L(G1)=配对的括号串的集合。证明:(1)按推导步数进行归纳证明:推出的是配对括号串 归纳基础:S 归纳假设:少于n步的推导都产生配对的括号串 归纳步骤:n步的最左推导如下S(S)S(x)S(x)y 其中x、y是配对的括号串,从而(x)y也是配对的 括号串,即n步的推导也产生配对的括号串。因此,由G1产生的每个字符串都是配对的括号串都在 L(G1)中。,编译
13、原理与技术,23,3.1 文法和语言,(2)按符号串的长度进行归纳证明:配对括号串可由S推出 归纳基础:S 归纳假设:长度小于2n的配对括号串都可以从S推导出来 归纳步骤:考虑长度为2n(n1)的w=(x)y,其中w、x、y 均为配对括号串,有S(S)S(x)S(x)y 即长度为2n的配对括号串都可以从S推导出来。因此,L(G1)中的每个字符串都能由G1产生。由(1)、(2)可知,文法G:S(S)S|产生语言L(G1)=配对的括号串的集合。,编译原理与技术,24,例3.10:验证文法G2:EE+aa 产生的语言是所有由若干个“+”分隔开的a 组成的符号串,即L(G2)=a,a+a,a+a+a,
14、a+a+a+a,.证明:(1)按a 的数目n归纳证明:每个符号串a+a+.+a L(G2)。归纳基础:因为Ea,所以Ea,aL(G2)。即n=1时成立。归纳假设:假设s=a+a+.+aL(G2),且有n-1个a,则存在 推导E s。归纳步骤:使用产生式EE+a一次,再利用归纳假设可得推 导:E E+a s+a。因此,s+aL(G2),其中 有n个a。因此,所有形如a+a+.+a的符号串在L(G2)中。,3.1 文法和语言,编译原理与技术,25,(2)按推导的长度n归纳证明:sL(G2)必满足格式a+a+.+a。归纳基础:推导的长度为1时,只能为E a,而a是满足格式。归纳假设:长度为n-1的推
15、导能推出满足格式a+a+.+a。归纳步骤:考虑长度为n1的推导E s。因为n 1,因此第一步 推导必然使用产生式EE+a,从而E E+a s+a=s,其中推导E s 长度为n-1,由归纳假设可知s 满足格式。因此,s=s+a 也满足格式a+a+.+a。因此,L(G2)中的所有符号串都满足格式a+a+.+a。由(1)、(2)可知,文法G2:EE+aa产生语言L(G2)=配对的括号串的集合。,3.1 文法和语言,编译原理与技术,26,3.1 文法和语言,语言的文法表达 由已知语言求其文法描述,实际上就是讨论语言中的句子,根据句子的特点利用层次分析的方法,构造相应的文法。构造过程中经常会用到下面形式
16、的产生式。右递归(right recursive)产生式:A aA|a 产生a+,A aA|产生a*左递归(left recursive)产生式:A Aa|a产生a+,A Aa|产生a*,编译原理与技术,27,3.1 文法和语言,例3.11:试构造语言L1=anbnci|n1,i0=ab,aabb,abc,aabbc,abcc,aabbcc,的文法。解:L1中符号串的特点是:串中含一个或多个a并置,可以看作含有a+形式;串中含一个或多个b并置,可以看作含有b+形式;串中含有0个或多个c,可以看作是c*形式。因此,该语言可以看作是a+、b+与c*的连接。使用A aA|a 可以产生a+,使用B b
17、B|b 可以产生b+,使用C cC|可以产生c*。而要表示它们的连接,只需将非终结符A、B、C连接起来即可。因此,满足要求的文法为G(Z):Z ABC A aA|a B bB|b C cC|,编译原理与技术,28,3.1 文法和语言,也可以使用左递归产生式,得到满足要求的另一个文法G(Z):Z ABC A Aa|a B Bb|b C cC|实际上,a+与b+的产生过程完全一致,可以将产生它们的产生式合并为A aAb|ab。则得到满足要求的另一个文法G(Z):Z AB A aAb|ab B cB|由此可以看出,已知语言求文法,文法不唯一,可以有不同的表达方法。,编译原理与技术,29,3.1 文法
18、和语言,例3.12:已知语言L2=x|xa,b,c*,且x是回文字=,aa,bb,cc,aba,aca,bab,bcb,cac,cbc,aabaa,,写出该语言的文法。解:L2中符号串的特点是:串中若包含符号,则以a开头必以a结束,以b开头必以b结束,串中符号对称出现。可以设计文法为 G(Z):Z aZa|bZb|cZc|a|b|c|。,编译原理与技术,30,3.1 文法和语言,分析树与语法树 分析树(parse tree)定义3.6:语法分析树用来描述句型的结构,是句型推导的一种树型表示,简称分析树。给定文法G=(VN,VT,P,S),对于G的任何句型都能构造相应的分析树,这棵树满足下列条件
19、:每个结点都有一个标记。根结点的标记是开始符号S;非叶结点 的标记是非终结符;叶结点的标记是终结符或非终结符或。如果一个非叶结点A有n个儿子结点,从左到右标记为A1,A2,Ak,则AA1A2Ak一定是P中的一个产生式。,编译原理与技术,31,3.1 文法和语言,例3.13:文法GS:S aAS|SA SbA|SS|ba 其句子aabbaa的语法分析树如图3.1所示。,图3.1 aabbaa的语法分析树,编译原理与技术,32,3.1 文法和语言,语法树表示了在推导过程中使用了哪个产生式和用在哪个非终结符上,它并没有表明施用产生式的顺序。比如例3.13中句子aabbaa的推导过程可以列举3个:推导
20、过程1:S aAS aAa aSbAa aSbbaa aabbaa 推导过程2:S aAS aSbAS aabAS aabbaS aabbaa 推导过程3:S aAS aSbAS aSbAa aabAa aabbaa,编译原理与技术,33,3.1 文法和语言,语法树(syntax tree)定义3.7:抽象语法树用来表示程序层次结构,它把分析树中对语义无关紧要的成分去掉,是分析树的抽象形式,简称语法树,也称语法结构树或结构树。语法树可看作分析树的浓缩,而分析树可看成具体语法树。,编译原理与技术,34,3.1 文法和语言,例3.14:条件语句产生式S if B-expr then S1 else
21、 S2的抽象语法树与语法分析树如图3.2所示。(a)语法树(b)分析树图3.2条件语句的语法树与分析树 抽象语法树中,操作符和关键字都不作为叶结点出现,而是作为内部结点。,编译原理与技术,35,3.1 文法和语言,例3.15:赋值语句产生式为赋值语句 i:=E,表达式的产生式为 E E+E|E*E|-E|id,则a:=b*-c+b*-c的语法树与分析树如图3.3所示。(a)语法树(b)分析树图3.3 赋值语句的语法树与分析树,编译原理与技术,36,3.2 文法和语言,文法的二义性 二义性文法 定义3.8:给定一个文法G,如果其产生的语言L(G)中存在存在某个句子对应两棵或两棵以上分析树,则称文
22、法G是二义性的。或者说,若一个文法中存在某个句子,它有两个或两个以上不同的最左(最右)推导,则该文法是二义的。,编译原理与技术,37,3.1 文法和语言,例3.16:对于简单表达式文法GE:EE+E|E-E|E*E|E/E|(E)|i 句子i*i+i有如下两个不同的最左推导,它们所对应的分析树如图3.4所示。因此该文法是二义性文法。推导一:E E+E E*E+E i*E+E i*i+E i*i+i 推导二:E E*E i*E i*E+E i*i+E i*i+i,(a)推导一的分析树(b)推导二的分析树图3.4 句子i*i+i两棵不同的分析树,编译原理与技术,38,3.1 文法和语言,注意文法二
23、义性和语言二义性的区别:这是两个不同的概念,因为可能有两个不同的文法G和G,其中G是二义的,但是却有L(G)=L(G),也就是说,这两个文法所产生的语言是相同的。如果产生上下文无关语言的每一个文法都是二义的,则说该语言是二义的。,编译原理与技术,39,3.1 文法和语言,文法二义性的消除 方法一:设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。这样的规则称作消除二义性规则(disambiguating rule)。其优点为:无需修改文法(可能会很复杂)就可消除二义性;其缺点为:语言的语法结构再也不能由文法单独提供。方法二:将文法改变成一个强制正确分析树的构造的格式
24、,就可以解决二义性。,编译原理与技术,40,3.1 文法和语言,为了消除例题3.16中简单表达式文法中的二义性,可以设置消除二义性规则,它建立了3个运算相互之间的优先关系。其标准解决办法是给予加法和减法相同的优先权,而乘法和除法则有高一级的优先权,并按惯例规定它们都服从左结合。这样句子i*i+i相当于(i*i)+i,它有惟一的分析树为图3.4(a)。,编译原理与技术,41,3.1 文法和语言,现在来看重写文法以消除二义性的方法。为了处理文法中的运算优先权问题,就必须把具有相同优先权的算符归纳在一组中,并为每一种优先权规定不同的规则。例如,将例3.11中文法分组为EE+E|E-E|TTT*T|T
25、/T|FF(E)|i 在这个文法中,加法和减法则被归在E规则下,乘法和除法被归在T规则下。由于T只能由E生成,这就意味着加法和减法在分析树和语法树中将被表现地“更高一些”(也就是更接近于根结点),因此它们的优先权就比乘法和除法低一级。这样将算符放在不同的优先权级别中的办法是在语法说明中使用BNF的一个标准方法。这种分组称作优先级联(precedence cascade)。,编译原理与技术,42,3.1 文法和语言,分组后的文法未指出算符的结合性而且仍有二义性。原因在于形如EE+E|E-E的产生式,它既是左递归又是右递归,若要得到符号串i+i-i,既可以先使用E+E再对第二个E使用E-E,也可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 技术 讲义

链接地址:https://www.31ppt.com/p-6599808.html