编译原理(陈火旺第三版)练习答案

更新时间:2023-06-03 19:51:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

编译原理(陈火旺第三版)练习答案

本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动!

更多计算机考研资料请大家到:www.jsj8.com下载!

第二章

(1)L(G)是0~9组成的数字串; (2)最左推导:

N ND NDD NDDD DDDD 0DDD 01DD 012D 0127 N ND DD 3D 34

N ND NDD DDD 5DD 56D 568 最右推导:

N ND N7 ND7 N27 ND27 N127 D127 0127 N ND N4 D4 34

N ND N8 ND8 N68 D68 568

G(S):(没有考虑正负符号问题) S→P|AP

P→1|3|5|7|9 A→AD|N

N→2|4|6|8|P D→0|N

或者:(1)S→ABC|C

A→1|2|3|4|5|6|7|8|9 B→BA|B0|ε C→1|3|5|7|9 G(E):E→T|E+T|E-T T→F|T*F|T/F F→(E)|i 最左推导:

E E+T T+T F+T i+T i+T*F i+F*F i+i*F i+i*i

E T T*F F*F i*F i*(E) i*(E+T) i*(T+T) i*(F+T) i*(i+T) i*(i+F) i*(i+i) 最右推导:

E E+T E+T*F E+T*i E+F*i E+i*i T+i*i F+i*i i+i*i

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

编译原理(陈火旺第三版)练习答案

本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动!

更多计算机考研资料请大家到:www.jsj8.com下载!

语法树:

E

E

E + T

E

+

T

E + T

F TT*

F

T i

F F F i

F i

i

i

i

i+i+i

i+i*i 句子:iiiei有两个语法树: S

S iSeS iSei iiSei iiiei i

S

e

S

S iS iiSeS iiSei iiiei

i

S

因此iiiei是二义性句子,因此 i

该文法是二义性的。 i

S→TS|T T→(S)|()

P-36-11

L1: G(S): S→AC A→aAb|ab C→cC|ε L2: G(S): S→AB A→aA|ε B→bBc|bc L3: G(S): S→AB A→aAb|ε B→aAb|ε L4: G(S): S→1S0|A A→0A1|ε

或者:S→A|B A→0A1|ε B→1B0|A

E

E -

T

E-

T

F TF i

F i

i

i-i-i

S

i S e

S

i

i

编译原理(陈火旺第三版)练习答案

本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动!

更多计算机考研资料请大家到:www.jsj8.com下载!

第三章

(1)

确定化:

{X} Φ,2,3} Φ

Φ

Φ

{1,2,,,3,4} {2,,,3,4} {2,3,,3,,3,4} {2,3,,,3,4,Y} {2,3,4,,3,,3,4}

最小化:{0,1,2,3,4,5},{6}

{0,1,2,3,4,5}0={1,3,5} {0,1,2,3,4,5}1={1,2,4,6} {0,1,2,3,4},{5},{6} {0,1,2,3,4}0={1,3,5} {0,1,2,3},{4},{5},{6}

{0,

1,2,3}0={1,3} {0,1,2,3}1={1,2,4} {0,1},{2,3},{4},{5},{6}

{0,1}0={1} {0,1}1={1,2} {2,3}0={3} {2,3}1={4} {0},{1},{2,3},{4},{5},{6}

编译原理(陈火旺第三版)练习答案

本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动!

更多计算机考研资料请大家到:www.jsj8.com下载!

P64-8 (1)

(0|1)*01 (2)

