1.前言
自顶向下和自底向上语法分析器的构造可以使用和文法G相关的两个函数FIRST和FOLLOW来实现。在自顶向下语法分析过程中,FIRST和FOLLOW使得我们可以根据下一个输入符号来选择应用哪个产生式。在恐慌模式的错误恢复中,由FOLLOW产生的词法单元集合可以作为同步词法单元。
2.FIRST和FOLLOW集
计算各个文法符号X的FIRST(X)时,不断的应用下面的规则,知道在没有新的终结符号或可以被加入到任何FIRST集合中为止。
1)如果X是一个终结符号,那么FIRST(X) = X。
2) 如果X是一个非终结符号,且X是一个产生式,其中k
1,那么如果对于某个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