编译原理-求FIRST集合

前言

  • 为什么需要求FIRST集合:因为一个产生式存在多个候选式,选择哪一个候选式是不确定的,所以这就产生了回溯。回溯需要消耗大量的计算、存储空间,所以我们需要消除回溯。而消除回溯的其中一种方法叫作“预测”,即根据栈顶非终结符去预测后面的候选式,那预测方法就是求第一个非终结符,来判断是否和读头匹配,以达到预测的效果
    微信公众号:JavaWeb架构师

  • FIRST集合定义

  • 文字定义:FIRST(α)集合是A的所有可能推导出的开头终结符或ε组成的集合,称FIRST(α)为α的开始符号集或首符号集
  • 公式定义:
    设G是上下文无关文法:
    微信公众号:JavaWeb架构师
    则:
    微信公众号:JavaWeb架构师

  • 注意

    • α多步能直接推出ε时,此时将ε加入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

完整教程PDF版本下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值