第4题:
对于文法G(S'): (0) S' → S (1) S → aS (2) S → bS (3) S → a 该文法的LR分析表如下: ACTION GOTO 状态 a b # S 0 s1 s2 3 1 s1 s2 r3 4 2 s1 s2 5 3 acc 4 r1 5 r2 下面是输入串aba#的LR分析过程的0~4步的格局,第5步的格局是 步骤 状态栈 符号栈 输入串 0 0 # aba# 1 01 #a ba# 2 012 #ab a# 3 0121 #aba # 4 0125 #abS # 5
A.步骤 状态栈 符号栈 输入串 5 014 #aS #
B.步骤 状态栈 符号栈 输入串 5 0124 #aS #
C.步骤 状态栈 符号栈 输入串 5 015 #aS #
D.步骤 状态栈 符号栈 输入串 5 0125 #aS #
(1)因为文法含有左递归所以文法不是LL(1)文法。 考虑该文法对应的语言为正规式(a|b)*ab|b描述的集合。文法改写为: S→aA|bB A→aA|bB B→aA|bC|ε C→aA|bC C→aA|bC 对改写的文法验证: 对S:FIRST(aA)={a}FIRST(bB)={b}有FIRST(aA)∩FIRST(bB)=Ф 对A:FIRST(aA)={a}FIRST(bB)={b}有FIRST(aA)∩FIRST(6B)=Ф 对B:FIRST(bC)={b}FIRST(aA)={a}FOLLOW(B)={#}且3个集合彼此不相交 对C:FIRST(bC)={b}FIRST(aA)={a}有FIRST(aA)∩FIRST(6C)=Ф ∴经验证改写后的文法是LL(1)文法。 (2)对文法S→aSbS|bSaS|ε 验证: FIRST(aSbS)={a} FIRST(bSaS)={b} FOLLOW(S)={ab} 且3个集合的交集不为空集。 ∴文法不是LL(1)文法。 考虑文法对应的语言为含有相同个数的a、b串。文法改写为: S→aBS|bAS|εA→a|bAA B→b|aBB 对改写的文法验证: 对S:FIRST(aBS)={a}FIRST(bAS)={b}FOLLOW(S)={#} 且3个集合的交集不为空集。 对A:FIRST(a)={a}FIRST(6AA)={b}有FIRST(a)∩FIRST(6AA)=Ф 对B:FIRST(b)={b}FIRST(aBB)={a}有FIRST(b)∩FIRST(aBB)=Ф ∴经验证改写后的文法是LL(1)文法。 (3)因为文法含有左递归所以文法不是LL(1)文法。 文法改写为: S→A A→BA|ε B|aB|b (或S→aA|bS|ε A→a|A|bS) 对改写的文法验证: 对S:FIRST(A)={ab}∪{ε}FOLLOW(S)={#}有FIRST(A)∩FOLLOW(S)=Ф 对A:FIRST(a)={a}FIRST(bAA)={b}有FIRST(a)∩FIRST(bAA)=Ф 对B:FIRST(b)={b}FIRST(aBB)={a}有FIRST(b)∩FIRST(aBB)=Ф ∴经验证改写后的文法是LL(1)文法。 因为文法含有左递归,所以文法不是LL(1)文法。考虑该文法对应的语言为正规式(a|b)*ab|b描述的集合。文法改写为:S→aA|bBA→aA|bBB→aA|bC|εC→aA|bCC→aA|bC对改写的文法验证:对S:FIRST(aA)={a},FIRST(bB)={b},有FIRST(aA)∩FIRST(bB)=Ф对A:FIRST(aA)={a},FIRST(bB)={b},有FIRST(aA)∩FIRST(6B)=Ф对B:FIRST(bC)={b},FIRST(aA)={a},FOLLOW(B)={#},且3个集合彼此不相交对C:FIRST(bC)={b},FIRST(aA)={a},有FIRST(aA)∩FIRST(6C)=Ф∴经验证,改写后的文法是LL(1)文法。(2)对文法S→aSbS|bSaS|ε验证:FIRST(aSbS)={a},FIRST(bSaS)={b},FOLLOW(S)={a,b}且3个集合的交集不为空集。∴文法不是LL(1)文法。考虑文法对应的语言为含有相同个数的a、b串。文法改写为:S→aBS|bAS|εA→a|bAAB→b|aBB对改写的文法验证:对S:FIRST(aBS)={a},FIRST(bAS)={b},FOLLOW(S)={#}且3个集合的交集不为空集。对A:FIRST(a)={a},FIRST(6AA)={b},有FIRST(a)∩FIRST(6AA)=Ф对B:FIRST(b)={b},FIRST(aBB)={a},有FIRST(b)∩FIRST(aBB)=Ф∴经验证,改写后的文法是LL(1)文法。(3)因为文法含有左递归,所以文法不是LL(1)文法。文法改写为:S→AA→BA|εB|aB|b(或S→aA|bS|εA→a|A|bS)对改写的文法验证:对S:FIRST(A)={a,b}∪{ε},FOLLOW(S)={#},有FIRST(A)∩FOLLOW(S)=Ф对A:FIRST(a)={a},FIRST(bAA)={b},有FIRST(a)∩FIRST(bAA)=Ф对B:FIRST(b)={b},FIRST(aBB)={a},有FIRST(b)∩FIRST(aBB)=Ф∴经验证,改写后的文法是LL(1)文法。