在上下文无关语法中,我们是否在替换过程中替换所有变量?或者我们可以将替换规则仅应用于相同类型的变量吗?

In Context Free Grammer, do we replace all variable during a substitution? or can we apply substitution rule to only of the variable of same type?

假设我们有一个Context Free Grammer,CFG,如下:

S -> a ...(1)

S -> SS ...(2)

然后我推导出指定语言的字符串如下:

S ..开始状态

SS ..使用 (2)

aS ...使用 (1) <- 这是否有效,例如仅对 1 个变量而不是所有相同变量应用替换规则?

所以我的问题是,如果我要对“SS”应用规则 (1),我是否可以选择仅将 (1) 应用到“SS”的 1 个 S,还是我必须对两者都应用其中?

您可以仅将规则应用于一个 S,也可以根据需要对多个 S 应用。这是一个稍微复杂一点的例子,也许能更好地说明这个想法:

S -> a       (1)
S -> b       (2)
S -> SS      (3)

那么,这种语言中的字符串是什么?这是前几个带有推导的字符串:

a: S -> a
b: S -> b
aa: S -> SS -> aS -> aa
    S -> SS -> Sa -> aa
ab: S -> SS -> aS -> ab
    S -> SS -> Sb -> as
ba: S -> SS -> bS -> ba
    S -> SS -> Sa -> ba
bb: S -> SS -> bS -> bb
    S -> SS -> Sb -> bb
aaa: S -> SS -> aS -> aSS -> aaS -> aaa
     S -> SS -> aS -> aSS -> aSa -> aaa
     S -> SS -> Sa -> SSa -> aSa -> aaa
     S -> SS -> Sa -> SSa -> Saa -> aaa
aab
...

总之,我们发现语法生成了所有non-empty个a和b的字符串,包括那些a和b混合的字符串。如果我们必须用相同的规则替换所有 S,我们将得到一种小得多的语言,如果我们得到一种 (non-empty) 语言的话。