编译原理期末试题(8套含答案+大题集)

S?SiA|AA?A?B|B B?)A*|(1.构造各非终结符的FIRSTVT和LASTVT集合; 2.构造优先关系表和优先函数。(12分) 答:(6分)

FIRSTVT(S)={ i,+,),( } FIRSTVT(A)={ +,),( } FIRSTVT(B)={ ),( }

LASTVT(S)={ i,+,*,( } LASTVT(A)={ +,*,( } LASTVT(B)={ *,( }

优先关系表: (3分) i + ( ) i > < < < + > > < < ( > > ) < < < * > > 优先函数: (3分) i + ( ) f 2 6 6 1 g 1 4 6 6 * > > > * 6 1 六、设某语言的do-while语句的语法形式为 (9分) S ? do S(1) While E

其语义解释为:

S(1)的代码 真

E的代码 假

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

R? do

U?R S(1) While S?U E

(2). (6分) R? do

{ R.QUAD:=NXQ } U?R S(1) While

{ U.QUAD:=R.QUAD;

BACKPATCH(S.CHAIN, NXQ) } S?U E

{ BACKPATCH(E.TC, U.QUAD); S.CHAIN:=E.FC }

答案二:

(1) S ? do M1 S(1) While M2 E

M ?ε (3分)

(2) M ?ε { M.QUAD := NXQ } (6分) S ? do M1 S(1) While M2 E {

BACKPATCH(S(1).CHAIN, M2.QUAD); BACKPATCH(E.TC, M1.QUAD);

S.CHAIN:=E. FC } 七、(8分)将语句

if (A0) then while C>0 do C:=C+D 翻译成四元式。(8分) 答:

100 (j<, A, X, 102) 101 (j, -, -, 109) 102 (j>, B, 0, 104) 103 (j, -, -, 109) 104 (j>, C, 0, 106) 105 (j, -, -, 109) 106 (+, C, D, T1) 107 (:=, T1, -, C) 108 (j, -, -, 104) 109

(控制结构3分,其他5分)

八、(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是出基本块后的活跃变量,请给出优化后的四元式序列。

答:(1) DAG如右图:(6分) n7 A n8 T6,B

_ *

n3 T1,T5, B n6 T4

/ +

n2 n1 n4 T2 n5 T3

(2) 四元式序列:(4分) T1:=S+R T4:=S/R A:=T1-T4 B:=T1*4

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

的LR分析表如下

状态 0 1 2 3 4 5 6 7 8 9 a s3 s6 s3 r3 s6 r2 S R 3 4 九、(9分) 设已构造出文法G(S):

ACTION b s4 s7 s4 r3 s7 r2 # acc r1 r3 r2 S 1 GOTO B 2 5 8 9

假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)。

答: 步骤 0 1 2 3 4 5 6 7 8 9

状态 0 03 034 038 02 026 0267 0269 025 01 符号 # #a #ab #aB #B #Ba #Bab #BaB #BB #S 输入串 abab# bab# ab# ab# ab# b# # # #

# acc

《编译原理》期末试题(八)

1.(10分)处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。

2.为语言L = {ambn | 0 ? m ? 2n}(即a的个数不超过b的个数的两倍) 写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。) 3.(10分)构造下面文法的LL(1)分析表。 D ? TL T ? int | real L ? id R R ? , id R | ? 4.(15分)就下面文法 S ? ( L) | a L ? L ? S | S

? 给出一个语法制导定义,它输出配对括号的个数。 ? 给出一个翻译方案,它输出每个a的嵌套深度。

如句子(a, (a, a) ),第一小题的输出是2,第二小题的输出是1 2 2。 5.(10分)Pascal语言for语句的含义见教材第222页习题7.13。请为该语句设计一种合理的中间代码结构。你可以按第215页图7.17的方式或者第219页图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。 6.(5分)一个C语言程序如下: func(i1,i2,i3) long i1,i2,i3; {

long j1,j2,j3;

printf(\ printf(\}

联系客服:779662525#qq.com(#替换为@)