FIRST集合基本构造

FIRST集合

定义

令G是一个不含左递归的文法,对G的所有非终结符的每个候选a定义它的终结首符集FIRST(a)为:

FIRST(α) = { a│α ⇒∗ a…, a∈VT }

若α ⇒∗ ε ,则规定ε∈FIRST(α)。

FIRST(α)被定义为从α推导得到的句子的首符号的集合,α是任意的文法符号串。

n非终结符的FISRT集合中有空串与该非终结符属于NULLABLE集合等价。

FIRST集合构造

构造每个文法符号的FIRST集合

第一种说明:

对于文法G的每个文法符号X∈VT∪VN:

  • 若 X ∈ VT,则 FIRST(X) = { X }
  • 若 X ∈ NULLABLE,则把 ε 加入FIRST(X)
  • 若 X ∈ VN,且 X → a…, a ∈ VT,则把a加入到FIRST(X)中
  • 若 X ∈ VN,且 X → Y…, Y ∈ VN,则把FIRST(Y) - {ε}加到FIRST(X)中
  • 若 X →Y1Y2 … Yi , 且 Y1, Y2, … ,Yi-1 ∈ nullable,则把 FIRST(Yi) - {ε}加到FIRST(X)中
  • 若 FIRST(Ym) ∈ NULLABLE(1<=m<=i),则ε∈FIRST(X)

第二种说明:

对每一X∈VT∪VN,连续使用下面的规则,直至每个集合FIRST不再增大为止:

  • 若X ∈ VT,则FIRST(X)={X}。
  • 若X ∈ VN,且有产生式X→a…,则把a加入到FIRST(X)中;若X→ε也是一条产生式,则把 ε 也加到FIRST(X)中。
  • 若X→Y…是一个产生式且Y ∈ VN,则把FIRST(Y)中的所有非 ε- 元素都加到FIRST(X)中;若X→Y1Y2…Yi-1Yi…Yk是一个产生式,Y1,…,Yi-1都是非终结符,对于任何j,1<=j<=i-1,FIRST(Yj)都含有 ε (即Y1…Yi-1 ⇒∗ε), 则把FIRST(Yi)中的所有非 ε-元素都加到FIRST(X)中;若所有的FIRST(Yj)均含有 ε,j=1,2,…,k,则把 ε 加到FIRST(X)中。

如果上面两个构造方法看不懂也不要紧,我们大白话讲一下

第三种说明(这种比较好理解):

对于 X -> ... 这条产生式而言,

  • 若右边第一个符号是终结符或 ε  ,则直接将其加入 FIRST(X)
  • 若右边第一个符号是非终结符,则将其 FIRST 集的的非 ε 元素加入 FIRST(X)
  • 若右边第一个符号是非终结符而且紧随其后的是很多个非终结符,这个时候就要注意是否有 ε  。
  • 若第 i 个非终结符的 FIRST 集有 ε  ,则可将第 i+1 个非终结符去除 ε 的 FIRST 集加入 FIRST(X)。
  • 若所有的非终结符都能够推导出 ε ,则将  ε  也加入到 FIRST(X)

 

以上三种说明大致意思都是相同的

例题

文法G: 
E → TE'
E' → +TE'│ε
T → FT'
T' → *FT'│ε
F → (E)│i
求每个非终结符号的FIRST集合

 这是一道非常经典的例题,下面我们一起来看一下

因为FIRST集合是要不断重复进行的,我们可以多次循环构造它(以下均使用第三种说明)



第一次循环

//E的产生式紧跟的是两个非终结符,根据构造法第二条,FIRST(E)=FIRST(T),而FIRST(T)我们还没求出来,所以我们这项暂时为空
FIRST(E) = { }

