题目
将文法G[V]改造成为LL(1)的。G[V]:V→N|N[E]E→V|V+EN→i
将文法G[V]改造成为LL(1)的。
G[V]:V→N|N[E]
E→V|V+E
N→i
题目解答
答案
对文法G[V]提取公共左因子后得到文法:
G′[V]:V→NA
A→ε|[E]
E→VB
B→ε|+E
N→i
求出文法G′[V]中每一个非终结符号的FIRST集:
FIRST(V)={i} FIRST(A)={[, ε}
FIRST(E)={i} FIRST(B)={+, ε}
FIRST(N)={i}
求出文法G′[V]中每一个非终结符号的FOLLOW集:
FOLLOW(V)={#}∪FIRST(B)\{ε}∪FOLLOW(E)={#,+,]}
FOLLOW(A)= FOLLOW(V)={+,,#}
FOLLOW(E)= FIRST(])\{ε}∪FOLLOW(B)= FIRST(])\{ε}∪FOLLOW(E)={]}
FOLLOW(B)= FOLLOW(E)={ ]}
FOLLOW(N)= FIRST(A)\{ε}∪FOLLOW(V)={[,],+,#}
可以看到,对文法G′[V]的产生式A→ε|[E],有
FIRST([E])∩FOLLOW(A)={[}∩{+,],#}= Ø
对产生式B→ε|+E,有
FIRST(+E)∩FOLLOW(B)={+}∩{]}= Ø
而文法的其他产生式都只有一个不为ε的右部,所以文法G′[V]是LL(1)文法。
解析
步骤 1:提取公共左因子
首先,我们需要对文法G[V]进行改造,提取公共左因子,以确保文法是LL(1)的。提取公共左因子的目的是消除左递归和左公共因子,使得文法的每个非终结符的产生式右部的FIRST集不相交。
步骤 2:提取公共左因子后的文法
提取公共左因子后,文法G[V]变为G'[V]:
G'[V]:V→NA
A→ε|[E]
E→VB
B→ε|+E
N→i
步骤 3:计算FIRST集
计算文法G'[V]中每一个非终结符号的FIRST集:
- FIRST(V) = FIRST(N) = {i}
- FIRST(A) = {[} ∪ {ε} = {[, ε}
- FIRST(E) = FIRST(V) = {i}
- FIRST(B) = {+} ∪ {ε} = {+, ε}
- FIRST(N) = {i}
步骤 4:计算FOLLOW集
计算文法G'[V]中每一个非终结符号的FOLLOW集:
- FOLLOW(V) = {#} ∪ FIRST(B)\{ε} ∪ FOLLOW(E) = {#, +, ]}
- FOLLOW(A) = FOLLOW(V) = {#, +, ]}
- FOLLOW(E) = FIRST(])\{ε} ∪ FOLLOW(B) = {]}
- FOLLOW(B) = FOLLOW(E) = {]}
- FOLLOW(N) = FIRST(A)\{ε} ∪ FOLLOW(V) = {[, ], +, #}
步骤 5:验证LL(1)条件
验证文法G'[V]是否满足LL(1)条件,即对于每个非终结符的产生式,其右部的FIRST集与FOLLOW集的交集为空。
- 对于产生式A→ε|[E],有FIRST([E])∩FOLLOW(A)={[}∩{#, +, ]}= Ø
- 对于产生式B→ε|+E,有FIRST(+E)∩FOLLOW(B)={+}∩{]}= Ø
- 文法的其他产生式都只有一个不为ε的右部,所以文法G'[V]是LL(1)文法。
首先,我们需要对文法G[V]进行改造,提取公共左因子,以确保文法是LL(1)的。提取公共左因子的目的是消除左递归和左公共因子,使得文法的每个非终结符的产生式右部的FIRST集不相交。
步骤 2:提取公共左因子后的文法
提取公共左因子后,文法G[V]变为G'[V]:
G'[V]:V→NA
A→ε|[E]
E→VB
B→ε|+E
N→i
步骤 3:计算FIRST集
计算文法G'[V]中每一个非终结符号的FIRST集:
- FIRST(V) = FIRST(N) = {i}
- FIRST(A) = {[} ∪ {ε} = {[, ε}
- FIRST(E) = FIRST(V) = {i}
- FIRST(B) = {+} ∪ {ε} = {+, ε}
- FIRST(N) = {i}
步骤 4:计算FOLLOW集
计算文法G'[V]中每一个非终结符号的FOLLOW集:
- FOLLOW(V) = {#} ∪ FIRST(B)\{ε} ∪ FOLLOW(E) = {#, +, ]}
- FOLLOW(A) = FOLLOW(V) = {#, +, ]}
- FOLLOW(E) = FIRST(])\{ε} ∪ FOLLOW(B) = {]}
- FOLLOW(B) = FOLLOW(E) = {]}
- FOLLOW(N) = FIRST(A)\{ε} ∪ FOLLOW(V) = {[, ], +, #}
步骤 5:验证LL(1)条件
验证文法G'[V]是否满足LL(1)条件,即对于每个非终结符的产生式,其右部的FIRST集与FOLLOW集的交集为空。
- 对于产生式A→ε|[E],有FIRST([E])∩FOLLOW(A)={[}∩{#, +, ]}= Ø
- 对于产生式B→ε|+E,有FIRST(+E)∩FOLLOW(B)={+}∩{]}= Ø
- 文法的其他产生式都只有一个不为ε的右部,所以文法G'[V]是LL(1)文法。