(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(0|5)|(0|5) (3)

0*1(0|10*1

)* | 1*0(1|01*0)*

P84-12 (a)

a

确定化:

Φ Φ

Φ

Φ

给状态编号:

编译原理(陈火旺第三版)练习答案

最小化:

{0,1} {2,3}

{0,1}a={1},{0,1}b={2} {2,3}a={0,3},{2,3}={3} {0,1},

{2},{3}

a

(b)

已经确定化,只需最小化: {0,1},{2,3,4,5} {0,1}a = {1} {0,1}b = {2,4}

{2,3,4,5}a = {1,3,0,5} {2,3,4,5}b = {2,3,4,5}

又:{2,4}a = {1,0} {2,4}b = {3,5} {3,5}a={3,5} {3,5}b = {2,4} 分划为:{0,1},{2,4},{3,5} {0,1}a = {1} {0,1}b = {2,4} {2,4}a = {1,0} {2,4}b = {3,5} {3,5}a = {3,5} {3,5}b = {2,4} 所以不能再分

a

编译原理(陈火旺第三版)练习答案

P64-14 正规式:(0|10)*

还可以:

然后再确定化,最小化,结果应该一样。 P65-15

首先构造NFA:

则有:G(f) f→A1|B0|C1|C0 C→C0|C1|A1|B0 A→S1|1 B→S0|0

S→S0|S1|0|1 或者是确定化,然后最小化:

1

G(C) C→C0|C1|A0|B1

A→0|B0 B→1|A1

编译原理(陈火旺第三版)练习答案

人、狼、羊、白菜:

{{M、W、G、C},{}}表示在左岸,{{},{M、W、G、C}}在右岸,将可能存在的状态中去掉不安全状态,剩下:

{{M、W、G、C},{}},{{},{M、W、G、C}},{{M、W、G},{C}},{{M、W、C},{G}}, {{M、G、C},{W}} ,{{C},{M、W、G}} ,{{G},{M、W、C}},{{W},{M、G、C}}, {{M、G},{W、C}} ,{{W,C},{M、G}}

箭弧上的标记符:<M>:表示人单独过河、<MG>:表示人和羊过河、<MW>:表示人和狼过河、<MC>:表示人和白菜过河

编译原理(陈火旺第三版)练习答案

第四章

P81-1

(1) 按照T,S的顺序消除左递归 G'(S):S→a| |(T) T→ST'

T'→,ST'|ε

递归下降子程序: procedure S: begin

if sym = ‘a’or sym= ‘ ’

then advance else if sym=‘(’ then begin advance;T;

if sym = ‘)’ then advance; else error; end

else error end

procedure T; begin S;T' End

Procedure T'; Begin

If sym = ‘,’ Then begin Advance; S;T'

End End

其中:sysm为输入串指针所指的符号;advance是把输入指针调至下一输入符号。 (2) 求First和Follow集合: First(S)={a 、 、(} First(T)={a 、 、(} First(T')={, 、ε} Follow(S)={ , 、) 、 #} Follow(T) = { ) } Follow(T')={ ) } a ( ) , # S S→a S→ S→(T) T T→ST' T→ST' T→ST'

T'

T'→ε

T'→,ST'

编译原理(陈火旺第三版)练习答案

P81-2

文法:E→TE' E'→+E|ε T→FT' T'→T|ε F→PF' F'→*F'|ε P→(E)|a|b| (1)

First(E) = {(,a,b, } First(E') = {+,ε} First(T) = {(,a,b, } First(T') = {(,a,b, , ε} First(F) = {(,a,b, } First(F') = {*,ε} First(P) = {(,a,b, }

Follow(E)={#, )} Follow(E')={#,)} Follow(T)={+,),#}

Follow(T')={+,),#} Follow(F)= {+,(,a,b, ,),# } Follow(F')={+,(,a,b, ,),# } Follow(P) ={*,+,(,a,b, ,),# }

(2)文法无左递归,考察E'→+E|ε T'→T|ε F'→*F'|ε P→(E)|a|b| E'→+E|ε: First(E') = {+,ε}∩Follow(E')={#,)} = Φ

T'→T|ε: First(T') = {(,a,b, , ε} ∩Follow(T')={+,),#} = Φ F'→*F'|ε:First(F') = {*,ε}∩Follow(F')={ (,a,b, ,),# } = Φ P→(E)|a|b| :候选式终结首符集两两不相交 所以该文法为LL(1)文法。 (3) LL(1)分析表 + * ( ) a b # E E→TE' E→TE'E→TE'E→TE' E' E'→+E E'→ε E'→εT T→FT' T→FT'T→FT'T→FT' T' T'→ε T'→T T'→εT'→T T'→T T'→T

T'→ε

F F→PF'

F→PF'F→PF'F→PF' F' F'→εF'→*F' F'→ε

F'→ε

F'→εF'→εF'→ε F'→εP

P→(E)

P→a

P→b

P→

(4) 构造递归下降程序

Procedure E; Begin

If sym = ‘(’ or sym = ‘a’ or sym = ‘b’ or sym = ‘ ’ Then begin T;E' end Else error End

Procedure E'; Begin

If sym = ‘+’

Then begin advance ; E end

Else if sym <> ‘)’ and sym <> ‘#’ then error End

Procedure T; Begin

If sym = ‘(’ or sym = ‘a’ or sym = ‘b’ or sym = ‘ ’ Then begin F; T' end Else error End

编译原理(陈火旺第三版)练习答案

Procedure T';

Begin if sym = ‘(‘ or sym = ‘a’ or sym = ‘b’ or sym = ‘ ’ Then begin T;

Else if sym = ‘*’ then error

End

Procedure F; Begin

if sym = ‘(‘ or sym = ‘a’ or sym = ‘b’ or sym = ‘ ’ Then begin P;F' end

Else error End

Procedure F' Begin

If sym = ‘*’

Then begin advance ; F' end End

Procedure P; Begin

If sym = ‘a’ or sym = ‘b’ or sym = ‘ ’

Then advance

Else if sym = ‘(‘ then Begin advance; E ;

If sym = ‘)’ then advance Else error End

Else error end P81-3 解答:(1)该文法不含左递归,计算First集合和Follow集合

Fisrt(S) = {a,b,c} First(A) = {a,ε} First(B)= {b,ε} Follow(S)={#} Follow(A)={b,c} Follow(B) = {c} 满足LL(1)文法的3个条件,所以是LL(1)文法; (2)该文法不含左递归,计算First集合和Follow集合

Fisrt(S) = {a,b} First(A) = {a,b,ε} First(B)= {b,ε} Follow(S)={#} Follow(A)={b} Follow(B) = {b}

考虑A→a|B|ε,Fisrt(A)中含有ε,而Fisrt(A)∩Follow(A)={b},所以不是LL(1)文法; (3)该文法不含左递归,计算First集合和Follow集合

Fisrt(S) = {a,b,ε} First(A) = {a,ε} First(B)= {b,ε} Follow(S)={#} Follow(A)={a,b,#} Follow(B) = {a,b,#}

考虑A→a|ε,Fisrt(A)中含有ε,而Fisrt(A)∩Follow(A)={a},所以不是LL(1)文法; (4)是LL(1)文法

编译原理(陈火旺第三版)练习答案

P82-4

文法:Expr→-Expr

Expr→(Expr)|Var ExprTail ExprTail→-Expr|ε Var→id VarTail VarTail→(Expr) |ε 解答:First(Expr)={-,(,id} First(Var)={id}

First(ExprTail)={-,ε} First(VarTail) = {(,ε} Follow(Expr)={#,)} Follow(Var) = {-,#,)} Follow(ExprTail)={#,)} Follow(VarTail)={ -,#,)} 所以LL(1)分析表: Expr

-

Expr→-Expr

id

Expr→Var ExprTail

Var→id VarTail

Expr→(Expr)

VarTail→(Expr)

#

ExprTail ExprTail→-Expr Var VarTail

VarTail→ε

ExprTail→ε

VarTail→ε VarTail→ε

分析id—id((id))

分析栈 输入 所用产生式 #Expr id--id((id)) #

#ExprTail Var id--id((id)) # Expr→Var ExprTail #ExprTail VarTail id id--id((id)) # Var→id VarTail #ExprTail VarTail --id((id)) #

#ExprTail --id((id)) # VarTail→ε

#Expr- --id((id)) # ExprTail→-Expr #Expr -id((id)) #

#Expr- -id((id)) # Expr→-Expr #Expr id((id)) #

#ExprTail Var id((id)) # Expr→Var ExprTail #ExprTail VarTail id id((id)) # Var→id VarTail #ExprTail VarTail ((id)) #

#ExprTail )Expr( ((id)) # VarTail→(Expr) #ExprTail )Expr (id)) #

#ExprTail ))Expr( (id)) # Expr→(Expr) #ExprTail ))Expr id)) #

#ExprTail ))ExprTail Var id)) # Expr→Var ExprTail #ExprTail ))ExprTail VarTail id id)) # Var→id VarTail #ExprTail )) ExprTail VarTail )) #

#ExprTail )) ExprTail )) # VarTail→ε #ExprTail )) )) # ExprTail→ε #ExprTail ) ) #

#ExprTail #

# # ExprTail→ε

编译原理(陈火旺第三版)练习答案

第五章

P133-1 E E+T E+T*F 短语:E+T*F,T*F 直接短语:T*F 句柄:T*F P133-2

文法:S→a| |(T) T→T,S|S (1)最左推导:

S (T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a)) S (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a), ,S),S) (((a,a), ,(T)),S) (((a,a), ,(S)),S) (((a,a), ,(a)),S) (((a,a), ,(T)),a)

最右推导:S (T) (T,S) (T,(T)) (T,(T,S)) (T,(T,a)) (T,(S,a)) (T,(a,a)) (S,(a,a)) (a,(a,a))

S (T,S) (T,a) (S,a) ((T),a) ((T,S),a) ((T,(T)),a) ((T,(S)),a) ((T,(a)),a) ((T,S,(a)),a) ((T, ,(a)),a) ((S, ,(a)),a) (((T), ,(a)),a) (((T,S), ,(a)),a) (((T,a), ,(a)),a) (((S,a), ,(a)),a) (((a,a), ,(a)),a) (2) (((a,a), ,(a)),a) (((S,a), ,(a)),a)

, ,(a)),a) (((T,a)

(((T,S), ,(a)),a) (((T), ,(a)),a) ((S, ,(a)),a) ((T, ,(a)),a) ((T,S,(a)),a) ((T,(a)),a) ((T,(S)),a) ((T,(T)),a) ((T,S),a) ((T),a)

编译原理(陈火旺第三版)练习答案

(S,a) (T,a) (T,S) (T) S

移进归约过程: 步骤 栈 输入串

动作 0 # (((a,a), ,(a)),a)#初始 1 #( ((a,a), ,(a)),a)#移进 2 #(( (a,a), ,(a)),a)# 移进 3 #((( A,a), ,(a)),a)# 移进 4 #((a ,a), ,(a)),a)# 移进 5 #(((S ,a), ,(a)),a)# 归约 6 #(((T ,a), ,(a)),a)# 归约 7 #(((T, A), ,(a)),a)# 移进 8 #(((T,a ), ,(a)),a)# 移进 9 #(((T,S ), ,(a)),a)# 归约 10 #(((T ), ,(a)),a)# 归约 11 #(((T) , ,(a)),a)# 移进 12 #((S , ,(a)),a)# 归约 13 #((T , ,(a)),a)# 归约 14 #((T, ,(a)),a)# 移进 15 #((T, ,(a)),a)# 移进 16 #((T,S ,(a)),a)# 归约 17 #((T ,(a)),a)# 归约 18 #((T, (a)),a)# 移进 19 #((T,( a)),a)# 移进 20 #((T,(a )),a)# 移进 21 #((T,(S )),a)# 归约 22 #((T,(T )),a)# 归约 23 #((T,(T) ),a)# 移进 24 #((T,S ),a)# 归约 25 #((T ),a)# 归约 26 #((T) ,a)# 移进 27 #(S ,a)# 归约 28 #(T ,a)# 归约 29 #(T, a)# 移进 30 #(T,a )# 移进 31 #(T,S )# 归约 32 #(T )# 归约 33 #(T) # 移进 34

#S

#

归约

编译原理(陈火旺第三版)练习答案

P133-3:文法:G(S):S→a| |(T) T→T,S|S

(1)FIRSTVT(S)={ a、 、(} FIRSTVT(T)={ ,、a、 、(} LASTVT(S)={ a、 、)} LASTVT(T)={,、a、 、)} (2)算符优先分析表

a ( ) , # a ( = ) , #

=

(3)优先函数:

a ( ) , # f 6 6 2 6 4 2 g

7

7

7

2

3

2

faf f( f) f, f#

gag g( ) , #

如果不考虑#,则:优先函数:

a ( ) , f 4 4 2 4 4 g

5

5

5

2

3

分析过程: 栈 输入

# (a,(a,a))# 初始 #( a,(a,a))# 移进 #(a ,(a,a))# 移进 #(S ,(a,a))# 归约 #(S, (a,a))# 移进 #(S,( a,a))# 移进 #(S,(a ,a))# 移进 #(S,(S ,a))# 归约 #(S,(S,

a))#

移进

编译原理(陈火旺第三版)练习答案

#(S,(S,a #(S,(S,S #(S,(T #(S,(T) #(S,S #(T #(T) #S

P134-5 (1)

))# ))# ))# )# )# )# # #

移进 归约 归约 移进 归约 归约 移进 归约

考察I1、I6、I7:

I1:存在移进-归约冲突,因为Follow(S’)={#},不包含a或b,因此冲突可以使用SLR解决方法解决。

I6:存在移进-归约冲突,因为Follow(A)={a,b},因此无法使用SLR方法解决移进-归约冲突

I7:存在移进-归约冲突,因为Follow(S)={#,a,b},因此无法解决移进-归约冲突 所以不是SLR(1)文法。

构造LR(1)项目集规范族:

编译原理(陈火旺第三版)练习答案

本文档由计算机吧【www.jsj8.com】搜集,版权归原作者,不得用于商业活动!

更多计算机考研资料请大家到:www.jsj8.com下载!

检查I5,[A→SA.,a/b],要求输入为a或者b使用A→SA归约,而[S→.b,a/b]及[A→.a,a/b]要求移进,因此存在移进-归约冲突,所以不是LR(1)文法。 P135-8 解答:

不存在左递归;

因为Fist(AaAb)={a},First(BbBa)={b}所以交集为空 所以该文法是LL(1)文法。

I0={S→.AaAb,S→.BbBa,A→.,B→.} I1=GO(I0,A)={ S→A.aAb } I2=GO(I0,B)={ S→B.bBa } I3=GO(I1,a)={ S→Aa.Ab,A→.} I4=GO(I2,b)={ S→Bb.Ba,B→.} I5=GO(I3,A)={ S→AaA.b } I6=GO(I4,B)={ S→BbB.a } I7=GO(I5,b)={ S→AaAb.} I8=GO(I6,a)= { S→BbBa.}

考虑:I0:存在两个归约项目,A→.,B→.,Follow(A)={a,b},Follow(B)={a,b},所以冲突不能解决,不是SLR(1)文法。

编译原理(陈火旺第三版)练习答案

第六章

P164-1

解答:表达式(4*7+1)*2的附注语法树:

L

n

*

F.val=29

digit.val=2

E.val=29 F.val=1

digit.val=1 F.val=4 digit.val=7

digit.val=4

P164-2

+

+

a b

(1)

a

b(2)

p165-5 (1)

E→E1+T { if (E1.type = int) and (T.type = int) then E.type = int Else E.type = real } E→T { E.type = T.type } T→num. num { T.type = real } T→num { T.type = int } (2)

E→E1+T { if (E1.type = int) and (T.type = int) then

E.type = int

E.code = E1.code || T.code || +

Else if (E1.type = real) and (T.type = real)

E.type = real

E.code = E1.code || T.code || + Else if E1.type = int then E.type = real

E.code = E1.code ||inttoreal || T.code || +

编译原理(陈火旺第三版)练习答案

Else

E.type = real

E.code = E1.code || T.code || inttoreal || +

End if

E→T { E.type = T.type

E.code = T.code}

T→num. num { T.type = real

E.code = num.num }

T→num { T.type = int

E.code = num }

P164-7

S→L1.L2 { S.val = L1.val + L2.val / 2L2.length }

S→L { S.val = L.val } L→L1B { L.val = 2*L1.val + B.c

L.length = L1.length + 1 }

L→B { L.val = B.c

L.length = 1 }

B→0 { B.c = 0} B→1 { B.c = 1}

P165-11

对D,L,T设置综合属性type。过程addtype(id.entry,type)用来将标识符id 的类型type填入到符号表中。 (1) 翻译模式:

D→id L { addtype(id.entry,L.type)}

L→,id L1 { L.type = L1.type ;addtype(id.entry,L1.type)} L→:T { L.type = T.type } T→integer { T.type = integer } T→real { T.type = real }

(2) 假设Ttype为已定义的表示“类型”的数据结构,预测翻译器如下: procedure D; var l_type:Ttype begin

if sym = “id” then begin

advance ; l_type = L ;

addtype(id.entry , l_type) end

else error end;

编译原理(陈火旺第三版)练习答案

procedure L; var l_type :Ttype; begin

if sym = “,” then begin

advance;

if sym = “id” then begin

advance ; l_type = L ;

adddtype(id.entry,l_type)

end else error ; end

else if sym = “:” then begin advance ; l_type = T ; end

else error ; return (l_type) ; end;

procedure T ; var t_type: Ttype ; begin

if sym = “integer” then

begin advance ;

t_type = integer ; end else if sym = “real” then

begin advance ; t_type = real ; end else error

return(t_type); end;

编译原理(陈火旺第三版)练习答案

第七章

P217-1

a*(-b+c) 后缀式:ab-c+* a+b*(c+d/e) 后缀式:abcde/+*+ -a+b*(-c+d) 后缀式:a-bc-d+*+

not A or not(C or not D) 后缀式:A not C D not or not or (A and B)or(not C or D) 后缀式:A B and C not D or or

(A or B)and(C or not D and E)后缀式: A B or C D not E and or and if (x + y)*z = 0 then (a+b)↑c else a↑b↑c 后缀式:xy+z*0= ab+c↑ abc↑↑ if-then-else P217-3

-(a+b)*(c+d)-(a+b+c) 三元式: (1)+,a,b (2)-,(1),- (3)+,c,d (4)*,(2),(3) (5)+,a,b (6)+,(5),c (7)-,(4),(6) 间接三元式: 三元式表: (1)+,a,b (2)-,(1),- (3)+,c,d (4)*,(2),(3) (5)+,(1),c (6)-,(4),(5) 间接码表:(1),(2),(3),(4),(1),(5),(6) 四元式序列:

(1)+,a,b,T1 (2)-,T1,-,T2 (3)+,c,d,T3 (4)*,T2,T3,T4 (5)+,a,b,T5 (6)+,T5,c,T6 (7)-,T4,T6,T7

编译原理(陈火旺第三版)练习答案

P218-8

自下而上分析过程中把赋值语句A := B * (-C + D)翻译成四元式的步骤: 步骤 (1)

输入串 A := B * (-C + D)

栈四元式

A A- A-B A-B A-B-

(2) B * (-C + D)(3)* (-C + D): (4)(-C + D) (5)(-C + D) (6) (7) (8)

(-C + D) -C + D) C + D)

i := i i := E i := E*

i := E*( i := E*( i := E*( i := E*((-,C,-,T1) i := E*( i := E*( i := E*(

i := E*((+,T1,D,T2) i := E*( i := E*(E) i := E*E i := E A

A-B-T2 A-T3

(*,B,T2,T3) (:=,T3,-,A)

(9)D) (10)D) (11)D) (12) (13) (14) (15) (16) (17) (18)

D) ) ) )

(19)

P218-5 =

=10 x 20 的数组,C、D大小为10的数组,数组每维下届为1,每个数据项宽度为4,设A、B为

则:

A[i,j] := B[i,j] + C[A[k,1]] + D[i+j] T1 := i * 20 T1 := T1 + j T2 := A – 84 T3 := 4 * T1 T4 := i * 20 T4 := T4 + j T5 := B – 84 T6 := 4 * T4 T7 := T5[T6] T8 := k*20 T8 = T8 + 1 T9 := A – 84 T10 := 4 * T8 T11 := T9[T10] T12 := C – 4 T13 := 4 * T11 T14 := T12[T13]

本文来源:https://www.bwwdw.com/article/vpk1.html

Top