编译原理第二版第五章答案.docx
- 文档编号:6509556
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:12
- 大小:23.48KB
编译原理第二版第五章答案.docx
《编译原理第二版第五章答案.docx》由会员分享,可在线阅读,更多相关《编译原理第二版第五章答案.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理第二版第五章答案
第五章
第5章自顶向下语法分析方法
练习(P99)
1.文法
S->aF|(T)
T->T,S|S
(1)对(a,(a,a)和(((a,a),A,(a)),a)的最左推导。
(3)经改写后的文法是否为LL
(1)的?
给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
(1)对(a,(a,a)的最左推导为:
S=>(T)
=>(T,S)=>(S,S)=>(a,S)=>(a,(T))
=>(a,(T,S))
=>(a,(S,S))
=>(a,(a,S))=>(a,(a,a))
对(((a,a),A,(a)),a)的最左推导为:
S=>(T)=>(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),A,S),S)=>(((a,a),A,(T)),
S)
=>(((a,a),A,(S)),S)=>(((a,a),A,(a)),S)=>(((a,a),A,(a)),a)
(3)改写文法为:
0)S->a
1)S->a
2)S->(T)
3)T->SN
4)N->,SN
5)N->£
FIRST
FOLLOW
S
aa(
#,)
T
a
A
(
)
N
£
)
对左部为N2的产生式可知:
FIRST(->,SN2)={,}
FIRST(->£)={£}
FOLLOW(N2)={)}
{,}n{)}=?
所以文法是LL
(1)的。
预测分析表
a
A
(
)
5
#
S
->a
->A
->(T)
T
->SN
->SN
->SN
N
->£
->,SN
也可由预测分析表中无多重入口判定文法是LL
(1)的。
(4)对输入串(a,a)#的分析过程为:
步骤
状态栈
当前字符
剩余输入串
操作
1
#S
(
a,a)#
S->(T)
2
#)T(
(
a,a)#
匹配
3
#)T
A
a)#
T->SN2
4
#)N2S
A
a)#
S->a
5
#)N2a
A
a)#
匹配
6
#)N2
5
a)#
N2->,SN2
7
#)N2S,
5
a)#
匹配
8
#)N2S
a
)#
S->a
9
#)N2a
a
)#
匹配
10
#)N2
)
#
N2->£
11
#)
)
#
匹配
12##
可见输入串(a,a)#是文法的句子。
2.对下面的文法G:
iTE
E't+E|£
TtFT
T'tT|£
Ftpf'
F't*F'|&
Pt(E)|a|bF
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
⑵证明这个文法是LL
(1)的。
(3)构造它的预测分析表。
(4)构造它的预测下降分析程序
【解】
(1)由题意分析得可推导出£的非终结符表为:
各非终结符的FIRST集为:
FIRST(E)=FIRST(T)={(,a,b,A}FIRST(E')={+}U{£}={+,门
FIRST(T)=FIRST(F)={(,a,b,a}
FIRST(T')=FIRST(T)U{£}={(,a,b,a,&}
FIRST(F)=FIRST(P)={(,a,b,a}FIRST(F')={*}U{£}={*,门
FIRST(P)={(,a,b,a}
•••最终求得各非终结符的FIRST集为:
FIRST(E)={(,a,b,A}FIRST(E')={+,£FIRST(T)={(,a,b,a}
FIRST(T')={(,a,b,a,£}FIRST(F)={(,a,b,a}FIRST(F')={*,£
FIRST(P)={(,a,b,a}
各非终结符的FOLLOW!
为:
FOLLOW(E)={#}UFOLLOW(E)U{)}
FOLLOW(E)=FOLLOW(E)
FOLLOW(T)=FOLLOW(T)U(FIRST(E')-{£})UFOLLOW(E)
FOLLOW()=FOLLOW(T)
FOLLOW(F)=(FIRST(T)-{£})UFOLLOW(T)
FOLLOW(F)=FOLLOW(F)UFOLLOW(F)
•••最终求得各非终结符的FOLLOW!
为:
FOLLOW(E)={#)}FOLLOW(E)={#,)}FOLLOW(T)={#,+,)}
FOLLOW()={#,+,)}FOLLOW(F)={(,a,b,人,#,+,)}
FOLLOW(F)={(,a,b,A,#,+,)}FOLLOW(P)={*,(,a,b,A,#,+,)}
(2)各产生式的SELECT集为:
SELECT(&TE')=FIRST(TE()=FIRST(T)={(,a,b,A}
SELECT(E't+E)=FIRST(+E)={+}
SELECT(E'f£)=(FIRST(£)-{£})UFOLLOW(E)=FOLLOW(E)={#,)}
SELECT(T»FT')=FIRST(FT‘)=FIRST(F)={(,a,b,人}
SELECT(T~T)=FIRST(T)={(,a,b,a}
SELECT(Tf)=(FIRST(£)-{£})UFOLLOW(T)=FOLLOW(T)={#,+,)}
SELECT(F>PF')=FIRST(PF‘)=FIRST(P)={(,a,b,a}
SELECT(Ft*F‘)=FIRST(*F‘)=FIRST(P)={*}
SELECT(F)=(FIRST(£)-{£})UFOLLOW(F)=FOLLOW(F)={(,a,b,a,#,+,)}
SELECT(P>(E))=FIRST((E))={(}
SELECT(P>a)=FIRST(a)={a}
SELECT(P>b)=FIRST(b)={b}
SELECT(P>A)=FIRST(A)={A}
•由以上结果得相同左部产生式的SELECT交集为:
select(e‘t+e)nselect(e‘t£)={+}n{#,)}
SELECT(TtT)nSELECT(Tt£)={(,a,b,A)n{#,+,)}=①
SELECT(Ft*F()nSELECT(Ft&)={*}n{(,a,b,卜,#,+,)}=①
SELECT(P>(E))nSELECT(Ta)nSELECT(Tb)nSELECT(TA)={(}n{a}n{b}n{A}=
•相同左部产生式的SELECT集合的交集为空。
•这个文法是LL
(1)的。
(3)由以上算出的SELECT集可以构造该文法的预测分析表如下:
+
*
(
)
a
b
A
#
E
TTE'
tTE'
tTE'
tTE'
E,
t+E
Tg
Tg
T
tFT'
tFT,
tFT'
tFT'
T,
tT
Tg
TT
TT
TT
Tg
F
tPF'
TPF'
TPF'
TPF'
F,
t*f,
Tg
Tg
Tg
Tg
Tg
Tg
P
T(E)
Ta
Tb
T
voidP()
{Getchar();
if
ch='('
{
E();
Getchar();if
ch='
)'Getchar();}
else
ifch='a'
Getchar();
else
ifch='b'
Getchar();
elseerror(),
}
}
voidF'()
{Getchar();
ifch='*'
F'();
elseerror();
}
F'();
}
voidF()
{
P();
F'();
}
voidT'()
{
T();
}
(4)不妨约定:
在进入一个非终结符号相应的子程序前,已读到一个单词ch:
存放当前
读到的单词,Getchar()为一子程序,每调用一次,完成读取一单词的任务,Error()为出错
处理程序。
4.证明下述文法不是LL
(1)文法。
S->C$
C->bA|aB
A->a|aC|bAA
B->b|bC|aBB
你能否构造一等价的文法,使其是LL
(1)?
并给出判断过程。
【解】因为SELECT(A->a)nSELECT(A->aC)工①,根据LL
(1)文法的判定条件:
(1)文法不含左递归
(2)对于文法U的任意两个不同的规则有:
Select(U~a)nSelect(U)=①一个文法若满足以上条件,称该文法G为LL
(1)文
法。
得出该文法不是LL
(1)文法。
该文法含公共因子,消除后的文法为:
S->C$
C->bA|aB
A->aA'|bAA
A->C|£
B->bB'|aBB
B'->C|&
【证明】因为SELECT(C->bA)nSELECT(C->aB)=①
SELECT(A->Aa)nSELECT(A->bAA)=①
SELECT(A->C)nSELECTA->e)=(FIRST(C)-{£})nFOLLOW(A)工①
因此消除公共因子后得到文法也不是LL
(1)文法。
7•对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL
(1)文法?
试对下面
文法进行改写,并对改写后的文法进行判断。
(1)A->baB|&[1]
B->Abb|a[2]
⑵AtaABe|a[1]
B~Bb|d[2]
⑶StAa|b[1]
atSB[2]
Btab[3]
【解】
对于一个文法若消除了左递归,提取了左公因子后不一定是LL
(1)文法。
1题:
A->baB|&
B->Abb|a
先改写文法为:
0)A->baB
1)A->&
2)B->baBbb
3)B->bb
4)B->a
再改写文法为:
0)A->baB
FIRST
FOLLOW
A
{b}
{#}
B
{b,a}
{#,b}
N{b,a}{#,b}1)A->£
2)B->bN
3)B->a
4)N->aBbb
5)N->b
预测分析表
a
b
#
A
->baB
->&
B
->a
->bN
N
->aBbb
->b
由预测分析表中无多重入口判定文法是LL
(1)的。
2题:
[2]将产生式[1]提取左公因子后得:
a(ABe|&)
进一步变换为文法G1:
LaA'
A'tAbe
Bb|d
消除
(2)中的直接左递归,将Bb|d变换为:
dB'
B'tbB'|&
该文法最终改写成的形式为:
A^aA'
A'tAbe|&
B~dB'
B'tbB'|&
对此改写后的文法进行判断其是否是LL
(1)文法。
由分析得可推导出&的非终结符表为:
A
A,
B
B,
否
是
否
是
各非终结符的FIRST集为:
FIRST(A)={a}
FIRST(A')=FIRST(A)U{£}={a,&}
FIRST(B)={d}FIRST(B')={b}U{£}={b,&}
各非终结符的FOLLOW集为:
FOLLOW(A)={#}U(FIRST(B)-{£})={#,d}
FOLLOW(A)=FOLLOW(A)={#d}
FOLLOW(B)={e}
FOLLOW((B)=FOLLOW(B()UFOLLOW(B)={e}
各产生式的SELECT集为:
SELECT(A>aA')=FIRST(aA()={a}
SELECT(A~ABe)=FIRST(ABe)=FIRST(A)={a}
SELECT(A~£)=(FIRST(£)-{£})UFOLLOW(A)=FOLLOW(A)={#,d}
SELECT(B>dB')=FIRST(dB')={d}
SELECT(B~bB')=FIRST(bB')={b}
SELECT(B~£)=(FIRST(£)-{门)UFOLLOW(B)=FOLLOW(B)={e}
由以上结果得相同左部产生式的SELEC咬集为:
SELECT(AtABe)nSELECT(A^£)={a}n{#,d}=①
SELECT(B~bB')nSELECT(Br)={b}n{e}=①
•••相同左部产生式的SELECT集合的交集为空。
•••改写后的文法是LL
(1)的。
3题:
该文法的非终结符S,A为间接左递归,以S,AB为序消除一切左递归。
将
(1)的右部代入
(2)得:
A^AaB|bB
消除其直接左递归得:
A^bBA
AtaBA'|£
此时文法变成如下形式:
StAa|b
(1)
(2)
AtbBA
A'taBA'I£
Btab
此文法中的
(1),
(2)产生式存在隐含的左公因子,消除隐含的左公因子后文法变成如下的形式:
StbS'
S'tBAa|&
AtbBA
AtaBAI&
Btab
此形式中AtbBA是不可达的产生式,是多余的,所以应将其去掉。
所以文法最终改写成的形式为:
StbS
StBAaI&
AtaBAI&
Btab
相同左部产生式的SELECT集为:
SELECT(StBAa)={a}
SELECT(St&)={#}
SELECT(AtaBA)={a}
SELECT(At&)={a}
相同左部产生式的SELECT交集为:
SELECT(Stbaa)nSELECT(St£)={a}n{#}=①
SELECT(AtaBA')nSELECT(At£)={a}n{a}工①
•••关于a'的相同左部其产生式的select集的交集不为空
二此改写后的文法不是LL
(1)的。
4题:
S->ASIb
A->SAIa
该文法含间接左递归,因此运用间接左递归的算法对文法进行改写后的文法为:
S->ASIb
A->bAA'IaA'
A->SAA|£
SELECT(S>AS)QSELECT(S->b)={b,a}n{b}工①,二此改写后的文法不是LL
(1)的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 第二 第五 答案