跟随集算法的第三条规则的基本原理是什么?
What is the rationale for the third rule of the follow set algorithm?
对于编译器 class,我们看到了以下用于查找 FOLLOW(A) 的规则:
α
- 如果A是开始符号,在FOLLOW(A)中添加'$'
- 如果 A -> α B β,将 FIRST(β) - {ε} 添加到 FOLLOW(B)
- 如果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
对于编译器 class,我们看到了以下用于查找 FOLLOW(A) 的规则:
α
- 如果A是开始符号,在FOLLOW(A)中添加'$'
- 如果 A -> α B β,将 FIRST(β) - {ε} 添加到 FOLLOW(B)
- 如果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