//E'的产生式紧跟的是非终结符+,根据构造法第一条,将其加入到FIRST(E')中,产生式中还可以推导出ε,将ε也加入到FIRST(E')中
FIRST(E') = {+,ε}

//T的产生式紧跟的是FT'两个非终结符,根据构造法第二条,FIRST(T)=FIRST(F),而FIRST(T)我们还没求出来,所以我们这项暂时为空
FIRST(T) = { }

//T'的产生式紧跟的是非终结符*,根据构造法第一条,将其加入到FIRST(T')中,产生式中还可以推导出ε,将ε也加入到FIRST(T')中
FIRST(T') = {*,ε}

//F的产生式紧跟的是非终结符(,根据构造法第一条,将其加入到FIRST(T')中,产生式中还可以推导出i,将i也加入到FIRST(F)中
FIRST(F) = {(, i}

//第一次循环之后,有FIRST集合发生改变,再次循环,直到所有FIRST集合不发生改变为止


第二次循环

FIRST(E) = { }            //没有得到FIRST(T),依旧不能得到FIRST(E),所以为空

FIRST(E') = {+,ε}        //不变

FIRST(T) = {(, i}
//T的产生式紧跟的是非终结符F,根据构造法第二条,将FIRST(F)中的元素加入到FIRST(T)中
     
FIRST(T') = {*,ε}        //不变

FIRST(T) = {(, i}        //不变

//第二次循环之后,FIRST集合发生变化,再次循环



第三次循环

FIRST(E) = {(, i}          //根据构造法第二条,将将FIRST(T)中的元素加入到FIRST(E)中

FIRST(E') = {+,ε}         //不变

FIRST(T) = {(, i}        //不变

FIRST(T') = {*,ε}        //不变

FIRST(T) = {(, i}        //不变


//第三次循环之后,FIRST集合发生改变,接着循环


第四次循环

FIRST(E) = {(, i}

FIRST(E') = {+,ε}

FIRST(T) = {(, i}

FIRST(T') = {*,ε}

FIRST(T) = {(, i} 

所有FIRST集合都不改变,完成FIRST集合的构造

构造任意符号串的FIRST集合

对文法G的任何符号串α=X1X2…Xn构造集合FIRST(α)

 

FIRST(α)={ a│α⇒∗ a…, a∈VT }

α = X, X∈VT∪VN

α = X1X2…Xn, X∈VT∪VN

 

1. 置FIRST(α)=FIRST(X1) \ {ε};

2. 若对任何1<=j<=i-1,ε∈FIRST(Xj),则把FIRST(Xi) \ {ε}加至FIRST(α)中;特别是,若所有的FIRST(Xj)均含有ε,1<=j<=n,则把ε 也加至FIRST(α)中。显然,若α=ε则FIRST(α)={ ε }。 

如果能理解上面对文法符号的构造,对任意符号串的构造就很好理解了

 

如有错误,欢迎指正!

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
编译原理,First集合和Follow集合是两个重要的概念,用于描述文法规则的语言特征和语法结构,下面是它们的求法: 1. First集合的求法: 对于一个非终结符号,它的First集合包括所有以该符号作为起始符号的产生式的首字符的终结符号。 对于一个终结符号,它的First集合就是本身。 对于一个产生式,如果它的右部第一个符号是终结符号,则将该符号加入First集合。 如果它的右部第一个符号是非终结符号,则将该符号的First集合的所有符号加入到该产生式的First集合,如果该符号的First集合包含ε,则还需要将下一个符号的First集合的符号加入到该产生式的First集合,直到没有ε为止。 2. Follow集合的求法: 对于文法的开始符号,将#(结束符号)加入到该符号的Follow集合。 对于每个非终结符号,遍历所有产生式,如果该符号出现在产生式右部,则将该符号后面的符号的First集合的所有符号(除ε)加入到该符号的Follow集合,如果该符号后面的符号可以推导出ε,则将该产生式左部符号的Follow集合的所有符号加入到该符号的Follow集合。 对于每一个右部可以推导出ε的产生式,将该产生式左部符号的Follow集合的所有符号加入到该产生式右部最后一个符号的Follow集合。 以上就是编译原理First集合和Follow集合的求法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值