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练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
P101练习7(2)
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练习7(3)
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 } |