1、第二章 形式语言简介,形式语言和自动机理论中的语言是一个广泛的概念。 一个字母表上的语言就是该字母表的某些字符串的集合。 语言中的字符串称为该语言的句子。,语言的的定义可以从两个方面进行:)从产生语言的角度;)从接收(或识别)语言的角度。,产生一个语言,目的就是根据语言中的基本句子和句子的形成规则,得到(产生)该语言所包含的所有句子。 这是形式语言所研究的问题。,接收一个语言,目的就是使用某种自动机模型来接收句子,该模型所接收的所有句子,也形成一个语言。 这是自动机所研究的问题。,1.6 常用术语,(1) 用代表空串,代表仅含有空串的集合。 (2) 用代表空集,表示一个元素都不包含的集合。 (
2、3) 用代表字母表。,常用术语(续),(4) 用代表两个字符串与的连接(并置)。 若 = a1a2a3an, = b1b2b3bm; 则= a1a2a3anb1b2b3bm。 显然,=,(5) 用AB代表集合A与B的连接。 A=a1,a2,a3,an, B=b1,b2,b3,bm;,AB= a1b1,a1b2,a1b3,a1bm,a2b1,a2b2,a2b3,a2bm,a3b1,a3b2,a3b3,a3bm,anb1,anb2,anb3,anbm ,注意:,A=A=。,6)An代表集合A的n次连接:A的n次幂定义为: (1) A0 = (2) An = An-1A n 1,7) A*代表集合A
3、上所有字符串的集合。即表示集合A中的所有字符串进行任意次连接而形成的串的集合。,A*称为集合A的闭包(克林闭包)。A* = A0 A1 A2 An,例1-11 A=0,1,A0= 即长度为0的0和1组成的串的集合 A1=A=0,1 即长度为1的0和1组成的串的集合,A2=AA=00,01,10,11 即长度为2的0和1组成的串集合A3=A2A =000,001,010,011,100,101,110,111即长度为3的0和1组成的串的集合,A* = A0 A1 A2 An =0和1 组成的所有的串=w|w是0和1 组成的串,如果串是集合A的闭包中的串,也称是集合A上的串。 对于任何集合A有(A
4、*)*= A*。,8) A+代表一个集合,称为A的正闭包, A+=AA2A3An 。,A * 与 A+,A * = A+ A0 即 A * = A+ ,语言的形式定义,设是一个字母表,L*, L称为字母表上的一个语言, wL, w称为语言L的一个句子。,2.1 例子语言,括号匹配串的语言。该语言是指所有的左括号和右括号相匹配的串的集合;( ),( ),( )( )等等都是该语言的句子)( ,( )等等不是该语言的句子。,如何产生这个语言呢?即如何产生该语言所有句子呢?,实际上,就是需要给出语言中句子的构造(形成)规则。 递归定义提供了语言的良好的定义方式,使得语言中的句子的构造规律较明显。 可
5、以使用多种方法描述构造规则。,自然语言的描述方式,采用如下的递归规则: ( )是该语言的最基本的句子; 若S是句子,则(S)是句子; 若S是句子,则SS是句子;,这些规则称为形成规则,根据这些规则,可以(1)产生该语言的任意的句子;(2)判断某个串是否是该语言的句子。,例如,可以产生句子()而推断串()不是句子。,规则(的个数)是有限的,但可以产生无限个句子和长度无限的句子; 因为规则是递归的。,BNF的描述方式,巴科斯和诺尔采用的巴科斯-诺尔范式(BNF-Backus-Naur Form)描述规则: := ( ) := :=(),Chomsky采用的符号化(形式化)的描述方式,运用如下的规则
6、(这些规则被称为产生式): S( ) S(S) SSS,“”读作“定义为”或者“是” , 它的左边和右边分别称为该产生式的左边和右边;,根据产生式可以生成任意句子;可以判断一个串是否为句子(语法分析)。,产生句子的过程为:从S开始,反复利用产生式的右边代替产生式的左边(称之为推导过程),最后,得到匹配的()组成的句子。,例:句子( )( )( )的产生过程,S=SS=(S)S=( )S=( )(S)=( )(SS)=( )( )S)= ( )( )( ),产生式的个数是有限的,规则是递归的,因而 所有的小括号匹配的句子(有无限个)均可以由它们产生,它们组成的集合就称为一个语言。,S称为非终结符
7、,在推导过程中,可以被代替的符号。 (和)称为终结符,在推导过程中,不可以被代替的符号。 是产生式系统的元符号,不属于非终结符,也不属于非终结符。,例2-1 由偶数个0组成的串的语言规则的自然语言描述方式: 00是该语言的基本的句子; 若S是句子,则SS是句子;,形式化的描述方式: S00 SSS,问题:,将产生式SSS换成S0S0或者S00S 是否还产生相同的语言?,结论:,同一个语言,可以使用不同的产生式组合来产生。,考虑,由奇数个1组成串的语言的产生规则。,例2-2,高级程序设计语言中的包含有+、*、/、()的算术表达式(的语言)的产生。,自然语言的描述方式,单个变量是最基本的句子; 若
8、E是一个句子,则EAE是一个句子(其中A代表运算符+、-、*、/) 若E是一个句子,则(E)是句子;,形式语言的描述方式, E i (i代表单个变量) EEAE E(E) A+ A- A* A/,思考:,字母表为? 若以A开始推导,则产生?,其中 : A+,A-,A*,A/ 四个产生式的左边是相同的符号,可以合并为A+|-|*|/+、-、*、/ 称为A的侯选式。,E i EEAEE(E) 也可以记为:E i|EAE|(E),注意:,这组产生式没有表示出运算符的优先级。,表示出运算符的优先级的产生式:EE+T|E-T|TTT*F|T/F|FF(E)|i,其中: E代表表达式,T代表项,F代表因子
9、 (E)代表的是带小括号的表达式。 该组产生式表示出先算因子,再*、/,最后+、-。,例2-3,标识符(以字母开头的字母、数字的串)的产生(仅考虑小写字母)。,IL IIL IID La|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t u|v|w|x|y|z D0|1|2|3|4|5|6|7|8|9,思考:,上例是从标识符的形成角度思考问题。 从标识符的定义角度考虑,则?,注意,D0|1|2|3|4|5|6|7|8|9 不能简写为D0|9,将I的定义加入到表达式中:,EE+T|E-T|TTT*F |T/F|FF (E)|IIL|IL|ID L D,2.2 文法和语言
10、的关系,介绍语言的定义。 介绍文法的定义。 介绍文法与语言的关系。,再次强调:,语言就是字母表上的字符串组成的一个集合。 语言中的字符串称为句子。 文法的作用就是产生一个语言。,定义2-1 短语结构文法(文法)的定义,文法G是一个四元式,G=(,V,S,P) 是一个有限字符的集合(字母表),它的元素称为字母或者终结符; V是一个有限字符的集合-非终结符集合,它的元素称为变量或者非终结符;,SV,称为文法的开始符号; P是有序偶对(,)的集合,其中是集合(UV)上的字符串,但至少包含一个非终结符;是集合(UV)*的元素。一般,将有序偶对(,)记为,称为产生式;,如果有,称之为空串产生式或者产生式
11、。 如果有AB,称之为单产生式。,一个产生式的左边可能不只一个符号;第一个产生式的左边只能有一个符号,就是开始符号S。,文法的作用就是产生一个语言。,约定:如果没有特别说明,则,第一个产生式左边的符号,就是开始符号,可以不为S;大写的英文字母代表非终结符;小写的英文字母a,b,c,d,e和数字代表终结符;,小写的英文字母u,v,w,x,y,z代表 终结符串;小写的希腊字母,代表非终结符和终结符串;,推导(派生)的定义2-2,文法G,和是集合(UV)上的串,= pvr ,=pur(p和r可能同时为), 而vu是文法G的一个产生式,则称可以直接推导出 ,记为= ,既 pvr =pur。,推导的实质
12、产生式的右边替换产生式的左边。,非终结符代表在推导的过程中可以被替代的符号, 终结符代表在推导的过程中不可以被替代的符号。,推导的逆过程称为归约。与pvr =pur对应,称串pur可以直接归约成串pvr。 记为pvr =pur。,多步推导(至少一步),y=+z 表示y可以经过多步推导出z,即存在串的序列1,2,3 ,n ;有y=1 ,z= n ,且i=i+1;对所有ni1。,任意步推导(包括0步),y=*z 表示y可以经过任意步推导出z,即y=z;或者y=+z。,思考:,对于任意文法G:S=*SS=+S 一定都成立吗?,最左推导和最右推导,如果在推导的过程中,每一步都是将推导产生的串的最左边的
13、非终结符代替掉-最左推导 如果每一步都是将推导产生的串的最右边的非终结符代替掉-最右推导(规范推导),,当然,还有其它方式的推导过程(例如混合)。 而最左推导和最右推导是比较常用的推导方式。,对于文法G,如果S=*,则称是文法的一个句型, 若 *, 称为句子。,定义2-3 语言的定义,给定文法G,有开始符号S,则把S可以推导出所有句子的集合,称为由文法产生的语言,记为L(G),即L(G)=|S=*,且*,例,文法G=(,),S,S, S( ), S(S), SSS )产生语言L(G)=w|w是括号匹配的串,注意:,文法G产生语言L(G),必须: 该文法推导产生的所有串都在该语言中; 语言中的任
14、意一个句子都可以由该文法产生。,对于文法G=(,V,S,P) 约定:第一个产生式左边的符号,就是开始符号(可以不是S);大写的英文字母代表非终结符。,对于文法(G),只需给出该文法的所有产生式即可。上例文法可以写成S( )S(S)SSS,还可以再简单写成S( )|(S)|SS,2.3Chomsky对文法的分类,本节介绍Chomsky对文法的分类。,语言是由文法产生的,对语言的分类,是根据产生语言的文法的分类而进行的。,0型文法,对于一般的短语结构文法(PSG) ,G=(,V,S,P) G称为0型文法,对应的L(G)叫作0型语言或者短语结构语言(PSL)、递归可枚举集。,1型文法,如果对于任意P
15、,均有|成立,则称G为1型文法,或上下文相关文法(CSG)。 对应的L(G)叫作1型语言或者上下文相关语言(CSL)。,1型文法,1型文法产生式的标准形式为:yAzyz 其中:AV;y,z(V)*, (V)+;,2型文法,如果对于任意P,均有|且V成立,则称G为2型文法,或上下文无关文法(CFG)。 对应的L(G)叫作2型语言或者上下文无关语言(CFL)。,3型文法,如果对于任意P,具有形式Aw,AwB其中,A,BV,w+则称G为3型文法,或右线性文法 RLG,也可称为正则文法RG。,对应的L(G)叫作3型语言,或右线性语言RLL,或正则语言RL。,四类文法和对应的四类语言之间是真包含关系。,
16、文法分类判断方法:,文法G=(,V,S,P),则1) G是短语结构文法;2) 如果文法G的所有产生式的左边长度小于等于右边长度部分,那么G是上下文相关文法;,3) 如果上下文相关文法G的所有产生式的左边都是一个非终结符,那么G是上下文无关文法;4) 如果上下文无关文法G的所有产生式的右边最多只有一个非终结符,且该非终结符号只能出现在最右边,那么G是正则文法。,2.4文法产生语言,例2-6 文法S0SS0 该文法产生语言L=0n|n0。,分析,如果开始使用第2个产生式S0,则S=0,就不能再往下进行推导了。产生基本句子0;,若使用产生式S0S,n-1次后,则S=0S=00S=000S=+0n-1
17、S,使用S0,则S=+0n这对于任何n1都是成立的; 总之,该文法产生语言L=0n|n0。,定义2-7 递归文法,一个上下文无关文法G, AV,如果 A =+A ,则该文法称为递归的文法;(A:递归非终结符) 递归分为直接和间接递归。 若A =A则称为直接递归的非终结符。,直接递归可以从产生式判断。 间接递归需要根据推导过程才能进行判断。,思考,是否可以将间接递归转换为直接递归? 如何进行转换?,基本思路:将推导过程直接反映在产生式中 方法代入法,一个上下文无关文法的产生式的个数总是有限的。 如果该文法是递归文法,则该文法就能够产生一个无穷语言。,若一个上下文无关文法不是递归的文法,则该文法产
18、生有穷语言。,注意,特殊形式的产生式 AA是递归的,可以反复利用任意多次, 但对于无穷语言的产生,没有任何作用。,定义2-8 空串产生式的定义,形如A的产生式,称为上下文无关文法的空串产生式,或产生式;AV。 空串产生式的作用就是在推导的过程中,对于某个句型,省略掉能够产生的非终结符号。,若某个上下文无关文法有S(S为文法的开始符号),则 该文法产生的语言一定包含空句子。,例2-7,文法S0SS 该文法产生语言L=0n|n0。 思考: 该文法是 ?型文法,分析,如果开始使用第2个产生式S,则S=,就不能再往下进行推导了, 产生空句子;,如果开始使用产生式S0S,n次后,S=0S=00S=000
19、S=+0nS最后,使用S,则S=+0n这对于任何n1都是成立的; 总之,该文法产生语言L=0n|n0。,例2-8,文法SaSbSab 该文法产生语言L=anbn|n0。,分析,如果开始使用第2个产生式Sab,则S=ab,就不能再往下进行推导了, 产生基本句子ab;,若使用SaSb,n-1次,则S=aSb=aaSbb=*an-1Sbn-1,最后,使用Sab,则S=*anbn,这对于任何n1都是成立的; 总之,该文法产生语言L=anbn|n0。,例2-9,文法 SaS SbS S 该文法产生语言L=a,b*。,例2-10,字母表a,b上所有对称的非空串组成的语言(没有中心点) 。 构造文法产生该语
20、言。,分析,aa和bb是最基本的句子。 如果S是句子,则aSa和bSb是句子;,得到文法:SaaSbbSaSaSbSb,思考,(1)文法SaSaSbSbSaSb 产生的语言是什么?,思考,(2)文法SaSaSbSbS 产生的语言是什么?,练习:构造文法,产生,(1)字母表a,b上所有对称的非空串组成的语言。 (2) L=wdwT|wa,b,c+。 (3) L=anbn|n=0。,一般,对任意的a,b+,可以使用Aab|aAb来产生anbn|n0; 对任意的a,b+,可以使用Aa|b|aS|bS来产生a,b+; 对任意的a+,可以使用Aa|aA来产生an|n0;,对任意的a,b+,可以使用AaA
21、a|bAb 来产生wAwT|wa,b+,注意:,不能使用Aa2 代表 Aaa,不能使用Aan(n1) 或 Aa+ 来代表A可以产生任意多个a。,例2-13 文法,SaSBC SaBC CBBC aBab bBbb bCbc cCcc ,产生的语言为L(G)=anbncn|n0。,2.5 推导树,对于上下文无关文法,利用推导树也可以表示句型的产生过程。,例-16,S0B|1A A0|0S|1AA B1|1S|0BB 对于串0011的产生过程:,推导过程,最左推导:S=0B=00BB=001B=0011 最右推导: S=0B=00BB=00B1=0011,推导树表示推导,S0 B0 B B 1 1
22、,2.7 消除左递归,在某些情况下,需要消除一个无关文法中的左递归。 递归的作用是产生无穷的语言,消除左递归,只是将左递归改造为右递归。 左递归包括直接的和间接的左递归。,2.7.1 消除直接左递归,直接左递归的产生式形式为AAv 其中:AV,v(UV)+。 递归的产生式可以产生串v的任意次连接。,假设文法G的产生式形式为:AAv|w 其中: v,w(UV)+, 且w不包含A 对于A,有A=*wv*,增加B V,构造无左递归文法:AwB|wBvB|v 右递归 则 A=*wv*,或 (编译采用的文法),AwBBvB| 实际上,消除了产生式,就得AwB|wBvB|v,一般地,产生式的形式为:AAv1|Av2|Avn|w1|w2|wm 对于A,有A=*(w1|w2|wm)(v1|v2|vn)*,增加一个新的非终结符B,构造无左递归文法: Aw1B|w2B|wmB|w1|w2|wm Bv1B|v2B|vnB|v2|v2|vn,某些文法可能没有直接左递归,但可能会有间接左递归。SAaASb|b,2.7.2 消除间接左递归(自学),