410 likes | 545 Views
第二章 形式语言概论. 编译程序使得高级语言源程序所描述的功能得以在计算机上实现。编译程序的设计者就是高级语言的 实现者 ,源程序的编写者就是高级语言的 使用者 ,他们必须 遵循同样的准则 —— 高级语言程序的构成规则,才能使写出的源程序能够被成功地翻译 . 构造一个编译程序,首先要了解被编译的源程序的结构及其含义。要搞清楚源语言的词法规则、语法规则和语义规则是如何描述的。 文法描述的就是高级语言程序的构成规则 。. 第二章 形式语言概论. 本章主要介绍形式语言理论中的一些最基本的概念和基础知识,它是学习以后各章节的基础。
E N D
第二章 形式语言概论 • 编译程序使得高级语言源程序所描述的功能得以在计算机上实现。编译程序的设计者就是高级语言的实现者,源程序的编写者就是高级语言的使用者,他们必须遵循同样的准则——高级语言程序的构成规则,才能使写出的源程序能够被成功地翻译. • 构造一个编译程序,首先要了解被编译的源程序的结构及其含义。要搞清楚源语言的词法规则、语法规则和语义规则是如何描述的。 • 文法描述的就是高级语言程序的构成规则。
第二章 形式语言概论 • 本章主要介绍形式语言理论中的一些最基本的概念和基础知识,它是学习以后各章节的基础。 • 大多数程序设计语言的单词和语句是由正规文法和上下文无关文法来描述的。 • 有穷自动机是词法分析的理论基础。
2.1 语言成分 一个语言的成分包括字母表(Alphabet),文法(Grammar)以及它的语义。 本节将主要讨论字母表和符号串的一些基本概念。
字母表与符号 :字母表是元素的非空有穷集合。字母表中的元素称为符号。举例说明。 符号串及其运算 : ① 符号串的概念 ② 符号串的长度。 ③ 符号串的连接。④ 符号串集合的乘积。 ⑤ 符号串的方幂。 ⑥ 符号串集合的方幂。 ⑦ 符号串集合的正闭包。⑧ 符号串集合的自反闭包。
形式语言 形式语言是字母表上按某种规则构成的所有串的集合,这些串称为句子或字。对于一个具体的语言,都有语法和语义两个方面,形式语言是指不考虑语言的具体意义。 形式语言的表示方法 有穷语言:枚举法 无穷语言:文法
2.2 产生式文法和语言 文法(Grammar)是对语言结构的定义和描述,换句话说,在形式上用来描述语言语法结构的就是文法。通常是由一组规则构成的。一个程序语言的文法的就是用适当条数的规则把该程序语言全部成分描述出来。
2.2.1 产生式文法 定义2.1产生式文法定义成一个四元组G=(VN,VT,S,P), VT:非空有限的终结符号集(符号表); VN:非空有限的非终结符号集(变量表); S:开始符号(识别符号),是文法G规定的最终目标; P:产生式(规则)的集合。 其中VN∩VT= ,SVN。我们令V=VN∪VT,则P中产生式的一般形式为 A| AVN且 ,V+ 或 A::=| (本书中统一采用“A|”的表示方法)。
2.2.2 上下文无关文法 定义2.2文法G是一个四元组,G=(VN,VT,P,S),其中,VN、VT分别是非空有限的非终结符号集和终结符号集,VN∩VT=,P是产生式集,SVN称为文法的识别符号或开始符号。开始符号S必须至少在某个产生式的左部出现一次。
程序设计语言表达式的文法 • G1=(VN, VT,S,P) VN ={E} VT =(i,+,*,(,)} S=E P={E→i,E→E+E,E→E*E,E→(E)}
2.2.3 上下文无关文法定义的语言 定义2.3设文法G=(VN,VT,P,S),A→是其中的产生式,若有符号串,(VN∪VT)*,使得 U=A,w= 则称w为U应用产生式A→所得到的直接推导(Direct Deriavtion),也称w可直接归约到U,记为 Uw ,即 A 特别的,当==时,有 A即每个产生式的右部都是它左部的直接推导,符号“”仅指“推导一步”的意思。 举例说明.
2.2.3 上下文无关文法定义的语言 定义2.4 如果存在一个直接推导的序列 v=012…n=w (n>0) 则称符号串w为符号串u的一个推导,或称“w可归约到v”记为 推导举例.
2.3 文法的分类 2.3.1 文法分类 乔姆斯基根据产生式的形式把文法分为4类: 0型文法 (短语文法、无限制文法) 1型文法(上下文有关文法) 2型文法(上下文无关文法) 3型文法(左、右线性文法和正规文法)
0型文法 产生式具有以下形式: → 其中,(VN∪VT)+,(VN∪VT)*
1型文法(上下文有关文法) 1型文法G的产生式具有以下形式:→ 要求:1≤∣∣≤∣∣ 其中=1A2;=12;1,2(VN∪VT)*;AVN; (VN∪VT)+。 例 1型文法G6=(VN,VT,P,S) 其中, VN={S,X,Y,Z} VT=(x,y,z) P={S→xSYZxYZ, xY→xy,yY→yy, yZ→yz ZY→YZ, zZ→zz}
2型文法(上下文无关文法) 在1型文法的产生式中上下文1和2用空符号串代替,则有以下形式的产生式称为2型文法:A→ 其中,AVN,(VN∪VT)+。 例 2型文法G3=(VN,VT,P,E) 其中, VN={E,T,F} VT={+,*,(,),i } P={E→E+TT,T→TFF,F→(E) i }
3型文法(右线性文法和正规文法) 如果P中的产生式只含有下面的两种形式: A→ A→ B则称该文法为右线性文法, 其中,A,BVN, VT*。 例 右线性文法 G4=(VN,VT,P,S) 其中, VN={S,A,B} VT={0, 1 } P={S→011A0B,A→1A0B,B→010B }
3型文法(右线性文法和正规文法) 在正规文法中,P中的每个产生式(S→例外,S为文法的开始符号)只有两种形式:A→a ,A→aB 。其中 A,BVN,aVT。此外,如果S→是P中的一个产生式,那么S不能出现在任何产生式的右边。 例 正规文法G5(S)(十进制实数) SdB|+A|-A|·G AdB|·G BdB|·H|d GdH HdH|d 其中d代表十进制数字。
2.3.2文法分类的意义(1) • 0型文法:0型语言(递归可枚举语言)使用图灵机来识别 • 1型文法:1型语言 (上下文有关语言) 使用空间线性界限自动机来识别 • 2型文法:2型语言(上下文无关语言) 使用下推自动机来识别 • 3型文法:3型语言(正规语言、正则语言)使用有穷自动机来识别
2.3.2文法分类的意义(2) • 程序设计语言的词法规则(单词)属于正规文法,使用有穷自动机来识别。 • 程序设计语言的语法和语义描述属于上下文无关文法和上下文有关文法范畴,为降低语法分析的难度,大部分语法规则使用上下文无关文法来描述,使用下推自动机来识别。
2.4 语言和语法 2.4.1 句型、句子和语言(1) 定义2.6 设S是文法G的识别符号,如果 , 则称符号串u为文法G的句型。 举例说明。
2.4.1 句型、句子和语言(2) 定义2.7 设S是文法G的识别符号,若 , uVT*,则称符号串u为文法G的子。 定义2.8 设S是文法G的识别符号,文法G的语言L(G)={u| 且u VT*},即文法的语言是文法的所有句子构成的集合。
文法和语言综述(1) • 给定一个文法,就能从结构上唯一地确定其语言,即G→L(G) • 给定一种语言,能确定其文法,但这种文法不是唯一的。 例如:标识符文法:G1[I] I→L|IL|ID L→a|b|c|…|x|y|z|A|B|C|…|X|Y︱Z D→0|1|2|3|…|9 G2[I]: 右线性文法:I → aB|a B →aB| dB| a |d G3[I]: 左线性文法:I → a| Ia| Id a代表字母、d 代表数字
文法和语言综述(2) • 给定文法,如何确定该文法的语言? 从已知文法确定语言的中心思想是:从文法的开始符号出发,反复连续地使用规则,对非终结符施行替换和展开,找出句子的规律,用式子或自然语言描述出来。 举例说明。
文法和语言综述(3) • 给定语言,如何构造其文法? 例: 设字母表Σ={a,b},试设计一个文法,使其描述的语言为 L={a2n,b2n|n≥1} G=(VN,VT ,P,S) 其中VN ={A,B,D}, VT ={a,b} P={ A→aa|aaB|bb|bbD B→aa|aaB D→bb|bbD} S=A
2.4.2 语法树(1) 在自然语言中,可通过树型表示直观地分析句子结构;在形式语言中,则是通过语法树直观地分析文法的句型结构。 句子结构
2.4.2 语法树 设文法G=(VN,VT,P,S),对于文法G的任意一个句型都存在一个相应的语法树: ①树的根结点标记是文法的识别符号S; ②每个结点上的标记都是文法字汇表中的符号; ③若一棵子树的标记为A,且所有直接后结点从左向右排列的顺序为B1,B2,…,Bn,则(A→B1B2…Bn)P; ④如果T1是根结点的唯一子树,且标记为ε,则一定有S → ε在P中; ⑤若树的所有末端结点上的标记从左向右排列为字符串w,则w是G的句型,若w仅含终结符号,则w是G所产生的句子.(举例)
2.4.3 语法树的生成过程 也称为推导树,是对句子或句型推导过程的图形表示法。 从文法的开始符号出发,每推导一步,语法树向下伸展一层。 【例1】设有文法G[E]: E→E+T∣E-T∣T T→T*F∣T/F∣F F→(E)∣i 给出句型(T+i2)*i1-F的语法树
2.5 文法和语言的一些特性 2.5.1 无用非终结符号 如果文法的某个非终结符不出现在文法的任何一个句型中,并且不能从它推导出终结符号串,则称该非终结符为无用非终结符号。(P30-例2.13) 2.5.2 不可达文法符号 如果一个非终结符(非识别符号)不出现在文法的任何一条产生式的右部,则称该非终结符为不可达文法符号。 文法中的任意非终结符A应满足如下两个条件: (1)A必须在文法的某个句型中出现。 (2)必须能从A推导出终结符号串。
2.5.3 可空非终结符 2型文法的产生式要求以下形式: A→ 其中,AVN,(VN∪VT)+。对2型文法可进行扩充,令(VN∪VT)*,允许有以下形式的产生式: A→ 此产生式称为空产生式,A称为可空非终结符。
2.5.4 最左、最右推导和规范推导(1) 定义2.9 在xUyxuy直接推导中,若xVT*,UVN 即U是符号串xUy中最左非终结符,则称此直接推导为 最左直接推导。若一个推导的每一步直接推导都是最左直接推导,那么此推导称为最左推导。 定义2.10 在xUy::=xuy直接推导中,yVT*,UVN,即U是符号串xUy中最右非终结符,则称此直接推导为最右直接推导。若一个推导的每一步直接推导都是最右直接推导,则称此推导为最右推导。 最右直接推导又称为规范直接推导,最右推导又称为规范推导。
2.5.4 最左、最右推导和规范推导(2) 定义2.11 假定x1x2…xn是一个最左推导,我们称序列Xn,Xn-1,…X1是一个最右归约。 定义2.12 假定x1x2…xn是一个最右推导,我们称序列Xn,Xn-1,…X1是一个最 左归约。 最左推导的逆过程是最右归约,最右推导的逆过程是最左归约。
2.5.5 二义性(1) 定义2.13 一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性。如果一个文法含有二义性的句子,则该文法具有二义性。 例如:表达式的文法 。 二义性的文法将给编译程序的执行带来问题。对于二义性文法的句子,当编译程序对它的结构进行语法分析时,就会产生两种甚至更多种不同的解释。由于语法结构上的不确定性,将必然会导致语义处理上的不确定性。对于二义性的文法我们可以利用文法的等价性来消除文法的二义性,以利于语法分析的进行。
2.5.5 二义性(2) • 例:定义某种程序设计语言语句的文法,证明是否有二义性并消除之。 S→if b S∣if b S else S∣A( 其他语句) 分析 该文法的句子 if b if b A else A 对应两棵不同的语法树。 • 改写文法: (1)不改变现有的规则,加进一项语法规定。 else与前面最近的不带 else的 if相对应。 (2)改写文法G 为G′: S→S1∣S2 S1→if b S1 else S2∣A S2→if b S∣if b S1 else S2 规定if 和else之间只能是if-else语句或其他语句。
2.5.5 二义性(3) • 文法的二义性和语言的二义性是两个不同的概念。 • 文法的二义性不能用算法来判定。
2.6 分析方法简介 一个分析器或分析自动机是这样一种系统,它能够根据给定的文法G,构造语言L(G)的任意推导。分析也可看作是语法树的构造过程。 分析的方法很多,可归纳为两类,一类是自上而下分析方法,另一类是自下而上分析方法。
2.6.1自上而下分析方法 自上而下分析方法的基本思想是从文法的开始符号出发,利用其中的产生式,逐步推导出待分析的符号串。如果能推导出这个符号串,则表明此符号串是该文法的一个句型或句子,否则便不是。
2.6.2 确定的自上而下分析方法(1) 当文法的某一个非终结符有几条产生式、而且每条产生式右部首符号都是终结符时,应保证它们是互不相同的终结符。 例 设文法G18[S]: S→aBcbCd B→eBf C→dCc 试检查符号串aefc是不是该文法的句子。
2.6.2 确定的自上而下分析方法(2) 上例推导过程: S→aBc,SaBc; B→eB,SaBcaeBc; B→f,SaBcaeBcaefc; 该例属确定的自上而下分析方法。
2.6.3 自下而上分析方法 自下而上分析方法的基本思想是从待检查的符号串出发,看最终是否能归约(推导的逆过程)到文法的识别符号。如果能归约到文法的识别符号,则表明此待检查的符号串是该文法的一个句型或句子,否则便不是。
2.6.4 文法在内存中的表示 用语法图的表格结构表示文法。一个文法的语法图由该文法所有非终结符号的定义图组成。每个非终结符号的定义图是一个结构型数据。 在自上而下分析方法中,用这种语法图表示文法有利于消除左递归,也有助于提取左因子。