在上一章的时候我们介绍了编译原理中FIRST集和FOLLOW集的计算,下面这章我们来介绍一下编译原理中的SELECT集。

编译器怎样识别api函数(编译原理中SELECT集是什么东西)(1)

带有科技感的抽象金属立方体漂浮在空中

若有SELECT(A->a) 若a通过n步可以推得ε,那么就有

SELECT(A->a)=FIRST(a)-{ε} U FOLLOW(A)

若a不能推得ε,那么就有

SELECT(A->a)=FIRST(a)

其实SELECT集就是预测分析表。使用预测分析表可以帮助我们分析判断一个句子是否符合语法。

例:S->AB|bC,A->ε|b,B->aD|ε,C->AD|b,D->aS|c

FIRST(S)={b} U FIRST(A)-{ε} U FIRST(B)-{ε} U {ε}

FIRST(A)={b,ε}

FIRST(B)={a,ε}

FIRST(C)=FIRST(A)-{ε} U FIRST(D)

FIRST(D)={a,c}

FOLLOW(S)=FOLLOW(D)

FOLLOW(A)=FIRST(D) U FIRST(B)-{ε} U FOLLOW(S)

FOLLOW(B)=FOLLOW(S)

FOLLOW(C)=FOLLOW(S)

FOLLOW(D)=FOLLOW(S)

对于S来说S周围有着句子的括号即#S#

故FOLLOW(S)="#"

可得

SELECT(S->AB)={FIRST(AB)-{ε}} U FOLLOW(S)

SELECT(S->bC)=FIRST(bC)

SELECT(A->ε)=FOLLOW(A)

SELECT(A->b)=FIRST(b)

SELECT(B->ε)=FOLLOW(B)

SELECT(B->aD)=FIRST(aD)

SELECT(C->AD)=FIRST(AD)

SELECT(C->b)=FIRST(b)

SELECT(D->aS)=FIRST(aS)

SELECT(D->c)=FIRST(c)

之后将其填入预测分析表即可。

,