欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    《编译原理》课后复习题集.docx

    • 资源ID:7016951       资源大小:101.46KB        全文页数:25页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《编译原理》课后复习题集.docx

    编译原理复习题集I .名词解释短语句柄文法上下文无关文法(1)文法1.R(1)文法语法分析无环路有向图(DAG)后缀式语法制导翻译遍局部优化词法分析语法分析语义分析源语言源程序目标语言中间语言(中间表示)2.简答题(1)编译程序和高级语言有什么区别?(2)编译程序的工作分为那几个阶段?(3)简述自下而上的分析方法。(4)目标代码有哪几种形式?生成目标代码时通常应考虑哪几个问题?(5)何谓优化?按所涉及的程序范围可分为哪几级优化?(6)简述代码优化的目的和意义。3 .叙述下面的正规式描述的语言,并画出接受该语言的最简DFA的状态转换图。(1Ol)*0*4 .PaSCaI语言无符号数的正规定义如下:numdigit*(.digit*)?(E(+-)?digit*)?其中digit表示数字,用状态转换图表示接受无符号数的确定有限自动机。5 .画出PaSCaI中实数(不带正负号,可带指数部分)的状态转换图。6 .用状态转换图表示接收(ab)aa的确定的有限自动机。7 .处于/*和*/之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。8 .某操作系统下合法的文件名为device:name,extension其中第一部分(device:)和第三部分(.extension)可缺省,device,name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的确定有限自动机。9 .构造一个DFA,它接受0,1上0和1的个数都是偶数的字符串。10 .设有非确定的有自限动机NFAM=(A,B,C,0,1,A,C),其中:(A,0)=C(A,1)=A,B(B,1)=C(C,l)=Co请画出状态转换距阵和状态转换图。11 .设La,b,c*是满足下述条件的符号串构成的语言:(1)若出现a,则其后至少紧跟两个C;(2)若出现b,其后至少紧跟一个cO试构造识别L的最小化的DFA,并给出描述L的正规表达式。12 .写出字母表=a,b上语言L=wW的最后两个字母是aa或bb的正规式,并画出接受该语言的最简DFA。13 .有穷自动机M接受字母表E=0,1上所有满足下述条件的串:串中至少包含两个连续的0或两个连续的1。请写出与M等价的正规式。14 .有正规式b*abb*(abb*)*,(1)构造该正规式所对应的NFA(画出状态转换图)。(2)将所求的NFA确定化(画出确定化的状态转换图)。(3)将所求的NFA最小化.(画出最小化后的状态转换图)。15 .求出下列文法所产生语言对应的正规式.SbSIaAAaAlbBBaAbCbCbSIaA16 .给出与下图的NFA等价的正规式。17.把下面的NFA确定化。18.下面两个文法中哪一个不是LR 那个有移进一归约冲突的规范的LR(1)文法?对非LR (1)的那个文法。给出 (1)项目集。S aAc S aAc19.将下面的DFA化20.为语言w (ab)*并且在W的任何前缀中,a的个数不少于b的个数写一个LR(1)文法,不准超过6个产生式。21 .写一个文法,使其语言是奇数集,且每个奇数不以0开头。22 .考查文法G(s):Sf(T)TT,SS(1)消除文法的左递归;提取公共左因子;对每个非终结符,写出不带回朔的递归子程序。23 .设文法G(三):Sf(L)IaSIa1.-*L,SS(1)消除左递归和回溯;(2)计算每个非终结符的FIRST和FOLLOW;(3)构造预测分析表。24 .消除下列文法的左递归.SSaPlSflPPQbPQQcSdIe25 .已知文法G:AaABe|aBBbd给出与上述文法等价的LL(I)文法G,O26 .已知文法GA:AfaABaBfBbld(1)构造与GA等价的LL(D文法;(2)构造G,A的预测分析表。27 .程序的文法如下:DD;Did:Tprocid;D;S(1)写一个语法制导定义,打印该程序一共声明了多少个id。(2)写一个翻译方案,打印该程序每个变量id的嵌套深度。28 .构造下面文法的LL(1)分析表。DTLTintireal1.idRR,idR29 .考虑下文法:DTVTintIfloatVid,V!ida.在该文法中提取左公因子。b.为所得文法的非终结符构造First和Follow集合。c.说明所得的文法是LL(I)文法。d.为所得文法构造LL(I)分析表。e.假设有输入串intX,y,z写出相应LL(I)分析程序的动作。30.说明如下文法是否是LL(1)文法,若不是,将其转换为LL(1)文法。最后给出该文法的LL(1)分析表。ABeBBbaP-*beginXYendXfXd;X-*d;Y-Y;SYfS(1)该文法含有左递归吗?若有,消除它。(2)改造后的文法是LL(I)文法吗?若是,给出其预测分析表。(3)写出句子begind;send的分析过程。32 .已给文法GS:SfSaPSfIPPfqbPq将GS改造成LL(1)文法,并给出LL(1)分析表。33 .设文法G(三):Sf(L)IaSIa1.-L,SS(1)消除左递归和回溯;(2)计算每个非终结符的FIRST和FOLLOW;(3)构造预测分析表。34 .给定文法GS:SfAadbjBbIdBaA-*cBfC构造文法GS的LR(1)分析表。SfalAl(T)T->T,SS写出句子(a,a),a)的规范归约过程及每一步的句柄。36 .已知文法G(E)E-TE+TT-FT*FFf(E)Ii给出句型(T*F+i)的最右推导及画出语法树;37 .说明下面的文法不是SLR(I)文法,并重写一个等价的SLR(I)文法。SMabMCdCbdaMdS,SSMabMc!dcbdaMdS,SSfMaSb.Mc|S.bMcbaS.ad-Sbd.a,S>b.daSt.deM.dMfdS->.bdaM9.d因为a是M的后继符号之一,因此在上面最右边一个项目集中有移进归约冲突。等价的SLR(I)文法是SdabdcIdebda38 .在PASCAL语言中,简单类型的变量的声明例举如下:m,n:integerp,q,r:real为这样的声明写一个LR(1)文法(为简单起见,变量标识符都用id表示),并根据你的文法写一个语法制导定义(或叫做为你的文法加上语义动作),它将变量的类型填入符号表。.一个非LR(1)的文法如下:1.MLbaM请给出所有有移进一归约冲突的LR(1)项目集,以说明该文法确实不是LR(1)的。39 .若有文法G(三)的产生式如下:SL=RSR1.*R1.iRL,构造识别所有项目集规范族的DFA.,判断该文法是否是SLR(I)文法,说明理由。40 .现有句型b1和产生式Ab,分别指出LL(1)方法和LR(1)方法在扫描到此句型的什么位置决定用此产生式?41 .为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零还是小于零)记录在属性E.sign中(属性值分别用POS或NEG表示)。你可以假定所有的整数都不为零,这样就不用担心零的符号。EE*E+EEunsigned_integer42 .一个文法如下:S(三)Sa请给出该文法中对活前缀(有效的LR(1)项目。43 .为下面文法添加语义规则(或叫动作子程序),输出S产生的二进制数的值,如输入是IOl时,输出5。SSSSBBBOil44 .写出表达式(a+b*c)(a+b)-d的逆波兰表示及三元式序列。45 .把表达式-(a+b)*(c+d)+(a+b+c)翻译成三地址码序列。46 .设布尔表达式的文法为E-*EiE2EfEE2Ei假定它们将用于条件控制语句中,请(1)改写文法,使之适合进行语法制导翻译;(2)写出改写后的每个产生式的语义动作。47 .将语句if(A<XB>0)while(OO)C=C+D;翻译成三地址码序列。48 .设有基本块如下:T1=S+RT2=3T3=12/T2T4=SRA=T1-T4T5=S+RB=T5T6=T5*T3B=T6(1)画出中间代码的流图;(2)设A、B是出基本块后的活跃变量,清给出优化后的三地址码序列。49 .设已构造出文法G(三):(1) SBB(2) BaB(3) Bb的LR分析表如下ACTIONGOTO状态ab#SB0s3s4121acc2s6s753s3s484r3r35rl6s6s797r38r2r29r2假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)O50 .给出活动记录空间结构。并给出各部分的存储对象。51 .将下面程序段翻译成四元式序列。while(A<CB<D)if(A=DC=C+1;elsewhile(A<D)A=A+2;)52 .有一语法制导翻译如下所示:SfbAbprint(alw)Af(BPrint(“2”)A-*aPrint("3")BfAa)Print("4”)若对输入序列b(aa)a)a)b进行自底向上分析,请写出输出序列。53 .画出IFa>0THENx:=x+lELSEx:=4*(-1)的翻译方案图。54 .下面是一个C语言程序:main()(longi;longa04;longj;1 =4;j=8;printf(%d,%dnv,sizeof(a),a00);虽然出现longa04这样的声明,在X86Linux机器上该程序还是能通过编译并生成目标代码。请回答下面两个问题:(I)SiZeOf(a)的值是多少,请说明理由。(2)a00的值是多少,请说明理由。(1)按照数组SiZe的计算公式,SiZec)f(a)的值一定是0。(2)a00的值是4。虽然a的SiZe是0,但它仍然有起始地址,并且a00的地址等于a的起始地址。由于X86Linux机器上,活动记录栈向低地址方向增长,另外由于低地址放低位字节,因此a00的地址和i的地址一致,其值和i的值一样,等于4。56 .将下面的条件语句表示成三地址码序列:if(a>b)x=a+b*c;elsex=b-a;57 .考虑下面的三地址语句序列:b:=1b:=2ifw<=XgotoL2e:=bgotoL21.l:gotoL31.2:c:=3b:=4c:=61.3:ify<=zgotoL4gotoL51.4:g:=g+1h:=8gotoLl1.5:h:=9(1)在该代码中用水平的横线将代码分成基本块,并给每个基本块一个序号。(2)画出该代码的控制流图,每个基本块就用(1)的序号表示。(3)若有循环的话,列出构成每个循环的结点。(1)(2)b:=2ifw<=XgotoL2(1)e:=bgotoL2(2)1.I:gotoL3(3)1.2:c:=3b:=4c:=6(4)1.3:ify<=zgotoL4(5)gotoL5(6)1.4:g:=g+1h:=8gotoLl(7)1.5:h:=9(8)(3)结点5、7和3构成一个循环,其中5是入口结点。58 .一个C语言程序如下:func(i1,i2,i3)longil,i2,i3;(longjl,j2,j3;printf(zzAddressesofil,i2,i3=%o,%o,%onz,&il,&i2,&i3);printf(,Addressesofjl,j2,j3=%o,%o,%onz,&jl,&j2,&j3);)main()(longil,i2,i3;func(il,i2,i3);该程序在SUN工作站上的运行结果如下:Addressesofil,i2,i3=35777773634,35777773640,35777773644Addressesofjl,j2,j3=35777773524,35777773520,35777773514从上面的结果可以看出,func函数的3个形式参数的地址依次升高,而3个局部变量的地址依次降低。试说明为什么会有这个区别。由于实参表达式是反序进入活动记录,而局部变最是顺序在活动记录中分配。59 .一个C语言程序如下:voidfun(structintx;doubler;val)main()(structintx;doubler;val;fun(val);)该程序在X86Linux机器上的用cc命令编译时,报告的错误信息如下:1: warning:structuredefinedinsideparms1:warning:anonymousstructdeclaredinsideparameterlist1:warning:itsscopeisonlythisdefinitionordeclaration,1:warning:whichisprobablynotwhatyouwant.7: incompatibletypeforargument1of'fun'请问,报告最后一行的错误的原因是什么?如何修改程序,使得编译时不再出现这个错误信息。60. 一个C语言程序如下:main()(func();printf(zzReturnfromfuncn");)func()chars4;strcpy(s,z,12345678z/);printf(,z%sn,s);)该程序在PC机IinUX操作系统上的运行结果如下:12345678Segmentationfault(coredumped)试分析为什么会出现这样的运行错误。61. 一个C语言函数如下:func(i)longi;(longj;j=i-l;func(j);)该函数在PC机IinUX操作系统上编译生成的汇编代码如下:.file"stack.cgcc2_compiled.:gnucompiledc:.text.align2.globl_func.type_func,©functionfunc:pushl%ebpmovl%esp,%ebpsubl$4,%espmovl8(%ebp),%edxdeci%edxmovl%edx,-4(%ebp)movl-4(%ebp),%eaxpushl%eaxcall_funcaddl$4,%esp1.I:leaveret1.fel:.size_func,Lfel-_func试画出该函数的一个活动记录的内容,包括活动记录的每个单元存放什么东西、执行movl8(%ebp),%edx指令时栈顶指针所指的的位置、与活动记录有关的另一个指针所指的位置和地址增长方向。62. 一个C语言的函数如下:func(c,1)charc;long1;func(c,1);在X86Linux机器上编译生成的汇编代码如下:.file"parameter,c.version01.01gcc2_compiled.:.text.align4.globlfunc.typefunc,©functionfunc:push1%ebp将老的基地址指针压栈movl%esp,%ebp将当前栈顶指针作为基地址指针subl$4,%esp分配空间movl8(%ebp),%eaxmovb%al,-1(%ebp)movl12(%ebp),%eaxpushl%eaxmovsbl-1(%ebp),%eaxpushl%eaxcallfuncaddl$8,%esp.L1:leave和下一条指令一起完成恢复老的基地址指针,将栈顶ret指针恢复到调用前参数压栈后的位置,并返回调用者.Lfel:.sizefunc,.Lfel-func.ident"GCC:(GNU)egcs-2.91.6619990314/Linux(egcs-l.1.2release),(a)请指出对应源程序第5行的函数调用func(c,1)的汇编指令是哪几条。(b)请说明字符型参数和长整型参数在参数传递和存储分配方面有什么区别。(小于长整型size的整型参数的处理方式和字符型参数的处理方式是一样的。)63. 一个C语言程序及其在某种机器IinUX操作系统上的编译结果如下。根据所生成的汇编程序来解释程序中四个变量的作用域、生存期和置初值方式等方面的区别。staticlongaa=10;shortbb=20;func()(staticlongcc=30;shortdd=40;编译生成的汇编代码如下:.file"static.c.version01.01gcc2compiled.:.data.align4.typeaa,©object.sizeaa,4aa:.long10.globlbb.align2.typebb,©object.sizebb,2bb:.value20.align4.typecc.2,©objectsizecc.2,4cc.2:.long30.text.align4.globlfunc.typefunc,©functionfunc:pushl%ebpmovl%esp,%ebpsubl$4,%espmovw$40,-2(%ebp).L1:leaveret.Lfel:.sizefunc,.Lfel-func.ident"GCC:(GNU)egcs-2.91.6619990314/Linux(egcs-l.1.2release),aa是静态外部变量,而bb是外部变量,它们都分配在静态数据区(由.data伪指令开始),但是bb由伪指令.globl指明为全局的,用来解决其它文件中对bb的外部引用,而aa只能由本文件引用。CC是静态局部变量,同aa和bb一样,它的生存期是整个程序并分配在静态数据区。由于CC在源程序中的作用域是函数func的体,而在目标文件中,它的作用域至少已是整个文件了,为避免同源文件中外部变量和其它函数的静态局部变量的名字冲突,所以要对它进行改名,成了CC.2。由于CC不是全局的,因此cc.2前面没有伪指令.g】obl。dd是自动变量,其作用域是函数func的体,其生存期是该函数激活期间,因此它分配在栈区,并且置初值是用运行时的赋值来实现。64. C语言是一种类型语言,但它不是强类型语言,因为编译时的类型检查不能保证所接受的程序没有运行时的类型错误。例如,编译时的类型检查一般不能保证运行时没有数组越界。请你再举一个这样的例子说明C语言不是强类型语言。例如联合体的类型检杳一般也不可能在编译时完成,虽然下面例子是可静态判断类型错误的。unionUintul;int*u2;u;intp;u.ul=10;P=u.u2;P=0;65 .下面程序在SUN工作站上运行时陷入死循环,试说明原因。如果将第8行的long*p改成short*p,并且将第23行longk改成shortk后,loop中的循环体执行一次便停止了。试说明原因。main()addr();IoopO;long*p;loop()(longi,j;J=O;for(i=0;i<10;i+÷)(*p)-;j+;)addr()(longk;k=0;P二&k;)66 .下面程序的结果是120。但是如果把第10行的abs(l)改成1的话,则程序结果是1,试分析为什么会有这不同的结果。intfact()staticinti=5;if(i=0)return(1);elsei=i-l;return(i+abs(1)*fact();)main()(printf(,zfactorof5=%dn,fact();)67 .一个C语言函数如下:main()(inti,j,k;i=5;j=l;while(j<100)k=i+l;j=j÷k;)经优化编译后,生成的代码如下:.fileoptimize,cffgcc2_compiled.:gnu_compiled_c:.text.align2.globl_func.type_func,©function_func:pushl%ebpmovl%esp,%ebpmovl$1,%eaxmovl$6,%edx.align2,0x901.4:addl%edx,%eaxcmpl$99,%eaxJleL4leaveret1.fel:.size_func,Lfel-_func试说明编译器对这个程序作了哪些种类的优化(只需要说复写传播、删除公共子表达式等,不需要说怎样完成这些优化的)。68 .对下面的流程图,假定各基本块出口之后的活跃变量均为a、b、f,循环中可用作固定的寄存器为RO、Rl,则将RO、RI固定分配给循环中哪两个变量,可使执行代价节省得最多?写出分析过程。69 .PaSCal语言的repeat-Until语句的语法形式为SrepeatSIuntilE其语义解释为:请按如下要求构造该语句的翻译模式:(1)写出适合语法制导翻译的产生式;(2)写出每个产生式对应的语义动作。

    注意事项

    本文(《编译原理》课后复习题集.docx)为本站会员(李司机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开