- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
05-编译原理课程测试第五套卷(附解析)-编译原理试题-中国科技大学
编译原理课程测试第五套卷(附解析)
1、(10分)用子集构造法给出由下面的NFA得到的DFA的转换表
2、(20分)(1)通过构造识别活前缀的DFA和构造分析表,来证明文法E ( E + id | id是SLR(1)文法。
(2)下面左右两个文法都和(1)的文法等价
E ( E + M id | id E ( M E + id | id
M ( ( M ( (
请指出其中有几个文法不是LR(1)文法,并给出它们不是LR(1)文法的理由。
3、(10分)下面是C语言两个函数f和g的概略(它们不再有其它的局部变量):
int f (int x) { int i; …return i +1; … }
int g (int y) {int j; … f (j +1); … }
请按照教材上例6.5中图6.13的形式,画出函数g调用f,f的函数体正在执行时,活动记录栈的内容及相关信息,并按图6.12左侧箭头方式画出控制链。假定函数返回值是通过寄存器传递的。
4、(10分)C语言函数f的定义如下:
int f (int x, int (py, int ((ppz)
{
((ppz +=1; (py +=2; x +=3; return x + (py + ((ppz;
}
变量a是指向b的指针,变量b是指向c的指针,c是整型变量并且当前值是4。那么执行f (c, b, a)的返回值是多少?
5、(10分)Java语言的实现通常把对象和数组都分配在堆上,把指向它们的指针分配在栈上,依靠运行时的垃圾收集器来回收堆上那些从栈不可达的空间(垃圾)。这种方式提高了语言的安全性,但是增加了运行开销。编译时能否采用一些技术,以降低垃圾收集所占运行开销?概述你的方案。
6、(5分)在面向对象语言中,编译器给每个对象分配空间的第1个域存放虚方法表的指针。是否可以把虚方法表指针作为最后1个域而不是第1个域?请简要说明理由。
7、(15分)考虑一个简单语言,其中所有的变量都是整型(不需要显式声明),并且仅包含赋值语句、读语句和写语句。下面的产生式定义了该语言的语法(其中lit表示整型常量;OP的产生式没有给出,因为它和下面讨论的问题无关)。
Program ( StmtList
StmtList ( Stmt StmtList | Stmt
Stmt ( id := Exp; | read (id ); | write ( Exp );
Exp ( id | lit | Exp OP Exp
我们把不影响write语句输出值的赋值(包括通过read语句来赋值)称为无用赋值,写一个语法指导定义,它确定一个程序中出现过赋予无用值的变量集合(不需要知道无用赋值的位置)和没有置初值的变量集合(不影响write语句输出值的未置初值变量不在考虑之中)。
非终结符StmtList和Stmt用下面3个属性(你根据需要来定义其它文法符号的属性):
(1)uses_in:在本语句表或语句入口点的引用变量集合,它们的值影响在该程序点后的输出。
(2)uses_out:在本语句表或语句出口点的引用变量集合,它们的值影响在该程序点后的输出。
(3)useless:本语句表或语句中出现的无用赋值变量集合。
8、(10分)一个C文件array.c仅有下面两行代码:
char a[ ][4] = { “123”, “456”};
char (p[ ] = { “123”, “456”};
从编译生成的下列汇编代码可以看出对数组a和指针p的存储分配是不同的。试依据这里的存储分配,为置了初值后的数组a和指针p写出类型表达式。
.file “array.c”
.globl a
.data
.type a, @object
.size a, 8
a:
.string “123”
.string “456”
.section .rodata
.LC0:
.string “123”
.LC1:
.string “456”
.globl p
.data
.align 4
.type p, @object
.size p, 8
p:
.long .LC0
.long .LC1
.section .note.GNU-stack, “”, @progbits
.ident “GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)”
9、(10分)两个C文件long.c和short.c的内容分别是
long i = 32768(
原创力文档


文档评论(0)