消除左递归

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集:

FOLLOW集:

FIRST(E) = { ( , i }

FIRST(E’) = {+ , ε }

FIRST(T) = { ( , i }

FIRST(T’) = { * , ε }

FIRST(F) = { ( , i }

FIRST(TE') = { (, i }

FIRST(+TE') = {+}

FIRST(ε) = {ε}

FIRST(FT') = { (, i }

FIRST(*FT') = {*}

FIRST((E)) = { ( }

FIRST(i) = {i}

FOLLOW(E) = { ) , # }

FOLLOW(E’) = { ) , # }

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

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

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

SELECT集:

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

SELECT(E’ -> +TE’) = FIRST(+TE’) = { + }

SELECT(E’ -> ε) = FIRST(ε) - {ε} U FOLLOW(E’) = FOLLOW(E’) = { ) , # }

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

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

SELECT(T’ -> ε) = FIRST(ε) - {ε} U FOLLOW(T’) = FOLLOW(T’) = { + , ) ,# }

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

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

 

 

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

 

 P101练习72

 

A -> aABe | a

 

B -> Bb | d

 

文法改写:

 

A -> aA’

 

A’ -> ABe | ε

 

B -> dB’

 

B’ -> bB’ | ε

 

FIRST集:

FOLLOW集:

FIRST(A) = { a }

FIRST(A’) = { a , ε }

FIRST(B) = { d }

FIRST(B’) = { b , ε }

 

FIRST(aA')={a}

FIRST(ABe)={a}

FIRST(ε)={ε}

FIRST(dB')={d}

FIRST(bB')={b}

FOLLOW(A) = {d , #}

FOLLOW(A’) = {d ,#}

FOLLOW(B) = {e}

FOLLOW(B’) = {e}

 

SELECT集:

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

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

SELECT(A’ -> ε) = FIRST(ε) - {ε} U FOLLOW(A’) = FOLLOW(A’) = { d , # }

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

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

SELECT(B’ -> ε) = FIRST(ε) - {ε} U FOLLOW(B’) = FOLLOW(B’) = { e }

 

 

 P101练习73

 

S -> SBa | b

 

B -> ab

 

文法改写:

 

S -> bS’

 

S’-> BaS’| ε

 

B -> ab

 

FIRST集:

FOLLOW集:

FIRST(S) = { b }

FIRST(S’) = { a , ε }

FIRST(B) = { a }

 

FIRST(bS')={b}

FIRST(BaS')={a}

FIRST(ε)={ε}

FIRST(ab)={a}

FOLLOW(S) = {#}

FOLLOW(S’) = {#}

FOLLOW(B) = {a}

 

SELECT集:

SELECT (S -> bS’) = FIRST(bS’) = { b }

SELECT(S’ -> BaS’) = FIRST(BaS’) = { a }

SELECT(S’ -> ε) = FIRST(ε) - {ε} U FOLLOW(S’) = FOLLOW(S’) = { # }

SELECT(B -> ab) = FIRST(ab) = { a }

 

课堂练习:

 

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

 

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

A->aA

 

 

 

FIRST集:

FOLLOW集:

FIRST(S) = { a,c,p }

FIRST(A) = { a,c,ε }

 

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

FIRST(a)={a}

FIRST(ε)={ε}

FIRST(cA)={c}

FIRST(aA)={a}

FOLLOW(S) = { # }

FOLLOW(A) = { p }

 

SELECT集:

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

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

SELECT(A -> ɛ) = FIRST(ε) - {ε} U 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集:

FOLLOW集:

FIRST(S1) = { a , c }

FIRST(S2) = { b , d }

FIRST(A) = { a , c }

FIRST(B) = { b ,d }

 

FIRST(Ap)={a,c}

FIRST(Bq)={b,d}

FIRST(a)={a}

FIRST(cA)={c}

FIRST(b)={b}

FIRST(dB)={d}

FOLLOW(S) = { # }

FOLLOW(A) = { p }

FOLLOW(B) = { q }

 

SELECT集:

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

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

原文地址:https://www.cnblogs.com/a188182/p/11861885.html