有人可以向我解释什么是上下文无关的语法吗?在查看了Wikipedia条目,然后查看了有关正式语法的Wikipedia条目之后,我完全被迷住了。有人会乐于解释这些东西吗?
我想知道这一点是因为我希望研究解析以及正则表达式引擎的局限性。
我不确定这些术语是否与编程直接相关,或者它们是否与语言学总体上更相关。抱歉,如果这样的话,也许可以动议吗?
有人可以向我解释什么是上下文无关的语法吗?在查看了Wikipedia条目,然后查看了有关正式语法的Wikipedia条目之后,我完全被迷住了。有人会乐于解释这些东西吗?
我想知道这一点是因为我希望研究解析以及正则表达式引擎的局限性。
我不确定这些术语是否与编程直接相关,或者它们是否与语言学总体上更相关。抱歉,如果这样的话,也许可以动议吗?
Answers:
上下文无关文法是满足某些属性的文法。在计算机科学中,语法描述语言。具体来说,它们描述形式语言。
形式语言只是一组字符串(符号序列...,非常类似于单词“ string”的编程用法)的集合(一组对象的数学术语)。形式语言的一个简单示例是长度为三的所有二进制字符串的集合:{000、001、010、011、100、101、110、111}。
语法通过定义您可以进行的转换来工作,以语法描述的语言构造字符串。语法将说明如何将起始符号(通常为S)转换为某些符号字符串。前面给出的语言的语法是:
S -> BBB
B -> 0
B -> 1
解释的方式是说S
可以被替换BBB
,B
可以被0替换,并且B
可以被1替换。因此我们可以构造字符串010 S -> BBB -> 0BB -> 01B -> 010
。
上下文无关的语法只是一种语法,其中您要替换的内容(箭头的左侧)是单个“非终结符”符号。非终结符是您在语法中使用的,不会出现在最终字符串中的任何符号。在上面的语法中,“ S”和“ B”是非终结符号,而“ 0”和“ 1”是“终结”符号。像
S -> AB
AB -> 1
A -> AA
B -> 0
不规则,因为它们包含诸如“ AB-> 1”之类的规则。
语言理论与计算理论有关。哪一个是计算机科学的哲学方面,即决定哪些程序是可能的,或者哪些程序将可能被编写,以及哪种类型的问题是不可能编写算法来解决的。
正则表达式是描述常规语言的一种方式。常规语言是可以由确定性有限自动机确定的语言。
您应该阅读有关有限状态机的文章: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 |。 ..)等,直到列出所有可能的组合。
Automata Theorem