First集合的构造
计算文法符号X的First(X)时,不断应用下列规则,直到再没有新的终结符号或者ε可以被加入到First集合中为止:
1)如果X是一个终结符号,那么First(X)=X。
2)若X→…右边第一个符号是终结符或 ε ,则直接将其加入 First(X)。
3)若X→…右边第一个符号是非终结符,则将其 First 集的的非 ε 元素加入 First(X)。
4)若X→…右边第一个符号是非终结符而且紧随其后的是很多个非终结符,这个时候就要注意是否有 ε 。
4.1]若第 i 个非终结符的 First 集有 ε ,则可将第 i+1 个非终结符去除 ε 的 First 集加入 First(X)。
4.2]若所有的非终结符都能够推导出 ε ,则将 ε 也加入到 First(X)。
现在我们可以按照如下方法计算任何串X1X2X3…Xn的First集合。向First(X1X2X3…Xn)加入First(X1)中所有的非ε符号。如果ε在First(X1)中,再加入First(X2)中所有的非ε符号;如果ε还在First(X2)中,再加入First(X3)中所有的非ε符号,以此类推。最后,如果ε在所有的First(Xi)中,那么将ε加入到First(X1X2X3…Xn)中。
Follow集合的构造
计算非终结符号A的First(A)时,不断应用下列规则,直到再没有新的终结符号可以被加入到任意Follow集合中为止:
1)将$放到Follow(S)中,其中S是开始符号,而 $ 是输入右端的结束标记。
2)如果存在一个产生式A→αBβ,那么First(β)中除了ε之外的所有符号都在Follow(B)中。
3)如果存在一个产生式A→αB,或存在产生式A→αBβ且First(β)包含ε,那么Follow(A)中所有符号都在Follow(B)中。
PS:α,β可以为空。
预测分析表的构造
消除左递归之后对于文法的每一个产生式A→α,进行如下处理:
1)对于First(α)中的每个终结符号a,将A→α加入到M【A,a】中。
2)如果ε在First(α)中,那么对于Follow(A)中的每一个终结符号b,将A→α加入到M【A,b】中。如果ε在First(α)中,且$在Follow(A)中,也将A→α加入到M【A, $】中。
在完成上面的操作后,如果M【A,a】中没有产生式,那么将M【A,a】设置为error(在表中用空条目表示)。