广工编译原理复习例题有客观题的答案.docx
《广工编译原理复习例题有客观题的答案.docx》由会员分享,可在线阅读,更多相关《广工编译原理复习例题有客观题的答案.docx(19页珍藏版)》请在冰豆网上搜索。
广工编译原理复习例题有客观题的答案
编译原理复习例题
一选择题
1.编译的各阶段工作都涉及B。
[A]词法分析[B]表格管理[C]语法分析[D]语义分析
2.D型文法也称为正规文法。
[A]0[B]1[C]2[D]3
3.D文法不是LL
(1)的。
[A]递归[B]右递归[C]2型[D]含有公共左因子的
4.文法E→E+E|E*E|i的句子i*i+i*i有C棵不同的语法树。
[A]1[B]3[C]5[D]7
5.文法S→aaS|abc定义的语言是C。
[A]{a2kbc|k>0}[B]{akbc|k>0}
[C]{a2k-1bc|k>0}[D]{akakbc|k>0}
6.若B为非终结符,则A→.B为D。
[A]移进项目[B]归约项目[C]接受项目[D]待约项目
7.同心集合并可能会产生新的D冲突。
[A]二义[B]移进/移进[C]移进/归约[D]归约/归约
8.代码优化时所依据的是C。
[A]语法规则[B]词法规则
[C]等价变换规则[D]语义规则
9.表达式a-(-b)*c的逆波兰表示(@为单目减)为B。
[A]a-b@c*[B]ab@c*-[C]ab@-[D]ab@c-*
10.过程的DISPLAY表是用于存取过程的B。
b
0
1
-
a
a
2
+
+
b
a
b
[A]非局部变量[B]嵌套层次[C]返回地址[D]入口地址
11.已知右图所示自动机M,请问下列哪个字符串不是M所能识别的。
D
[A]bbaa[B]abba[C]abab[D]aabb
12.若状态k含有项目“A→α.”,且仅当输入符号a∈FOLLOW(A)时,才用规则“A→α”归约的语法分析方法是D。
[A]LALR分析法[B]LR(0)分析法
[C]LR
(1)分析法[D]SLR
(1)分析法
13.有一语法制导翻译如下所示:
(第8章)
S->bAb{print“1”}
A->(B{print“2”}
A->a{print“3”}
B->Aa){print“4”}
若输入序列为b(((aa)a)a)b,则采用自下而上的分析方法,则输出是B。
[A]32224441[B]34242421
[C]12424243[D]34442212
14.局部优化是对D进行的优化。
[A]表达式 [B]部分代码
[C]循环体 [D]基本块
15.削减运算强度是对D的一种优化。
[A]表达式 [B]过程 [C]基本块 [D]循环
二填空题
1.词法分析阶段的任务式从左到右扫描 源程序,从而逐个识别单词 。
2.对于文法G[E]:
E→T|E+TT→F|T*FF→P^F|PP→(E)|i,句型T+T*F+i的句柄是 T 。
3.最右推导的逆过程称为最左规约,也称为规范规约。
4.符号表的信息栏中登记了每个名字的有关属性,如符号名、符号的类型、符号的存储类别和符号的作用域及可视性等。
5.一个确定有穷自动机由五部分组成:
有穷状态集、有穷字母表、转换函数、初态和终态集。
6.最常用的两类语法分析方法是 自顶向下 和 自底向上 分析法。
7.单词的三种描述工具:
正规文法、正规式和有穷自动机互相之间具有等价性。
8.在PL/0的目标代码解释执行时,寄存器B总是指向当前执行过程活动记录的 起始地址 ,而寄存器T总是指向 栈顶 。
9.LR(0)分析法的名字中”L”表示自左向右扫描输入符号串,”R”表示最右推导的逆过程,“0”表示向前看的输入符号的个数。
10.两种常用的动态存储分配办法是栈式动态分配和堆式动态分配。
三判断题(认为正确的填“T”,错的填“F”)
【T】1.同心集的合并有可能产生“归约/归约”冲突。
【T】2.一个文法所有句子的集合构成该文法定义的语言。
【F】3.非终结符可以有综合属性,但不能有继承属性。
【T】4.逆波兰表示法表示表达式时无需使用括号。
【F】5.一个确定有穷自动机有且只有一个终态。
【F】6.若过程p第k次被调用,则p的DISPLAY表中就有k+1个元素。
四解答题
1.给定文法G和句型(T+F)*i+T,
G:
E→E+T|TT→T*F|FF→(E)|i
(1)画出句型的语法树;
(2)写出句型的全部短语、简单短语和句柄。
解:
(略)
2.设有文法G:
S→S+S|S*S|i|(S)。
(1)对于输入串i+i*i给出一个最左推导;
(2)该文法是否是二义性文法?
请证明你的结论。
解:
(1)i+i*i的最左推导:
S=>S+S=>i+S=>i+S*S=>i+i*S=>i+i*i
(2)该文法是二义性的。
因为对于句子i+i*i可以画出两棵语法树(语法树略)。
3.给出语言{ambmcn|m≥1,n≥0}的上下文无关文法(2型)。
解:
G:
S→AB|A
A→aAb|ab
B→cB|c
4.给出语言{akbmcn|k,m,n≥1}的正规文法(3型)。
解:
G:
A→aA|aB
B→bB|bC
C→cC|c
5.将文法G改写成等价的正规文法(3型)。
G:
S→dAB
A→aA|a
B→bB|b
解:
G:
S→dA
A→aA|aB
B→bB|b
6.设有字母表{a,b}上的正规式R=(ab|a)*。
(1)构造R的相应有限自动机;
解:
0
1
2
3
b
a
a
ε
ε
-
+
(2)构造R的相应确定有限自动机;
解:
将
(1)所得的非确定有限自动机确定化
Ia
Ib
-+013
123
+123
123
13
+13
123
0
1
2
a
a
b
a
-+
+
+
(3)构造R的相应最小确定有限自动机;
解:
对
(2)得到的DFA化简,合并状态0和2为状态2:
1
2
a
a
b
-+
+
(4)构造与R等价的正规文法
解:
令状态1和2分别对应非终结符B和A
G:
A→aB|a|ε
B→aB|bA|a|b|ε
可化简为:
G:
A→aB|ε
B→aB|bA|ε
7.已知正规文法G[S]:
S→aS|bA|a
A→aS
(1)构造与之等价的自动机NFAM
(2)将NFAM确定化为DFAM’
I
Ia
Ib
-0
S
SZ
A
+1
SZ
SZ
A
2
A
S
8.有穷自动机M接受字母表={0,1}上所有满足下述条件的串:
串中至少包含两个连续的0或两个连续的1。
请写出与M等价的正规式。
解:
(0|1)*(00|11)(0|1)*
9.对右图所示的有限自动机
(1)若是确定的,则写出其转换矩阵;若不是,则将其确定化;
(2)最小化。
(注:
确定化和最小化均应给出转换矩阵和图示)。
解:
(1)
符号
状态
a
b
-1
2
3
2
1
4
+3
2
5
+4
1
6
5
5
5
6
6
6
(2)首先将状态按终态和非终态分成两个集合{1,2,5,6}和{3,4}
检查子集{1,2,5,6},由于f(1,a)=2,f(2,a)=1,f(5,a)=4,f(6,a)=3,所以子集{1,2,5,6}可进一步划分为{1,2}和{5,6}
检查子集{3,4},由于f(3,a)=2,f(4,a)=1以及f(3,b)=5,f(4,b)=6,所以不用进一步划分了。
检查子集{1,2},由于f(1,a)=2,f(2,a)=2以及f(1,b)=3,f(2,b)=4,所以不用进一步划分了。
检查子集{5,6},由于f(5,a)=4,f(6,a)=3以及f(5,b)=¢,f(6,b)=¢,所以不需要进一步划分了。
因此最终划分的结果是{1,2}、{3,4}和{5,6},重新命名状态,令{1,2}为1,{3,4}为3和{5,6}为5,则得到化简后的DFA为
符号
状态
a
b
-1
1
3
+3
1
5
5
5
5
10.写出在{a,b}上,不以a开头,但以aa结尾的字符串集合的正规式(并构造与之等价的最简DFA)。
解:
依题意,“不以a开头”,则必以b开头,又要“以aa结尾”,故正规式为:
b(a|b)*aa
(构造与之等价的最简DFA,此略)
11.写一个LL
(1)文法G,使其语言是
L(G)={ambnc2n|m>=0,n>0}
并证明文法是LL
(1)。
解:
文法G(S):
SaS|E
EbE’
E’Ecc|cc
Select(SaS)∩Select(SE)=Ф
Select(E’Ecc)∩Select(E’cc)=Ф
故文法为LL
(1)的
12.将文法G改写成等价的LL
(1)文法,并构造预测分析表。
G:
S→S*aT|aT|*aT
T→+aT|+a
(编写递归下降子程序)
解:
消除左递归后的文法G’:
S→aTS’|*aTS’
S’→*aTS’|ε
T→+aT|+a
提取左公因子得文法G’’:
S→aTS’|*aTS’
S’→*aTS’|ε
T→+aT’
T’→T|ε
Select(S→aTS’)={a}
Select(S→*aTS’)={*}
Select(S→aTS’)∩Select(S→*aTS’)=Ф
Select(S’→*aTS’)={*}
Select(S’→ε)=Follow(s’)={#}
Select(S’→*aTS’)∩Select(S’→ε)=Ф
Select(T→+aT’)={+}
Select(T’→T)=First(T)={+}
Select(T’→ε)=Follow(T’)={*,#}
Select(T’→T)∩Select(T’→ε)=Ф
所以该文法是LL
(1)文法。
预测分析表:
*
+
a
#
S
S’Ta,N
TS’T,N
S’
S’Ta,N
ε,P
T
T’a,N
T’
ε,P
T,P
ε,P
a
ε,N
#
OK
(递归下降子程序,略)
13.对文法G[S]:
S→aSb|P
P→bPc|bQc
Q→Qa|a
构造简单优先关系表。
该文法是否是简单优先文法?
解:
简单优先关系矩阵如下:
S
a
b
P
Q
c
S
=
a
=
<>
<
<
>
b
<
<>
=
=<
P
>
=
Q
=
=
c
>
>
由于矩阵中有元素存在多种优先关系,故不是简单优先文法。
14.考虑文法G:
S→AS|b
A→SA|a
(1)构造文法的可归前缀图(活前缀的DFA);
(2)判断文法是否是LR(0)文法,并说明理由。
解:
(1)可归前缀图
(2)因为存在冲突,所以不是LR(0)文法。
15.已知文法G[S]:
S→Uta|Tb
T→S|Sc|d
U→US|e
(1)试判断G是LR(0),SLR
(1),LALR
(1)还是LR
(1),说明理由。
(2)构造相应的分析表。
解:
(1)首先拓广文法为G',增加产生式S'→S
(0)S'→S
(1) S→UTa
(2)S→Tb(3)T→S
(4)T→Sc(5)T→d(6)U→US(7)U→e
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
(2)在I1中:
S'→S.为接受项目,T→S.为归约项目,T→S.c为移进项目,存在接受-归约和移进-归约冲突,因此所给文法不是LR(0)文法。
在I1中:
Follow(S')∩Follow(T)={#}∩{a,b}=
Follow(T)∩{c}={a,b}∩{c}=
在I8中:
Follow(U)∩Follow(T)∩{c}={d,e}∩{a,b}∩{c}=
所以在I1中的接受-归约和移进-归约冲突与I8中的移进-归约和归约-归约冲突可以由Follow集解决,所以G是SLR
(1)文法。
构造的SLR
(1)分析表如下:
状态(State)
Action
Goto
a b c d e #
S U T
0
1
2
3
4
5
6
7
8
9
10
S5 S4
r3 r3 S6 Acc
S5 S4
S9..................
r7 r7
r5 r5........................
r4 r4.........................
S10 S9.........................
r3 r3. S6 r6 r6......
r2 r2. r2 r2 r2 r2
r1 r1. r1 r1 r1 r1
1 2 3
.
8 2 7
16.文法G及其LR分析表如下,请给出对串dada#的分析过程。
G:
S→VdB①
V→e②
V→ε③
B→a④
B→Bda⑤
B→ε⑥
状态
ACTION
GOTO
d
e
a
#
S
B
V
0
r3
S3
1
2
1
acc
2
S4
3
r2
4
r6
S5
r6
6
5
r4
r4
6
S7
r1
7
S8
8
r5
r5
解:
对输入串dada#的分析过程
步骤
状态栈
符号栈
剩余输入符号
动作
1
2
3
4
5
6
7
8
9
0
02
024
0245
0246
02467
024678
0246
01
#
#V
#Vd
#Vda
#VdB
#VdBd
#VdBda
#VdB
#S
dada#
dada#
ada#
da#
da#
a#
#
#
#
用V→ε归约
移进
移进
用B→a归约
移进
移进
用B→Bda归约
用S→VdB归约
接受
17.对以下文法,请写出关于配对括号数目ps的属性文法。
文法规则
语义规则
S→(T)
S→i
T→T,S
T→S
解:
h表示配对括号数目
(1)S.h=T.h+1
(2)S.h=0
(3)T.h=T’.h+S.h(4)T.h=S.h
18.把下列语句
ifx>0andy>0thenz:
=x+y
elsex:
=x+2
翻译成四元式序列。
解:
略
19.对传值、传地址和传名3种参数传递方法分别写出下列程序的输出:
voidp(intx,inty,intz){
y*=3;
z+=x;
}
voidmain(){
inta=5,b=2;
p(a*b,a,a);
printf(“%d\n”,a);
}
这些参数传递机制如何实现?
解:
(1)传值5;
(2)传地址25;(3)传名45
(参数传递机制,略)
20.将下面程序划分为基本块,并画出其程序流图。
b:
=1
b:
=2
ifw<=xgotoL2
e:
=b
gotoL2
L1:
gotoL3
L2:
c:
=3
b:
=4
c:
=6
L3:
ify<=zgotoL4
halt
L4:
g:
=g+1
h:
=8
gotoL1
解:
(1)基本块:
(2)程序流图
b:
=1
1
4
2
3
7
6
5
b:
=2
ifw<=xgotoL2
(1)
e:
=b
gotoL2
(2)
L1:
gotoL3(3)
L2:
c:
=3
b:
=4
c:
=6(4)
L3:
ify<=zgotoL4(5)
halt(6)
L4:
g:
=g+1
h:
=8
gotoL1(7)
21.对PL/0语言If……ELSE子句填空:
<条件语句>:
:
=IF<条件>THEN<语句>ELSE<语句>
注:
FOR语句和WHILE语言的填空
请在空缺处填空,完成条件语句的编译算法:
switch(SYM){
……
caseIFSYM:
;
CONDITION(SymSetUnion(SymSetNew(THENSYM),FSYS),LEV,TX);
if(SYM==THENSYM)GetSym();
elseError(16);
CX1=CX;GEN(JPC,0,0);
STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX);
CX2=CX;GEN(JMP,0,0);
;
If()
{GetSym();
STATEMENT(FSYS,LEV,TX);
;
}
break;
……
}
解:
(1)getSym()
(2)Code[CX1].A=CX
(3)SYM==ELSESYM(4)Code[CX2].A=CX