如何找到 FIRST 和 FOLLOW

How to find FIRST and FOLLOW

我想为以下 CFG 找到 FIRST 和 FOLLOW:

S -> O | M
M -> iEtMeM | a
O -> iEtS | iEtMeO
E -> b

我做了左分解,所以我得到:

S -> O | M
M -> iEtMeM | a
O -> iEtO'
O'-> S | MeO
E -> b

第一组:

FIRST(S) = FIRST(O)|FIRST(M) = {i,a}
FIRST(M) = {i,a}
FIRST(O) = {i}
FIRST(O') = FIRST(S)|FIRST(M) = {i,a}
FIRST(E) = {b}

现在我找不到 S 的 FOLLOW 集,因为我不知道 FOLLOW(O') 是什么:

FOLLOW(S) = {$, FOLLOW(O')}

其实只有FOLLOW(S) = {$}

所以,我忽略了右边提到的 S 边。以下更正:

首先我们通过添加产生式S' ->S$得到扩充文法,然后 FOLLOW(S') = {$}.

然后我们有

  • 来自 S' -> S$O' -> S

    关注(S)=第一($)+关注(O')

  • 来自 M -> iEtMeMO' -> MeOS -> M

    跟随(M)=第一个(eM)+第一个(eO)+跟随(S)

  • 来自 S -> OO' -> MeO

    关注(O) = 关注(S) + 关注(O')

  • 来自 O -> iEtO'

    关注(O') = 关注(O)

  • 来自 M -> iEtMeMO -> iEtO'

    跟随(E)=第一个(tMeM)+第一个(tO')

"problem"是对的相互递归定义 FOLLOW(S)FOLLOW(O) 和 `FOLLOW(O') - 这意味着每个 这些跟随集的一部分是其他集的子集,因此它们是 等于。

如果一个代表一组包含约束,由 以上等式,作为图形(以非终端符号作为节点), 每组相互递归的定义形成一个 强连接组件。用新的替换每个 SCC 节点将产生一个DAG,代表一组 非递归方程,然后可以通过 "evaluated" in 拓扑顺序。

比如说,我们用节点 N 替换对应于符号 SOO' 的节点。等式变为:

FOLLOW(N) = FIRST($) + FOLLOW(N)
FOLLOW(M) = FIRST(eM) + FIRST(eO) + FOLLOW(N)
FOLLOW(N) = FOLLOW(N) + FOLLOW(N)
FOLLOW(N) = FOLLOW(N)
FOLLOW(E) = FIRST(tMeM) + FIRST(tO')

并通过剪掉多余的部分:

FOLLOW(N) = FIRST($) = {$}
FOLLOW(M) = FIRST(eM) + FIRST(eO) + FOLLOW(N) = {e, $}
FOLLOW(E) = FIRST(tMeM) + FIRST(tO') = {t}

并且,由于 N 代表 SOO',我们得到:

FOLLOW(S`) = FOLLOW(S) = FOLLOW(O) = FOLLOW(O`) = {$}
FOLLOW(M) = {e, $}
FOLLOW(E) = {t}