1. (简答题, 50分)已知文法 G[S]: S→MH|a
H→LSo|ε
K→dML|ε
L→eHf
M→K|bLM
(1)计算文法的每个非终结符的FIRST集和FOLLOW集。
(2)判断 G 是否是 LL(1)文法,如果是,构造 LL(1)分析表。
正确答案:
非终结符 | FIRST 集 | FOLLOW 集 |
S | {a,d,b,ε,e} | {#,o} |
M | {d,ε,b} | {e,#,o} |
H | {ε,e} | {#,f,o} |
L | {e} | {a,d,b,e,o,#} |
K | {d,ε} | {e,#,o} |
a | o | d | e | f | b | # | ||
S | S→a | S→MH | S→MH | S→MH | S→MH | S→MH | ||
M | M→K | M→K | M→K | M→bLM | M→K | |||
H | H→ε | H→LSo | H→ε | H→ε | ||||
L | L→eHf | |||||||
K | K→ε | K→dML | K→ε | K→ε | ||||
由预测分析表中无多重入口也可判定文法是 LL(1)的。
2. (简答题, 50分) 对于一个文法若消除了左递归,提取了左公共因子后是否一定为 LL(1)文法?试对下面文法进行改写,并对改写后的文法进行判断。
(1) G(A):A→baB|ε
B→Abb|a
(2) G(A):A→aABe|a
B→Bb|d
正确答案:
答案:(1)先改写文法为:G(A):A→baB A→ε
B→baBbb B→bb B→a
再改写文法为:G(A):A→baB A→ε
B→bB’ B→a
B’→aBbb B’→b
FIRST集和FOLLOW集:
FIRST | FOLLOW | |||||||||
A | {b,ε} | {#} | ||||||||
B | {b,a} | {#,b} | ||||||||
B’ | {b,a} | {#,b } | ||||||||
预测分析表: | ||||||||||
a | b | # | ||||||||
A | A→baB | A→ε | ||||||||
B | B→a | B→bB’ | ||||||||
B’ | B’→aBbb | B’→b | ||||||||
预测分析表中无多重入口,所以是LL(1)文法。
(2) 文法:G(A):A→aABe|a
B→Bb|d
提取左公共因子和消除左递归后文法变为:
G(A):A→aA’
A’→ABe A’→ε
B→dB’
B’→bB’ B’→ε
非终结符 | FIRST 集 | FOLLOW 集 |
A | {a} | {#,d} |
B | {d} | {e} |
A’ | {a,ε} | {#,d} |
B’ | {b,ε} | {e} |
因为:
FIRST(A B e)∩FOLLOW(A’) ={ a }∩ {#,d }=Ø
FIRST(b B’)∩FOLLOW(B’) ={ b }∩ { e }=Ø
所以文法是 LL(1)的。
预测分析表(Predicting Analysis Table)
a | e | b | d | # | ||
A | A→a A’ | |||||
B | B→d B’ | |||||
B’ | B’→ε | B’→b B’ | ||||
A’ | A’→ABe | A’→ε | A’→ε | |||
也可由预测分析表中无多重入口判定文法是 LL(1)的。