编译原理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)文法

温馨提示:答案为网友推荐,仅供参考
相似回答