编译原理 求first集 follow集 select集

S→AB

S→bC

A→ε

A→b

B→ε

B→aD

C→AD

C→b

D→aS

D→c

求他的first,follow,select


First(S) =(First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b}
 ={a,b,ε}

因为A的first有ε,B的first有ε,S->AB,所以是First(A)-{ε})∪(First (B)-{ε}) ∪{ε},然后S->bC,所以再加一个b,就是First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b},

First (A)={b, ε}

没什么好解释的

First (B)={a, ε}

ε不用解释,就是B->ε,所以有他,a就是因为B->aD,第一个非终结符是a所以有a,那要不要加上D的first呢,就是a和c,答案是不用,就只要aD里面的a就可以

First (C)={a,b,c}

C->AD这一句,AD都是非终结符,所以要找A和D的first集,D的是a,c,A的是b,ε,因为不是AD同时都能推出ε所以C的first是A和D的first的并集减去ε,还要加上b,因为有C->b这一句
First (D)={a,c}

D->c不用解释,D->aS这一句,不用加上S的first!!!

First (AB)={a,b,ε}First (bB)={b}
First (ε)={ε} First (b)={b}
First (aD)={a} First (AD)={a,b,c}
First (aS)={a} First (c)={c}

AB同时能够推出ε,所以first(AB)就是A和B的first的并集减去ε再并上ε

bB的first就是b,不用加上B的first

ε的就是ε,b就是b,c就是c,只有一个终结符ε没什么好说的

一个终结符和一个非终结符的,就要那个终结符就可以,不用管后面那个非终结符,

两个非终结符的要看是不是他们两个同时能推出ε,能就有ε,要是有一个不能推出ε,那first集就没有ε

AB有ε是因为AB都能推出ε,AD没有是因为A能D不能推出ε

接下来求follow集

从开始符号S开始推倒,开始符号的follow里面一定要有#,

所以开始符号的S的follow集要有#,

follow是找->后面的,比如找S的follow,就要看谁的->后面有S,D->aS里面有S,然后在看D->aS的S后面有没有别的符号,没有就加上D的follow集,如果有,就加上后面那个字母的first集里面除了ε以外的符号,在看这个字母能不能推出ε,如果能,就再加上->左边的那个字母的follow

看A的follow,首先找所有->后面有A的,找到了S->AB,C->AD,先看S->AB,A后面有B,所以要加上B的first集里面除了ε的其他符号,再看B能不能在有限的步骤里推出ε,有B->ε这句,所以能,就要再加上->左边的S的follow集,所以目前的A的follow集里面有a,和follow(S),再看C->AD这一句,A后面有D,所以要加上D的first集里面除了ε的其他的,再看B能不能在有限的步骤里推出ε,D不能,所以不用加->左边的C的follow,所以A的follow就是a,follow(S),a,c,但是如果有重复的,就只要一个,所以最终就是a,c,follow(S),这个follow(S)到后面还要算出来的,不能就这样写

看B的follow,找所有->后面有B的,找到了S->AB,看B后面有字母吗?没有,就加上->左边的S的follow,所以follow(B)=follow(S)

看C的follow,找所有->后面有C的,找到了S-bC,看C后面有字母吗?没有,就加上->左边的S的follow集,所以follow(C)=follow(S)

看D的follow,所有->后面有D的,找到了B->aD。C->AD,这两句D后面都没有字母,所以加上->左边的B和C的follow,所以follow(D)=follow(B)并上follow(C)

最终要把以上的follow都求出来,看follow(S)=#+follow(D),follow(D)=follow(B)+follow(C),所以follow(S)=#+follow(B)+follow(C),follow(B)=follow(S),follow(C)=follow(S)所以follow(S)=#+follow(S)+follow(S),所以follow(S)就是#,follow(B),follow(C),follow(D)也都是#,所以follow(A)就是ac,#,求完了,以上所有的+代表求并集

SELECT集

1、定义:

给定上下文无关文法的产生式A→α, A∈VN,α∈V*, 若α不能推导出ε,则SELECT(A→α)=FIRST(α)   

如果α能推导出ε则:SELECT(A→α)=(FIRST(α) –{ε})∪FOLLOW(A)

需要注意的是,SELECT集是针对产生式而言的。


看select(S->AB),AB都能推出ε,所以select(S->AB)=first(AB)-ε+follow(S)所以结果是a,b,#

看select(S->bC),bC不能推出ε,所以是first(bC),结果是b

看select(A->ε),A能推出ε所以是first(ε)-ε+follow(A)结果a,c,#

看select(A->b),这里的A是推出b不是ε所以是first(b),结果是b

看select(B->ε),B能推出ε,所以是first(ε)-ε+follow(B),结果是#

看select(B->aD),这里B不能推出ε,所以是first(aD),结果是a

看select(C->AD),这里D不能推出ε,所以算AD不能推出ε,就是first(AD),结果是a,b,c

ε,所以是first(b),结果是b

看select(D->aS),这里不能推出ε,所以是first(aS),结果是a

看select(D->c),这里D不能推出ε,所以是first(c),结果是c


猜你喜欢

转载自blog.csdn.net/hewenjing8168/article/details/79943544