First集
定义:对于任意文法符号串α ,FIRST(α)是可从α推导得到的串的首符号的集合
如果αε,则ε也在FIRST(α)中( 即α可空)
FIRST(α)={t|α-->tβ, t∈T}U{ε|α-->ε}
做法:首先明确FIRST集合是对推导符号后面的首符号(仅仅只是一个符号)进行判断的
步骤:
假设 α-->tβ,求FIRST(α)
① 如果首符号t是终结符则直接放入first集合中
②如果t不是非终结符:
i.如果t—>ε,则将ε加入FIRST(α),并且将β进行①②操作判断。
ii.如果t不是ε,那么求first(t),并将first(t)的结果放入FIRST(α)中。
Follow集
假设A àαBβ,A àαB,求follow(B)
做法:寻找B在à右边出现的规则式,然后按照以下步骤进行操作
步骤:
①如果A是开始符, 将$加入FOLLOW(A), 这里$是输入结束标记.
②对于A àαBβ,首先判断β是不是可以推出ε
i.如果不能推出ε,那么将first(β)加入follow(B)
ii.如果推出ε,那么将{first(β)- ε}Ufollow(A)
③对于A àαB,将follow(A)结果加入follow(B)。
注意:Follow一般从上往下找,而且第一轮的时候有时候不能够将所有的follow都填满,所以要采用迭代的方式不断循环。
有时候遇到闭环的时候,先假设按照第一遍 把所有的都算出来后,第二轮的时候将所有集合制空,如果有变化,则在进行一轮,直到没有变化为止。
例如:
先列出计算两个集合的式子:
FOLLOW(E)={#} U {)} U FOLLOW(E')
FOLLOW(E')=FOLLOW(E)
然后迭代执行这两个式子:
首先假设两个集合都是空
第一轮:
计算FOLLOW(E)={#,)}
此时FOLLOW(E)已经非空了,
接下来算出FOLLOW(E')={#,)}
此轮FOLLOW集有变化,再进行下一轮:
第二轮:
计算FOLOW(E)={#,)}
FOLLOW(E')={#,)}
此轮没有新变化,迭代计算过程结束。