版权声明:本文为博主原创文章,转载需标明出处 https://blog.csdn.net/Jason_yesly/article/details/86563365
在进行语法分析的时候,特别是自顶向下的语法分析,比如LL(1)分析、LL(0)分析,需要求出文法的first集和follow集,进而求出select集,然后根据select集得到预测分析表。但书上给的计算方法过于形式化,相对来说比较抽象,不易理解,所以,下面介绍好理解的计算方法。
first 集
基本定义如下:
first(X): 可以从X推导出的所有串首终结符
构成的集合
若 X ->˙ε,则 ε∈first(X)
算法如下:
运用以下规则,直到没有任何终结符或ε可以被加入到任何first集中为止
- X如果是一个终结符,则 first(X)={X}
- X如果是一个非终结符,且X->Y₁···Yₖ∈P(k>=1)
- 若 Y₁ -/->ε,则first(X)=first(Y₁)
- 若 Y₁ -->ε,Y₂ -/->ε,则 first(X) = first(Y₁) + first(Y₂) ,其中包含ε
- 若 Yₖ 的前(k-1)个都能推导出 ε,则把 first(Y₁)··· first(Yₖ) 和 ε 加入到first(X)中
- X -->ε,则把 ε 加入到first(X)中
follow 集
定义:
follow(A):可能在某个句型中紧跟在 A后面的 终结符a
的集合
如果 A 是某个句型的最右符号
,则将结束符 #
加入到 follow(A)中
计算方法:
- 将 # 放入follow(S)中,S 是开始符号
- 对于 A–>αBβ
- 若 ε 不属于 first(β),则 follow(B) = first(β)
- 若 ε∈first(β),则 follow(B) = first(β) - {ε} + follow(A)
- A–>αB,follow(B) = follow(A)
注意:
上面说的α,既可以是终结符,也可以是非终结符
select 集
这里先定义α 代表 一个 终结符,大写字母 是 非终结符
- 对于产生式 A->BC 或 A->B
- B 推不出 ε,则
select(A->BC) = first(B)
- B 推出 ε,则
select(A->BC) = [first(B) - {ε}] U follow(A)
- B 推不出 ε,则
- 对于产生式 A->αB,则
select(A->αB) = {α}