FIRST集和FOLLOW集的求法

FIRST集和FOLLOW集的求法

  • FIRST集
    • 步骤
  • FOLLOW集
    • 步骤

FIRST集

步骤

  1. 若X->a…,则将终结符a加入FIRST(X)中;
  2. 若X->e ,则将终结符e加入FIRST(X)中(e表示空集);
  3. 若 X->BC…D,则将First(B)所有元素(除了空集)加入First(A),然后检测First(B),若First(B)中不存在空集, 则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空集)加入First(A),然后再检测First(C)中是否有空集…直到最后,若D之前的所有非终结符的First集中都含有空集,则检测到D时,将First(D)也加入First(A),若First(D)中含有空集,则将空集加入First(A)。

例子:A->aB | CD

这里面包含了组成First(A)的两种情况:

  1. 以终结符开头, 当然要把这个终结符放到A的First里
  2. 以非终结符开头, 先把C的First放到A的First里。再看如果C的First中有空的话就把D的First放到A的First里,如果D也有空的话往后依次类推

技巧:First一般从下往上找。
如果要找A的First,我们要找A的定义式,即A在左边的式子,看着他的右边来找。

FOLLOW集

步骤

  1. 对文法开始符号S,置$于FOLLOW(S)中;
  2. 对于产生式:A->aBC,将除去空集e的First(C)加入Follow(B)中;
  3. 对于产生式:A->aB或者A->aBC,(其中C可以推导出空串,C=>*e),则将Follow(A)加入Follow(B)中。
  4. 开始符号的Follow中要加上‘#’

你可能感兴趣的:(编译原理)