我尝试用不同的关卡来解读Chomsky层次结构。
我检查了一些例子,这是一个我不太懂的例子。也许有人知道为什么这个不是上下文敏感的语言:
S → aA
A → aA | ε
B → bA
答案 0 :(得分:0)
您提供的语法G
毫无疑问是无上下文的(每个规则在LHS中有一个非终端,在RHS中有一串终端和非终端)。因此,它生成的语言L
是无上下文的。因此,由于无上下文语言的类别是上下文相关语言的适当子集,语言L
是上下文敏感的。 (我不知道你在哪里读到这种语言L
不是上下文敏感的。要么你误读了这个,要么你读的是完全错误的。)
我会猜测这种混乱的原因。我们假设您声称语法 G
(不是语言 L
)不是上下文相关的。现在,也许奇怪的是,如果一种语言是上下文敏感的,这并不意味着生成这种语言的所有语法都是上下文敏感的(对于其他类别也是如此,当然除了不受限制之外)一)。如果语言是上下文敏感的,这意味着有生成它的上下文敏感语法。因此,即使L
对上下文敏感,这并不一定意味着G
也是上下文敏感的。
如果G
(无上下文语法)不是上下文敏感的话会很奇怪。这是否真实取决于您对上下文敏感语法的确切定义。正如您可以阅读的那样,例如,在related Wikipedia article中,对于上下文相关语法至少有两个备选定义:
根据定义1,语法G
是上下文敏感的(上下文字符串α和β通常是空的)。但是,根据定义2,语法G
不是,因为非终端A的空生产规则不是起始符号。
然而,可以提供等效语法G'
,其根据两个定义对上下文敏感并产生相同的语言L
。一种这样的语法可以构造如下:
A产生零或多个“a”的字符串。我们可以通过以下方式替换它的定义:
A → A' | ε
A' → a | aA'
其中A'产生一个或多个“a”的字符串。请注意,A的规则不是递归的。我们可以在S和B的规则中替换A的产生,然后消除非终端A.这给了我们:
S → aA' | a
A' → a | aA'
B → bA' | b
根据上述两种定义,这种语法(通过注意A'和S产生相同的语言可以进一步简化)是上下文敏感的。