如何找到FIRST和FOLLOW

时间:2016-12-04 17:25:32

标签: compiler-construction context-free-grammar

我想为以下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集:

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')}

1 个答案:

答案 0 :(得分:1)

实际上只有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')

“问题”是相互递归的定义 FOLLOW(S)FOLLOW(O)和`FOLLOW(O') - 表示每个 这些跟随集合是其他集合的子集,因此它们是 相等。

如果一个代表集合包含约束,由...强加 以上方程式,作为图形(非终端符号作为节点), 每组相互递归的定义形成一个 强连接组件。用新的替换每个SCC 节点将生成一个DAG,表示一组 非递归方程,然后可以通过“评估” 拓扑秩序。

说,我们用节点S替换符号OO'N的节点。方程变为:

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}