一、定义

1、FIRST集:看产生式左部

FIRST(α) = {a | α ⇒ ∗ \stackrel{*}\Rightarrow a···,a∈ V T V_{T} VT}

FIRST(α)是α的所有可能推导的开头终结符或可能的ε。
2、 FOLLOW集:看产生式右部

FOLLOW(A) = {a | S ⇒ ∗ \stackrel{*}\Rightarrow ···Aa···,a∈ V T V_{T} VT}

FOLLOW(A)是所有该文法开始符推导的句型中出现在紧跟A之后的终结符或 “#”。

二、求解规则

1、FIRST集的求解规则

(1.1) 若X→a···,则将终结符 a 加入FIRST(X)中。

(1.2) 若X→ε,则将 ε 加入FIRST(X)中。

(1.3) 若X→Y…,且Y属于非终结符,则将FIRST(Y)/{ε}加入到FIRST(X)中。

(1.4) 若X→ Y 1 Y 2 ⋅ ⋅ ⋅ Y K Y_{1} Y_{2} ···Y_{K} Y1Y2⋅⋅⋅YK,且 Y 1 , Y 2 , ⋅ ⋅ ⋅ , Y i − 1 Y_{1}, Y_{2}, ···,Y_{i-1} Y1,Y2,⋅⋅⋅,Yi1都是非终结符,且 Y 1 , Y 2 , ⋅ ⋅ ⋅ , Y i − 1 Y_{1}, Y_{2}, ···,Y_{i-1} Y1,Y2,⋅⋅⋅,Yi1的FIRST集合中均包含ε,则将FIRST( Y j Y_{j} Yj) ,(j=1,2,···,i)的所有非 ε 元素加入到FIRST(X)中,特别地,若 Y 1 Y_{1} Y1~ Y k Y_{k} Yk均有 ε 产生式,则将 ε 加到FIRST(X)中。

2、FOLLOW集的求解规则

(2.1) 对文法开始符号S, 置 # 于FOLLOW(S)中。

(2.2) 若有A→αBβ,则将 FIRST(β) \ {ε} 加入FOLLOW(B)中(此处 α 可以为空)。

(2.3) 若A→αB或A→αBβ,且β ⇒ ∗ \stackrel{*}\Rightarrow ε(即ε∈FIRST(β)),则将 FOLLOW(A)加入FOLLOW(B)中(此处 α 可以为空)。

在这里插入图片描述

三、求FIRST集例题

例1:写出下面文法中所有非终结符的FIRST集。

	E → TE’
	E’ → +E|ε
	T → FT’
	T’ → T|ε
	F → PF’
	F’ → *F’|ε
	P  → (E)|a|b|^

解答:

	FIRST(E’) = {+ , ε}  			规则(1.1)(1.2)
	FIRST(F’) = {* , ε}    		 	规则(1.1)(1.2)
	FIRST(P)  = {( , a , b , ^}		规则(1.1)
	FIRST(F)  = FIRST(PF’) = FIRST(P)\{ε}= {( , a , b , ^}	规则(1.3)  		FIRST(P)不包含ε
	FIRST(T)  = FIRST(FT’) = FIRST(F)\{ε}= {( , a , b , ^}	规则(1.3)  		FIRST(F)不包含ε
	FIRST(E)  = FIRST(TE’) = FIRST(T)\{ε}= {( , a , b , ^}	规则(1.3)  		FIRST(T)不包含ε
	FIRST(T’) = {FIRST(T)\{ε}} ∪ {ε} = {( , a , b , ^ ,ε}	规则(1.2)(1.3)	FIRST(T)不包含ε

例2:写出下面文法中求FIRST(S),FIRST(A),FIRST(B)。

	G: S → BA
	   A → BS|d
	   B → aA|bS|c

解答:

	FIRST(A) = {FIRST(B)\{ε}}∪{d} = {a, b, c, d} 
	FIRST(S) = {FIRST(B)\{ε}} = {a, b, c}
	FIRST(B)={a, b, c}

例3:写出下面文法中所有非终结符的FIRST集。

	E  → TE’
	E’ → +E|ε
	T  → Fd
	F  → PF’
	F’ → *F’|ε
	P  → (E)|a|b|ε

解答:

	FIRST(E)  = FIRST(TE’) = FIRST(T) = {( , a, b, *, d}
	FIRST(E’) = {+, ε} 
	FIRST(T)  = FIRST(Fd) 
			  = {FIRST(F)\{ε}}∪{d} 
			  = {(, a, b, *, d}
	FIRST(F)  = FIRST(PF’) 
		      = {FIRST(P)\{ε}}∪{FIRST(F’)\{ε}}∪{ε}
		      = {(, a, b, *, ε}
	FIRST(F’) = {*, ε} 
	FIRST(P)  = {(, a, b, ε}

四、求FOLLOW集例题

例1:写出下面文法中所有非终结符的FOLLOW集。

  	G:  E  → TE’
		E’ → +TE’|ε 
		T  → FT’ 
		T’ → *FT’|ε 
		F  → (E)|i

已知:

	FIRST(E)  = FIRST(T) = FIRST(F) = {(, i}
	FIRST(E’) = {+, ε}
	FIRST(T’) = {*, ε}

解答:

1、由规则(2.1),对文法开始符E,置#于FOLLOW(E)中

	# ∈ FOLLOW(E) 

2、E在产生式F → (E)|i 的右部出现,由规则(2.2),结合步骤1

	FOLLOW(E) = {#,)}

3、E’在产生式E → TE’和 E’ → +TE’ 的右部出现,由规则(2.3)

	FOLLOW(E’) = FOLLOW(E)∪FOLLOW(E’) = {#,)}

4、T在产生式 E → TE’和E’ → +TE’ 的右部出现,由规则(2.2),再由规则(2.3)

	FOLLOW(T) = {FIRST(E’)\{ε}}∪FOLLOW(E)∪FOLLOW(E’) = {+,#,)}

5、T’在产生式T → FT’ 和T’ → *FT’ 的右部出现,由规则(2.3)

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

6、F在产生式T → FT’ 和T’ → *FT’ 的右部出现,由规则(2.2),再由规则(2.3)

	FOLLOW(F) = {FIRST(T’)\{ε}}∪FOLLOW(T)∪FOLLOW(T’) = {*,+,#,)}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