摘要:对于普遍的求FIRST集和FOLLOW集做法而言,我在学习过程中,觉得FIRST集应该有一些需要额外考虑的东西。若有不对,请指出。
一、大多数博客或者视频中的介绍做法:
1、First集规则(相应字母在->左边,查找->右边第一个东西)
①A->aB,a加进First(A);
(->右边第一个是终结符,加进集合)
②A->ε,ε加进First(A);
③A->Xa,将集合First(X)- ε加入First(A)中。
(->右边第一个是非终结符,将该非终结符的First集(去空)加进集合)
2、Follow集合规则(相应字母在->右边,查找相应字母的右边的东西)
①A是开始符号,Follow(A)有#;
②B->Aa,Follow(A)有a
(后面是终结符,加进我的Follow集)
③B->AC,First(C)-ε加入Follow(A)。
(后面是非终结符,将该非终结符的First集加进我的Follow集)
④B->aA或B->aAC,C->ε。将Follow(B)加入Follow(A)
二、针对求FIRST集,个人觉得需要额外注意的点:
1、算法(理论)支撑
2、有了算法的支撑,以一个简单例子讲解需要注意的点。
(1)基础知识:对于这个例子,我们首先要知道:
(2)重要的是,在这个过程中,我认为需要注意的:
对于FIRST(AB) = {a, b, ε},因为A中有ε,所以才会继续求First(B);
以及对于FIRST(bC) = {b} , 因为b中无ε,所以不会再求First(C);
原因在于算法中这句UNTIL:当无法满足条件的时候,即ε不属于当前符号的FIRST集,则停止并入其余符号的FIRST集。
同理,对于其它求FIRST也是如此。