编译原理10套试卷及答案 下载本文

.L1:

leave ret .Lfe1:

.size func,.Lfe1-func .ident \(GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)\ 8.(10分)C语言是一种类型语言,但它不是强类型语言,因为编译时的类型检查不能保证所接受的程序没有运行时的类型错误。例如,编译时的类型检查一般不能保证运行时没有数组越界。请你再举一个这样的例子说明C语言不是强类型语言。 9.(10分)如果在A机器上我们有C语言编译器CCA,也有它的源码SA(用C语言写成)。如何利用它通过尽量少的工作来得到B机器的C语言编译器CCB。 10.(5分)表达式(?x.(?yz.(x + y) + z) 3) 4 5和(?x.(?yz.(x + y) + z) 3 5) 4有同样的结果。在抽象机FAM上,哪一个表达式对应的目标代码的执行效率高?为什么?

2001年编译原理试题参考答案

1.

others start 1 / 2 * 2 * others 4 *

/ 5

2.LR(1)文法 S ? AB | aABb A ? aaAb | ? B ? Bb | ?

3. int D D?TL T T?int L R

LR(1)文法 S ? AB A ? aaAb | ab | ? B ? Bb | ?

id

二义文法 S ? AASb | ? A ? a | ?

real

D?TL T?real

, $

L?id R

R ?, id R R ? ?

4. S? ? S print(S.num) S ? (L) S.num := L.num +1 S ? a S.num := 0 L ? L1,S L.num := L1.num + S.num L ? S L.num := S.num S? ? {S.depth := 0} S S ? {L.depth := S.depth +1} (L) S ? a {print(S.depth)} L ? {L1.depth := L.depth} L1, {S.depth := L.depth} S L ? { S.depth := L.depth} S

5. t1 := initial t2 := final if t1 > t2 goto L1 v := t1 L2: stmt if v = t2 goto L1 v := v + 1 goto L2 L1:

6.由于实参表达式是反序进入活动记录,而局部变量是顺序在活动记录中分配。

7.aa是静态外部变量,而bb是外部变量,它们都分配在静态数据区(由.data伪指令开始),但是bb由伪指令.globl指明为全局的,用来解决其它文件中对bb的外部引用,而aa只能由本文件引用。cc是静态局部变量,同aa和bb一样,它的生存期是整个程序并分配在静态数据区。由于cc在源程序中的作用域是函数func的体,而在目标文件中,它的作用域至少已是整个文件了,为避免同源文件中外部变量和其它函数的静态局部变量的名字冲突,所以要对它进行改名,成了cc.2。由于cc不是全局的,因此cc.2前面没有伪指令.globl。dd是自动变量,其作用域是函数func的体,其生存期是该函数激活期间,因此它分配在栈区,并且置初值是用运行时的赋值来实现。

8.例如联合体的类型检查一般也不可能在编译时完成,虽然下面例子是可静态判断类型错误的。 union U { int u1; int *u2;} u; int ?p; u.u1 = 10; p = u.u2; ?p = 0;

9. ? 修改源码SA 的代码生成部分,让它产生B机器的代码,称结果程序为SB。

? 将SB提交给CCA进行编译,得到一个可执行程序。 ? 将SB提交给上述可执行程序进行编译,得到所需的编译器CCB。

10.第一个表达式在执行?yz.(x + y) + z) 3时出现参数个数不足的情况,因此有FUNVAL的值进入栈顶,然后发现参数个数不足,又把它做成FANVAL的情况。而第二个表达式执行的是(?yz.(x + y) + z) 3 5,不会出现参数个数不足的情况。因此第二个表达式的执行效率比第一个表达式的高。

《编译原理》考试试题

(所有答案必须写在答题纸上)

(2006.12.25)

一、(5×6分)回答下列问题:

1.什么是S-属性文法?什么是L-属性文法?它们之间有什么关系? 2.什么是句柄?什么是素短语?

3.划分程序的基本块时,确定基本块的入口语句的条件是什么? 4.运行时的DISPLAY表的内容是什么?它的作用是什么? 5.对下列四元式序列生成目标代码:

A:=B*C D:=E+F G:=A+D H:=G*2

其中,H是基本块出口的活跃变量, R0和R1是可用寄存器

二、(8分)设?={0,1}上的正规集S由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA。 三、(6分)写一个文法使其语言为L(G)={ anbmambn | m,n≥1}。 四、(8分)对于文法G(E):

E?T|E+T T?F|T*F F?(E)|i

1. 写出句型(T*F+i)的最右推导并画出语法树。

2. 写出上述句型的短语,直接短语、句柄和素短语。 五、(12分)设文法G(S):

S?SiA|AA?A?B|BB?)A*|(

1.构造各非终结符的FIRSTVT和LASTVT集合;

2.构造优先关系表和优先函数。

六、(9分)设某语言的do-while语句的语法形式为 S ? do S(1) While E

其语义解释为:

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式: (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。

七、(8分)将语句 if (A0) then while C>0 do C:=C+D; 翻译成四元式。 八、(10分) 设有基本块如下:

T1:=S+R T2:= 3 T3:= 12/T2 T4:=S/R A:=T1-T4 T5:=S+R B:=T5

T6:=T5*T3 B:=T6

(1)画出DAG图;

(2)设A,B是出基本块后的活跃变量,请给出优化后的四元式序列。 九、(9分) 设已构造出文法G(S):

(1) S ? BB (2) B ? aB (3) B? b

的LR分析表如下

S(1)的代码 E的代码 真 假

状态 0 1 2 3 4 5 6 a s3 s6 s3 r3 s6 ACTION b s4 s7 s4 r3 s7 GOTO # acc r1 S 1 B 2 5 8 9