句法模式识别(二)-正规文法、上下文无关文法
2014-05-17 23:52
260 查看
正规文法的特性
1.所有长度有限的语言都是正规的。
2.用正规文法当然能产生无限长串,其中周期重复部分的长度不大于非终止符的长度。
举个例子
![](http://latex.codecogs.com/gif.latex?S%5Cto%20aA,A%20%5Cto%20bS,A%20%5Cto%20c)
在此规则之下,能生成句子
![](http://latex.codecogs.com/gif.latex?%5Cleft%5C%7B%7Ba%7B%7B%5Cleft(%20%7Bba%7D%20%5Cright)%7D%5En%7Dc%7Cn%20%5Cge%200%7D%20%5Cright%5C%7D)
其中周期重复部分为ab,这个例子的非终止符的元素个数为2,故满足2不大于2.
自嵌入特性
我们把上下文无关文法中的正规文法去掉,剩下的那部分我们叫做真正的上下文无关文法。
自嵌入特性是区分真正的上下文无关文法与正规文法的判定标准。
即一个真正的上下文无关文法一定具有自嵌入特性,正规文法具有非自嵌入特性。亦即非自嵌入的上下文无关文法是正规文法,上下文无关文法就蜕化了。
什么是自嵌入特性?
自嵌入顾名思义,就是能够自己嵌入自己:
![](http://latex.codecogs.com/gif.latex?A%5Cmathop%20%20%5CRightarrow%20%5Climits_G%5E*%20vAx)
当然必须保证v和x不能是空串。
uvwxy定理
这是一个用以判定上下文无关文法和正规文法的条件。
就是说,当这个文法满足自嵌入条件,表示出来就是
![](http://latex.codecogs.com/gif.latex?S%5Cmathop%20%20%5CRightarrow%20%5Climits_G%5E*%20uAy,A%5Cmathop%20%20%5CRightarrow%20%5Climits_G%5E*%20vAx,A%5Cmathop%20%20%5CRightarrow%20%5Climits_G%5E*%20w)
那么,可以得到
![](http://latex.codecogs.com/gif.latex?L%5Cleft(G%20%5Cright)%20=%20%5Cleft%5C%7B%20%7Bu%7Bv%5Ei%7Dw%7Bx%5Ei%7Dy%7Ci%20%5Cge%200%7D%20%5Cright%5C%7D)
其中当v和x的重复次数相同且为非空串时,则这个文法肯定就是真正的上下文无关文法。因为这种周期形式是正规文法所不具有的。比如这种
![](http://latex.codecogs.com/gif.latex?c%7Ba%5Ei%7Dd%7Bb%5Ei%7D)
就是必须要用真正的上下文无关文法。
下面介绍上下文无关文法的等价文法。
不同的上下文无关文法,它们生成的语言有可能是等价的,这样就涉及到一个最优文法的问题。那么最优是什么?最有就是高效、没有冗余和浪费。
粗略说有2种冗余,而且只有非终止符能够冗余。终止符总是有用的啦。
其一是浪费环节。
浪费环节是说由单个非终止符传递到了单个的非终止符,比如
![](http://latex.codecogs.com/gif.latex?A%5Cto%20B,B%20%5Cto%20C)
这种形式意味着B是多此一举的,还不如直接A到C呢。
其二是无用环节。
细分又有2类。通俗说
1.无尾的无用非终止符
所谓无尾,就是咱用了这个终止符,话根本都没法结束。有头无尾。
A根本没法最后变成常量(终止符)。
不存在x使得
![](http://latex.codecogs.com/gif.latex?A%5Cmathop%20%5CRightarrow%20%5Climits_G%5E*%20x)
2.无头的无用非终止符
所谓无头,就是这句话根本就不可能从这个非终止符开始。有尾无头。
从起始符开始根本找不到含有A的句子。
从起始符S开始,不存在
![](http://latex.codecogs.com/gif.latex?S%5Cmathop%20%20%5CRightarrow%20%5Climits_G%5E*%20%5Calpha%20A%5Cbeta)
首先介绍如何消去浪费环节。
消去浪费环节包括2个部分。
其一消去。
其二修正。
消去过程
这个过程用递归算法来实现。
就是要求出所有非终止符各自对应能到达的所有非终止符集合。
举个例子就好了
![](http://latex.codecogs.com/gif.latex?%7BG_1%7D=%20%5Cleft(%20%7B%5Cleft%5C%7B%20%7BS,A,B%7D%20%5Cright%5C%7D,%5Cleft%5C%7B%20%7Ba,b%7D%20%5Cright%5C%7D,P,S%7D%20%5Cright))
现在消去浪费环节,先考虑S,
发现S能在一步之内的非终止符只有A
记
![](http://latex.codecogs.com/gif.latex?%7BK_1%7D(S)=%20%5Cleft%5C%7B%20S%20%5Cright%5C%7D%20%5Ccup%20%5Cleft%5C%7B%20A%20%5Cright%5C%7D%20=%20%5Cleft%5C%7B%20%7BS,A%7D%20%5Cright%5C%7D)
在K1(S)集合中再次出发,在一步之内能走到的新非终止符只有B
记
![](http://latex.codecogs.com/gif.latex?%7BK_2%7D(S)=%20%5Cleft%5C%7B%20%7BS,A%7D%20%5Cright%5C%7D%20%5Ccup%20%5Cleft%5C%7B%20B%20%5Cright%5C%7D%20=%20%5Cleft%5C%7B%20%7BS,A,B%7D%20%5Cright%5C%7D)
再往后没有新的非终止符了。
同理考察A,A在一步之内能到达的非终止符只有B了,记
![](http://latex.codecogs.com/gif.latex?%7BK_1%7D(A)%20=%5Cleft%5C%7B%20A%20%5Cright%5C%7D%20%5Ccup%20%5Cleft%5C%7B%20B%20%5Cright%5C%7D%20=%20%5Cleft%5C%7B%20%7BA,B%7D%20%5Cright%5C%7D)
再考察B,B根本就没有能在一步之内能到达的新终止符。
于是这对应的3个集合就求完了
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7DK%5Cleft(S%20%5Cright)%20=%20%5Cleft%5C%7B%20%7BS,A,B%7D%20%5Cright%5C%7D%5C%5CK%5Cleft(A%20%5Cright)%20=%20%5Cleft%5C%7B%20%7BA,B%7D%20%5Cright%5C%7D%5C%5CK%5Cleft(B%20%5Cright)%20=%20%5Cleft%5C%7B%20B%20%5Cright%5C%7D%5Cend%7Barray%7D)
修正过程
修正过程就按照上面的消去过程打补丁就好了,因为要消去一堆连接,旧桥拆了总得重新修吧。还是上面那个例子,先把之前的生成关系画出来,如图1黑线所示。
![](https://img-blog.csdn.net/20140517234450937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWNoZW5nX3NqdHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图1
现在考虑A,根据集合,我们要去掉A到B的连接
那么就得补上S到b、A到b、S到aS、A到aS,黄线代表。
然后再考虑S,要去掉S到A
那么就得补上S到BAb,绿线代表。
注意:现在虽然看起来文法规则比以前更麻烦了,但是,实际生成句子的过程却变得简单了许多,所以简化没简化还是要看疗效。
下面介绍消去无用的终止符
消去无用终止符的思路就是,找出所有有用的非终止符,那么剩下的自然就是没有用的了。
消去无尾非终止符
找出所有的有尾非终止符集合,定义为J(G)
方法是
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7D%7BJ_0%7D(G)=%20%5Cphi%20%5C%5C%7BJ_%7Bi+%201%7D%7D(G)%20=%20%7BJ_i%7D%5Cleft(%20G%20%5Cright)%20%5Ccup%20%5Cleft%5C%7B%20%7BA%7CA%20%5Cin%20%7BV_N%7D,A%20%5Cto%20%5Calpha,%5Calpha%20%20%5Cin%20%7B%7B%5Cleft(%20%7B%7BV_T%7D%20%5Ccup%7BJ_%7B%5Crm%7Bi%7D%7D%7D%5Cleft(%20G%20%5Cright)%7D%20%5Cright)%7D%5E*%7D%7D%20%5Cright%5C%7D%5Cend%7Barray%7D)
这个表达式很清晰,还是举个例子,反而绕口,但还是举吧
![](http://latex.codecogs.com/gif.latex?%7BG_1%7D=%20%5Cleft(%20%7B%5Cleft%5C%7B%20%7BS,A,B%7D%20%5Cright%5C%7D,%5Cleft%5C%7B%20%7Ba,b%7D%20%5Cright%5C%7D,P,S%7D%20%5Cright))
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7DP:S%5Cto%20aBA%5C%5CS%5Cto%20bA%5C%5CA%5Cto%20aA%5C%5CA%5Cto%20b%5C%5CB%5Cto%20aAB%5Cend%7Barray%7D)
这个表达式其实是一步步找到那些最终的到达终止符的非终止符。
首先J0(G)为空集。则J1(G)为所有能一步走到以终止符为尾的非终止符,即A
继续,J2(G)是J1(G)并上所有能在一步之内到以J1(G)或者其他终止符为尾的非终止符。
好绕口。。。其实就是{S,A}
再往下就找不到了。不过现在忽然发现,B呢?怎么没看到B的影子。
这就说明B就是无尾的无用非终止符。
去掉所有跟B有过关系的生成关系就好,现在是新的生成关系
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7B*%7B20%7D%7Bl%7D%7D%7BS%20%5Cto%20bA%7D%5C%5C%7BA%20%5Cto%20aA%7D%5C%5C%7BA%20%5Cto%20b%7D%5Cend%7Barray%7D)
再说说消去无头非终止符
也是只要找出所有有头的非终止符就好,剩下自然就无头了
用表达式表示是这样的
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7D%7BR_0%7D(S)=%20%5Cleft%5C%7B%20S%20%5Cright%5C%7D%5C%5C%7BR_%7Bi+%201%7D%7D(S)%20=%20%7BR_i%7D(S)%20%5Ccup%20%5Cleft%5C%7B%20%7BA%7CB%20%5Cto%20%5Csigma%20A%5Cgamma%20,B%20%5Cin%20%7BR_i%7D(S)%7D%5Cright%5C%7D%5Cend%7Barray%7D)
这个表达式的意义其实就是从起始符,回溯一步步展开,希望能找到句子的头部。
还是举个例子
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7D%7BG_2%7D=%20%5Cleft(%20%7B%5Cleft%5C%7B%20%7BS,A,B,C%7D%20%5Cright%5C%7D,%5Cleft%5C%7B%20%7Ba,b%7D%20%5Cright%5C%7D,P,S%7D%20%5Cright)%5C%5CP:S%5Cto%20aAA%5C%5CA%5Cto%20aAb%5C%5CA%5Cto%20aCA%5C%5CB%5Cto%20b%5C%5CB%5Cto%20Aa%5C%5CC%5Cto%20b%5C%5CA%5Cto%20b%5Cend%7Barray%7D)
展开起始符S,发现S能到aAA,因此R1(S)={S,A}
A继续展开,发现A能到aCA,因此R2(S)={S,A,C}
搞定,又发现原来B是无头的非终止符,赶紧删掉与它有关系的所有表达关系就好了,不再赘述。
上下文无关文法的2中标准型
1.C(Chomsky)标准型
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7DA%5Cto%20a%5C%5CA%5Cto%20BC%5Cend%7Barray%7D)
举一个例子立即就知道怎么把随便一个上下文无关文本变成C标准型了:
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7B*%7B20%7D%7Bl%7D%7D%7BA%20%5Cto%20BCd%7D&*&*%5C%5C%7B%20%5CRightarrow%20A%20%5Cto%20BCD%7D&%7BD%20%5Cto%20d%7D&*%5C%5C%7B%20%5CRightarrow%20A%20%5Cto%20BE%7D&%7BE%20%5Cto%20CD%7D&%7BD%20%5Cto%20d%7D%5Cend%7Barray%7D)
2.G(Greibach)标准型
![](http://latex.codecogs.com/gif.latex?%5Cbegin%7Barray%7D%7Bl%7DA%5Cto%20a%5Calpha%20%5Cleft(%20%7B%5Calpha%20%20%5Cin%20V_N%5E*%7D%5Cright)%5C%5CA%5Cto%20a%5Cend%7Barray%7D)
这个严格的转化方法有点畸形,就暂时不展开了。简单情况用凑的就好了。
欢迎参与讨论并关注本博客和微博以及知乎个人主页,后续内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及本文链接,谢谢您的支持!
1.所有长度有限的语言都是正规的。
2.用正规文法当然能产生无限长串,其中周期重复部分的长度不大于非终止符的长度。
举个例子
在此规则之下,能生成句子
其中周期重复部分为ab,这个例子的非终止符的元素个数为2,故满足2不大于2.
自嵌入特性
我们把上下文无关文法中的正规文法去掉,剩下的那部分我们叫做真正的上下文无关文法。
自嵌入特性是区分真正的上下文无关文法与正规文法的判定标准。
即一个真正的上下文无关文法一定具有自嵌入特性,正规文法具有非自嵌入特性。亦即非自嵌入的上下文无关文法是正规文法,上下文无关文法就蜕化了。
什么是自嵌入特性?
自嵌入顾名思义,就是能够自己嵌入自己:
当然必须保证v和x不能是空串。
uvwxy定理
这是一个用以判定上下文无关文法和正规文法的条件。
就是说,当这个文法满足自嵌入条件,表示出来就是
那么,可以得到
其中当v和x的重复次数相同且为非空串时,则这个文法肯定就是真正的上下文无关文法。因为这种周期形式是正规文法所不具有的。比如这种
就是必须要用真正的上下文无关文法。
下面介绍上下文无关文法的等价文法。
不同的上下文无关文法,它们生成的语言有可能是等价的,这样就涉及到一个最优文法的问题。那么最优是什么?最有就是高效、没有冗余和浪费。
粗略说有2种冗余,而且只有非终止符能够冗余。终止符总是有用的啦。
其一是浪费环节。
浪费环节是说由单个非终止符传递到了单个的非终止符,比如
这种形式意味着B是多此一举的,还不如直接A到C呢。
其二是无用环节。
细分又有2类。通俗说
1.无尾的无用非终止符
所谓无尾,就是咱用了这个终止符,话根本都没法结束。有头无尾。
A根本没法最后变成常量(终止符)。
不存在x使得
2.无头的无用非终止符
所谓无头,就是这句话根本就不可能从这个非终止符开始。有尾无头。
从起始符开始根本找不到含有A的句子。
从起始符S开始,不存在
首先介绍如何消去浪费环节。
消去浪费环节包括2个部分。
其一消去。
其二修正。
消去过程
这个过程用递归算法来实现。
就是要求出所有非终止符各自对应能到达的所有非终止符集合。
举个例子就好了
现在消去浪费环节,先考虑S,
发现S能在一步之内的非终止符只有A
记
在K1(S)集合中再次出发,在一步之内能走到的新非终止符只有B
记
再往后没有新的非终止符了。
同理考察A,A在一步之内能到达的非终止符只有B了,记
再考察B,B根本就没有能在一步之内能到达的新终止符。
于是这对应的3个集合就求完了
修正过程
修正过程就按照上面的消去过程打补丁就好了,因为要消去一堆连接,旧桥拆了总得重新修吧。还是上面那个例子,先把之前的生成关系画出来,如图1黑线所示。
图1
现在考虑A,根据集合,我们要去掉A到B的连接
那么就得补上S到b、A到b、S到aS、A到aS,黄线代表。
然后再考虑S,要去掉S到A
那么就得补上S到BAb,绿线代表。
注意:现在虽然看起来文法规则比以前更麻烦了,但是,实际生成句子的过程却变得简单了许多,所以简化没简化还是要看疗效。
下面介绍消去无用的终止符
消去无用终止符的思路就是,找出所有有用的非终止符,那么剩下的自然就是没有用的了。
消去无尾非终止符
找出所有的有尾非终止符集合,定义为J(G)
方法是
这个表达式很清晰,还是举个例子,反而绕口,但还是举吧
这个表达式其实是一步步找到那些最终的到达终止符的非终止符。
首先J0(G)为空集。则J1(G)为所有能一步走到以终止符为尾的非终止符,即A
继续,J2(G)是J1(G)并上所有能在一步之内到以J1(G)或者其他终止符为尾的非终止符。
好绕口。。。其实就是{S,A}
再往下就找不到了。不过现在忽然发现,B呢?怎么没看到B的影子。
这就说明B就是无尾的无用非终止符。
去掉所有跟B有过关系的生成关系就好,现在是新的生成关系
再说说消去无头非终止符
也是只要找出所有有头的非终止符就好,剩下自然就无头了
用表达式表示是这样的
这个表达式的意义其实就是从起始符,回溯一步步展开,希望能找到句子的头部。
还是举个例子
展开起始符S,发现S能到aAA,因此R1(S)={S,A}
A继续展开,发现A能到aCA,因此R2(S)={S,A,C}
搞定,又发现原来B是无头的非终止符,赶紧删掉与它有关系的所有表达关系就好了,不再赘述。
上下文无关文法的2中标准型
1.C(Chomsky)标准型
举一个例子立即就知道怎么把随便一个上下文无关文本变成C标准型了:
2.G(Greibach)标准型
这个严格的转化方法有点畸形,就暂时不展开了。简单情况用凑的就好了。
欢迎参与讨论并关注本博客和微博以及知乎个人主页,后续内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及本文链接,谢谢您的支持!
相关文章推荐
- 句法模式识别(两)-正规文法、上下文无关文法
- 句法模式识别(二)-正规文法、上下文无关文法
- 文法系列之从上下文无关语法到转换语法
- 正则文法和上下文无关文法
- 上下文无关文法解析
- 自动机、正则式、正则文法和上下文无关文法
- 文法系列之上下文无关语法简介
- 上下文无关文法及分析
- 正则表达式与上下文无关文法
- 编译原理-上下文无关文法
- 词汇化概率上下文无关文法 Lexicalized PCFGs
- 判别函数、贝叶斯、K—L变换、句法模式识别
- 上下文无关文法(Content-Free Grammar, CFG)
- 到底什么是上下文无关文法?
- 到底什么是上下文无关文法?
- 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树
- [系列][编译原理]上下文无关文法及分析
- 上下文无关文法
- 自己动手开发编译器(六)上下文无关语言和文法
- 文法系列之上下文无关语法简介