编译原理:FIRST集、FOLLOW集、SELECT集的求法及LL(1)文法的判定——篇③SELECT集的求法及LL(1)文法的判定

编译原理:FIRST集、FOLLOW集、SELECT集的求法及LL(1)文法的判定——篇③SELECT集的求法及LL(1)文法的判定

FIRST集的求法见添加链接描述
FOLLOW集的求法见添加链接描述

SELECT集

对于产生式A—>α,集合select(A—>α)定义如下:
若α不能推出ε,则select(A—>α) = first(α)。
若α能推出ε,则select(A—>α)= {first(α)-{ε}}∪ follow(A)。

例子1:
设有文法G【A】:
① E -> TE’
② E’ -> +TE’|ε
③ T -> FT’
④ T’ -> *FT’|ε
⑤ F -> (E)|id

*将以上五个式子分开来看,可得:
(1) E -> TE’
(2)E’ -> +TE’
(3)E’ -> ε
(4)T -> FT’
(5)T’ -> FT’
(6)T’ -> ε
(7)F -> (E)
(8)F -> id

简单来说就是,若式子是以终结符开头,则SELECT集直接为该终结符;若式子满足A—>α,α不能推出ε,则SELECT集为其串首非终结符的FIRST集。则上式的SELECT集分别为:
编译原理:FIRST集、FOLLOW集、SELECT集的求法及LL(1)文法的判定——篇③SELECT集的求法及LL(1)文法的判定
根据上图可知,2、3式子的左部相同, 5、6 式子的左部相同, 7、8式子的左部相同, 交集为空,所以该文法为LL(1)文法。

补充,根据SELECT集可得其预测分析表:
编译原理:FIRST集、FOLLOW集、SELECT集的求法及LL(1)文法的判定——篇③SELECT集的求法及LL(1)文法的判定
三篇博客合起来,即为FIRST集、FOLLOW集、SELECT集的求法及LL(1)文法的判定,若有表述不当之处,还望包含,有任何问题也可以评论,我必将解答。