2001编译原理试卷.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:35 大小:293KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

2001编译原理试卷.doc

2001编译原理试卷.doc

预览

免费试读已结束,剩余 25 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

2001年编译原理试题1.(10分)处于/*和*/之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。2.(10分)为语言L={ambn|0m2n}(即a的个数不超过b的个数的两倍)写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。)3.(10分)构造下面文法的LL(1)分析表。DTLTint|realLidRR,idR|4.(15分)就下面文法S(L)|aLLS|S给出一个语法制导定义,它输出配对括号的个数。给出一个翻译方案,它输出每个a的嵌套深度。如句子(a,(a,a)),第一小题的输出是2,第二小题的输出是122。5.(10分)Pascal语言for语句的含义见教材习题7.13。请为该语句设计一种合理的中间代码结构。你可以按图7.17的方式或者图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。6.(5分)一个C语言程序如下:func(i1,i2,i3)longi1,i2,i3;{longj1,j2,j3;printf("Addressesofi1,i2,i3=%o,%o,%o\n",&i1,&i2,&i3);printf("Addressesofj1,j2,j3=%o,%o,%o\n",&j1,&j2,&j3);}main(){longi1,i2,i3;func(i1,i2,i3);}该程序在某种机器的Linux上的运行结果如下:Addressesofi1,i2,i3=27777775460,27777775464,27777775470Addressesofj1,j2,j3=27777775444,27777775440,27777775434从上面的结果可以看出,func函数的3个形式参数的地址依次升高,而3个局部变量的地址依次降低。试说明为什么会有这个区别。7.(15分)一个C语言程序及其在某种机器linux操作系统上的编译结果如下。根据所生成的汇编程序来解释程序中四个变量的作用域、生存期和置初值方式等方面的区别。staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}.file"static.c".version"01.01"gcc2_compiled.:.data.align4.typeaa,@object.sizeaa,4aa:.long10.globlbb.align2.typebb,@object.sizebb,2bb:.value20.align4.typecc.2,@object.sizecc.2,4cc.2:.long30.text.align4.globlfunc.typefunc,@functionfunc:pushl%ebpmovl%esp,%ebpsubl$4,%espmovw$40,-2(%ebp).L1:leaveret.Lfe1:.sizefunc,.Lfe1-func.ident"GCC:(GNU)egcs-2.91.6619990314/Linux(egcs-1.1.2release)"8.(10分)C语言是一种类型语言,但它不是强类型语言,因为编译时的类型检查不能保证所接受的程序没有运行时的类型错误。例如,编译时的类型检查一般不能保证运行时没有数组越界。请你再举一个这样的例子说明C语言不是强类型语言。9.(10分)如果在A机器上我们有C语言编译器CCA,也有它的源码SA(用C语言写成)。如何利用它通过尽量少的工作来得到B机器的C语言编译器CCB。10.(5分)表达式(x.(yz.(x+y)+z)3)45和(x.(yz.(x+y)+z)35)4有同样的结果。在抽象机FAM上,哪一个表达式对应的目标代码的执行效率高?为什么?2001年编译原理试题参考答案1.124start52othersothers/***/2.LR(1)文法LR(1)文法二义文法SAB|aABbSABSAASb|AaaAb|AaaAb|ab|Aa|BBb|BBb|3.intrealid,$DDTLDTLTTi