收藏 分享(赏)

编译原理考研真题.doc

上传人:hwpkd79526 文档编号:7080619 上传时间:2019-05-05 格式:DOC 页数:10 大小:52.56KB
下载 相关 举报
编译原理考研真题.doc_第1页
第1页 / 共10页
编译原理考研真题.doc_第2页
第2页 / 共10页
编译原理考研真题.doc_第3页
第3页 / 共10页
编译原理考研真题.doc_第4页
第4页 / 共10页
编译原理考研真题.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、12003年编译原理考研真题1 (10 分)叙述下面的正规式描述的语言,并画出接受该语言的最简 DFA 的状态转换图。( 1 | 01 )* 0*2 (10 分)某语言有两种语句:S 过程调用语句 | 下标变量赋值语句过程调用语句的形式是:id(id, id, , id),即过程名加置于圆括号中的变量表。下标变量赋值语句的形式是:id(id, id, , id) := id(id, id, , id),赋值号两边都是数组名加置于圆括号中的变量表。(a) 请你完成过程调用语句和下标变量赋值语句的文法设计,得到一个以语句 S 为开始符号的 LR(1)文法。不得超过 6 个产生式,不需要给出你的文法

2、是LR(1)文法的证明。(b) 如果想在 LR 分析的同时完成语义分析和中间代码生成,基于你的文法有什么困难?3 (10 分)(a) 为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式 E 的符号(即值大于零还是小于零)记录在属性 E.sign 中(属性值分别用POS 或 NEG 表示) 。你可以假定所有的整数都不为零,这样就不用担心零的符号。E E *E | +E | E | unsigned_integer(b) 为上面的表达式产生栈机器代码。代码执行后,表达式的值留在栈上。你自己设计所需的栈机器指令,并写清楚指令的含义。4 (10 分)在 C 语言的教材上,称A a;A *

