消除左递归

 

 

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}

 

 

 

posted on 2019-11-14 16:54  [︵︵]  阅读(154)  评论(0)    收藏  举报