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