2023编译原理试卷.docx
《2023编译原理试卷.docx》由会员分享,可在线阅读,更多相关《2023编译原理试卷.docx(35页珍藏版)》请在课桌文档上搜索。
1、2023年编译原理试题1 .(10分)处于/*和*/之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。.(10分)为语言1.=ambn0 a LL,S LSprint(S.num)S.num := L.num +1S.num := 0L.num := L.num + S.numL.num := S.numS, S.depth := 0 SS L.depth := S.depth +1 (L)S a print(S.depth)L L.depth := L.depth Li, S.depth := L.depth SL S.depth := L.depth S5. t :
2、= initialt2 := finalif t t2 goto Ll v := tL2: stmtif v = t2 goto Ll v := v + 1goto L2LI:6 .由于实参表达式是反序进入活动记录,而局部变量是依次在活动记录中安排。7 .aa是静态外部变量,而bb是外部变量,它们都安排在静态数据区(由.data伪指令起先),但是bb由伪指令.globl指明为全局的,用来解决其它文件中对bb的外部引用,而aa只能由本文件引用。CC是静态局部变量,同aa和bb一样,它的生存期是整个程序并安排在静态数据区。由于CC在源程序中的作用域是函数fmc的体,而在目标文件中,它的作用域至少已
3、是整个文件了,为避开同源文件中外部变量和其它函数的静态局部变量的名字冲突,所以要对它进行改名,成了cc.2o由于CC不是全局的,因此cc.2前面没有伪指令.gkbldd是自动变量,其作用域是函数func的体,其生存期是该函数激活期间,因此它安排在栈区,并且置初值是用运行时的赋值来实现。8 .例如联合体的类型检查一般也不行能在编译时完成,虽然下面例子是可静态推断类型错误的。unionUintu1;int*u2;u;int*p;u.u1=10;p=u.u2;*p=0;9.修改源码SA的代码生成部分,让它产生B机器的代码,称结果程序为SBQ将以提交给Ca进行编译,得到一个可执行程序。将S提交给上述可
4、执行程序进行编译,得到所需的编译器CC5。10.第一个表达式在执行外2.。+历+2)3时出现参数个数不足的状况,因此有FUNVAL的值进入栈顶,然后发觉参数个数不足,又把它做成FANVAL的状况。而其次个表达式执行的是QyzG+y)+z)35,不会出现参数个数不足的状况。因此其次个表达式的执行效率比第一个表达式的高。2023年编译原理试题1 .(20分)写出字母表=a,b上语言L=卬IW中a的个数是偶数的正规式,并画出接受该语言的最简DFAo2 .(15分)考虑下面的表达式文法,它包括数组访问、加和赋值:EEEIEEIE=EI(E)Iid该文法是二义的。请写一个接受同样语言的LR(I)文法,其
5、优先级从高到低依次是数组访问、加和赋值,并且加运算是左结合,赋值是右结合。3 .(10分)下面是产生字母表=0,1,2上数字串的一个文法:SDSD2D01写一个语法制导定义,它打印一个句子是否为回文数(一个数字串,从左向右读和从右向左读都一样时,称它为回文数)。4 .(10分)教材上7.2.1节的翻译方案PToffset:=0)DDD;DDid:Tenter(id.name,T.type,ojfset)offset:二offset+T.widthTintegerT.type:=integer;T.width:=47realT.type:=real;T.width:=8运用了变量offset.请
6、重写该翻译方案,它完成同样的事情,但只运用文法符号的属性,而不运用变量。5. (5分)一个C语言程序如下:voidfun(structinix;doubler;val)main()(structintx;doubler;val;fun(val);)该程序在X86Linux机器上的用cc吩咐编译时,报告的错误信息如下:1: warning:structuredefinedinsideparms2: warning:anonymousstructdeclaredinsideparameterlist3: warning:itsscopeisonlythisdefinitionordeclarati
7、on,4: warning:whichisprobablynotwhatyouwant.7: incompatibletypeforargument1offun,请问,报告最终一行的错误的缘由是什么?如何修改程序,使得编译时不再出现这个错误信息。6. (10分)一个C语言程序如下:typedefstruct_ashorti;shortj;shortk;a;typedefstruct_blongi;shortk;b;main()printf(,Sizeofshort,long,aandb=%d,%d,%d,%dn,sizeof(short),sizeof(long),sizeof(a),size
8、of(b);)该程序在X86Linux机器上的运行结果如下:Sizeofshort,long,aandb=2,4,6,8已知Short类型和IOng类型分别对齐到2的倍数和4的倍数。试问,为什么类型b的size会等于8?7. (15分)一个C语言程序如下:intfact(i)inti;(if(i=0)return1;elsereturni*fact(i-l);main()(printf(%dn,fact(5);printf(,%dn,fact(5,10,15);printf(,%dnfact(5.0);printf(%dn,fact();)该程序在X86Linux机器上的运行结果如下:1201
9、201Segmentationfault(coredumped)请说明下面问题: 其次个fact调用:结果为什么没有受参数过多的影响? 第三个fact调用:为什么用浮点数5.0作为参数时结果变成1? 第四个fact调用:为什么没有供应参数时会出现Segmentationfault?8. (5分)C语言的赋值操作并非仅对简洁类型而言,例如若有类型声明longa100,b100;,则赋值a=b是允许的。同样,若a和b是同一类型的两个结构,则赋值a=b也是允许的。用教材上第七章所给出的三地址语句,我们能否为这种赋值产生中间代码?若你持确定看法,请你给出对应这种赋值的中间代码序列;否则请你为这种赋值设
10、计一种三地址语句。你所选用或设计的三地址语句要便于目标代码的生成。9. (5分)一个C程序的三个文件的内容如下:head.h:shortinta=10;filel.c:#includehead.hmain()file2.c:includehead.h在X86Linux机器上的编译吩咐如下:ccflel.cfile2.c编译结果报错的主要信息如下:multipledefinitionofta,试分析为什么会报这样的错误。10. (5分)依据教材上介绍的方法,把下面C+语言的函数翻译成C的函数。voidzoom(GraphicalObj&obj,doublezoom_faclor,Point Di
11、 Si D2S2D0D 1print(S.val)S.val=(D.val=D2.val)andS.valS.val=trueD.val=0D.val=14 .文法符号D的属性offset是继承属性,代表在分析D前原来运用的变量offset的大小;属性offset!是综合属性,代表在分析D后原来运用的变量offset的大小。P的属性offset是综合属性,记录该过程所安排的空间。PD.ojfset:=0DP,offset:=D.offset!DfD.ojfset:=D.offset1D;D2.0jfset:=D.offset!D2D.offset!:=Di.offset!)id:Tenter(
12、id.name,T.type,Doffseil);D.offset2:=D.offseti+T.widthTintegerT.type:=integer,T.width:=4J7realT.type:=real,T.width:=85 .C语言对全部的类型都采纳结构等价,唯有结构类型例外,采纳名字等价。这里的类型不相容是因为两个val不是名字等价的。要消退这个错误,包括全部的警告,程序修改如下:structsintx;doubler;);voidfun(structsval)main()structsval;fun(val);6 .一个数组的SiZe等于数组元素的SiZe乘以数组元素的个数,这
13、是一个原则。对于结构类型b来说,它的一个变量只需6个字节就够了。假如声明结构类型b的一个数组,有两种可能:(a)结构类型b的SiZe是6,数组元素之间空两个字节,以保证每个数组元素的地址都是4的倍数(因为第一个域i的类型是Iong,要求对齐到4的倍数)。(b)结构类型b的SiZe是8,以保证它作为数组元素的类型时,数组元素之间不用再考虑对齐问题。方法(a)违反了我们一起先提到的原则,因此只能取方法(b)o7 .(1)参数表达式逆序计算并进栈,fact能够取到第一个参数。(2)参数5.0转换成双精度数进栈,占8个字节。它低地址的4个字节看成整数时正好是0。(3)由于没有供应参数,fact把老eb
14、p(限制链)(main的活动记录中保存的ebp)当成参数,它确定是一个很大的整数,使得活动记录栈溢出。8 .教材上的中间代码有形如X:=y的复写语句,用它就可以了。但是生成目标代码时,必需考虑X和y的类型。若X和y不是简洁类型,则应当依据它们类型的size,产生一连串的值传送指令。9 .由于file1.c和file2.c两个文件都包含文件head.h,而head.h中有shortinta=10,因此该程序有两个a的强符号定义。10 .依据教材上介绍的方法,函数的翻译结果如下:voidzoom(GraphicalObj&obj,doublezoom-faclor,Point¢er)obj
15、.vptr01(obj,-center.x,-center.y);/将中心点移至原点(0,0)obj.vptrl(obj,zoom_factor);/缩放I2023年编译原理试题1. (20分)写出字母表=a,b上语言L=w卬的最终两个字母是44或协的正规式,并画出接受该语言的最简DFA。2. (15分)说明下面的文法不是SLR(I)文法,并重写一个等价的SLR(I)文法。SMabMcdcbdaMd3. (10分)为下面的语言写一个无二义的文法:ML语言中用分号分隔语句的语句块,例如:(s;s);(s;s;s);s);(s;s)4. (20分)考虑一个类PaSCal的语言,其中全部的变量都是整
16、型(不须要显式声明),并且仅包含赋值语句、读语句、写语句,条件语句和循环语句。下面的产生式定义了该语言的语法(其中Iit表示整型常量;OP的产生式没有给出,因为它和下面探讨的问题无关)。定义Stmt的两个属性:Ma)Qef表示它可能定值的变量集合,MayUse表示它可能引用的变量集合。(1)写一个语法制导定义或翻译方案,它计算Stmt的MayDefMayUse属性。(2)基于MoyEW和MayUse属性,说明Stmt;Stmt2和Stmt2;Stmtl在什么状况下有同样的语义。ProgramStmtStmtid:=ExpStmtread(id)Stmtwrite(Exp)StmtStmt;St
17、mtStmtif(Exp)thenbeginStmtendelsebeginStmtendStmtwhile(Exp)dobeginStmtendExpidExplitExpExpOPExp5. (10分)下面是一个C语言程序:main()(longi;longa04;IOngj;1 =4;j=8;Printfr%d,%dn,SiZeof(a),a00);)虽然出现IOnga04这样的声明,在X86Linux机器上该程序还是能通过编译并生成目标代码。请回答下面两个问题:(I)SiZeof(a)的值是多少,请说明理由。2 2)a0110的值是多少,请说明理由。6. (15分)考虑下面的三地址语句
18、序列:b:=1b:=2ifw=XgotoL2e:=bgotoL21.I:gotoL31.2:c:=3b:=4c:=61.3:ify=zgotoL4gotoL51.4:g:=g+1h:=8gotoLl1.5:h:=9(1)在该代码中用水平的横线将代码分成基本块,并给每个基本块一个序号。(2)画出该代码的限制流图,每个基本块就用(1)的序号表示。(3)若有循环的话,列出构成每个循环的结点。7. (5分)假如(1)用编译吩咐CCteSLC会报告有未定义的符号;(2)用编译吩咐cctest.c-lusr.a会得到可执行程序(-lusr.a表示连接库libusr.a)0那么,用编译吩咐cctest.c-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 编译 原理 试卷

链接地址:https://www.desk33.com/p-452328.html