消除左递归

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')={T}       FIRST(+TE')={+}   FIRST(ε)={ε}  FIRST(FT')={F}      FIRST(*FT')={*}  FIRST((E))={(}  FIRST(i)={i}

 

FOLLOW集: 

 FOLLOW(E)={)}  FOLLOW(E')={#}  FOLLOW(T)={E'}  FOLLOW(T')={#}  FOLLOW(F)={#}

 

SELECT集: 

 SELECT(E→TE')=FIRST(TE')={T}  SELECT(E'→+TE')=FIRST(+TE')={+}  SELECT(E'→ε)=(FIRST(ε)-{ε})∪FOLLOW(E')={)}  SELECT(T→FT')=FIRST(FT')={F}

                       SELECT(T'→*FT')=FIRST(*FT')={*}        SELECT(T'→ε)=(FIRST(ε)-{ε})∪FOLLOW(T')={#}  SELECT(F→(E))=FIRST((E))={(}  SELECT(F→i)=FIRST(i)={i}

分析符号串i*i+i:

 

 

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

 

提取左公因子: 

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

 

(3)化成: 

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

 

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

 

 

FIRST集:   

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

 

FOLLOW集:

FOLLOW(S)={#}  FOLLOW(A)= {p}

 

SELECT集:

SELECT(S→Ap)=FIEST(Ap)={A}  SELECT(A→a)=FIRST(a)={a}  SELECT(A→ε)=(FIRST(ε)-{ε})∪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}  FIRST(cA)={c}  FIRST(b)={b}  FIRST(dB)={d}  FIRST(Ap)={a,c}  FIRST(Bq)={b,d}

 

FOLLOW集:  

FOLLOW(S)={#}  FOLLOW(A)={p}  FOLLOW(B)={q}

 

SELECT集: 

 SELECT(S→Ap)=FIEST(Ap)={A}  SELECT(S→Bq)=FIRST(a)={a}  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-14 21:40  Seraooo  阅读(148)  评论(0编辑  收藏  举报