编译方法习题及答案
(2011-10-31 23:05:10)
标签:
杂谈 |
第2章 形式语言基础
2.2 设有文法G[N]:
D -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
(1)
(2)
解答:
(1)
(2)
0123的最左推导:N Þ ND Þ NDD Þ NDDD Þ DDDD Þ 0DDD Þ 01DD Þ 012D Þ 0123
0123的最右推导:N Þ ND Þ N3 Þ ND3 Þ N23 Þ ND23 Þ N123 Þ D123 Þ 0123
268的最左推导:N Þ ND Þ NDD Þ DDD Þ 2DDD Þ 26D Þ 268
268的最右推导:N Þ ND Þ N8 Þ ND8 Þ N68 Þ D68 Þ 268
2.4 写一个文法,使其语言是奇数的集合,且每个奇数不以0开头。
解答:
N -> 1 | 3 | 5 | 7 | 9 | BN
B -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B0
2.7 下面文法生成的语言是什么?
G1:
S->AB
A->aA| e
B->bc|bBc
G2:
S->aA|a
A->aS
解答:
B Þ bc
B Þ bBcÞ bbcc
B Þ bBcÞ bbBcc Þ bbbccc
……
A Þ ε
A Þ aA Þ a
A Þ aA Þ aaA Þ aa
……
∴S Þ AB Þ ambncn , 其中m≥0,n≥1
即L(G1)={
ambncn
S Þ a
S Þ aA Þ aaS Þ aaa
S Þ aA Þ aaS Þ aaaA ÞaaaaS Þ aaaaa
……
∴S Þ a2n+1 , 其中n≥0
即L(G2)={ a2n+1
2.11 已知文法G[S]:
请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。
解答:
S
(
(
因为S 不能 Þ (a),
所以 (a)不是文法的句型。
没有短语、直接短语和句柄。
S
(
(
(
因为S Þ (AS) Þ(A(AS)) Þ (A((SaA)S)) Þ (A((SaA)(b))),
所以(A((SaA)(b)))是文法的句型。
短语:(A((SaA)(b))),((SaA)(b)),(SaA),(b)
直接短语:(SaA),(b)
句柄:(SaA)
第3章 自动机基础
3.1 构造下列正规式相应的DFA。
(2) (a|b)*(aa|bb)(a|b)*
解答:
NFA:
③
NFA化为DFA:
②
最小化DFA:初始划分:{1,2,3},{4,5} à 最终划分:{1},{2},{3},{4,5}
②
3.2 将下图中的(a)和(b)分别确定化和最小化。
a |
a |
0 |
+ |
1 |
(a) |
a,b |
- |
a |
(b) |
b |
0 |
+ |
- |
1 |
2 |
3 |
4 |
5 |
- |
b |
b |
b |
b |
b |
a |
a |
a |
a |
a |
解答:
(a) NFA化为DFA:
{0,1}
{1}
最小化DFA:{1,2},{3}
(b) 本身为DFA,最小化DFA:
±①
3.4 给出文法G[S],构造相应最小的DFA。
解:
NFA:令 ①-S, ②-A, ③-B
NFA化为DFA:
{2,3}
3.6 给出与下图中的NFA等价的正规文法G。
a |
A |
+ |
B |
C |
D |
- |
b |
a |
b |
b |
b |
a |
- |
解:G(A):A à aB | bD
补充题1:构造与正规式(a|b)*c+|ab等价的DFA
(1) 与之等价的NFA为
(2) 消除ε边后的NFA为
(3)确定化过程如下:
|
a |
b |
c |
+ A {1,2} |
B {2,4} |
C {2} |
D {3} |
B {2,4} |
C {2} |
E {2,5} |
D {3} |
C {2} |
C {2} |
C {2} |
D {3} |
- D {3} |
|
|
D {3} |
- E {2,5} |
C {2} |
C {2} |
D {3} |
得到的DFA为:
第5章 语法分析
4.3 设有文法G[S]:
解答:
(1) 原文法有左递归,利用A->Ab|a可以化为
A->aA`
A`->bA`|e
可以得到,原文法可以化为G`(S):
S->A
A->BA`
A`->iBA`|e
B->CB`
B`->+CB`|e
C->)A*|(
(2) 扩展文法,增设一个产生式S`->S,作为主程序,得到的递归下降子程序的流程如下:
主程序
(3) 每个非终结符的FIRST集和FOLLOW集如下:
|
first |
Follow |
S |
{ ), ( } |
{ # } |
A |
{ ), ( } |
{ #, * } |
A` |
{ i } |
{ # , * } |
B |
{ ), ( } |
{ i, # ,*} |
B` |
{ + } |
{ i,#,* } |
C |
{ ), ( } |
{ +, i ,# ,*} |
其中,follow(B)=first(A`)∪follow(A)= first(A`)∪{*}∪follow(S)={i}∪{*}∪{#}
(4) 为产生式编号:
S->A
A->BA` ②
A`->iBA` ③ |e ④
B->CB` ⑤
B`->+CB` ⑥ |e ⑦
C->)A* ⑧ |( ⑨
select(⑤)=first(C)= {), (}
select(⑥)=first(+CB`)={+}
select(⑦)= first(e)∪follow(B`)={i,#,*}
select(⑧)=first()A*)={)}
select(⑨)=first(()={(}
|
i |
+ |
) |
* |
( |
# |
S |
|
|
① |
|
① |
|
A |
|
|
② |
|
② |
|
A` |
③ |
|
|
④ |
|
④ |
B |
|
|
⑤ |
|
⑤ |
|
B` |
⑦ |
⑥ |
|
⑦ |
|
⑦ |
C |
|
|
⑧ |
|
⑨ |
|
根据以上LL(1)分析表,得出输入串 (+)(*# 的分析过程如下:
分析栈 |
当前符号 |
剩余符号 |
查分析表:操作 |
#S |
( |
+)(*# |
①: push(A) |
#A |
( |
+)(*# |
②: push(A`B) |
#A`B |
( |
+)(*# |
⑤: push(B`C) |
#A`B`C |
( |
+)(*# |
⑨: push(() |
#A`B`( |
( |
+)(*# |
匹配( next(w) |
#A`B` |
+ |
)(*# |
⑥: push(B`C+) |
#A`B`C+ |
+ |
)(*# |
匹配+ next(w) |
#A`B`C |
) |
(*# |
⑧:push(*A)) |
#A`B`*A) |
) |
(*# |
匹配) next(w) |
#A`B`*A |
( |
*# |
②: push(A`B) |
#A`B`*A`B |
( |
*# |
⑤: push(B`C) |
#A`B`*A`B`C |
( |
*# |
⑨: push(() |
#A`B`*A`B`( |
( |
*# |
匹配( next(w) |
#A`B`*A`B` |
* |
# |
⑦: push(e) |
#A`B`*A` |
* |
# |
④: push(e) |
#A`B`* |
* |
# |
匹配* next(w) |
#A`B` |
# |
|
⑦: push(e) |
#A` |
# |
|
④: push(e) |
# |
# |
|
OK |
4.9 设文法G[S]为:
解答:
(1)扩展文法:
构造的文法的句柄识别器为:
(2)由上图可以看出,在③状态处存在移进和规约冲突,即{,4}和{r(1)},因此,不是LR(0)文法。
(3)对以上移进和规约冲突{,4}和{r(1)},(1)号产生式为S->r D,follow(S)∩{,}={#}∩{,}=F,因此,是SLR(1)文法。
根据文法的句柄识别器及移进和规约冲突的解决,得到的SLR(1)分析表如下:
|
r |
, |
i |
# |
S |
D |
0 |
r2 |
|
|
|
S1 |
|
1 |
|
|
|
OK |
|
|
2 |
|
|
i6 |
|
|
D3 |
3 |
|
,4 |
|
r1 |
|
|
4 |
|
|
i5 |
|
|
|
5 |
r2 |
r2 |
r2 |
r2 |
|
|
6 |
r3 |
r3 |
r3 |
r3 |
|
|
符号串ri,i# 的SLR(1)分析过程为:
分析栈 |
当前符号 |
剩余符号 |
执行的动作 |
#0 |
r |
i,i# |
push(r2) |
#0r2 |
i |
,i# |
push(i6) |
#0r2i6 |
, |
i# |
r(3) |
#0r2D3 |
, |
i# |
push(,4) |
#0r2 D3,4 |
i |
# |
push(i5) |
#0r2 D3,4i5 |
# |
|
r(2) |
#0r2D3 |
# |
|
r(1) |
#0S1 |
# |
|
OK |
4.10 考虑文法G[S]:
解答:
(1) 扩展文法:
S->a A (1)| b B (2)
构造的文法的句柄识别器为:
(2) 从以上句柄识别器中可以看出,没有任何状态存在移进和规约冲突,因此,是LR(0)文法。根据句柄识别器,可以得到LR(0)分析表如下:
|
a |
b |
0 |
1 |
# |
S |
A |
B |
0 |
a2 |
b4 |
|
|
|
S1 |
|
|
1 |
|
|
|
|
OK |
|
|
|
2 |
|
|
06 |
18 |
|
|
A3 |
|
3 |
r(1) |
r(1) |
r(1) |
r(1) |
r(1) |
|
|
|
4 |
|
|
09 |
1 11 |
|
|
|
B5 |
5 |
r(2) |
r(2) |
r(2) |
r(2) |
r(2) |
|
|
|
6 |
|
|
06 |
18 |
|
|
A7 |
|
7 |
r(3) |
r(3) |
r(3) |
r(3) |
r(3) |
|
|
|
8 |
r(4) |
r(4) |
r(4) |
r(4) |
r(4) |
|
|
|
9 |
|
|
09 |
1 11 |
|
|
|
B10 |
10 |
r(5) |
r(5) |
r(5) |
r(5) |
r(5) |
|
|
|
11 |
r(6) |
r(6) |
r(6) |
r(6) |
r(6) |
|
|
|
符号串 a001# 的LR(0)分析过程如下:
分析栈 |
当前符号 |
剩余符号 |
执行的动作 |
#0 |
a |
001# |
push(a2) |
#0a2 |
0 |
01# |
push(06) |
#0a206 |
0 |
1# |
push(06) |
#0a20606 |
1 |
# |
push(18) |
#0a2060618 |
# |
|
r(4) |
#0a20606A7 |
# |
|
r(3) |
#0a206A7 |
# |
|
r(3) |
#0a2A3 |
# |
|
r(1) |
#0S1 |
# |
|
OK |
附加题1:已知文法G[A]为:
A->aAB1|a
B->Bb|d
(1) 给出与G[A]等价的LL(1)文法G'[A];
(2) 构造G'[A]的预测分析表;
(3) 给出输入串aad1#的分析过程;
解答:
(1) 将递归和公因子处理后,得到的文法G'[A]为:
A->aA'
A'->AB1|ε
B->dB'
B'->bB'|ε
(2) 预测分析表为
|
a |
b |
1 |
d |
# |
A |
->aA' |
|
|
|
|
A' |
->AB1 |
|
|
->ε |
->ε |
B |
|
|
|
->dB' |
|
B' |
|
->bB |
->ε |
|
|
(3) 输入串aad1#的分析过程:
分析栈 |
当前符号 |
剩余符号 |
查分析表:操作 |
#A |
a |
ad1# |
push(aA') |
#A'a |
a |
ad1# |
匹配a next(w) |
#A' |
a |
d1# |
|
#1BA |
a |
d1# |
|
#1BA'a |
a |
d1# |
匹配a next(w) |
#1BA' |
d |
1# |
|
#1B |
d |
1# |
push(B'd) |
#1B`d |
d |
1# |
匹配d next(w) |
#1B |
1 |
# |
push(ε) |
#1 |
1 |
# |
匹配1 next(w) |
# |
# |
|
匹配,分析成功 |
第6章
【习题1】写出下列语句的四元式序列:
解答:
(1)
(2)
(3)
(1) ( lb
(2) (*
(3) ( -
(4) ( =
......
(8)
【习题2】表达式E的“值”描述如下:
如采用LR分析法,给出表达式(5*4+8)*2的语法树并在各结点注明语义值 val。
解答:
按照表达式属性文法中的语义动作,得到属性语法树:
【习题3】设有文法G:
E-> E + T | T
T-> T * F | F
F-> P↑F | P
P-> (E) | i
(1) 消除文法的左递归性,并构造适合递归子程序法的属性翻译文法。
(2) 消除文法的左递归性,并构造适合LL(1)分析法的属性翻译文法。
解答:
(1)
E -> T { + T}
T -> F { * F}
F-> P↑F | P
P -> ( E ) | i
根据这个文法,构造的适合递归子程序法的属性翻译文法:
E -> T { + T{GEQ(+)}}
T -> F { * F{GEQ(*)}}
F-> P↑F{GEQ(↑)} | P
P -> ( E ) | i {PUSH(i)}
(2) 消除文法的左递归,可得到以下文法:
E -> T
E´
E´-> + T E´| e
T -> F T´
T´-> * F T´| e
F-> P↑F | P
P -> ( E ) | i
根据以上文法,构造的适合LL(1)分析法的属性翻译文法:
E -> T
E´
E´-> + T {GEQ(+)} E´| e
T -> F T´
T´-> * F {GEQ(*)} T´| e
F-> P↑F{GEQ(↑)} | P
P -> ( E ) | i {PUSH(i)}
【习题4】根据6.4.2节给出的表达式的四元式属性翻译文法,写出a+b/c-d#的四元式 LL(1)法翻译过程(参照【例6.13 】)。
解答:
6.4.2节给出的表达式的四元式属性翻译文法为:
E -> T E´
①
E´-> + T {GEQ(+)} E´②| - T {GEQ(-)} E´③| e ④
T -> F T´⑤
T´-> * F {GEQ(*)} T´⑥| / F {GEQ(/)} T´⑦| e ⑧
F -> i {PUSH(i)} ⑨ | ( E ) ⑩
LL(1)分析表如下:
a+b/c-d#的四元式 LL(1)法翻译过程为:
SYN[n] |
x |
w |
操作 |
SEM[M] |
QT[q] |
#E |
E |
a |
push①R |
|
|
#E´T |
T |
a |
push⑤R |
|
|
#E´T´F |
F |
a |
push⑨R |
|
|
#E´T´{PUSH(a)}a |
a |
a |
next(w) |
|
|
#E´T´{PUSH(a)} |
|
+ |
PUSH(a) |
a |
|
#E´T´ |
T´ |
+ |
push⑧R |
a |
|
#E´ |
E´ |
+ |
push②R |
a |
|
# E´{GEQ(+)}T+ |
+ |
+ |
next(w) |
a |
|
# E´{GEQ(+)}T |
T |
b |
push⑤R |
a |
|
# E´{GEQ(+)}T´F |
F |
b |
push⑨R |
a |
|
# E´{GEQ(+)}T´{PUSH(b)}b |
b |
b |
next(w) |
a |
|
# E´{GEQ(+)}T´{PUSH(b)} |
|
/ |
PUSH(b) |
a b |
|
# E´{GEQ(+)}T´ |
T´ |
/ |
push⑦R |
ab |
|
# E´{GEQ(+)}T´{GEQ(/)}F/ |
/ |
/ |
next(w) |
ab |
|
# E´{GEQ(+)}T´{GEQ(/)}F |
F |
c |
push⑨R |
ab |
|
# E´{GEQ(+)}T´{GEQ(/)}{PUSH(c)}c |
c |
c |
next(w) |
ab |
|
# E´{GEQ(+)}T´{GEQ(/)}{PUSH(c)} |
|
- |
PUSH(c) |
abc |
|
# E´{GEQ(+)}T´{GEQ(/)} |
|
- |
GEQ(/) |
abc |
(/ b c t1) |
# E´{GEQ(+)}T´ |
T´ |
- |
push⑧R |
a t1 |
|
# E´{GEQ(+)} |
|
- |
GEQ(+) |
a t1 |
(+ a t1 t2) |
# E´ |
E´ |
- |
push③R |
t2 |
|
# E´{GEQ(-)}T - |
- |
- |
next(w) |
t2 |
|
# E´{GEQ(-)}T |
T |
d |
push⑤R |
t2 |
|
# E´{GEQ(-)}T´F |
F |
d |
push⑨R |
t2 |
|
# E´{GEQ(-)}T´{PUSH(d)}d |
d |
d |
next(w) |
t2 |
|
# E´{GEQ(-)}T´{PUSH(d)} |
|
# |
PUSH(d) |
t2 d |
|
# E´{GEQ(-)}T´ |
T´ |
# |
push⑧R |
t2 d |
|
# E´{GEQ(-)} |
|
# |
GEQ(-) |
t2 d |
(- t2 d t3) |
# E´ |
E´ |
# |
push④R |
t3 |
|
# |
|
# |
OK |
|
|
【习题5】给定二进制数的文法G(S)如下:
令 S 的综合属性 val 给出G(S)中 S 产生的二进制数的值,例如,对于输入 101.101 时,S.val=5.625。
试给出二进制数求值的属性文法(给出属性求值规则)。
产生式 |
语义规则 |
S ->L 1.L2 |
S.val=L1.val+L2.val/2L2.length |
S->L |
S.val=L.val |
L -> L1B |
L.val=L1.val*2+B.val L.length=L1.length+1 |
L -> B |
L.val=B.val L.length=1 |
B -> 0 |
B.val=0 |
B -> 1 |
B.val=1 |
第7章
【习题】设有程序片断如下,试填写符号表:
第8章
【习题1】试把以下程序段划分为基本块,并做出其程序流程:
int C;
A = 0;
B = 1;
L1 :
If B >= C goto L2;
B = B + 1;
goto L1;
L2:
halt;
基本块的划分:
根据基本块的入口语句的判断条件,入口语句为(1)、(4)、(8)、(9)、(12)
【习题2】设有基本块上的语句序列:
解答:
1.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10) (/ B C t8)
(11) (+ t7 t8 t9)
(12) (= t9 _ C)
构造DAG,进行常值表达式节省、公共表达式节省和删除多余运算等优化,得到的优化的DAG为:
交换临时变量与非临时变量(t9与C,t3与A)后得到如下DAG:
2. 根据基本块内优化的DAG,重组四元式:
(1) (/ B C t2)
(2) (+ 6 t2 A)
(3) (= A _ B)
(4) (/ A C t8)
(5) (+ 6 t8 C)
第 9 章
9.4 假设可用寄存器为R0和R1,试对以下四元式序列G给出目标代码的生成过程:
T1=B-C
T2=A*T1
T3=D+1
T4=E-F
T5=T3*T4
W=T2/T5
解:
四元式 |
目标代码 |
寄存器 |
内存 |
T1=B-C |
①LD R0,B ②SUB R0,C |
R0含T1 |
|
T2=A*T1 |
③MUL R0,A |
R0含T2 |
|
T3=D+1 |
④LD R1,D ⑤ADD R1,1 |
R0含T2 R1含T3 |
|
T4=E-F |
⑥ST R0,T2 ⑦LD R0,E ⑧SUB R0,F |
R0含T4 R1含T3 |
M含T2 |
T5=T3*T4 |
⑨ MUL R1,R0 |
R0含T4 R1含T5 |
M含T2 |
W=T2/T5 |
⑩ LD R0,T2 ⑾ DIV R0,R1 ⑿ ST R0,W |
|
M含W |
补充题
已知下列语句:
① if(a+b<c) x=(a+b)/(c-d)+(a+b);
② while (A!=0){A=2+B/C;B=2+B/C;}
※ 试分别解答:
⑴ 写出优化的四元式序列;
⑵ 标记变量的活跃信息;
⑶ 描述单寄存器R下的目标代码生成过程。
解:① if(a+b<c) x=(a+b)/(c-d)+(a+b)优化的四元式序列:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
附有活跃信息的四元式序列:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
单寄存器R下的目标代码生成过程:
四元式 |
目标代码 |
SEM |
RDV |
(1) |
(1)LD R,a (2)ADD R,b |
|
t1(y) |
(2) |
(3)LT R,c |
|
t2(y) |
(3) |
(4)FJ R,?(15) |
(4) |
|
(4) |
(5)LD R,a (6)ADD R,b |
|
t3(y) |
(5) |
(7)ST R,t3 (8)LD R,c (9)SUB R,d |
|
t4(y) |
(6) |
(10)ST R,t4 (11)LD R,t3 (12)DIV R,t4 |
|
t5(y) |
(7) |
(13)ADD R,t3 |
|
x |
(8) |
(14)ST R,x |
|
|
|
(15) |
|
|
② while (A!=0){A=2+B/C;B=2+B/C;}优化的四元式序列:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
附有活跃信息的四元式序列:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
单寄存器R下的目标代码生成过程:
四元式 |
目标代码 |
SEM |
RDV |
(1) |
(1) |
(1) |
|
(2) |
(1)LD R,A (2)NE R,0 |
|
t1(y) |
(3) |
(3)FJ R,?(10) |
(3) |
|
(4) |
(4)LD R,B (5)DIV R,C |
|
t2(y) |
(5) |
(6)ADD R,2 |
|
A |
(6) |
(7)ST R,B |
|
A |
(7) |
(8)ST R,A (9)JMP ?(1) |
|
|
|
(10) |
|
|