求文法的FIRST集和FOLLOW集的步骤如下:
- 求FIRST集
- 如果符号是终结符,则FIRST集合为该终结符本身。
- 如果符号是非终结符,则将该非终结符可以推导出的所有串的FIRST集合合并,得到该非终结符的FIRST集合。
- 如果一个非终结符可以推导出ε,则将ε加入该非终结符的FIRST集合。
- 求FOLLOW集
- 将#(表示输入串的结束符)加入文法开始符号的FOLLOW集。
- 如果存在一个产生式A->αB,则将B的FIRST集(除去ε)加入A的FOLLOW集。
- 如果存在一个产生式A->αB或A->αBβ,且B可以推导出ε,则将A的FOLLOW集加入B的FOLLOW集。
举例说明:
求FIRST集和FOLLOW集
文法:S → aAB | bBA
A → ε | cC
B → ε | dD
C → e | ε
D → f | ε
求解:
FIRST(S)={a, b}
FIRST(A)={ε, c, e}
FIRST(B)={ε, d, f}
FIRST(C)={e, ε}
FIRST(D)={f, ε}
FOLLOW(S)={#}
FOLLOW(A)={b, f, #}
FOLLOW(B)={a, c, #}
FOLLOW(C)={d, #}
FOLLOW(D)={b, #}
求FIRST集和FOLLOW集
文法:S → Aa | bB
A → c | ε
B → Cd | ε
C → e | ε
D → f | ε
求解:
FIRST(S)={b, c, e}
FIRST(A)={c, ε}
FIRST(B)={e, f, ε}
FIRST(C)={e, ε}
FIRST(D)={f, ε}
FOLLOW(S)={#}
FOLLOW(A)={a, #}
FOLLOW(B)={a, #}
FOLLOW(C)={d, #}
FOLLOW(D)={d, #}
求FIRST集和FOLLOW集
文法:S → ABa | bB
A → cA | ε
B → Bd | ε
C → e | ε
D → f | ε
求解:
FIRST(S)={b, c, e}
FIRST(A)={c, ε}
FIRST(B)={d, ε}
FIRST(C)={e, ε}
FIRST(D)={f, ε}
FOLLOW(S)={#}
FOLLOW(A)={a, #}
FOLLOW(B)={a, #}
FOLLOW(C)={d, #}
FOLLOW(D)={d, #}