自己的理解——编译原理中的四种文法
转载请注明来源http://www.cnblogs.com/qjkobe/p/5332612.html,谢谢。
编译原理学文法类型的时候,会出现乔姆斯基给出的四种文法类型,然而,这些概念太过于抽象了,对于初学者实在很难理解,所以,在这里,我给出一些我自己的理解,希望能对大家有所帮助。
在这之前,你必须对终结符和非终结符有所了解,简单来说,非终结符就是这个东西还能→别的东西(→的标准叫法是定义为),但是终结符就不能了,比如说,分子→原子,原子→夸克。夸克就不能再分了,所以不能由其他粒子定义。(随便举个例子,基于2016年,免得以后万一夸克不是最小的了呢,机智如我)
ps:终结符里包含ε,也就是空。
然后,必须明确是概念是文法类型之间的包含关系。
先有0型,然后后面的文法都是对前者添加更多的限制,来缩小它的范围。
那么,什么是0型文法,其实就是,→的左边,是非终结符和终结符的组合,由于终结符是有ε这个空存在的,所以,这就相当于只要有一个非终结符,其他怎么样都行。向右的右边,没有任何限制。举个例子:
终结符:A,B,C,S(注:S作为开始符,是非终结符,至少在一条规则中作为左部出现,规则就是什么→什么)
非终结符:a,b,c(注:ε也在里面,不过一般不会写出来,因为在规则里加上S→ε没有意义。)
→左边可以是:S,SA,A,aA,aAb,aAa,AB,aAB.....等等
→右边可以是:a,ab,b,abc,ε,A,AB....等等,反正,什么都可以,只要在终结符和非终结符的集合里。
那好,0型的限制这么少,1型又是怎样的呢,其实,1型加的限制就是,对任一产生式α→β,都有|β|>=|α|, 仅仅 S→ε除外,这个说法有点让人摸不着头脑,让我们换一种说法
表达式的形式应该为:α1Aα2→α1βα2,A在终结符集合中,剩下的符号都是任意的(终结符和非终结符的集合),这意味着什么,我举个例子来说明:
A→aB
S→abc
bB→bc
aB→bB
我们在上述例子的第一个规则中A→aB中,想把B给替换掉,但是我们发现,没有B→这样的规则,然而,聪明的我们又发现,有aB→这样的式子,所以我们就把aB替换成了bB,然后bB又可以替换成bc。
这其实就表达了这样一个意思,我要换这个B啊,必须得和他周围的东西一起换掉,就好像超市,B单独一个东西卖不出去,只有打包才行,所以,1型文法又称为上下文有关文法。
注:这里有人会觉得,1型不就是0型吗?这个答案是肯定的,因为是包含关系嘛。但是0型就不一定是1型了。举个例子,比如以下规则;
S→ab
bB→c
aB→cB
上面的规则中,最后二条违背了1型的定义,所以,上述例子是0型不是1型。
搞懂了1型,那么,2型文法又加了什么限制呢,其实就是,→的左边,都只能存在一个非终结符,那种AA,aB,aBc之类的就不能存在了,左边必须单身狗,向右的右边依旧很自由,什么都可以(终结符和非终结符的集合)。
比如:
A→aB
S→bAA
B→a
C→abA
大家会发现,当我要在A→aB中,把B替换掉的时候,由于存在B→a,所以直接就可以替换掉B,而不用在乎A→aB这个式子的B的旁边有没有别的东西,所以,2型文法又叫做上下文无关文法。
最后一种,3型文法,又称为正规文法,它的限制可就十分之死板了,它只允许两种形式的产生式存在,一个是A→aB,一个是A向右a,A和B都是非终结符,a则是终结符。举个例子:
S→aA
S→a
A→bB
A→b
反正就是只有两种格式的式子允许存在,所以正规文法其实是很少的。
PS:终结符和非终结符的集合可以是,ab,AB,aBc这样的组合,但是上述文字中我如果没说集合,那就只能有一个,比如,A,b,C,d