我想为以下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')}
答案 0 :(得分:1)
实际上只有 FOLLOW(S) = {$}
。
所以,我忽略了右边提到的S
侧。更正如下:
首先,我们通过添加生产S' ->S$
来获得增强语法
FOLLOW(S') = {$}
。
然后我们
S' -> S$
和O' -> S
的
跟随(S)=第一($)+跟随(O')
M -> iEtMeM
,O' -> MeO
和S -> M
的
跟随(M)=第一(eM)+第一(eO)+跟随(S)
S -> O
和O' -> MeO
的
跟随(O)=跟随(S)+跟随(O')
O -> iEtO'
的
跟随(O')=跟随(O)
M -> iEtMeM
和O -> iEtO'
的
跟随(E)=第一(tMeM)+第一(tO')
“问题”是相互递归的定义
FOLLOW(S)
,FOLLOW(O)
和`FOLLOW(O') - 表示每个
这些跟随集合是其他集合的子集,因此它们是
相等。
如果一个代表集合包含约束,由...强加 以上方程式,作为图形(非终端符号作为节点), 每组相互递归的定义形成一个 强连接组件。用新的替换每个SCC 节点将生成一个DAG,表示一组 非递归方程,然后可以通过“评估” 拓扑秩序。
说,我们用节点S
替换符号O
,O'
和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
代表S
,O
或O'
,我们得到:
FOLLOW(S`) = FOLLOW(S) = FOLLOW(O) = FOLLOW(O`) = {$}
FOLLOW(M) = {e, $}
FOLLOW(E) = {t}