3、fun()return(a);2该函数在 Linux 上用 gcc 编译时,报告的类型错误如下:第 6 行:warning: return from incompatible pointer type(2)文件 2:typedef int A1020;A a;A *fun()return(该函数在 Linux 上用 gcc 编译时,没有类型方面的错误。(3)文件 3:typedef int A1020;typedef int B20;A a;B *fun()return(a);该函数在 Linux 上用 gcc 编译时,没有类型方面的错误。(4)文件 4:typedef int A1020;A

4、 a;fun()printf(“%d,%d,%dn”, a, a+1, main()fun();该程序的运行结果是:134518112, 134518192, 13451891232004编译原理部分考研真题1 (10 分)下面的文法是 LR(1)文法。请合并该文法 LR(1)项目集规范族中的同心集,以说明该文法不是 LALR(1)文法。S a A d | b B d | a B e | b A eA cB c2 (10 分)为下面文法写一个语法制导的定义,用 S 的综合属性 val 给出下面文法中 S 产生的二进制数的值。例如,输入 101.101 时,S. val := 5.625 。 (

5、不得修改文法。 )S L . R | LL L B | BR B R | BB 0 | 13 (5 分)在 X86/Linux 机器上,编译器报告第 15 行有错误:incompatible types in return在 C 语言中,数组和结构都是构造类型,为什么下面第 2 个函数有类型错误,而第 1个函数没有?typedef int A110;typedef int A210;A1 a;typedef struct int i;S1;typedef struct int i;S2;S1 s;A2 *fun1()return(S2 fun2()return(s);4 (5 分)在 C 语言

6、中,若 a 和 b 是相同的结构类型,那么赋值 a=b 是可以的。但是编译器对这种赋值的实现方式可能和它们的字节数(size)有关。下面是两个 C 语言程序及在X86/Linux 机器上生成的目标代码(略去了和本题目无关的部分) 。扼要叙述这些目标代码中体现出的实现方式上的区别。 (在下面汇编程序中给出的注释仅供参考。 )struct long i,j; double m;a,b;4main()a=b;main:pushl %ebpmovl %esp,%ebpmovl $b,%eaxmovl $a,%edxmovl (%eax),%ecxmovl %ecx,(%edx)movl 4(%eax)

7、,%ecxmovl %ecx,4(%edx)movl 8(%eax),%ecxmovl %ecx,8(%edx)movl 12(%eax),%eaxmovl %eax,12(%edx).L1:leaveretstruct long i,j; double m,n;a,b;main()a=b;main:pushl %ebpmovl %esp,%ebppushl %edipushl %esimovl $a,%edimovl $b,%esicld 设定方向标志,使地址指针自动增量movl $6,%ecx 设定重复次数rep 表示重复下面的指令movsl 传送指令.L1:leal -8(%ebp),%

8、esppopl %esipopl %edileave5ret2005编译原理考研真题1 (5 分)下面是用正规式表示的变量声明:( int | float ) id (, id )* ;请改用上下文无关文法表示,也就是写一个上下文无关文法,它和该正规式等价。2 (10 分)在 C 语言中,3+和( id + id )+这样的表达式被编译时,编译器都会报告如下的错误:invalid lvalue in increment现有如下简化的 C 语言表达式文法:E E + E | ( E ) | E + | id | num请你写一个语法制导定义或翻译方案,它检查+的运算对象是否合法。3 (10 分)

9、下面是一个 C 语言程序: long f1(i)long i;return(i*10);long f2(long i)return(i*10);main()printf(“f1 = %d, f2 = %dn”, f1(10.0), f2(10.0) );其中函数 f1 和 f2 仅形式参数的描述方式不一样。该程序在 X86/Linux 机器上的运行结果如下:f1 = 0, f2 = 100请解释为什么用同样的实在参数调用这两个函数的结果不一样。4 (5 分)优化编译器对下面程序的局部变量 i 和 j 不分配空间,为什么?main()long i, j;i = 5;j = i * 2;6prin

10、tf(“%dn”, i+j);2006编译原理考研真题1、 (10 分)下面是 int i, j, k 这样的类型声明的两种不同语法:D T L D T LT int | real T int | realL L , id | id L id , L | id如果用 LL(1)分析方法,应该选择哪个文法?如果用某种 LR 分析方法,选择哪个文法更好?简要说明理由。2、 (6 分)用 SLR(1)文法能定义的语言集合、用 LR(1)文法能定义的语言集合和用 LALR(1)文法能定义的语言集合之间有什么关系?(不需要给出理由。 )3、 (8 分)下面是一个 C 语言的函数:void f(char

11、c, long j)char *p;char ch;long m3;p=m0=j; 在 x86/Linux 机器上经某版本的编译器编译生成的汇编代码如下:.file “frame.c“.version “01.01“gcc2_compiled.:.text.align 4.globl f.type f,functionf:pushl %ebpmovl %esp,%ebpsubl $24,%espmovl 8(%ebp),%eaxmovb %al,-1(%ebp)leal -1(%ebp),%edxmovl %edx,-8(%ebp)movl 12(%ebp),%eax参数 j参数 c返回地址老

12、 ebp(控制链)esp ebp栈增长方向高地址低地址7movl %eax,-24(%ebp).L1:leaveret.Lfe1:.size f,.Lfe1-f.ident “GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)“请将执行 subl $24,%esp 后,esp 和 ebp 指向地址之间的区域(见上图)用于存放哪些变量的值,按照这些变量的名字、相对于 ebp 指向地址的偏移、字节数(size)列出来。4、 (6 分)两个 C 语言文件 link1.c 和 link2.c 的内容分别如下:int buf1 =100

13、;和extern int *buf;main()printf(“%dn”, *buf);在 X86/Linux 经命令 cc link1.c link2.c 编译后,运行时产生如下的出错信息:Segmentation fault (core dumped)请说明原因。2007年编译原理部分1、 (10 分)描述由正规式 b*(abb*)*(a| )定义的语言,并画出接受该语言的最简 DFA。2、 (10 分)证明文法 E E + id | id 是 SLR(1)文法。3、 (10 分)下面是表达式和赋值语句的文法,其中 and 的类型是 bool bool bool,+的类型是int int

14、int,= 的类型是 int int bool,:= 要求 id 和 E 的类型都是 int 或者都是bool。为该文法写一个语法制导定义或翻译方案,它完成类型检查。S id := EE E and E | E + E | E = E |id4、 (5 分)对于下面 C 语言文件 s.c f1(int x)8long x;x = 1;f2(int x)long x;x = 1;某编译器编译时报错如下:s.c: In function f1:s.c:3: warning: declaration of x shadows a parameter请回答,对函数 f2 为什么没有类似的警告错误。5、

15、 (5 分)下面 C 语言程序经非优化编译后,若运行时输入 2,则结果是area=12.566360, addr=-1073743076经优化编译后,若运行时输入 2,则结果是area=12.566360, addr=-1073743068请解释为什么输出结果有区别。main()float s, pi, r;pi=3.14159;scanf(“%f“, printf(“area=%f, addr=%dn“, s=pi*r*r, 92008年编译原理考研真题1、 (10 分)描述由正规式 ba(bba) b定义的语言,并画出接受该语言的最简 DFA。2、 (10 分)下面的文法产生代表正二进制数

16、的 0 和 1 的串集:B B 0 | B 1 | 1下面的翻译方案计算这种正二进制数的十进制值:B B1 0 B.val := B1.val 2 | B1 1 B.val := B1.val 2 +1| 1 B.val := 1 请消除该基础文法的左递归,再重写一个翻译方案,它仍然计算这种正二进制数的十进制值。3、 (10 分)在 C 语言中,如果变量 i 和 j 都是 long 类型,请写出表达式printf(“%dn”, 4、 (10 分)一个 C 语言的函数如下:func(i) long i; long j;j = i 1;func(j);下面左右两边的汇编代码是两个不同版本 GCC

17、编译器为该函数产生的代码。左边的代码在调用 func 之前将参数压栈,调用结束后将参数退栈。右边代码对参数传递的处理方式没有实质区别。请叙述右边代码对参数传递的处理方式并推测它带来的优点。func: | func:pushl %ebp | pushl %ebpmovl %esp, %ebp | movl %esp, %ebpsubl $4, %esp | subl $8, %espmovl 8(%ebp), %edx | movl 8(%ebp), %eaxdecl %edx | decl %eaxmovl %edx, -4(%ebp) | movl %eax, -4(%ebp)movl -4(%ebp), %eax | movl -4(%ebp), %eaxpushl %eax | movl %eax, (%esp)call func | call funcaddl $4, %esp | leave10leave | retret |

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报