资源描述:
《编译原理考研真题ustc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2003年编译原理考研真题1.(10分)叙述下面的正规式描述的语言,并画出接受该语言的最简DFA的状态转换图。(1
2、01)*0*2.(10分)某语言有两种语句:S®过程调用语句
3、下标变量赋值语句过程调用语句的形式是:id(id,id,…,id),即过程名加置于圆括号中的变量表。下标变量赋值语句的形式是:id(id,id,…,id):=id(id,id,…,id),赋值号两边都是数组名加置于圆括号中的变量表。(a)请你完成过程调用语句和下标变量赋值语句的文法设计,得到一个以语句S为开始符号的LR(1)文法。不得超过6个产生式,不需要给出你的文法是LR(1)文法的证明。(b)如果想在L
4、R分析的同时完成语义分析和中间代码生成,基于你的文法有什么困难?3.(10分)(a)为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零还是小于零)记录在属性E.sign中(属性值分别用POS或NEG表示)。你可以假定所有的整数都不为零,这样就不用担心零的符号。E®E*E
5、+E
6、-E
7、unsigned_integer(b)为上面的表达式产生栈机器代码。代码执行后,表达式的值留在栈上。你自己设计所需的栈机器指令,并写清楚指令的含义。4.(10分)在C语言的教材上,称&为地址运算符,&a为变量a的地址。但是教材上没有说明表达式&a的类型是什么。另外,教材
8、上说,数组名代表数组的首地址,但是也没有说明这个值的类型。它们所带来的一个问题是,如果a是一个数组名,那么表达式a和&a的值都是数组a的首地址,但是它们的使用是有区别的,初学时很难掌握。下面我们给出4个C文件,请你根据编译报错信息和程序运行结果,写出表达式a和&a的类型表达式。若你能掌握它们的类型,那么它们的区别就清楚了,你也就会正确使用它们了。(1)文件1:typedefintA[10][20];Aa;A*fun(){return(a);}该函数在Linux上用gcc编译时,报告的类型错误如下:第6行:warning:returnfromincompatiblepointerty
9、pe(2)文件2:typedefintA[10][20];Aa;A*fun(){return(&a);}该函数在Linux上用gcc编译时,没有类型方面的错误。(3)文件3:typedefintA[10][20];typedefintB[20];Aa;B*fun(){return(a);}该函数在Linux上用gcc编译时,没有类型方面的错误。(4)文件4:typedefintA[10][20];Aa;fun(){printf(“%d,%d,%d”,a,a+1,&a+1);}main(){fun();}该程序的运行结果是:134518112,134518192,13451891
10、22004编译原理部分考研真题1.(10分)下面的文法是LR(1)文法。请合并该文法LR(1)项目集规范族中的同心集,以说明该文法不是LALR(1)文法。S®aAd
11、bBd
12、aBe
13、bAeA®cB®c2.(10分)为下面文法写一个语法制导的定义,用S的综合属性val给出下面文法中S产生的二进制数的值。例如,输入101.101时,S.val:=5.625。(不得修改文法。)S®L.R
14、LL®LB
15、BR®BR
16、BB®0
17、13.(5分)在X86/Linux机器上,编译器报告第15行有错误:incompatibletypesinreturn在C语言中,数组和结构都是构造类型,为什么下面第2
18、个函数有类型错误,而第1个函数没有?typedefintA1[10];typedefintA2[10];A1a;typedefstruct{inti;}S1;typedefstruct{inti;}S2;S1s;A2*fun1(){return(&a);}S2fun2(){return(s);}4.(5分)在C语言中,若a和b是相同的结构类型,那么赋值a=b是可以的。但是编译器对这种赋值的实现方式可能和它们的字节数(size)有关。下面是两个C语言程序及在X86/Linux机器上生成的目标代码(略去了和本题目无关的部分)。扼要叙述这些目标代码中体现出的实现方式上的区别。(在下面汇编
19、程序中给出的注释仅供参考。)struct{longi,j;doublem;}a,b;main(){a=b;}main:pushl%ebpmovl%esp,%ebpmovl$b,%eaxmovl$a,%edxmovl(%eax),%ecxmovl%ecx,(%edx)movl4(%eax),%ecxmovl%ecx,4(%edx)movl8(%eax),%ecxmovl%ecx,8(%edx)movl12(%eax),%eaxmovl%eax,12(%edx).L1:l