跟随集算法的第三条规则的基本原理是什么?

What is the rationale for the third rule of the follow set algorithm?

对于编译器 class,我们看到了以下用于查找 FOLLOW(A) 的规则:

α

  1. 如果A是开始符号,在FOLLOW(A)中添加'$'
  2. 如果 A -> α B β,将 FIRST(β) - {ε} 添加到 FOLLOW(B)
  3. 如果A -> α B, or ( A -> α B β and β *-> ), FOLLOW(A) 添加到FOLLOW(B).

我们还得到了 Follow(A) 的非正式定义: 可以在句子形式中紧跟在 A 之后的终结符集合。

为什么第三条规则成立?

我了解如何应用第三条规则,但我对为什么必须如此感到困惑。任何人都可以提供一个需要使用它的具体示例,或者一个在没有第三条规则的情况下无法通过非正式定义的示例吗?

假设您有一个生产规则

A → αBβ

你知道β可以导出空字符串。在这种情况下,如果您使用上述生产规则然后将 β 扩展为空字符串,那么可以合法跟随 A 非终结符的字符也可以跟随 B 非终结符。

举个例子,让我们看一下这个简单的语法:

S → Ax

A → CBC

C → ε

B → y

在这里,我们可以做这个推导,在 B 之后加上一个 x:

S → Ax → CBCx → CBx