一 、构造 FIRST 集的算法
定义
例子加深理解理解****
①首先将各个候选式中的终结符填入FIRST集中
1.先看E的候选式首个是T,不是终结符,且现在我们还不知道FIRST(T),所以先看下一个
2.先看E‘的候选式首个是+,是终结符,所以将+填入FIRST(E’)
3.先看T的候选式首个是F,不是终结符,且现在我们还不知道FIRST(F),所以先看下一个
4.先看T’的候选式首个是*,是终结符,所以将*填入FIRST(T’)
5.先看F的候选式首个是(和id,是终结符,所以将(和id填入FIRST(F)
②将各个候选式中有ε的填入FIRST集中
③现在我们看T—>FT’, 可以知道FIRST(F),所以将FIRST(F)-{ε }填入FIRST(T),因为FIRST(F)中没有ε,所以不用看T’的FIRST集。
④
现在我们看E—>TE’, 可以知道FIRST(T),所以将FIRST(T)-{ε }填入FIRST(E),因为FIRST(F)中没有ε,所以不用看E’的FIRST集。
⑤最后我们就得到了完整的FIRST集
二、构造 FOLLOW 集的算法
定义
解法
还是上题解释
由前面,我们已经求出了各个FIRST集,接下来接着求FOLLOW集:
①
由于E是文法的开始符号,所以将结束符‘#’填入FOLLOW(E)中,然后再各个产生式中找含有E的,只有F->(E)|id, 利用规则(2),所以将FIRST( ) )加入到FOLLOW(E)中
②
由E->TE’,利用规则3 将FOLLOW(E)写入FOLLOW(E‘),
由E’->+TE’|ε ,利用规则3 将FOLLOW(E’)写入FOLLOW(E‘),
③
由E->TE’,利用规则2 将FIRST(E‘)- {ε} 写入FOLLOW(T), 当FIRST(E‘)的元素为ε,利用规则3 将FOLLOW(E)写入FOLLOW(T)
由E’->+TE’|ε ,规则2 将FIRST(E‘)- {ε} 写入FOLLOW(T), 当FIRST(E‘)的元素为ε,利用规则3 将FOLLOW(E’)写入FOLLOW(T)
④
由T->FT’,利用规则3 将FOLLOW(T)写入FOLLOW(T’),
由T’->*FT’|ε,利用规则3 将FOLLOW(T’)写入FOLLOW(T’),
⑤
由T->FT’,利用规则2 将FIRST(T’)写入FOLLOW(F),当FIRST(T’)的元素为ε,利用规则3 将FOLLOW(T)写入FOLLOW(F)
由T’->*FT’|ε,利用规则2 将FIRST(T’)写入FOLLOW(F),当FIRST(T’)的元素为ε,利用规则3 将FOLLOW(T’)写入FOLLOW(F)
三、练习题
题1
解:
题2