蒋立源编译原理第三版第四章习题与答案docx.docx
《蒋立源编译原理第三版第四章习题与答案docx.docx》由会员分享,可在线阅读,更多相关《蒋立源编译原理第三版第四章习题与答案docx.docx(48页珍藏版)》请在冰豆网上搜索。
蒋立源编译原理第三版第四章习题与答案docx
第五章
习题
5-1
设有文法
G[S]:
S
→A/
A
→aA∣AS∣/
(1)找出部分符号序偶间的简单优先关系。
(2)验证G[S]不是简单优先文法。
5-2对于算符文法G[S]:
S→EE→E-T∣TT→T*F∣FF→-P∣PP→(E)∣i
(1)找出部分终结符号序偶间的算符优先关系。
(2)验证G[S]不是算符优先文法。
5-3设有文法
G′
[E]:
E→E
E
→E+T|T
1
T→TT→T*F|F
F→(E)|i
1
1
1
1
1
其相应的简单优先矩阵如题图
5-3
所示,试给出对符号串(
i+i)进行简单优先分析的
过程。
题图5-3文法G′[E]的简单优先矩阵
5-4设有文法G[E]:
E→E+T|T
T→T*F|F
F→(E)|i
其相应的算符优先矩阵如题图5-4所示。
试给出对符号串(i+i)进行算符优先分析的
过程。
(
i
*
+
)
#
(
○
○
○
○
○
<
<
<
<
=
i
○
○
○
○
>
>
>
>
*
○
○
○
○
○
○
<
<
>
>
>
>
+
○
○
○
○
○
○
<
<
<
>
>
>
)
○
○
○
○
>
>
>
>
#
○
○
○
○
<
<
<
<
题图5-4
文法G[E]的算符优先矩阵
5-5对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并
判断哪些是LR(0)文法。
(1)S→aSb∣aSc∣ab
(2)S→aSSb∣aSSS∣c
(3)S→AA→Ab∣a
5-6下列文法是否是SLR
(1)文法?
若是,构造相应的SLR
(1)分析表,若不是,则
阐明其理由。
(1)S→Sab∣bRR→S∣a
(2)S→aSAB∣BAA→aA∣BB→b
(3)S→aA∣bBA→cAd∣εB→cBdd∣ε
5-7对如下的文法分别构造LR(0)及SLR
(1)分析表,并比较两者的异同。
S→cAd∣bA→ASc∣a
5-8对于文法G[S]:
S→AA→BA∣εB→aB∣b
(1)构造LR
(1)分析表;
(2)给出用LR
(1)分析表对输入符号串abab的分析过程。
5-9对于如下的文法,构造LR
(1)项目集族,并判断它们是否为LR
(1)文法。
(1)S→AA→AB∣εB→aB∣b
(2)S→aSa∣a
第4章习题答案2
5-1解:
(1)由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中
的部分优先关系如答案图5-1(b)所示。
(2)由答案图5-1(b)可知,在符号A和/之间,即存在等于关系,又存在低于关系,故文法G[S]不是简单优先文法。
5-2解:
(1)由文法G[S]的产生式可直接看出:
(○=)
此外,再考察句型-P--(E)和i*(T*F)的语法树(见答案图5-2(a)及(b))。
由答案图5-2(a)可得:
-○>-,-○<-,-○<(
由答案图5-2(b)可得:
i○>*,*○<(,(○<*,*○>)
(2)由答案图5-2(a)可知,在终结符号-和-之间,存在两种算符优先关系:
-○>-,-○<-
故文法G[S]不是算符优先文法。
5-3解:
对符号串(i+i)进行简单优先分析的过程如答案表5-3所示。
因为分析成功,所以符号串(i+i)是文法G′[E]的合法句子。
答案表5-3
符号串(i+i)
的简单优先分析过程
当前
余留
所用
步骤
分析栈
关系
符号
输入串
句柄
产生式
0
#
低于
(
i+i)#
1
#(
低于
i
+i)#
2
#(i
优于
+
i)#
i
F→i
3
#(F
优于
+
i)#
F
T→F
4
#(T
优于
+
i)#
T
T1→T
5
#(T1
优于
+
i)#
T1
E1→T1
6
#(E
1
等于
+
i)#
7
#(E1
+
低于
i
)#
8
#(E
1
+i
优于
)
#
i
F→i
9
#(E
1
+F
优于
)
#
F
T→F
10
#(E1
+T
优于
)
#
T
T1→T
11
#(E
1
+T
优于
)
#
E+T
E→E+T
1
1
1
1
1
1
12
#(E1
优于
)
#
E1
E→E1
13
#(E
等于
)
#
14
#(E)
优于
#
(E)
F→(E)
15
#F
优于
#
F
T→F
16
#T
优于
#
T
T1→T
17
#T1
优于
#
T1
E1→T1
18
#E
优于
#
E
E→E
1
1
1
19
#E
#
分析
优于
成功
5-4解:
对符号串(i+i)
因为分析成功,所以符号串
进行算符优先分析的过程如答案表
(i+i)是文法G[E]的合法句子。
5-4
所示。
句子(i+i)及其分析过程中所得句型的语法树如答案图5-4所示。
答案表5-4
符号串(i+i)
的算符优先分析过程
当前栈顶
优先
当前输
余留
最左
步骤
分析栈
终结符号
关系
入符号
输入串
素短语
0
#
#
<
(
i+i)#
○
1
#<(
(
<
i
+i)#
○
○
2
#<(<i
i
>
+
i)#
i
○○
○
3
#<(F
(
<
+
i)#
○
○
4
#<(<F+
+
<
i
)#
○○
○
5
#○<(○<F+○<i
i
○>
)
#
i
6
#<(<F+F
+
>
)
#
F+F
○○
○
7
#○<(E
(
○=
)
#
8
#<(=E)
)
>
#
(E)
○○
○
9
#F
#
#
分析
成功
5-5
解:
(1)
在文法G[S]中引入一个新的开始符号
S′,且将S′→S作为第0个产生式添
加到文法G中,从而得到G的拓广文法G′[S′]:
′→S→aSc
→aSb→ab
识别文法G[S]全部可归前缀的DFA如答案图5-5-
(1)所示。
因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,故可构造出不含冲突动作的LR(0)分析表如答案表5-5-
(1)所示。
答案表5-5-
(1)
文法G[S]的LR(0)分析表
ACTION
GOTO
状态
a
b
c
#
S
0
s2
1
1
acc
2
s2
s4
3
3
s5
s6
4
r3
r3
r3
r3
5
r1
r1
r1
r1
6
r2
r2
r2
r2
(2)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添
加到文法G中,从而得到G的拓广文法G′[S′]:
′→S→aSSS
→aSSb→c
识别文法G[S]全部可归前缀的DFA如答案图5-5-
(2)所示。
因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,故可构造出不含冲突动作的LR(0)分析表如答案表5-5-
(2)所示。
答案表5-5-
(2)
文法G[S]的LR(0)
分析表
状态
ACTION
GOTO
a
b
c
#
S
0
s2
s3
1
1
acc
2
s2
s3
4
3
r3
r3
r3
r3
4
s2
s3
5
5
s2
s3
7
6
r1
r1
r1
r1
7
r2
r2
r2
r2
(3)在文法G[S]中引入一个新的开始符号S′,且将
加到文法G中,从而得到G的拓广文法G′[S′]:
′→S→Ab
→A→a
识别文法G[S]全部可归前缀的DFA如答案图5-5-(3)
S′→S作为第所示。
0个产生式添
因为在LR(0)项目集I2中含有移进-归约冲突项目,所以文法G[S]不是LR(0)文法,
故构造出的
LR(0)分析表中含有冲突动作。
文法G[S]的LR(0)分析表如答案表
5-5-(3)
所示。
答案表5-5-(3)
文法G[S]的LR(0)分析表
状态
ACTION
GOTO
a
b
#
S
A
0
s3
1
2
1
acc
2
r1
s4,r1
r1
3
r3
r3
r3
4
r2
r2
r2
5-6解:
(1)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添
加到文法
G中,从而得到
′→S
→Sab
G的拓广文法G′[S′]:
→S
→a
2.S
→bR
识别文法G[S]全部可归前缀的DFA如答案图5-6-
(1)所示。
由答案图5-6-
(1)可知,在项目集I1和I4中都存在“移进-归约”冲突。
在项目集
I4={R→S·,S→S·ab}中,由于FOLLOR(R)={a},FOLLOR(R)∩{a}={a}≠?
,所以其项目集的“移进-归约”冲突不可能通过SLR
(1)规则得到解决,从而该文法不是SLR
(1)文法。
(2)在文法
G[S]中引入一个新的开始符号
S′,且将
S′→S作为第
0个产生式添
加到文法
G中,从而得到
G的拓广文法
G′[S′]:
识别文法
′→S
→aSAB
→BA
G[S]全部可归前缀的
→aA
→B
→b
DFA如答案图
5-6-
(2)
所示。
答案图5-6-
(2)识别G[S]全部可归前缀的DFA
因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,
故也是SLR
(1)文法。
因为FOLLOW(S)={a,b,#},FOLLOW(A)={a,b,#},FOLLOW(B)={a,b,#},
G[S]的SLR
(1)分析表如答案表5-6-
(2)所示。
所以文法
答案表5-6-
(2)文法G[S]的SLR
(1)分析表
状态ACTIONGOTO
a
b
#
S
A
B
0
s2
s4
1
3
1
acc
2
s2
s4
5
3
3
s7
s4
6
8
4
r5
r5
r5
5
s7
s4
9
8
6
r2
r2
r2
7
s7
s4
11
8
8
r4
r4
r4
9
s4
10
10
r1
r1
r1
11
r3
r3
r3
(3)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添
加到文法G中,从而得到G的拓广文法G′[S′]:
′→S→ε
→aA→cBdd
→bB→ε
3.A→cAd
识别文法G[S]全部可归前缀的DFA如答案图5-6-(3)所示。
由答案图5-6-(3)可知,在项目集I2,I3,I5和I9中都存在“移进-归约”冲突。
因为在项目集I2和I5中,由于FOLLOR(A)={d,#},FOLLOR(A)∩{c}=?
,所以其项目
集的“移进-归约”冲突能通过SLR
(1)规则得到解决;
又因为在项目集I3和I9中,由于FOLLOR(B)={d,#},FOLLOR(B)∩{c}=?
,所以其项
目集的“移进-归约”冲突也能通过SLR
(1)规则得到解决;所以文法G[S]是SLR
(1)文
法。
因为FOLLOR(S)={#},FOLLOR(A)={d,#},FOLLOR(B)={d,#},所以文法G[S]的SLR
(1)
分析表如答案表5-6-(3)所示。
答案表5-6-(3)
文法
状态
ACTION
a
b
c
d
0
s2
s3
1
2
s5
r4
3
s9
r6
4
5
s5
r4
6
s7
7
r3
8
9
s9
r6
10
s11
11
s12
12
r5
G[S]的SLR
(1)分析表
GOTO
#
S
A
B
1
acc
r4
4
r6
8
r1
r4
6
r3
r2
r6
10
r5
5-7解:
在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个
产生式添加到文法G中,从而得到G的拓广文法G′[S′]:
′→S→ASc
→cAd→a
→b
识别文法G[S]全部可归前缀的DFA如答案图5-7所示。
因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法。
文法G[S]的LR(0)分析表如答案表5-7-(a)所示。
答案表5-7-(a)
文法G[S]的LR(0)分析表
ACTION
GOTO
状态
a
b
c
d
#
S
A
0
s3
s2
1
1
acc
2
s4
5
3
r2
r2
r2
r2
r2
4
r4
r4
r4
r4
r4
5
s3
s2
s6
7
6
r1
r1
r1
r1
r1
7
s8
8
r3
r3
r3
r3
r3
因为FOLLOR(S)={#,c},FOLLOR(A)={b,c,d},所以文法G[S]的SLR
(1)分析表如答
案表5-7-(b)所示。
答案表5-7-(b)
文法G[S]的SLR
(1)分析表
ACTION
GOTO
状态
a
b
c
d
#
S
A
0
s3
s2
1
1
acc
2
s4
5
3
r2
r2
4
r4
r
4
r4
5
s3
s2
s6
7
6
r1
r1
7
s8
8
r3
r3
r3
两个表的相同之处为:
(1)两个表的GOTO表部分完全相同。
(2)在两个表的ACTION表中,不含归约项目的项目集对应的行的元素完全相同,即第0,2,5,7行完全相同。
两个表的不同之处为:
在两个表的ACTION表中,含有归约项目的项目集对应的行的元素不同,即第
3,4,6,8行的元素不同。
以第3行为例,答案表5-7-(a)中的所有元素都为r2;而在答案表5-7-(b)中,因为FOLLOR(S)={#,c},故仅在“#”和“c”列对应的元素为r2。
5-8
(1)
加到文法
文法
解:
在文法G[S]中引入一个新的开始符号S′,且将
G中,从而得到G的拓广文法G′[S′]:
′→S→ε
→A→aB
→BA→b
G[S]的LR
(1)项目集及DFA如答案图5-8所示。
S′→S作为第
0个产生式添
文法G[S]的LR
(1)分析表如答案表5-8-
(1)所示。
答案表5-8-
(1)
文法G[S]的LR
(1)分析表
状态
ACTION
GOTO
a
b
#
S
A
B
0
s4
s5
r3
1
2
3
1
acc
2
r1
3
s4
s5
r3
6
3
4
s4
s5
7
5
r5
r5
r5
6
r2
7
r4
r4
r4
(2)用LR
(1)分析表对输入符号串abab的分析过程如答案表5-8-
(2)所示。
因为
分析成功,所以符号串abab是文法G[S]的合法句子。
答案表5-8-
(2)
符号串abab的LR分析过程
步骤
状态栈
符号栈
余留输入串
分析动作
下一状态
1
I
0
#
abab#
s4
4
2
II
4
#a
bab#
s
5
5
0
3
I
0I
4I
5
#ab
ab#
r5
GOTO[I4,B]=7
4
I
0I
4I
7
#aB
ab#
r4
GOTO[I0,B]=3
5
I
0I
3
#B
ab#
s4
4
6
I
I
I
4
#Ba
b#
s
5
5
0
3
7
II
II
5
#Bab
#
r
5
GOTO[I,B]=7
0
3
4
4
8
I
0I
3I
4I7
#BaB
#
r4
GOTO[I