




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课程测试第四套卷(附解析)1、(15分)(a) 用正规式表示字母表a, b上,a不会相邻的所有串。(b) 画出一个最简的确定有限自动机,它接受所有大于101的二进制整数。2、(10分)构造下面文法的LL(1)分析表。S a B S | b A S | eA b A A | aB a B B | b3、(10分)下面的文法是二义文法S EE while E do E | id := E | E + E | id | (E)请你为该语言重写一个规范的LR(1)文法,它为该语言中的各种运算体现通常的优先级和结合规则。不需要证明你的文法是规范LR(1)的。4、(10分)为下面文法写一个语法制导的定义,它完成一个句子的while-do最大嵌套层次的计算并输出这个计算结果。S EE while E do E | id := E | E + E | id | (E)5、(15分)考虑一个类似Pascal的语言,其中所有的变量都是整型(不需要显式声明),并且仅包含赋值语句、读语句、写语句、条件语句和循环语句。下面的产生式定义了该语言的语法(其中lit表示整型常量;OP的产生式没有给出,因为它和下面讨论的问题无关)。定义Stmt的两个属性:Def表示在Stmt中一定会定值且在该定值前没有引用的变量集合,MayUse表示在Stmt中有引用且在该引用前可能没有定值的变量集合。(a) 写一个语法制导定义或翻译方案,它计算Stmt的Def和MayUse属性。(b) 基于上面的计算,程序可能未赋初值的变量集合从哪儿可以得到?可能未赋初值的变量是这样定义的:若存在从程序开始点到达变量a某引用点的一条路径,在这条路径上没有对变量a赋值,则变量a属于程序可能未赋初值的变量集合。ProgramStmtStmtid := ExpStmtread (id )Stmtwrite ( Exp )StmtStmt ; StmtStmt if ( Exp ) then begin Stmt end else begin Stmt endStmtwhile ( Exp ) do begin Stmt endExpidExplitExpExp OP Exp6、(15分)赋值语句Ax, y:= z(其中A是10 5的数组)的注释分析树如下图。请根据教材上7.3.4节的翻译方案,把图中的属性值都补上(像图7.9那样),并且把每步归约产生的中间代码写在相应产生式的旁边。:=SL.place := L.offset := zE.place := L.place := L.offset := Elist.place := Elist.ndim := Elist.array := ,Elist.place := Elist.ndim := Elist.array := AE.place := L.place := L.offset := yE.place := L.place := L.offset := x7、(15分)通常,函数调用的返回值是简单类型时,用寄存器传递函数值。当返回值是结构类型时需要采用别的方式。下面是一个C语言文件和它在x86/Linux上经某版本GCC编译器编译生成的汇编代码。(备注,该汇编码略经修改,以便于阅读。该修改没有影响结果。)(a) 请你分析这些代码,总结出函数返回值是结构类型时,返回值的传递方式。(b) 若m函数的语句s = f(10)改成s.i = f(10).i + f(20).i + f(30).i,你认为m函数的局部存储分配应该怎样修改,以适用该语句的计算。源文件return.c的内容如下:typedef structlong i;S;S f(k)long k; S s; s.i =k; return s;m() S s; s.i = 20; s = f(10);汇编文件return.s的内容如下:.filereturn.c.text.globl f.typef, functionf:pushl%ebpmovl%esp, %ebpsubl$4, %espmovl8(%ebp), %eaxmovl12(%ebp), %edxmovl%edx, -4(%ebp)movl-4(%ebp), %edxmovl%edx, (%eax)leaveret.sizef, .-f.globl m.typem, functionm:pushl%ebpmovl%esp, %ebpsubl$4, %espmovl$20, -4(%ebp)leal-4(%ebp), %eaxpushl$10pushl%eaxcallfaddl$8, %espleaveret.sizem, .-m.section.note.GNU-stack,progbits.identGCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)8、(5分)把下面左边的文件file1.c提交给编译器,编译器没有报告任何错误。而把文件file2.c提交给编译器,错误报告如下:file2.c: 2: error: conflicting types for funcfile2.c: 1: error: previous declaration of func试分析原因。(在这两个文件中,第1行都是函数func的原型,第2行都是函数func的定义,函数体为空。)file1.cfile2.cint func(double);int func(double);int func(f) float f; int func(float f) 9、(5分)教材上第342页倒数第7行说“将C+语言中一个类的所有非静态属性构成一个C语言的结构类型,取类的名字作为结构类型的名字”。在这一章都学过后,你认为这句话需要修改吗? 编译原理课程测试第四套卷参考答案1、 (a) b*(abb*)*(a| e)01start52100, 13, 4, 510 0, 1 0, 1(b) 见下图。若不允许前缀的无效0,则去掉状态0上的0转换。2、开始符号集合和后继符号集合LL(1)分析表FirstFollowSa, b, e$Aa, ba, b, $Ba, ba, b, $ab$SS a B SS b A SS eAA aA b A ABB a B BB b3、 S EE while E do E | AA id := A | TT T + F | FF id | (E)4、 语法制导的定义如下:S Eprint(S.loop);E while E1 do E2E.loop := max(E1.loop, E2.loop) +1;E id := EE.loop := E1.loop;E E1 + E2E.loop := max(E1.loop, E2.loop);E idE.loop := 0;E (E1)E.loop := E1.loop;5、(a) 计算Stmt的Def和MayUse属性的语法制导定义如下:ProgramStmt Program. MayUse := Stmt.MayUse Stmtid := Exp Stmt.Def := -Exp.MayUse ; Stmt.MayUse:= Exp.MayUse Stmtread (id ) Stmt.MayUse := f ; Stmt.Def := Stmtwrite ( Exp ) Stmt.Def := f ; Stmt.MayUse:= Exp.MayUse StmtStmt1 ; Stmt2 Stmt.MayUse := Stmt1.MayUse (Stmt2.MayUse - Stmt1.Def) ;Stmt.Def := Stmt1.Def (Stmt2.Def - Stmt1.MayUse) Stmt if ( Exp ) then begin Stmt1 end else begin Stmt2 end Stmt.MayUse := Stmt1.MayUse Stmt2.MayUse Exp.MayUse; Stmt.Def := (Stmt1.Def Stmt2.Def) - Exp.MayUse Stmtwhile ( Exp ) do begin Stmt1 end Stmt.MayUse := Stmt1.MayUse Exp.MayUse; Stmt.Def := Stmt1.Def- Exp.MayUse Expid Exp.MayUse := Explit Exp.MayUse := f ExpExp1 OP Exp2 Exp.MayUse := Exp1.MayUse Exp2.MayUse (b) Program的属性MayUse就是程序可能未赋初值的变量集合。6、:=SL.place := zL.offset := null zE.place := zL.place := t2L.offset := t3Elist.place := t1Elist.ndim := 2Elist.array := A,Elist.place := xElist.ndim := 1Elist.array := AAE.place := yL.place := yL.offset := nullyE.place := x L.place := xL.offset := null xt1 := x * 5t1 := t1 + yt2 := A -24t3 := t1 * 4t2 t3:= z7、(a) 调用函数m把实在参数压栈后,将存放返回值的地址压栈,然后调用f。f在返回前,将结果送到m提供的存放返回值的地址。(b) m要为3次f调用分配存放结果值的空间,并且这3次存放结果值的空间不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职工餐厅团队管理办法
- 联通公司服务管理办法
- 2025上海华东师范大学空间人工智能学院行政管理岗位招聘1人考试参考试题及答案解析
- 2025年甘肃省兰州市佛慈集团、佛慈制药面向社会招聘专业人员考试参考试题及答案解析
- 中药材种苗创新创业项目商业计划书
- 智能语音识别技术创新创业项目商业计划书
- 兰花主题教育课程创新创业项目商业计划书
- 移动社交匿名社交平台创新创业项目商业计划书
- 跨境电商物流车辆采购及国际租赁合作协议
- 2025高端医疗设备性能保障及全方位用户维护服务合同
- 实验室生物安全管理手册
- 病理科实验室生物安全评估表
- 2024年高考作文备考之议论文写作素材:人物篇(墨子)
- 成人学习者数字素养的培养
- 管理会计模拟实训实验报告
- 数学知识讲座
- 新闻采访课件
- 赣县清溪中心学校早期民办、代课教师稳控应急预案
- 上市公司合规培训
- SPACEMAN(斯贝思曼)冰淇淋机 安装调试培训
- 利润分成合同
评论
0/150
提交评论