前言
为什么需要求FIRST集合:因为一个产生式存在多个候选式,选择哪一个候选式是不确定的,所以这就产生了回溯。回溯需要消耗大量的计算、存储空间,所以我们需要消除回溯。而消除回溯的其中一种方法叫作“预测”,即根据栈顶非终结符去预测后面的候选式,那预测方法就是求第一个非终结符,来判断是否和读头匹配,以达到预测的效果
FIRST集合定义
- 文字定义:FIRST(α)集合是A的所有可能推导出的开头终结符或ε组成的集合,称FIRST(α)为α的开始符号集或首符号集
公式定义:
设G是上下文无关文法:
则:
注意
- α多步能直接推出ε时,此时将ε加入FIRST集合
计算FIRST集合步骤
- 求解FIRST(X)
- 1)若X ∈ VT,则FIRST(X) = {X}。【终结符自己就是自己的FIRST集合】
- 2)若X ∈ VN,且有产生式X → a……, a ∈ VT,则a ∈ FIRST(X) 【非终结符,选第一个终结符加入】
- 3)若X ∈ VN,X → ε,则 ε ∈ FIRST(X) 【能直接推出ε,ε加入FIRST】
- 4)若X,Y1,Y2,……,Yn ∈ VN,而有产生式X → Y1,Y2,……,Yn。当Y1,Y2,……,Y(i-1) 直接推出ε时,则FIRST(Y1) - ε, FIRST(Y2) - ε, …… , FIRST(Y(i-1) - ε) ,FIRST(Yi) 都包含在FIRST(X)中【中间的ε是不会加入进去的】
- 5)当4)中所有Yi 都推出 ε时,则最后的FIRST(X) = FIRST(Y1) ∪ FIRST(Y2) ∪ …… ∪ FIRST(Yn) ∪ {ε}
反复运用2)-5)步骤,直到每个符号的FIRST集合不再增大为止
例题
- 对如下文法G,求各个非终结符的终结首符集
1.E → TE'
2.E' → +TE'
3.E' → ε
4.T → FT'
5.T' → *FT'
6.T' → ε
7.F → i
8.F → (E)
解:
----------------------FIRST(E)、FIRST(T)、FIRST(F)----------------------
FIRST(E) = FIRST(T); // 1.
FIRST(T) = FIRST(F); // 4.
FIRST(F) = {i,(}; // 7. 8.
∴ FIRST(E) = FIRST(T) = FIRST(F) = {i,(};
----------------------FIRST(E')----------------------
FIRST(E') = {+,ε}; // 2. 3.
----------------------FIRST(T')----------------------
FIRST(T') = {*,ε}; // 5. 6.
其它
- 课件下载:
关注下方微信公众号,
回复:
FIRST.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top