如何确定某种语言是否不受上下文限制?

时间:2010-08-18 08:10:49

标签: computer-science context-free-grammar

如何知道语言是否无上下文?

3 个答案:

答案 0 :(得分:26)

首先,您应该尝试构建一个构成主题语言的context-free grammar。如果所有产品的左侧都包含一个非终端符号,则语法是无上下文的。根据定义,如果存在,那么语言是无上下文的。

等效构造将是pushdown automaton。它与DFA相同,但可以使用堆栈。它可能比语法更容易构建。

但是,如果您未能构建语法或自动机,则并不意味着语言不是无上下文的;或许,只是你无法构建一个足够苛刻的语法(例如,我花了大约7个小时为一种棘手的语言建立语法)。

如果您开始怀疑该语言是否无上下文,您应该使用所谓的"pumping lemma for context-free languages"。它描述了所有无上下文语言的属性,如果您的语言违反了它,那么它肯定不是无上下文的(请参阅维基百科的usage notes)。

这个引理是Ogden's lemma的必然结果。所以Ogden的功能更强大,如果你没有应用泵浦引理,你可以尝试Ogden(它的使用方式相同)。

答案 1 :(得分:2)

修改

正如评论中所建议的那样,证明一种语言不是CFG,我相信是通过使用一个ogdens的引理。我之前的回答中包含的固有误解是可以原谅:)保留潜伏者的早期答案。

旧答案

通过查看使用的语法和规则!从图像中可以看出(礼貌的维基百科chomsky层次结构)。只有常规语言不具有上下文。暗示任何使用A-> aB或A-> Ba形式的东西都不具有上下文。

alt text

修改 A-> aB和A-> Ba定义用于表示左和右递归语法,不能按字面意思理解。

答案 2 :(得分:1)

您需要语言语法来确定它是否无上下文。如果语法的所有产品都形成“(非终端) - >终端和非终端序列”,则语法是无上下文的。