第十次——消除左递归

Posted lxml

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十次——消除左递归相关的知识,希望对你有一定的参考价值。

1.将以下文法消除左递归,求FIRST集、FOLLOW集,SELECT集,并分析符号串 i*i+i  

     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)

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

 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集

 S -> Ap

 A -> a |ε

 A -> cA

 A -> aA

  FIRST(a)={a}

  FIRST(ε)={ε}

  FIRST(cA)={c}

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

 

  FOLLOW(S)={#}

  FOLLOW(A)= {p}

 

  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(a)={a}

  FIRST(cA)={c}

  FIRST(b)={b}

  FIRST(dB)={d}

  FIRST(Ap)={a,c}

  FIRST(Bq)={b,d}

 

  FOLLOW(S)={#}

  FOLLOW(A)={p}

  FOLLOW(B)={q}

 

  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}

 

 

以上是关于第十次——消除左递归的主要内容,如果未能解决你的问题,请参考以下文章

如何消除左递归何时需要消除左递归—编译原理

消除文法左递归

消除左递归

消除左递归

消除左递归

消除左递归