编译原理随堂作业十-------消除左递归

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

FIRST(+TE')={+}

FIRST(FT')={( ( , i ) | F-->{ , 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'-->ε )=FOLLOW(E')={#}

SELECT(T-->FT' )=FIRST(FT')={( ( , i ) | F-->{ , F-->I}

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

SELECT(T'-->ε)=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 → aABe|a

  B → Bb|d

提取公因子

A-->aA'

A'-->ABe | ε

消除左递归

B-->bB' | d

B'-->*b | ε

FIRST集

FIRST(aA')={a}

FIRST(ABe)={a | A-->a}

FIRST(ε)={ε}

FIRST(bB')={b}

FIRST(d)={d}

FIRST(*b)={*}

FOLLOW集

FOLLOW(A)=FIRST(B)={b}

FOLLOW(A')={#}

FOLLOW(B)={e}

FOLLOW(B')={#}

SELECT集

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

SELECT(A'-->ABe)=FIRST(ABe)={a | A-->a}

SELECT(A'-->ε)=FOLLOW(A')={#}

SELECT(B-->bB' )=FIRST(bB')={b}

SELECT(B-->d)=FIRST(d)={d}

SELECT(B'-->*b)=FIRST(*b)={*}

SELECT(B'-->ε)=FOLLOW(B')={#}

  S → Aa|b

  A → SB

  B → ab

带入S得

S-->SBa | b

B-->ab

消除左递归

S-->BaS' | b

S'-->*B | e

B-->ab

(待修改)

课堂练习:

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

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

A->aA

 FIRST集

FIRST(Ap)={(a,c,ε) | A-->a,A-->c,A-->ε}

FIRST(a)={a}

FIRST(ε)={ε}

FIRST(cA)={c}

FIRST(aA)={a}

FOLLOW集

FOLLOW(S)={#}

FOLLOW(A)={p}

SELECT集

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

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

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

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}

SELECT(S->Bq)=FIRST(b)={b} U FIRST(dB)={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}

原文地址:https://www.cnblogs.com/xiaoAP/p/11862833.html