first、follow、select集的计算

版权声明:本文为博主原创文章,转载需标明出处 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集中为止

  1. X如果是一个终结符,则 first(X)={X}
  2. X如果是一个非终结符,且X->Y···Y∈P(k>=1)
    1. 若 Y -/->ε,则first(X)=first(Y)
    2. 若 Y -->ε,Y -/->ε,则 first(X) = first(Y) + first(Y) ,其中包含ε
    3. 若 Y 的前(k-1)个都能推导出 ε,则把 first(Y)··· first(Y) 和 ε 加入到first(X)中
    4. X -->ε,则把 ε 加入到first(X)中

follow 集

定义:

follow(A):可能在某个句型中紧跟在 A后面的 终结符a的集合

如果 A 是某个句型的最右符号,则将结束符 # 加入到 follow(A)中

计算方法:

  1. 将 # 放入follow(S)中,S 是开始符号
  2. 对于 A–>αBβ
    1. ε 不属于 first(β),则 follow(B) = first(β)
    2. εfirst(β),则 follow(B) = first(β) - {ε} + follow(A)
  3. A–>αBfollow(B) = follow(A)

注意:上面说的α,既可以是终结符,也可以是非终结符

select 集

这里先定义α 代表 一个 终结符,大写字母 是 非终结符

  • 对于产生式 A->BC 或 A->B
    • B 推不出 ε,则 select(A->BC) = first(B)
    • B 推出 ε,则 select(A->BC) = [first(B) - {ε}] U follow(A)
  • 对于产生式 A->αB,则 select(A->αB) = {α}

猜你喜欢

转载自blog.csdn.net/Jason_yesly/article/details/86563365