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(α)中。

编译原理 求解first集和follow集步骤(附例子)

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')={#,)}

此轮没有新变化,迭代计算过程结束。

 

相关文章: