- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
06-编译原理课程测试第六套卷(附解析)-编译原理试题-中国科技大学
编译原理课程测试第六套卷(附解析)
1、(10分)用正规式表示字母表{a, b}上a不会相邻的所有句子的集合,并给出接受该语言的最简DFA。
2、(15分)(1)为下面文法构造规范LR(1)分析表,画出像教材上图3.19这样的状态转换图就可以了。
S ? V = E | E
V ? ? E | id
E ? V
(2)上述状态转换图有同心项目集吗?若有,合并同心项目集后是否会出现动作冲突?
3、(10分)为字母表{0, 1}上的回文数集合写一个LR文法;若你认为该语言不存在LR文法,则说明理由。(注:一个数字串,从左向右读和从右向左读都一样时,称它为回文数。)
4、(10分)下面的翻译方案计算0和1的串的值(解释为二进制的正整数)。
B ? B1 0 { B.val = B1.val ? 2 }
B ? B1 1 { B.val = B1.val ? 2 + 1 }
B ? 1 { B.val = 1 }
重写该翻译方案,使得它基础文法没有左递归,并且为整个输入串计算的B.val和原来的一样。
5、(10分)若布尔表达式有异或xor(exclusive-or)运算(异或运算的结果为真,当且仅当它的一个运算对象为真),请按照教材上表7.4的风格给出异或运算的语义规则。(备注:该题目设计得不好。)
6、(5分)在面向对象语言中,编译器给每个类建立虚方法表,如教材上图11.3和图11.4那样。请简要说明,为什么编译器给每个类仅建立虚方法表,而不是建立所有方法的方法表。
7、(15分)C语言和Java语言的数组声明和数组元素引用的语法形式同教材上7.3.3节和7.3.4节讨论的不一样,例如float A[10][20]和A[i+1][j-1],并且每一维的下界都是0。若适应这种情况的赋值语句的文法如下:
S ? L := E
E ? E + E | (E ) | L
L ? L [E ] | id
(1)重新设计教材上7.3.3节数组元素的地址计算公式,以方便编译器产生数组元素地址计算的中间代码。不要忘记每一维的下界都是0。
(2)重新设计数组元素地址计算的翻译方案。只需写出产生式L ? L [E ] | id的翻译方案,但要能和7.3.4节中产生式S ? L := E和E ? E + E | (E ) | L的翻译方案衔接。若翻译方案中引入新的函数调用,要解释这些函数的含义。
8、(15分)一个C语言的文件如下:
func(long i, long j, long k) { k = (i + j) – (i – j – f(k));
}
经GCC 3.4.6编译器编译得到的汇编代码分两列在下面给出:
.file “call.c” | movl 16(%ebp), %eax
.text | movl %eax, (%esp)
.globl func | call f
.type func, @function | subl %eax, %ebx
func: | movl %ebx, %eax
pushl %ebp | subl %eax, %esi
movl $esp, %ebp | movl %esi, %eax
pushl %esi | movl %eax, 16(%ebp)
pushl %ebx | popl %ebx
movl 12(%ebp), %eax | popl %esi
movl 8(%ebp), %esi | popl %ebp
addl %eax, %esi | ret
movl 12(%ebp), %edx | .size func, .-func
movl 8(%ebp), %eax | .section .note.GNU-stack,””,@progbits
movl %eax, %ebx | .ident “GCC: (GNU) 3.4.6”
subl %edx, %ebx
请根据上述汇编代码,并参考教材上例6.5和第6章到第9章习题中的汇编代码进行总结:为适应函数调用引起的跨函数执行,该编译器在寄存器的值的保护方面有些什么约定?
9、(10分)下面左边的函数被GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)优化成右边的代码。若你认为该优化结果不对或该优化不合理,则阐述你的理由。若你认为该优化结果是对的,请说明实施了哪些优化,并解释循环优化结果的合理性。
f(a,b,c,d,x,y,z) | f:
int a,b,c,d,x,y,z; | pushl %eb
文档评论(0)