10、消除左递归
1.将以下文法消除左递归,分析符号串 i*i+i 。
并分别求FIRST集、FOLLOW集,和SELECT集
E → E+T | T
T → T*F | F
F→ (E) | i
2.P101练习7(2)(3)
文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
课堂练习:
求以下文法的FIRST集、FOLLOW集和SELECT集。
S→Ap
A→a |ε
A→cA
A→aA
S→Ap
S→Bq
A→a
A→cA
B→b
B→dB
------------------------------------------------------------------------------
解:
1.
E → +TE' | ε
T → FT'
T' → *FT' | ε
F → (E) | i
FIRST(E)=FIRST(T)=FIRST(F)={ ( , i }
FIRST(E')={ + , ε }
FIRST(E')={ + , ε }
FIRST(T')={ * , ε }
FOLLOW(E)={ ) , # }
FOLLOW(E')= FOLLOW(E) ={ ) , # }
FOLLOW(T)={ + , ) , # }
FOLLOW(T')=FOLLOW(T)= {+, ) , # }
FOLLOW(F)={ +, * , ) , # }
SELECT( E→TE' )={ (,i }
SELECT( E'→+TE' )={ + }
SELECT( E→ ε )={ ( ) , # }
SELECT( E→FT' )={ (,i }
SELECT( E→ *FT' )={ * }
SELECT( )={ T'→ε }=(+, ) ,# }
SELECT( F→(E) )={ ( }
SELECT( )=( F→i )={ i }
练习7(2)
A→aABe|a
B→Bb|d
FIRST集
FIRST(aA’)={a}
FIRST(aA’Be)={a}
FIRST(ε)={ε}
FIRST(dB’)={d,b}
FIRST(bB’)={b}
FOLLOW集
FOLLOW(A’)={d}
FOLLOW(A)={#}
FOLLOW(B’)={ε}
FOLLOW(ε)={ε}
FOLLOW(B)={#}
SELECT集
SELECT(A→aA’)={a,e,d,b}
SELECT(A’→aA’Be)={a,e,d,b}
SELECT(A’→ε)={a,e,d,b}
SELECT(B→dB’)={d,b}
SELECT(B’→bB’)={b}
SELECT(B’→ε)={b}
---------------------------------------------------
(3)
S→Aa|b
A→SB
B→ab
FIRST集
FIRST(bS’)={b,a}
FIRST(aS’B)={a}
FIRST(ε)={ε}
FIRST(ab)={a}
FOLLOW集
FOLLOW(S’)={a}
FOLLOW(S)={#}
SELCECT集
SELECT(S→bS’)={a,b}
SELECT(S’→aS’ab)={a,b}
SELECT(S’→ε)={a,b}
---------------------------------------------------
S→Ap
A→a |ε
A→cA
A→aA
FIRST集
FIRST(S)={a,c,p}
FIRST(A)={a}
FIRST(A)={c}
FIRST(A)={a}
FOLLOW集
FOLLOW(S)={#}
FOLLOW(A)={p}
SELCECT集
SELECT(S->Ap)={a,c,p}
SELECT(A->a)={a}
SELECT(A->ε)={p}
SELECT(A->cA)={c}
SELECT(A->aA)={a}
S→Ap
S→Bq
A→a
A→cA
B→b
B→dB
FIRST集
FIRST(S)={a,c}
FIRST(S)={b,d}
FIRST(A)={a}
FIRST(A)={c}
FIRST(B)={b}
FIRST(B)={d}
FOLLOW集
FOLLOW(S)={#}
FOLLOW(A)={p}
FOLLOW(B)={q}
SELCECT集
S->Ap S->Bq
A->a
A->cA
B->b
B->dB
SELECT()={}
SELECT(S->Ap)={a,c}
SELECT(S->Bq)={b,d}
SELECT(A->a)={a}
SELECT(A->cA)={c}
SELECT(B->b)={b}
SELECT(B->dB)={d}