- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中科大编译理考研真题答案USTC
2003年真题部分答案
1.该正规式描述的语言是,所有不含子串001的0和1的串。
3start
3
start
0
0
1
.
1
0
1
2
2.
(a) S ? Call | Assign
Call ? 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{if E1.sign= E2.sign then E.sign := POS else E.sign := NEG }
E ? +E1 { E.sign := E1.sign }
E ? ?E1 {if E1.sign= POS then E.sign := NEG else E.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 . R S. val := L. val + R. val
S ? L S. val := L. val
L ? L1 B L. val := L1. val ?2 + B. val
L ? B L. val := B. val
R ? B R1 R. val := (R1. val + B. val)/2
R ? B R. val := B. val/2
B ? 0 B. val := 0
B ? 1 B. val := 1
3.C语言对除结构类型以外的所有类型使用结构等价,而对结构类型使用名字等价。
第1个函数能通过结构等价的检查,而第2个函数不能通过名字等价的检查。
4.在结构的字节数较少时,则为该结构各域分别产生值传送指令。
在结构的字节数较多时,则根据值传送的源地址(b的地址)、目的地址(a的地址)和该结构的长字数,产生简洁的重复传送指令,以提高效率。
2005年真题部分答案
1. D ? T L ;
T ? int | float
L ? L, id | id
2.给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值表达式和右值表达式,那么语法制导定义如下(无输出则表示无错):
E? ? E
E ? E1 + E2 E.v := rvalue
E ? ( E1 ) E.v := E1.v
E ? E1 ++ if E1.v = rvalue then printf(“invalid lvalue in increment”);
E.v := rvalue
E ? id E.v := lvalue
E ? num E.v := rvalue
3. 历史上,C语言中有参函数定义的一般形式是:
类型标识符 函数名(形式参数列表)
形式参数声明
对于这种形式的声明,C语言编译器是不做实在参数和形式参数的个数和类型是否一致的检查的。如本题中函数f1的声明是这种形式。
现在,ANSI新标准允许使用另一种方法声明形式参数,即在函数名后的括号中列出形式参数的同时,声明形式参数的类型。本题中函数f2的声明是这种形式。C语言编译器对于这种形式的函数声明是要进行实在参数和形式参数的个数和类型是否一致的检查的。
因此,在编译函数调用f2(10
文档评论(0)