消除左递归


1.将以下文法消除左递归,分析符号串 i*i+i,并分别求FIRST集、FOLLOW集,和SELECT集
E -> E+T | T
T -> T*F | F
F -> (E) | i
消除左递归:
E -> TE’
E’ -> +TE’ | ε
T -> FT’
T’ -> *FT’ | ε
F -> (E) | i
分析符号串 i*i+i:

FIRST集:
First(E)={ (,i }
First(E’)={ +,ε }
First(T)={ (,i }
First(T’)={ *,ε }
First(F)={ (,i }
First(ε)={ε}
FOLLOW集:
Follow(E) = { ),# }
Follow(E') = { ),# }
Follow(T) = { +,),# }
Follow(T') = { +,),# }
Follow(F) = { *,+,),# }
SELECT集 :
Select(E->TE') =First(T)={ (,i }
Select(E'->+TE') = { + }
Select(E'->ε) = (First(ε) -{ε})∪Follow(E') = { ),# }
Select(T->FT') = First(F)={ (,i }
Select(T'->*FT') = { * }
Select(T'->ε) = First(ε) -{ε}∪Follow(T') = { +,),# }
Select( F->(E)) = { ( }
Select( F->i )= { i }
2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
(2) A -> aABe | a
B -> Bb | d
文法改写:
A->aA'
A'->ABe |ε
B->dB'
B'->bB' |ε
FIRST集:
First(aA')={a}
First(ABe)={a}
First(ε)={ε}
First(dB')={d}
First(bB')={b}
FOLLOW集:
Follow(A) = {d,#}
Follow(A') = {d,#}
Follow(B) = {e}
Follow(B') = {e}
SELECT集:
Select (A -> aA’) =First(aA’) = { a }
Select (A’-> ABe) = First(ABe) = { a }
Select (A’-> ε) = First(ε) - {ε} U Follow(A’) = Follow(A’) = { d , # }
Select (B -> dB’) = First(dB’) = { d }
Select (B’-> bB’) = First(bB’) = {b }
Select (B’-> ε) =First(ε) - {ε} U Follow(B’) =Follow(B’) = { e }
(3) S -> Aa | b
A -> SB
B -> ab
文法改写:
S -> Aa | b -> SBa | b -> bS’
S’ -> BaS’ | ε
B -> ab
FIRST集:
First(bS')={b}
First(BaS')={a}
First(ε)={ε}
First(ab)={a}
FOLLOW集:
Follow(S)={#}
Follow(S')={#}
Follow(B)={a}
SELECT集:
Select(S->bS')=First(bS')={b}
Select(S'->BaS')=First(BaS')={a}
Select(S'->ε)=First(ε)-{ε}U Follow(S')=Follow(S')={#}
Select(B->ab)=First(ab)={a}
课堂练习:
求以下文法的FIRST集、FOLLOW集和SELECT集。
(1)S->Ap
A->a |ε
A->cA
A->aA
FIRST集:
First(A)={a,c,ε}
First(Ap)={a,c,p}
First(a)={a}
First(ε)={ε}
First(cA)={c}
First(aA)={a}
FOLLOW集:
Follow(A)={p}
Follow(S)={#}
SELECT集:
Select(S -> Ap)=First(Ap)={a,c,p}
Select(A-> a)=Firs(a)={a}
Select(A->ε)=First(ε)-{ε}U Follow(A)=Follow(A)={p}
Select(A->cA)=First(cA)={c}
Select(A->aA)=First(aA)={a}
(2)S->Ap
S->Bq
A->a
A->cA
B->b
B->dB
FIRST集:
First(S1)=First(Ap)={a,c}
First(S2)=First(Bq)={b,d}
First(a)={a}
First(cA)={c}
First(b)={b}
First(dB)={d}
FOLLOW集:
Follow(S)={#}
Follow(A)={p}
Follow(B)={q}
SELECT集:
Select(S -> Ap)=First(Ap)={a,c}
Select(S->Bq)=First(Bq)={b,d}
Select(A->a)=First(a)={a}
Select(A->cA)=First(cA)={c}
Select(B->b)=First(b)={b}
Select(B->dB)=First(dB)={d}
浙公网安备 33010602011771号