编译原理 第5章习题解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章习题解答
5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。
S→SASC
S→ε
A→Aa
A→b
C→DcD
D→d
5.2 消除下列文法的左递归:
① G[A]:
A→BX∣CZ∣W
B→Ab∣Bc
C→Ax∣By∣Cp
② G[E]:
E→ET+∣ET–∣T
T→TF*∣TF/F
F→(E)∣i
③ G[X]:
X→Ya∣Zb∣c
Y→ Zd∣Xe∣f
Z→X e∣Yf∣a
④ G[A]:
A→Ba|Aa|c
B→Bb|Ab|d
5.3 设文法G[<语句>]:
<语句>→<变量>: = <表达式>|if<表达式>then<语句>
|if<表达式>then<语句>else<语句> <变量>→i
<表达式>→<项>|<表达式>+<项>
<项>→<因子>|<项>*<因子>
<因子>→<变量>|′(′<表达式>′)′
试构造该文法的递归下降子程序。
5.4 设文法G[E]:
E→ TE'
E'→ + E∣ε
T→ FT'
T'→ T∣ε
F→ PF'
F'→ *F∣ε
P→ (E)∣ a∣^
①构造该文法的递归下降分析程序;
②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;
③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。
5.5 设文法G[S]:
S→ SbA∣aA
B→ Sb
A→ Bc
①将此文法改写为LL(1)文法;
②求文法的每一个非终结符的FIRST集合和FOLLOW集合;
③构造相应的LL(1)分析表。
5.6 设文法G[S]:
S→ aABbcd∣ε
A→ ASd∣ε
B→ SAh∣eC∣ε
C→ Sf∣Cg∣ε
D→ aBD∣ε
①求每一个非终结符的FOLLOW集合;
②对每一个非终结符的产生式选择,构造FIRST集合;
③该文法是LL(1)文法。
5.7 设文法G[E]:
E→ Aa∣Bb
A→ cA∣eB
B→ bd
试画出其自上而下分析程序框图。
第五章习题参考答案
5.1 解:NDPDA M=(Q,∑,H,δ,q0,F,Z0)
Q={q}
∑={a,b,c,d}
H={S,A,C,D,a,b,c,d}
q0=q
F={q}
Z0=S
δ: δ(q,ε,S)={(q,SASC),(q,ε)}
δ(q,ε,A)={(q,Aa),(q,b)}
δ(q,ε,C)={(q,DCD)}
δ(q,ε,D)={(q,d)}
δ(q,a,a)=(q,ε)
δ(q,b,b)=(q,ε)
δ(q,c,c)=(q,ε)
δ(q,d,d)=(q,ε)
5.2 解:
①利用消除左递归的算法,将非终结符排序为U1=A,U2=B,U3=C,
则i=1,j=0时,对文法无影响。
i=2,j=1时,因为U i=B→Ab,U j=A→Bx|Cz|w
所以将B改写为B→Bxb|Czb|wb|Bc
消除产生式B的左递归:
B→CzbB′|wbB′
B′→xbB′|cB′| ε
i=3,j=1时,因为U i=C→Ax,U j=A→Bx|Cz|w
所以将C改写为C→Bxx|Czx|wx|By|Cp
j=2时,因为U i=C→Bxx|By,U j=B→CzbB′|wbB′
所以将产生式C改写为
C→CZbB′xx|CzbB′y|wbB′xx|wbB′y|Czx|wx|Cp
消除产生式C的左递归:
C→wbB′xxC′|wbB′yC′|wxC′
C′→zbB′xxC′|zbB′yC′|zxC′|pC′| ε
所以,文法消除左递归后变为
A→Bx|Cz|w
B→CzbB′|wbB′
B′→xbB′|cB′|ε
C→wbB′xxC′|wbB′yC′|wxC′
C′→zbB′xxC′|zbB′yC′|zxC′|pC′|ε
②利用消除左递归的算法,将非终结符排序为:U1=E,U2=T,U3=F
则 i=1,j=0时,无代入。
消除产生式E的左递归:
E→T{(T+|T-)}
i=2,j=1时,无代入。
消除产生式T的左递归:
T→{F*|F/F}
i=3,j=1时,无代入,也无产生式左递归,不改写产生式。
所以,文法消除左递归后变为
E→T{(T+|T-)}
T→{F*|F/F}
F→(E)|I
③利用消除左递归的算法,将非终结符排序为: U1=X,U2=Y,U3=Z
则 i=1,j=0时,无代入
i=2,j=1时,因为U i=Y→Zd|Xe|f,U j=X→Ya|Zb|c
所以将Y改写为 Y→Zd|Yae|Zbe|ce|f
消除左递归,得到 Y→ZdY′|ZbeY′|ceY′|fY′ Y′→aeY′|ε
i=3,j=1时,因为U i=Z→Xe|Yf|a,U j=X→Ya|Zb|c
所以将Z改写为Z→Yae|Zbe|ce|Yf|a j=2时, U i=Z→Yae|Yf, U j= Y→ZdY′|ZbeY′|ceY′|fY′