编译原理速成大法
FIRST集和FOLLOW集构造法速成
例:对于文法G(E)
首先像E,T,E’,F这样的就是非终结符
+,*, ε,(,)这样的就是终结符
构造每个非终结符的FIRST集和FOLLOW集
FIRST
FIRST集很简单,从左侧开始,如果第一个是终结符就停止并加入FIRST集合中
例如E→TE’,没有终结符,则按顺序从左侧开始,进入T→×FT’| ε,×,ε是终结符,处在第一个位置,所以加入到FIRST(E)集合中
同理得:
FOLLOW
FOLLOW集就需要借助冗长的文字来看了,有三个条件
什么意思呢?来看,如果我们要求FOLLOW(E),就要找到一个A→αBβ的形式(注意α有时可能为空,β有时可能没有,而且条件2,3可同时满足)
我们发现只有F → (E)|i存在这种形式,其中F可看作A,E可看作B,(可看作α,)可看作β,属于是A→β的形式,符合条件2,可以把FIRST(β)即FIRST())即)加入到FOLLOW(E)中,同时E为开始符号,需要加入#
所以FOLLOW(E)={),#}
还例如求FOLLOW(F),由T → FT’ 和T’ → FT’|ε 可知:
T → FT’ 属于A→Bβ(α为空)的形式,且ε ∈FIRST(T’),所以同时满足条件2,3,因此要把FIRST(T’)和FOLLOW(T)加入到FOLLOW(F)中
和T’ → FT’|ε 属于A→αBβ的形式,且ε ∈FIRST(T’),也同时满足条件2,3,因此要把FIRST(T’)和FOLLOW(T’)加入到FOLLOW(F)中
最终FOLLOW(F)={*,+,),#}
最终推出以下结果:
LL(1)预测分析表