编译原理follow集怎么求?例:s->xSNy|Nx;N->zN|空 答案:follow(S)={y,z,#},follw(N)={x,y}什么时候有#

问题描述:

编译原理follow集怎么求?例:s->xSNy|Nx;N->zN|空 答案:follow(S)={y,z,#},follw(N)={x,y}什么时候有#
非S得其他非终结符什么时候有#什么时候没有#?


求某一非终结符的follow集,主要看产生式右端(含有该非终结符的右端).

因为S是该文法的开始符,所以#在follow(S)中.在产生式S->xSNy的右端,S的后跟符号是first(Ny),即z和y.这样follow(S)={y,z,#}

求follw(N)时,看产生式S->xSNy和S->Nx,在它们的右端都含有N,根据S->xSNy可知,y在follw(N)中;根据S->Nx可知,x在follw(N)中;这样follw(N)={x,y}
虽然产生式N->zN的右端也含有N,但根据follow集合的定义,将follw(N)加入follw(N)中没有意义,所以不用计算.

对于不是开始符的其他非终结符,其follow集合有没有#,要看产生式的结构(产生式右端).
这个不是LL(1)文法吧?不是。因为select(S->xSNy)={x} select(S->Nx)={x,z}两个集合的交集不为空,所以不是LL(1)文法