离散数学——FIRST集,FOLLOW集和SELECT集的通俗求法
FIRST集合
- 添加终结符以及空字
若X∈ε,则ε∈FIRST(X)
若X=a…,若a∈VT,则a∈FIRST(X);
- 添加非终结符——后加前,first集
若有表达式α->X1X2…Xn,Xi为非终结符
<1>将FIRST(X1)中的一切非ε的终结符加进FIRST(α);
<2>若ε∈FIRST(X1),则将FIRST(X2)中的一切非ε的终结符加进FIRST(α);
<3>若ε∈FIRST(X1)且ε∈FIRST(X2),则将FIRST(X3)中的一切非ε的终结符加进FIRST(α);
<4>依此类推,若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε加进FIRST(α)。
FOLLOW集合——FOLLOW集没有空字
- 文法的开始符号,添加“$”符进入FOLLOW(S)中
- 若B→aAb(b≠ε),则把FIRST(b)-{ε}加入FOLLOW(A)中;
- 若B→aA 或B→aAb,且b=>*ε 则把FOLLOW(B)加入FOLLOW(A) 中,前加后,FOLLOW,前为子集。b为空字
SELECT集合
- 对于产生式A—>α。集合select(A—>α)定义如下:
- 若α不能推出ε,则select(A—>α) = first(α)。不包含空字,就是右部首字母的FIRST集。
- 若α能推出ε,则select(A—>α)= {first(α)-{ε}}∪ follow(A)。包含空字,就是A的FOLLOW和右部首终结符的FIEST集(去除空字)
LL1文法判别
所有具有相同左部的SELECT集交集是空集,才是LL1文法