文法的分类【编译原理】编译原理4种文法类型
- 1956年,Chomsky建立形式语言的描述。
- 通过对产生式的施加不同的限制,Chomsky把文法分为4种类型
首先定义一个产生式
α→β
- 0型文法定义:
0型文法(PSG): α∈(VN∪VT)* ,且至少含一个VN
β∈(VN∪VT)*
对产生式没有任何限制
例如:A0→A0 , A1→B
0型文法说明:
0型文法也称为短语文法。
一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。或者说,任何0型语言都是递归可枚举的;反之,递归可枚举集必定是一个0型语言。
对0型文法产生式的形式作某些限制,以给出1,2和3型文法的定义。
(注意)
文法G 定义为四元组(VN ,VT ,P,S)
¨VN :非终结符集
¨VT :终结符集
¨P :产生式集合(规则集合)
¨S :开始符号(识别符号)
-
1型文法(上下文有关文法context-sensitive):
对任一产生式α→β,都有|β|>=|α|, 仅仅 S→ε除外
产生式的形式描述:α1Aα2→α1βα2
(其中,α1、α2、β∈(VN∪VT)*,β≠ε,A∈VN)
即:A只有出现在α1α2的上下文中,才允许用β替换。
产生的语言称“上下文有关语言”但S不能出现在产生式的右部。
例如:0A0→011000 1A1→101011
- 2型文法(CFG):对任一产生式α→β,都有α∈VN,β∈(VN∪VT)*
产生式的形式描述:A→β(A∈VN)
即β取代A时,与A所处的上下文无关。
产生的语言称“上下文无关语言”
例如:G[S]:S→01 S→0S1
- 3型文法(RG):也称正规文法
每个产生式均为 “A→aB”或“A→a” —— 右线性
“A→Ba”或“A→a” —— 左线性
其中,A、B∈VN,a∈VT*
产生的语言称“正规语言”
例如:G[S]: S→0A | 0
A→1B | B
B→1 | 0
4个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
四种文法之 关系是:包含关系.(原因:将产生式做进一步限制而定义的。
![](https://images0.cnblogs.com/blog2015/736765/201506/101733015983355.jpg)
对产生式施加不同的限制得到不同类型的文法
¨0型(无限制文法):
¨1型(上下文有关):
¨ 2型(上下文无关):
¨3型(右线性和正规文法):
正规文法只能出现单个的终结符,右线性文法可能出现若干个终结符组成的串。
![](https://images0.cnblogs.com/blog2015/736765/201506/101640094571230.jpg)
快速判断文法的方法浅析
引用:
====================
S-> aaS|a是什么型的,为什么
S-> aSb|ab是什么型的,为什么
S-> SaS|b是什么型的,为什么
=====================
====================
S-> aaS|a是什么型的,为什么
S-> aSb|ab是什么型的,为什么
S-> SaS|b是什么型的,为什么
=====================
答:三种文法都属于上下文无关文法。
四种文法的判断非常简单,说到到,四种文法就是规定产生式的左和右边的字符的组成规则不同而已,其它的不能理解就不要去想了,你只要知道判断的时候就是以产生式的左边和右边符合的规则进行判断。下面解释一下如何根据产生式左边和右边的特征来进行判断。
首先,应该明确,四种文法,从0型到3型,其规则和约定越来越多,限制条件也越来越多,所以,我们判断时可以从最复杂的3型进行判断,依次向下判断,如果不符合3型的,那再看是不是2型的,不是2型的,再看是不是1型的,当然,对于作题作的熟的朋友,不用这么复杂,可以一眼直接看出来。
3型文法遵循什么规范呢?
第一点:左边必须只有一个字符,且必须是非终结符;
第二点:其右边最多只能有两个字符,且当有两个字符时必须有一个为终结符而另一个为非终结符。当右边只有一个字符时,此字符必须为终结符。
第三点:对于3型文法中的所有产生式,其右边有两个字符的产生式,这些产生式右边两个字符中终结符和非终结符的相对位置一定要固定,也就是说如果一个产生式右边的两个字符的排列是:终结符+非终结符,那么所有产生式右边只要有两个字符的,都必须前面是终结符而后面是非终结符。反之亦然,要么,就全是:非终结符+终结符。
依以上规则判断,你所给的三个文法显然都不属于3型文法。
再看2型文法如何判断:
第一点:与3型文法的第一点相同,即:左边必须有且仅有一个非终结符。
第二点:2型文法所有产生式的右边可以含有若干个终结符和非终结符(只要是有限的就行,没有个数限制)。
依2型文法的判断规则,你的三个文法都属于2型文法,即:上下文无关文法。
再看1型文法如何判断:
第一点:1型文法所有产生式左边可以含有一个、两个或两个以上的字符,但其中必须至少有一个非终结符。
第二点:与2型文法第二点相同。
依1型文法判断规则,显然,你的文法也是属于1型的。
最后是0型文法,这个就不用看了,只要你能描述出来,都属于这个类型,即0型。
所以,取其最高的符合规则,最后的答案是其符合:上下文无关文法规则,即2型。
四种文法的判断非常简单,说到到,四种文法就是规定产生式的左和右边的字符的组成规则不同而已,其它的不能理解就不要去想了,你只要知道判断的时候就是以产生式的左边和右边符合的规则进行判断。下面解释一下如何根据产生式左边和右边的特征来进行判断。
首先,应该明确,四种文法,从0型到3型,其规则和约定越来越多,限制条件也越来越多,所以,我们判断时可以从最复杂的3型进行判断,依次向下判断,如果不符合3型的,那再看是不是2型的,不是2型的,再看是不是1型的,当然,对于作题作的熟的朋友,不用这么复杂,可以一眼直接看出来。
3型文法遵循什么规范呢?
第一点:左边必须只有一个字符,且必须是非终结符;
第二点:其右边最多只能有两个字符,且当有两个字符时必须有一个为终结符而另一个为非终结符。当右边只有一个字符时,此字符必须为终结符。
第三点:对于3型文法中的所有产生式,其右边有两个字符的产生式,这些产生式右边两个字符中终结符和非终结符的相对位置一定要固定,也就是说如果一个产生式右边的两个字符的排列是:终结符+非终结符,那么所有产生式右边只要有两个字符的,都必须前面是终结符而后面是非终结符。反之亦然,要么,就全是:非终结符+终结符。
依以上规则判断,你所给的三个文法显然都不属于3型文法。
再看2型文法如何判断:
第一点:与3型文法的第一点相同,即:左边必须有且仅有一个非终结符。
第二点:2型文法所有产生式的右边可以含有若干个终结符和非终结符(只要是有限的就行,没有个数限制)。
依2型文法的判断规则,你的三个文法都属于2型文法,即:上下文无关文法。
再看1型文法如何判断:
第一点:1型文法所有产生式左边可以含有一个、两个或两个以上的字符,但其中必须至少有一个非终结符。
第二点:与2型文法第二点相同。
依1型文法判断规则,显然,你的文法也是属于1型的。
最后是0型文法,这个就不用看了,只要你能描述出来,都属于这个类型,即0型。
所以,取其最高的符合规则,最后的答案是其符合:上下文无关文法规则,即2型。
![](https://images0.cnblogs.com/blog2015/736765/201506/101721240664688.jpg)
![](https://images0.cnblogs.com/blog2015/736765/201506/101721420358832.jpg)
有限状态自动机是具有离散输入和输出的系统的一种数学模型。
其主要特点有以下几个方面:
– (1)系统具有有限个状态,不同的状态代表不同的意义。按照实际的需要,系统可以在不同的状态下完成规定的任务。
– (2)我们可以将输入字符串中出现的字符汇集在一起构成一个字母表。系统处理的所有字符串都是这个字母表上的字符串。
– (3)系统在任何一个状态下,从输入字符串中读入一个字符,根据当前状态和读入的这个字符转到新的状态。
– (4)系统中有一个状态,它是系统的开始状态。
– (5)系统中还有一些状态表示它到目前为止所读入的字符构成的字符串是语言的一个句子。
形式定义
· 定义:有限状态自动机(FA—finite automaton)是一个五元组:
– M=(Q, Σ, δ, q0, F)
· 其中,
– Q——状态的非空有穷集合。∀q∈Q,q称为M的一个状态。
– Σ——输入字母表。
– δ——状态转移函数,有时又叫作状态转换函数或者移动函数,δ:Q×Σ→Q,δ(q,a)=p。
– q0——M的开始状态,也可叫作初始状态或启动状态。q0∈Q。
– F——M的终止状态集合。F被Q包含。任给q∈F,q称为M的终止状态。