First集和Follow集

这篇博客记录了作者在编译原理实验中,手动计算First集和Follow集的体验。面对复杂的文法,手工计算变得困难,作者决定自己实现算法。经过思考和伪代码设计,成功编写出求解First集和Follow集的代码,虽然过程复杂但收获颇丰。
摘要由CSDN通过智能技术生成

第一篇博客 献给了写了两周的编译原理实验

       做编译原理的实验——语法分析时,要用到First集合和Follow集合。首先说说我手算First集和follow集感觉吧。求First集合,用手算,感觉还是比较简单的。对Follow集,要是文法比较简短,用手算起来还算容易,要是文法复杂一些,比如有几十个产生式,手算就不太现实了。其实手算Follow集合的时候,我都是凭感觉,算到有点懵的时候,感觉应该算得差不多了,再检查检查,然后就觉得应该算完了。所以不太想自己写,因为脑袋里对它的求解算法都不了解,还只是“凭感觉”的层次。


       当前面的铺垫代码都搭建好了,到了需要用到follow集合的时候了,就直接找来别人的“轮子”,幻想着以为改改接口,传几个参数,接一下返回值,就万事大吉了。结果发现实现这两个求解的算法,加起来有几百行的代码,一看我就懵了。抱着改改就能用的心态,导致我根本不想研读他的代码,所以改了一天多,也没改明白。后来,一想有这改别人代码的时间,不如自己设计一个“轮子”。


       说干就干。firsts集,想起来还比较简单,一会儿就在纸上写出了求解的伪代码。follow集,在认真得“观察”了自己手算时脑袋里的思路,大概有了机器求解算法的雏形。在纸上反复修改后,利用递归,也基本写出了求解的伪代码。


      有了伪代码,在用语言实现起来就容易多了。写完后,真的觉得,其实没有多复杂,虽然也写了三百多行的代码。


      废话不多说,上代码(部分)。

求解first集的部分
        之前写的有个问题,究其原因还是没有认真思考First集合的定义。 书上在定义First集合时,是这样写的First(α) = ...... ,α是一个·符号串啊!我之前只把他考虑成一个符号(终结符or非终结符),这样的后果就是某个符号的First的集合求不完全,举个例子:
        例如文法 : P->A B     
                            A->empty | a    
                            B->b | c
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值