FIRST集
1
FIRST(X): 可以从X推导出的所有串首终结符构成的集合
如果X⇒∗ε.那么 ε∈FIRST(X)
例
1◯2◯3◯4◯5◯ E→TE′ E′→+TE′∣ε T→FT′ T′→∗FT′∣ε F→(E)∣idFIRST(E)FIRST(E′)FIRST(T)FIRST(T′)FIRST(F)={(,id}={+,ε}={(,id}={∗,ε}={(,id}
算法
不断应用下列规则,直到没有新的终结符或 ε 可以被加入到任何 FIRST
集合中为止
▶ 如果 X
是一个终结符,那么 FIRST(X) = {X}
▶ 如果 X
是一个非终结符,且 X→Y₁…Yₖ ∈ P(k≥1)
,那么:
- 如果对于某个
i
,a
在 FIRST(Yᵢ)
中,且 ε
在所有的 FIRST(Y₁), …, FIRST(Yᵢ₋₁)
中(即 Y₁…Yᵢ₋₁ ⇒* ε
),就把 a
加入到 FIRST(X)
中。
- 如果对于所有的
j = 1, 2, …, k
,ε
在 FIRST(Yⱼ)
中,那么将 ε
加入到 FIRST(X)
中。
▶ 如果 X→ε ∈ P
,那么将 ε
加入到 FIRST(X)
中
计算串X1X2..Xn的FIRST集合
向FIRST(X1X2X3...Xn)加入FIRST(X1)中所有的非 ε符号
如果 ε 在FIRST(X1)中,再加入FIRST(X2)中的所有非 ε符号;
如果 ε 在FIRST(X1)和FIRST(X2)中,再加入FIRST(X3)中的所有非ε符号,以此类推
FOLLOW集
FOLLOW(A):可能在某个句型中,紧跟在A后边的非终结符a的集合
例
①②③④⑤E→TE′E′→+TE′∣εT→FT′T′→∗FT′∣εF→(E)∣idFIRST(E)={(,id}FOLLOW(E)={#,)}FIRST(E′)={+,ε}FOLLOW(E′)={#,)}FIRST(T)={(,id}FOLLOW(T)={+,#,)}FIRST(T′)={∗,ε}FOLLOW(T′)={+,#,)}FIRST(F)={(,id}FOLLOW(F)={∗,+,#,)}