如何在FOLLOW集中删除循环依赖

Zab*_*abi 5 compiler-theory context-free-grammar

考虑一下简短的语法

S -> Bc | DB
B -> ab | cS
D -> d | epsilon
Run Code Online (Sandbox Code Playgroud)

第一组是

FIRST(S) ={a,c,d}
FIRST(B) = { a,c }
FIRST(D)= { d, epsilon }
Run Code Online (Sandbox Code Playgroud)

在它里面

Follow(S)={ Follow(B) }
Run Code Online (Sandbox Code Playgroud)

Follow(B) ={ c , Follow(S) }
Run Code Online (Sandbox Code Playgroud)

我的问题是如何解决这个循环依赖?

Era*_*man 4

这种循环依赖一开始就不应该存在。这是查找“follow”的算法:

\n\n

将所有跟随组初始化为 {},但 S 除外,它初始化为 {$}。
\n虽然有变化,但对于每个 A\xe2\x88\x88V 执行:
\n 对于每个 Y \xe2\x86\x92 \xce\xb1A\xce\xb2 执行:
\n follow(A) = follow(A) \ xe2\x88\xaa first(\xce\xb2)
\n 如果 \xce\xb2 \xe2\x87\x92* \xce\xb5,也执行: follow(A) = follow(A) \xe2\x88\xaa follow (是)

\n\n

因此,在您的情况下,您应该得到:
\nFollow(S)={c,$}
\nFollow(B)={c,$}
\nFollow(D)={a,c}

\n

  • 我想我现在明白了。当算法说您应该与 follow(Y) 联合时,它仅表示当前的 follow(Y),正如您到目前为止所计算的那样。另外,由于整个算法说“当有变化时”,那么如果这样的 follow(Y) 组发生变化,它最终会反映在 follow(A) 中。正如您在本例中所看到的,follow(B) 确实包含 follow(S)(它们实际上是相等的 - 都是“{c,$}”)。 (2认同)