在我的一个cs类中,他们提到无上下文语法和上下文敏感语法之间的区别在于CSG,然后 生产环境 规则的左侧必须小于或等于右侧 .
因此,他们给出的一个例子是,上下文敏感的语法不能有空字符串,因为这样就不会满足第一个规则 .
但是,我已经理解常规语法包含在无上下文中,无上下文包含在上下文敏感中,并且上下文相关包含在递归可枚举语法中 .
因此,例如,如果语法是递归可枚举的,那么也是类型上下文敏感,无上下文和常规的类型 .
问题是,如果发生这种情况,那么如果我有一个包含空字符串的无上下文语法,那么它就不能满足规则被视为上下文敏感,但是会发生矛盾,因为每个上下文敏感没有上下文 .
1 回答
空制作("lambda productions",所谓的因为λ通常用于指代空字符串)可以从任何无上下文语法中机械地消除,除了可能的顶级制作
S → λ
. 这样做的算法很好地呈现在形式语言理论的每一个文本中 .因此对于任何具有lambda产品的CFG,都有一个等效的CFG,没有lambda产生,它生成相同的语言,并且也是一个上下文敏感的语法 . 因此,禁止在CSG中签订 Contract 规则不会影响语言的层次结构:任何无上下文的语言都是一种上下文敏感的语言 .
乔姆斯基对上下文敏感语法的原始定义没有指定非 Contract 属性,而是更具限制性的属性:每个 生产环境 必须是
αAβ→αγβ
形式,其中A
是单个符号而γ
不是空的 . 这组语法生成与非签约语法相同的语言集(Chomsky也证明了这一点),但它不是同一组 . 此外,他的无上下文语法确实是上下文敏感语法的一个子集,因为根据他对CFG的原始定义,lambda产品被禁止 . (1959年的论文可在线获取;有关参考链接,请参阅Wikipedia article on the Chomsky hierarchy . )正是存在一个非空的上下文 -
α
和β
- 这导致名称"context-sensitive"和"context-free";对于诸如AB→BA
之类的任意非约束规则而言"context-sensitive"可能意味着什么并不太明确 . (注1)简而言之,鉴于您的问题中引用的CFG和CSG的常见现代用法,"every CFG is a CSG"在技术上并不正确 . 但这只是一个技术性问题:带有lambda产品的CFG可以进行机械转换,就像非 Contract 语法可以机械地转换成符合Chomsky对上下文敏感的定义的语法(参见Wikipedia article on non-contracting grammars) .
(通过向规则
S→λ
添加CFG和CSG定义的例外,允许上下文敏感语言和无上下文语言都包含空字符串也很常见 . )注意事项
AB → BA
的结果描述为解析树并不是很明显,尽管在例如a A b → B
的情况下非常清楚 .