day05_编译原理学习

第四章 语法分析

FOLLOW的计算和定义

    • 定义:被定义为\alpha从推导得到的串首符号的集合(其中\alpha是任意的文法符号)。
    • 算法:求解的方法:不断应用以下规则,直到没有新的终结符号或空集被加入到任何集合中为止。
      • 1)如果X是一个终结符号,那么= X;
      • 2) 如果X是一个非终结符,且X\rightarrow Y\textup{1}Y\textup{2}...Y\textup{k}(k \geq 1)是一个产生式,\alphaFIRST(Y\textup{i})中且\epsilon在所有的FIRST(Y\textup{1}-Y\textup{i})中,也就是说,Y\textup{1}...Y\textup{i-1}经零步或者多步推导可以得出\epsilon。如果对于所有的i= 1,2,...,k,\epsilonFIRST(Y\textup{i})中,那么就将\epsilon加入到FIRST(X ).
      • 3)如果X\rightarrow \epsilon是一个产生式,那么将\epsilon加入到
    • 例子:
    • 具体解题思路:求解文法中所有的产生式左部的FIRST集合,只需要看每个左部的所有产生式右部的首字符A。
      • 1. 如果A是终结符,那么将其加入到左部对应的 集合中。
      • 2. 如果A是非终结符,那么继续求解FIRST(A),并将FIRST(A)加入到左部对应的集合中去。
      • 3. 如果A \Rightarrow \epsilon,那么也将\epsilon加入其中。
      • 注意:如果产生式的右部由“|”连接,对于"|"左右两边的句型运用上述相同的规则。
    • 计算X\textup{1}X\textup{2}...X\textup{n}FIRST集合
  • FOLLOW

    • 定义:FOLLOW(A)可能在某些句型中紧跟在A右边的终结符号的集合。
    • 求解所有非终结符A的FOLLOW(A)集合时,不断应用以下规则,直到不再有新的终结符可以加入到任意的FOLLOW集合中为止。
      • 1) 将\$(是输入右端的结束标记)放入到FOLLOW(S)集合中,其中S为文法的开始符号
      • 2)如果存在一个产生式,那么FIRST(\beta )中除了\epsilon之外的所有符号都在中。
      • 3)如果存在一个产生式,或存在产生式FIRST(\beta )包含, 那么FOLLOW(A)中的所有符号都在 中.
    • 具体解题思路:求解所有非终结符的 FOLLOW集合:
      • 1. 先将结束标记 \$ 加入到开始符号FOLLOW 集中,即 FOLLOW(S) = {\$ ,...}。
      • 2. 再将所有非终结符中能推导出\epsilon的非终结符列举到一个集合中。
      • 3. 紧接着对于非终结符B,观察文法中所有产生式的右部是否存在B,如果存在,则判断B在产生式中的句型:
        • 如果是 ,直接将FOLLOW(A)加入到
        • 如果是则需要继续判断\beta是否是终结符
          • 终结符,那么就将其加入到FOLLOW(A)
          • 非终结符,那么就将FIRST(\beta )加入到 中,接着判断该非终结符是否在第二步中的非终结符集合中
            • 不在则进行下一轮判断。
            • 如果在,就将 FOLLOW(A) 加入到   中。
    • 根据 FOLLOW集构造表达式文法的可选集SELECT

      • (day04)定义回顾:由于各个具有相同的左部的产生式的SELECT集不存在交集,故图片中表达式的文法是LL(1)文法。
    • 根据表达式文法的可选集构造预测分析表 

附:FIRST和FOLLOW集合的计算从定义来看较为晦涩,可以根据要点中“具体解题思路”再反复刷题和观看视频进行理解!

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值