作业10:消除左递归

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   

分析符号串:

FIRST集:

  FIRST(TE')=FIRST(T)={(,i,}

  FIRST(+TE')={+}

  FIRST(ε)={ε}

  FIRST(FT')=FIRST(F)={(,i}

  FIRST(*FT')={*}

  FIRST(ε)={ε}

  FIRST((E))={(}

  FIRST(i)={i}

FOLLOW集:

    FOLLOW(E)={),#}

  FOLLOW(E')={),#}

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

  FOLLOW(T')={+,),#}

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

过程如图:

SELECT集:

  SELECT(E→TE')=FIRST(TE')={(,i}

  SELECT(E'→+TE')=FIRST(+TE')={+,ε}

  SELECT(E'→ε)=(FIRST(ε)-{ε})∪FOLLOW(E')={),#}

  SELECT(T→FT')=FIRST(FT')={(,i}

  SELECT(T'→*FT')=FIRST(*FT')={*,ε}

  SELECT(T'→ε)=(FIRST(ε)-{ε})∪FOLLOW(T')={+,),#}

  SELECT(F→(E))=FIRST((E))={(,i}

  SELECT(F→i)=FIRST(i)={i}        

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

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')={#}

  FOLLOW(B)={e}

  FOLLOW(B')={#}

SELECT集:

  SELECT(A→aA')=FIRST(aA')={a}

  SELECT(A'→ABe)=FIRST(ABe)={A}

  SELECT(A'→ε)=(FIRST(ε)-{ε})∪FOLLOW(A')={#}

  SELECT(B→dB')=FIRST(dB')={d}

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

  SELECT(B'→ε)=(FIRST(ε)-{ε})∪FOLLOW(B')={#}

S->Aa|b

A->SB

B->ab

由后面两个式子代入得:

S->SBa|b

消除左递归:

S →bS'

S'→BaS'|ε

B→ab

FIRST集:

  FIRST(SBa)={S}

  FIRST(b)={b}

  FIRST(bS')={b}

  FIRST(BaS)={B}

  FIRST(ε)={ε}

  FIRST(ab)={ab}

 FOLLOW集:

  FOLLOW(S)={B}

  FOLLOW(S')={#}

  FOLLOW(B)={a}

 SELECT集:

  SELECT(S→SBa)=FIRST(SBa)={S}

  SELECT(S→b)=FIRST(b)={b}

  SELECT(S→bS')=FIRST(bS')={b}

  SELECT(S'→BaS')=FIRST(BaS')={B}

  SELECT(S'→ε)=(FIRST(ε)-{ε})∪FOLLOW(S')={#}

  SELECT(B→ab)=FIRST(ab)={a}

课堂练习:

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

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

A->aA

FIRST集:

  FISRT(a)={a}

  FIRST(ε)={ε}

  FIRST(cA)={c}

  FIRST(aA)={a}

  FIRST(Ap)={a,c,p,ε}

FOLLOW集:

  FOLLOW(A)={p}

  FOLLOW(S)={#}

SELECT集:

  SELECT(S->Ap)=FIRST(Ap)={a,c,p}

  SELECT(A->a)=FIRST(a)={a}

  SELECT(A->ε)=FIRST(ε)-{ε}υFOLLOW(A)=FOLLOW(A)={p}

  SELECT(A->cA)=FIRST(cA)={c}

  SELECT(A->aA)=FIRST(aA)={a}

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

FIRST集:

  FIRST(A)={a,c}

  FIRST(B)={b,d}

  FIRST(S)={a,b,c,d}

FOLLOW集:

  FOLLOW(A)={p}

  FOLLOW(B)={q}

  FOLLOW(S)={#}

SELECT集:

  SELECT(S->Ap)=FIRST(Ap)={a,c}

  SELECT(S->Bp)=FIRST(Bp)={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 @ 2019-11-13 11:59  小婷G899  阅读(473)  评论(0编辑  收藏  举报