中科大编译原理考研真题答案USTC.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:5 大小:52KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

中科大编译原理考研真题答案USTC.doc

中科大编译原理考研真题答案USTC.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

2003年真题部分答案1.该正规式描述的语言是,所有不含子串001的0和1的串。3start001.10122.(a)SCall|AssignCallid(id_list)Assignid(id_list):=id(id_list)id_listid_list,id|id(b)由于过程参数和下标表达式的中间代码是不一样的,在id和id_list,id向id_list归约时,不知按哪种方式处理。3.(a)EE1*E2{ifE1.sign=E2.signthenE.sign:=POSelseE.sign:=NEG}E+E1{E.sign:=E1.sign}EE1{ifE1.sign=POSthenE.sign:=NEGelseE.sign:=POS}Eunsigned_integer{E.sign:=POS}(b)指令的解释如下:PUSH值:将值压栈NEG:将栈顶值取出,计算其相反数,把结果压入栈MUL:将栈顶和次栈顶的值取出,将它们相乘,把结果压栈产生代码的翻译方案如下:EE1*E2{emit(MUL)}E+E1{}EE1{emit(‘NEG’)}Eunsigned_integer{emit(‘PUSH’unsigned_integer.lexval)}4.对一个t类型的数组a[i1][i2]…[in]来说,表达式a的类型是:pointer(array(0..i2–1,…array(0..in–1,t)…))而表达式&a的类型是:pointer(array(0..i1–1,…array(0..in–1,t)…))2004年真题部分答案1.对活前缀ac和bc有效的项目集分别为{[Ac·,d],[Bc·,e]}和{[Ac·,e],[Bc·,d]},它们是同心的。合并后变成{[Ac·,d/e],[Bc·,d/e]},产生归约归约冲突。因此该文法不是LALR(1)文法。2.SL.RS.val:=L.val+R.valSLS.val:=L.valLL1BL.val:=L1.val2+B.valLBL.val:=B.valRBR1R.val:=(R1.val+B.val)/2RBR.val:=B.val/2B0B.val:=0B1B.val:=13.C语言对除结构类型以外的所有类型使用结构等价,而对结构类型使用名字等价。第1个函数能通过结构等价的检查,而第2个函数不能通过名字等价的检查。4.在结构的字节数较少时,则为该结构各域分别产生值传送指令。在结构的字节数较多时,则根据值传送的源地址(b的地址)、目的地址(a的地址)和该结构的长字数,产生简洁的重复传送指令,以提高效率。2005年真题部分答案1.DTL;Tint|floatLL,id|id2.给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值表达式和右值表达式,那么语法制导定义如下(无输出则表示无错):EEEE1+E2E.v:=rvalueE(E1)E.v:=E1.vEE1++ifE1.v=rvaluethenprintf(“invalidlvalueinincrement”);E.v:=rvalueEidE.v:=lvalueEnumE.v:=rvalue3.历史上,C语言中有参函数定义的一般形式是:类型标识符函数名(形式参数列表)形式参数声明对于这种形式的声明,C语言编译器是不做实在参数和形式参数的个数和类型是否一致的检查的。如本题中函数f1的声明是这种形式。现在,ANSI新标准允许使用另一种方法声明形式参数,即在函数名后的括号中列出形式参数的同时,声明形式参数的类型。本题中函数f2的声明是这种形式。C语言编译器对于这种形式的函数声明是要进行实在参数和形式参数的个数和类型是否一致的检查的。因此,在编译函数调用f2(10.0)时,会把浮点数10.0转换成整数10,并产生将整数10压栈的指令。因此函数调用f2(10.0)的结果是100。而在编译函数调用f1(10.0)时,会把浮点数10.0转换成双精度型(参见《编译原理习题精选》第5.8题),并产生将该双精度型数压栈的指令。双精度数占8个字节。它低地址的4个字节看成整数时正好是0。因此函数调用f1(10.0)的结果是0(参见http://staff.ustc.edu.cn/~yiyun上2003年