编译原理 | 求FIRST集和FOLLOW集的具体过程

FIRST集的构造:
计算所有文法符号X的FIRST(X),直到每个FIRST集合不再增大为止.
(1) 若X∈VT,那么FIRST(X)={X}.
(2) 若X→ε是产生式,那么把ε加入FIRST(X).
(3) 如果X是非终结符,且X→Y1Y2…Yk是产生式,若对某个i, a属于FIRST(Yi),并且ε属于所有的FIRST(Y1),FIRST(Y2), …,FIRST(Yi-1),即Y1Y2…Yi-1 ε,则把a加入FIRST(X).如果对所有的j=1,2,…,k, 有ε属于FIRST(Yj),那么把ε加入FIRST(X).

FOLLOW集的构造:
对所有的非终结符A计算FOLLOW(A).应用下面规则,直到每个FOLLOW集不再增大为止.
(1) 把#加入FOLLOW(S),其中S是开始符号,#是输入结束标记.
(2) 如果有产生式A→αBβ,那么除ε外,把FIRST(β)中的所有元素加入FOLLOW(B).
(3) 如果有产生式A→αB,或有产生式A→αBβ且 FIRST(β)含ε,那么,把FOLLOW(A)中的一切元素加入 FOLLOW(B).


栗子:

在这里插入图片描述

构造FIRST集:

FIRST(S) = {}
FIRST(M) = {}
FIRST(H) = {}
FIRST(L) = {}
FIRST(K) = {}

把所有在开头的终结符加入到对应的FIRST:

FIRST(S) = {a, }
FIRST(H) = {ε, }
FIRST(K) = {d, ε}√
FIRST(L) = {e}√
FIRST(M) = {b, }

ps:√表示已完成

要计算FIRST(S),就要先FIRST(M),而要计算FIRST(M),就要先计算FIRST(K)。

FIRST(K) = {d, ε},这里出现了ε,因为M->K,所以FIRST(M)={b, d, ε}。

因为M可以推出ε,所以要计算FIRST(S),就还要计算FIRST(H),要计算FIRST(H),就要先计算FIRST(L),FIRST(L) = {e},所以FIRST(H) = FIRST(H) = {ε, e}。

因为S->MH,MH都可以推出ε,所以FIRST(S) = {a, b,d,e,ε}。

FIRST(S) = {a, b,d,e,ε}√
FIRST(H) = {ε, e}√
FIRST(K) = {d, ε}√
FIRST(L) = {e}√
FIRST(M) = {b, d, ε}√

完成。


构造FOLLOW集:

FOLLOW(S) = {}
FOLLOW(H) = {}
FOLLOW(K) = {}
FOLLOW(L) = {}
FOLLOW(M) = {}
FOLLOW(S) = {#}
FOLLOW(H) = {}
FOLLOW(K) = {}
FOLLOW(L) = {}
FOLLOW(M) = {}

对于S -> MH中的M

(1)把FIRST(H)中除ε以外的加入到FOLLOW(M):
FOLLOW(M) = {e}
(2)因为H->ε,所以可以把FOLLOW(S)中的一切元素加入 FOLLOW(M),先做个记号:
FOLLOW(M) = {e,FOLLOW(S)}

对于S -> MH中的H:

把FOLLOW(S)中的一切元素加入 FOLLOW(H):
FOLLOW(H) = {FOLLOW(S)}

FOLLOW(S) = {#}
FOLLOW(H) = {FOLLOW(S)}
FOLLOW(K) = {}
FOLLOW(L) = {}
FOLLOW(M) = {e,FOLLOW(S)}

对于H->LSo中的L:
(1)把FIRST(S)中除ε以外的加入到FOLLOW(L):
FOLLOW(L) = {a, b,d,e}
(2)因为S–>ε,所以可以把FOLLOW(S)中的一切元素加入 FOLLOW(L):
FOLLOW(L) = {a, b,d,e,FOLLOW(S)}

对于H->LSo中的S:
FOLLOW(S) = {#,o}

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S)}
FOLLOW(K) = {}
FOLLOW(L) = {a, b,d,e,FOLLOW(S)}
FOLLOW(M) = {e,FOLLOW(S)}

对于K->dML中的M,把FIRST(L)中除ε以外的加入到FOLLOW(M):
FOLLOW(M) = {e,FOLLOW(S)}

对于K->dML中的L,把FOLLOW(K)中的一切元素加入 FOLLOW(L):
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K)}

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S)}
FOLLOW(K) = {}
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K)}
FOLLOW(M) = {e,FOLLOW(S)}

对于L->eHf中的H
FOLLOW(H) = {FOLLOW(S),f}

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S),f}
FOLLOW(K) = {}
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K)}
FOLLOW(M) = {e,FOLLOW(S)}

对于M->K中的K:
FOLLOW(K) = {FOLLOW(M)}

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S),f}
FOLLOW(K) = {FOLLOW(M)}
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K)}
FOLLOW(M) = {e,FOLLOW(S)}

对于M->bLM中的L:
(1)把FIRST(M)中除ε以外的加入到FOLLOW(L):
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K)}
(2)因为M–>ε,所以可以把FOLLOW(M)中的一切元素加入 FOLLOW(L):
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K),FOLLOW(M)}

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S),f}
FOLLOW(K) = {FOLLOW(M)}
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K),FOLLOW(M)}
FOLLOW(M) = {e,FOLLOW(S)}

补全FOLLOW,直到没变化:

FOLLOW(S) = {#,o}
FOLLOW(H) = {FOLLOW(S),f,#,o}
FOLLOW(K) = {FOLLOW(M),e,#,o}
FOLLOW(L) = {a, b,d,e,FOLLOW(S),FOLLOW(K),FOLLOW(M),#,o}
FOLLOW(M) = {e,FOLLOW(S),#,o}
FOLLOW(S) = {#,o}
FOLLOW(H) = {f,#,o}
FOLLOW(K) = {e,#,o}
FOLLOW(L) = {a, b,d,e,#,o}
FOLLOW(M) = {e,#,o}

完成。


结果

FIRST(S) = {a, b,d,e,ε}
FIRST(H) = {ε, e}
FIRST(K) = {d, ε}
FIRST(L) = {e}
FIRST(M) = {b, d, ε}

FOLLOW(S) = {#,o}
FOLLOW(H) = {f,#,o}
FOLLOW(K) = {e,#,o}
FOLLOW(L) = {a, b,d,e,#,o}
FOLLOW(M) = {e,#,o}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cat_xing/article/details/85887761