1.前言
自顶向下和自底向上语法分析器的构造可以使用和文法G相关的两个函数FIRST和FOLLOW来实现。在自顶向下语法分析过程中,FIRST和FOLLOW使得我们可以根据下一个输入符号来选择应用哪个产生式。在恐慌模式的错误恢复中,由FOLLOW产生的词法单元集合可以作为同步词法单元。
2.FIRST和FOLLOW集
计算各个文法符号X的FIRST(X)时,不断的应用下面的规则,知道在没有新的终结符号或可以被加入到任何FIRST集合中为止。
1)如果X是一个终结符号,那么FIRST(X) = X。
2) 如果X是一个非终结符号,且X是一个产生式,其中k1,那么如果对于某个i,a在FIRST()中且在所有的FIRST() ,... ,FIRST()中,就把a加入到FIRST(X)中。也就是说,。如果对于所有的j = 1,2,...,k, 在FIRST()中,那么将加入到FIRST(X)中。比如,FIRST()中的所有符号一定在FIRST(X)中。如果不能推导出,那么我们就不会再向FIRST(X)中加入任何符号,但如果,那么我们就加上FIRST(),依此类推。
3)如果X是一个产生式,那么将加入到FIRST(X)中。
现在,我们可以依照如下方式计算任何串的FIRST集合。向FIRST()集合中加入F()中所有的非符号。如何在FIRST()中,再加入FIRST()中所有的非符号;如果在FIRST()和FIRST()中,再加入FIRST()中加入所有的非符号,依此类推。最后,如果对所有的i,都在FIRST()中,那么将加入到FIRST()中。
计算所有的非终结符号A的FOLLOW(A)集合时,不断的应用下面的原则,直到再没有新的终结符号可以被加入到任意FOLLOW集合中为止。
1)将$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记。
2)如果存在一个产生式A,那么FIRST()中除之外的所有符号都在FOLLOW(B)中。
3)如果存在一个产生式AB,或存在产生式A