符集
FIRST集
原则:求FIRST(A),观察左边为A的产生式,如: A->…
情况1
A->a… (a为终结符) 则有:
F I R S T ( A ) ∋ a FIRST(A)\ni a FIRST(A)∋a
情况2
A->B… (B为非终结符)则有:
F I R S T ( A ) ⊇ F I R S T ( B ) FIRST(A) \supseteq FIRST(B) FIRST(A)⊇FIRST(B)
FOLLOW集
原则:求FOLLOW(A),观察右边含有A的产生式,如:…->…A…
特别说明:若A为文法的初始符,则规定:
F O L L O W ( A ) ∋ # FOLLOW(A) \ni \# FOLLOW(A)∋#
情况1
S->…Aa…(a为终结符),则有:
F O L L O W ( A ) ∋ a FOLLOW(A) \ni a FOLLOW(A)∋a
情况2
S->…AB …(B为非终结符)
情况2.1
ξ ∉ F I R S T ( B ) \xi \notin FIRST(B) ξ∈/FIRST(B)
F O L L O W ( A ) ⊇ F I R S T ( B ) FOLLOW(A) \supseteq FIRST(B) FOLLOW(A)⊇FIRST(B)
情况2.2
ξ ∈ F I R S T ( B ) \xi \in FIRST(B) ξ∈FIRST(B)
F O L L O W ( A ) ⊇ F I R S T ( B ) − { ξ } ∪ F O L L O W ( B ) FOLLOW(A) \supseteq FIRST(B)-\{\xi\} \cup FOLLOW(B) FOLLOW(A)⊇FIRST(B)−{ξ}∪FOLLOW(B)
情况3
S->…AB(B为非终结符)
情况3.1(和2.1一样)
ξ ∉ F I R S T ( B ) \xi \notin FIRST(B) ξ∈/FIRST(B)
F O L L O W ( A ) ⊇ F I R S T ( B ) FOLLOW(A) \supseteq FIRST(B) FOLLOW(A)⊇FIRST(B)
情况3.2
ξ ∈ F I R S T ( B ) \xi \in FIRST(B) ξ∈FIRST(B)
F O L L O W ( A ) ⊇ F I R S T ( B ) − { ξ } ∪ F O L L O W ( S ) FOLLOW(A) \supseteq FIRST(B)-\{\xi\} \cup FOLLOW(S) FOLLOW(A)⊇FIRST(B)−{ξ}∪FOLLOW(S)
情况4
S->…A,则有
F O L L O W ( A ) ⊇ F O L L O W ( S ) FOLLOW(A) \supseteq FOLLOW(S) FOLLOW(A)⊇FOLLOW(S)
SELECT集
求SELECT(A->B),(这里的B可能是终结符也可能是非终结符)就是利用前面求出的FIRST集和FOLLOW集,要注意SELCET的括号里是一个产生式
情况1
ξ ∉ F I R S T ( B ) \xi \notin FIRST(B) ξ∈/FIRST(B)
S E L E C T ( A − > B ) = F I R S T ( B ) SELECT(A->B) = FIRST(B) SELECT(A−>B)=FIRST(B)
情况2
ξ ∈ F I R S T ( B ) \xi \in FIRST(B) ξ∈FIRST(B)
S E L E C T ( A − > B ) = F I R S T ( B ) − { ξ } ∪ F O L L O W ( A ) SELECT(A->B) = FIRST(B) -\{ \xi\} \cup FOLLOW(A) SELECT(A−>B)=FIRST(B)−{ξ}∪FOLLOW(A)