消除左递归

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)= First (T)= First (F)={(,i}

First (E’)= {+,ε}

First (E’)= {+,ε}

First (T’)={*,ε}

 

 FOLLOW集

Follow (E)={),#}

Follow (E')= Follow (E)={),#}

Follow (T)={+,),#}

Follow (T’)= Follow (T)= {+,),#}

Follow (F)= {+,*,) ,#} 

 

 SELECT集

SELECT (E -> TE')={(,i}

SELECT (E' -> +TE')={+}

SELECT (E' ->  ε)={),#}

SELECT (T -> FT')={(,i}

SELECT (T' ->*FT' )={*}

SELECT ()={T' ->ε}={+,),#}

SELECT ( F -> (E))={(}

SELECT ()={F ->i}={i}

2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集

解:(2)

A→aA'

A'→ABe| ε

B→dB'

B'→bB' | ε

 

FIRST集

First (A)={a}

First (A')={a,ε}

First (B)={d}

First (B')={b,ε}

 

FOLLOW集

Follow (A)={d,#}

Follow (A')={d,#}

Follow (B)={e}

Follow (B')={e}

 

SELECT集

SELECT (A→aA')={a}

SELECT (A'→ABe)={a}

SELECT (A'→ε)={d,#}

SELECT (B→dB')={d}

SELECT (B'→bB')={b}

SELECT (B'→ε)={e}

 

(3)

S→bS'

S'→BaS' | ε

B→ab

 

FIRST集

First (S)={b}

First (S')={a,ε}

First (B)={a}

 

FOLLOW集

Follow (S)={#}

Follow (S')={#}

Follow (B)={a}

 

SELECT集

SELECT (S→bS')={b}

SELECT (S'→BaS' )={a,ε}

SELECT (S'→ ε )={#}

SELECT (B→ab)={a}

课堂练习:

求以下文法的FIRST集、FOLLOW集和SELECT集。

S->Ap
A->a |ε
A->cA

A->aA

解:

FIRST集

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)

SELECT(A→a)=FIRST(a)

SELECT(A→Ɛ)=Follow(A)

SELECT(A→cA)=FIRST(cA)

SELECT(A→aA)=FIRST(aA)

 

2、

S->Ap
S->Bq
A->a
A->cA
B->b
B->dB

解:

FIRST集

First(Ap)={a,c}

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)

Select(S→Bq)=FIRST(Bq)

Select(A→a)=FIRST(a)

Select(A→cA)=FIRST(cA)

Select(B→b)=FIRST(b)

Select(B→dB)=FIRST(dB)

 

 

posted on 2019-11-15 16:20  ztr啊仁  阅读(171)  评论(0编辑  收藏  举报

导航