什么是无语语法?

时间:2011-07-15 21:17:55

标签: regex parsing grammar context-free-grammar

有人可以向我解释一下上下文无关语法是什么吗?在查看维基百科条目,然后查看关于正式语法的维基百科条目后,我完全被遗忘了。有人会如此善意地解释这些事情是什么吗?

我想知道这是因为我希望调查解析,以及正面的正则表达式引擎的限制。

我不确定这些术语是否与编程直接相关,或者它们是否与语言学有关。如果是这样的话,我道歉,如果是这样的话可能会被移动?

2 个答案:

答案 0 :(得分:101)

无上下文语法是一种满足某些属性的语法。在计算机科学中,语法描述语言;具体来说,他们描述了正式语言。

形式语言只是字符串的集合(对象集合的数学术语)(符号序列......非常类似于单词“string”的编程用法)。形式语言的一个简单示例是长度为3的所有二进制字符串的集合,{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”等规则。

答案 1 :(得分:20)

语言理论与计算理论有关。这是计算机科学中更具哲学性的一面,关于决定哪些程序是可能的,哪些程序是可能的,以及哪种类型的问题是不可能编写算法来解决的。

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

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

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

所有常规语言都是上下文自由语言,但有不常规的上下文自由语言。 Context Free Language是Context Free Grammer或Pushdown Automata接受的所有字符串的集合,它是一个有一个堆栈的有限状态机:http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

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

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

我的计算机科学入门三年级教科书非常擅长解释这些东西:计算理论导论。迈克尔西普尔。但是,购买新产品需要花费160美元,而且价格不是很高。也许你可以找到一个二手的副本,或者在图书馆找一份副本,或者它可以帮助你。

编辑:

在过去50年左右的时间里,正规表达式和高级语言课程的局限性已经被研究了很多。您可能对常规语言的泵浦引理感兴趣。这是一种证明某种语言不规律的方法:

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

如果一种语言不规则,它可能是Context Free,这意味着它可以由Context Free Grammer描述,或者它甚至可能在更高的语言类中,你可以通过泵浦引理证明它不是Context Free用于Context Free语言,类似于正则表达式。

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

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

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

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

使用包含更多b而不是a的字母a和b的所有字符串的语言不常规。

此外,你不应该认为所有有限语言都是常规语言,例如:

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