考试昨天下午就算考完了, SE考的好像不太理想啊, 概念多实践少的科目果然不适合我啊(复习的时候, 坚持不了5分钟就开始玩手机, 真是日了狗, 然后开始自责, 然后循环...) 唯一一个好消息是好像我dbi是年级最高分, 不过对于这种没什么技术含量的考试分的高低其实也没什么重要, 不挂科其实都还行吧... 自从昨天下午考完之后, 晚上也没什么兴趣去学习, 看了两部电影, 今天睡了个大觉, 下午吃了一波釜山烤肉, 晚上刚了一波日本烧烤 烧鸟... 经济状况很不理想啊, 不过偶尔吃吃改善一下生活质量还是挺好的... 上面的也算是一些闲话吧, 虽然说是说在写技术博客, 但有时候还是想当日记记一记的, 暑假其实从今天就算开始了, 那么以后更新的可能会比较频繁... 不过23号还要和毛里求斯的同学去上海玩一波, 毕竟下个学期去英国就碰不到他们了, 所以这可能是最后一次一起出去玩, 也算是对这一年来一起的一个总结吧... 暑假就目前来看有这么几件事 :
近一点的 : 1. 正则表达式的引擎(最简版本)
2.六月的六级考试
远一点的 : 1. 弄完编译原理, 手动实现编译器... (如果不亲自实现, 那自学编译原理还有什么意义? 毕竟学习编译原理就是为了装逼嘛, 不能show me the code 怎么能叫装逼)
2. 如果还有时间, 看看是学C++ 还是操作系统... 到时候再说吧.
好了, 进入正题... 上一节介绍了first集的求解算法, 这一节就讲讲follow集的求解算法 (follow集的作用在于提出更加严密的first集求解算法..)
这个算法的关键在于, 他是逆序的, 也就是从推导式的最后一个符号(终结符或者是非终结符)往前推, 如果是可空的, 那么之前的temp可以传递下去, 也就是说之前一个非终结符的follow集合也可以作为下一个非终结符的follow集合(因为当前非终结符可以为空)...
最后就是first集合的严密算法, 好好感受一下大自然的力量 - .-, 可以看出这个算法不是针对某个非终结符来求解的, 而是针对具体的某一条推导式来求解的, 因为从生产分析表的角度上看, 实际上同一个非终结符的不同推导式必须要对应不相交的fisrt集合(因为如果first集合相交了, 也就是给定某个非终结符然后给定你读入的下一个token, 结果发现有两条推导式可以选择, 产生冲突显然是ll(1)不允许的), 所以我们生产表的时候应该是根据产生式的不同, 比如此时是产生式1, 产生式左部的非终结符是S, 右侧的first集合是a, 我们就可写table[S][a] = 1; 而如果不限定某条产生式那么我们如何知道此时table[S][a]应该对应什么呢 ?
所以总结起来ll(1)算法的总过程就是 :
1. 算出所有元素的first集合, follow集合, nullable与否...
2. 根据上面的结果对于每一条推导式计算first_s然后得出分析表...