第5章 语法制导翻译和中间代码生成习题PPT课件_第1页
第5章 语法制导翻译和中间代码生成习题PPT课件_第2页
第5章 语法制导翻译和中间代码生成习题PPT课件_第3页
第5章 语法制导翻译和中间代码生成习题PPT课件_第4页
第5章 语法制导翻译和中间代码生成习题PPT课件_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,第五章语法制导翻译与中间代码生成,典型习题,.,2,第五章语法制导翻译与中间代码生成,1、为文法:S(L)|aLL,S|S(a)写一个翻译方案,它输出配对括号的个数。如对于句子(a,(a,a),输出结果为2。(b)写一个翻译方案,它输出配对括号的最大嵌套深度。如对于句子(a,(a,a),输出结果为2。(c)写一个翻译方案,它输出每个a的嵌套深度。例如:对于句子(a,(a,a),输出的结果是122。(d)写一个翻译方案,它打印出每个a在句子中是第几个字符。例如:当句子是(a,(a,(a,a),(a)时,打印的结果是2581014。,.,3,第五章语法制导翻译与中间代码生成,S(L)|aLL,S|S,(a)写一个翻译方案,它输出配对括号的个数。如对于句子(a,(a,a),输出结果为2。,根据输出配对括号个数的要求,从下到上分析每条规则可知:当采用规则LS进行归约时,L中的括号对数等于S中的括号对数;当采用规则LL1,S进行归约时,L1与S用“,”连接,因此L中的括号对数等于S中的括号对数与L1中的括号对数之和;当采用规则Sa进行归约时,S中的括号对数等于0;当采用规则S(L)进行归约时,S中的括号对数等于L中的括号对数加1;为输出总的括号对数,需对原文法进行拓广,增加一条文法规则:SS,对应的语义规则为输出总的括号对数。根据上述分析,为S和L引入属性num(表示括号对数),可写出每条规则的语义动作如下:,.,4,第五章语法制导翻译与中间代码生成,SSprint(S.num)S(L)S.num=L.num+1SaS.num=0LL1,SL.num=L1.num+S.numLSL.num=S.num,S(L)|aLL,S|S,(a)写一个翻译方案,它输出配对括号的个数。如对于句子(a,(a,a),输出结果为2。,.,5,第五章语法制导翻译与中间代码生成,SSprint(S.num)S(L)S.num=L.num+1SaS.num=0LL1,SL.num=max(L1.num,S.num)LSL.num=S.num,S(L)|aLL,S|S,(b)写一个翻译方案,它输出配对括号的最大嵌套深度。如对于句子(a,(a,a),输出结果为2。,.,6,第五章语法制导翻译与中间代码生成,SS.depth=0SSL.depth=S.depth+1(L)Saprint(S.depth)LL1.depth=L.depthL1,S.depth=L.depthSLS.depth=L.depthS,S(L)|aLL,S|S,(c)写一个翻译方案,它输出每个a的嵌套深度。例如:对于句子(a,(a,a),输出的结果是122。,由于a的嵌套深度不是由a本身能决定的,所以一定要用继承属性。用继承属性depth表示嵌套深度,所求的翻译方案如下:,.,7,第五章语法制导翻译与中间代码生成,SS.in=0SSL.in=S.in+1(L)S.out=L.out+1SaS.out=S.in+1;print(S.out)LL1.in=L.inL1,S.in=L1.out+1SL.out=S.outLS.in=L.inSL.out=S.out,S(L)|aLL,S|S,(d)写一个翻译方案,它打印出每个a在句子中是第几个字符。例如:当句子是(a,(a,(a,a),(a)时,打印的结果是2581014。,为文法符号S和L分别定义一个继承属性in和一个综合属性out,分别表示在句子中,该文法符号推出的字符序列的前面有多少个字符,和该文法符号推出的字符序列的最后一个字符在句子中是第几个字符。所求的翻译方案如下:,.,8,第五章语法制导翻译与中间代码生成,SS.in=0SSL.in=S.in+1(L)S.total=L.total+2SaS.total=1;print(S.in+1)LL1.in=L.inL1,S.in=L.in+L1.total+1SL.total=L1.total+1+S.totalLS.in=L.inSL.total=S.total,S(L)|aLL,S|S,(d)写一个翻译方案,它打印出每个a在句子中是第几个字符。例如:当句子是(a,(a,(a,a),(a)时,打印的结果是2581014。,为文法符号S和L分别定义一个继承属性in和一个综合属性total,分别表示在句子中,该文法符号推出的字符序列的前面有多少个字符,和该文法符号推出的字符总数(即:out=in+total)。所求的翻译方案如下:,.,9,第五章语法制导翻译与中间代码生成,2、给出下列文法的适合自底向上翻译的语义动作,使得当输入串是acb时,其输出串是102。SaAScASb,print“1”,print“0”,print“2”,.,10,第五章语法制导翻译与中间代码生成,3、文法GS及相应的翻译方案如下:SbAbprint“1”AcBprint“2”Aaprint“3”BAadprint“4”当输入串是bcaadb时,该翻译方案的输出是多少?,3421,.,11,第五章语法制导翻译与中间代码生成,4、文法GS如下:SS(S)S试写出一个语法制导定义,它对输入符号串翻译的结果是输出配对的括号个数。,为S引入一个综合属性num,用以表示该文法符号所表示的语法成分中配对的括号数。首先将文法扩展,并设计语法制导的语义动作为:,SSprint(S.num)SS1(S2)S.num=S1.num+S2.num+1SS.num=0,.,12,第五章语法制导翻译与中间代码生成,5、有一语法制导翻译方法如下:其中“+”表示符号连接运算:SBprint(B.reverse)BaB.reverse=aBbB.reverse=bBBaB.reverse=a+B.reverseBBbB.reverse=b+B.reverse若输入符号串abab,则采用自底向上语法分析方法时,输出为什么?,baba,.,13,第五章语法制导翻译与中间代码生成,6、给出文法GS的语法制导定义,功能是统计句子中a和b的个数。GS:SaBS|bAS|BaBB|bAbAA|a,S、A、B均是由a和b组成的字符串,所以分别为S、A、B引入两个记录a和b个数的属性num_a和num_b,将文法拓广后的语法制导定义为:SSprint(S.num_a);print(S.num_b)SaBS1S.num_a=1+B.num_a+S1.num_a;S.num_b=B.num_b+S1.num_bSbAS1S.num_a=A.num_a+S1.num_a;S.num_b=1+A.num_b+S1.num_bSS.num_a=0;S.num_b=0BaB1B2B.num_a=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论