什么是上下文无关语法?


104

有人可以向我解释什么是上下文无关的语法吗?在查看了Wikipedia条目,然后查看了有关正式语法的Wikipedia条目之后,我完全被迷住了。有人会乐于解释这些东西吗?

我想知道这一点是因为我希望研究解析以及正则表达式引擎的局限性。

我不确定这些术语是否与编程直接相关,或者它们是否与语言学总体上更相关。抱歉,如果这样的话,也许可以动议吗?


2
它与Automata Theorem
Rahul

2
如果您对用于解析的形式语言和自动机理论感兴趣,建议您参阅Sudkamp的Languages and Machines或Aho,Sethi和Ullman的Compilers等书。每本书都对无上下文语法进行了形式化描述,这是一种形式语法,然后陈述并证明了理解无上下文语法所需的基本定理(例如无上下文语言的转换引理和转换以及正规定理)。除了对集合论的粗略了解外,学习形式语言理论没有数学上的先决条件。
danportin

1
这样的问题不应该移植到理论计算机科学吗?
浅蓝点2012年

Answers:


110

上下文无关文法是满足某些属性的文法。在计算机科学中,语法描述语言。具体来说,它们描述形式语言。

形式语言只是一组字符串(符号序列...,非常类似于单词“ string”的编程用法)的集合(一组对象的数学术语)。形式语言的一个简单示例是长度为三的所有二进制字符串的集合:{000、001、010、011、100、101、110、111}。

语法通过定义您可以进行的转换来工作,以语法描述的语言构造字符串。语法将说明如何将起始符号(通常为S)转换为某些符号字符串。前面给出的语言的语法是:

S -> BBB
B -> 0
B -> 1

解释的方式是说S可以被替换BBBB可以被0替换,并且B可以被1替换。因此我们可以构造字符串010 S -> BBB -> 0BB -> 01B -> 010

上下文无关的语法只是一种语法,其中您要替换的内容(箭头的左侧)是单个“非终结符”符号。非终结符是您在语法中使用的,不会出现在最终字符串中的任何符号。在上面的语法中,“ S”和“ B”是非终结符号,而“ 0”和“ 1”是“终结”符号。像

S -> AB
AB -> 1
A -> AA
B -> 0

不规则,因为它们包含诸如“ AB-> 1”之类的规则。


12
所谓“不定期”,是指“不是上下文无关”吗?(因为CFG可以代表的语言是正则表达式可以代表的语言的超集)
Anti Earth

3
应将“ S替换为B”改为“ S替换为BBB”?
Cosmo Harrigan 2014年

4
上帝,这是我在SO上看到的最能解释的答案之一。
拉斐尔·迪亚斯·达席尔瓦

1
@AntiEarth第二个示例不是常规语法,因为它具有从单个非终止符号生成两个非终止符号的规则,这在常规语法中是不允许的(此外,正如OP所指出的,它具有包含多个非终止符号的规则左边)。en.wikipedia.org/wiki/Regular_grammar
awwsmm

21

语言理论与计算理论有关。哪一个是计算机科学的哲学方面,即决定哪些程序是可能的,或者哪些程序将可能被编写,以及哪种类型的问题是不可能编写算法来解决的。

正则表达式是描述常规语言的一种方式。常规语言是可以由确定性有限自动机确定的语言。

您应该阅读有关有限状态机的文章:http : //en.wikipedia.org/wiki/Finite_state_machine

和常规语言:http : //en.wikipedia.org/wiki/Regular_language

所有常规语言都是上下文无关语言,但是有些上下文无关语言也不是常规语言。上下文无关的语言是上下文无关的Grammer或下推自动机接受的所有字符串的集合,后者是具有单个堆栈的有限状态机:http : //en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

有更复杂的语言需要图灵机(您可以在计算机上编写的任何可能的程序)来确定字符串是否为该语言。

语言理论也与P vs. NP问题以及其他一些有趣的东西非常相关。

我的《计算机科学概论》三年级教科书很好地解释了这些内容:《计算理论概论》。迈克尔·西普瑟(Michael Sipser)。但是,我花了160美元买了新的它,而且它不是很大。也许您可以找到使用过的副本,或者在图书馆中找到副本,或者可能会有所帮助。

编辑:

在过去的50多年中,对正则表达式和高级语言类的局限性进行了大量研究。您可能对常规语言的抽奖引理感兴趣。这是一种证明某种语言不规则的方法:

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

如果一种语言不是常规语言,则可能是上下文无关的,这意味着可以用上下文无关的语法来描述它,甚至可能是在更高语言的类中,您也可以通过上下文无关的抽签来证明它不是上下文无关的与正则表达式类似的语言。

语言甚至是无法决定的,这意味着甚至图灵机(可能会运行您的计算机的程序)也无法通过编程来决定是否应该接受或拒绝使用该语言的字符串。

我认为您最感兴趣的部分是有限状态机(确定性和确定性),以查看正则表达式可以决定哪些语言,以及抽动引理来证明哪些语言不是正则。

基本上,如果某种语言需要某种形式的记忆或计数能力,那么它就是不规则的。匹配括号的语言是不规则的,例如因为机器需要记住它是否已经打开了一个括号才能知道它是否必须关闭。

使用包含至少三个b的字母a和b的所有字符串的语言是常规语言:ba ba ba

所有使用字母a和b且包含比a多的b的字母的语言不是正常的。

另外,您不应该所有有限的语言都是正规的,例如:

使用少于a的b的字母a和b来构成少于50个字符的所有字符串的语言是常规的,因为它是有限的,我们知道它可以描述为(b | abb | bab | bba | aabbb | ababb |。 ..)等,直到列出所有可能的组合。


1
正则表达式不是将字符串与模式匹配的决策程序。它们是表示正则集的表达式,对于该正则集,可以确定成员资格问题。
danportin

1
如果一组是常规的,显然是可以决定的。我不知道该怎么说。它们实际上是没有内存的决策程序。
保罗

您正在描述确定性有限自动机,它为常规语言(“没有内存的决策程序”)提供了决策过程。正则表达式而言正规语言,而不是程序的程序。这是我唯一的抱怨。
danportin

1
我将其更改为“正则表达式是描述常规语言的一种方式。常规语言是可以由确定性有限自动机确定的语言。” 听起来更好吗?
保罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.