1998年编译原理试题
1.(10分)把下面的NFA确定化。
2.(10分)下面两个文法中哪一个不是LR(1)文法?对非LR(1)的那个文法。给出那个有移进-归约冲突的规范的LR(1)项目集。
S ( aAc
S ( aAc
A ( bbA | b
A ( bAb | b
3.(5分)为L = { ambn | m > n ( 0 }写一个LR(1)的文法,不要超过5个产生式。
4.(20分)为P101习题3.1的文法
1( 写一个语法制导定义,它打印出括号嵌套的最大深度;
2( 写一个翻译方案,它打印出每个a在句子中是第几个字符。
如,当句子是(a,(a,(a,a),(a)))时,两小题的结果分别是3和2 5 8 10 14。
5.(5分)P166习题5.12。
6.(5分)下面是求阶乘的程序。用图6.18的方式画出程序第3次进入函数factor时的活动
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
栈和静态链。
program fact(input, output);
var f, n : integer;
function factor(n : integer) : integer;
begin
if n=0 then factor :=1
else factor :=n*factor(n-1)
end;
begin n :=5; f :=factor(n); write(f)
end.
7.(15分)下面是用类PASCAL语言写的求最大公约数的函数(参数是传值的)
function gcd(p, q:integer);
begin if p mod q = 0
then return q
else return gcd(q, p mod q)
end
其中的递归调用称为尾递归(即return后的表达式是一个递归调用)。对于尾递归,编译器可以产生和一般的函数调用不同的代码,使得目标程序运行时,这种递归调用所需存储空间大大减少,也缩短了运行时间。对于尾递归,编译器应怎样产生代码,简述你的想法。(若用源语言一级的优化来回答此问题,则不合题目要求。)
8.(10分)识别右边流图中的循环。
9.(5分)根据教材第10章介绍的从C++向C的翻译方案,C++中的对象声明语句应如何翻译成C语句,如P287第8行
point _center;
应翻译成什么?
10.(10分)P315习题11.3(b)。
11.(5分)cc是UNIX系统上C语言编译命令,(l是联接库程序的选择项。某程序员自己编写了两个程序库libuser1.a和libuser2.a(库名必须以lib为前缀),当用命令
cc test.c (luser1.a (luser2.a
编译时,报告有未定义的符号,而改用命令
cc test.c (luser2.a (luser1.a
时,能得到可执行程序。试分析原因。
1
0
1
1
2
1
5
1
0
4
6
1
3
2
7
3
4
5
6
1
8
9
10