《第二章文法和语言的概念和表示27482.pdf》由会员分享,可在线阅读,更多相关《第二章文法和语言的概念和表示27482.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章 文法和语言的概念和表示 本章概述 本章中,我们将概述高级程序语言的结构和主要的共同特征,并介绍程序语言的语法描述方法。主要学习内容:程序设计语言的定义,高级语言的一般特性,高级语言的语法描述,上下文无关文法,语法分析树和二义性,乔姆斯基文法体系。学习目标:理解程序语言的词法、语法和语义等概念,进一步掌握高级程序设计语言的一般结构和主要共同特征,使学生具有必要的基础知识;理解文法和语言的一些基本概念,如文法的定义和构造、句型、句子、语言、推导、语法树等。学习重点和难点:语法,语义,文法的构造。2.1 概述 显然,用高级语言编程比用低级语言来得方便,但要解决两个问题:1.计算机怎样懂得高级
2、语言程序,这就需要一个翻译程序实现从源程序到目标程序的转换。2.用什么方法来精确定义高级语言,即怎样精确描述高级语言。要构造一个编译程序,应深刻理解被编译的源语言的结构(即词法和法)及其含义(即语义),同时要弄清源语言的语法规则和语义规则是采用什么理论或什么方法来描述的。当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是由主语后随谓语而成,构成谓语的是动
3、词和直接宾语。任何语言均可看作一个集合。这个集合中的每个元素都是在一定符号集(字母表)上的一个符号串。对于自然语言来说,它们是定义在某个字母表上的句子的集合。对于程序语言来说,它们也是定义在某个字母表上的句子的集合。这里的句子,就是一个源程序。通常,源程序是由关键字、标识符、常数、运算符以及一些界限符组成。这些语法成分统称为单词或单词符号。单词符号是语言中具有独立意义的最基本单位。语言的单词符号是由词法规则所确定的,即词法规则规定了单词符号的形成规则。“我是大学生”是汉语的一个句子。用语法来描述:句子=主语 谓语 主语=代词名词 代词=我你他 名词=王明大学生工人英语 谓语=动词 直接宾语 动
4、词=是学习 直接宾语=代词名词 有了这一组规则以后,按照如下方式用它们导出句子:开始去找=左端的带有句子的规则并把它由=右端的符号串代替,这个动作表示成:句子主语 谓语,然后在得到的串主语 谓语中,选取主语或谓语,再用相应规则的=右端代替之。比如,选取了主语,并采用规则主语=代词,那么得到:主语 谓语代词 谓语,重复做下去,这样句子“我是大学生”的导出的全部动作过程是:句子主语 谓语 代词 谓语 我谓语 我动词 直接宾语 我是名词 我是大学生 语言概述:语言是由句子组成的集合,是由一组符号所构成的集合。汉语所有符合汉语语法的句子的全体 英语所有符合英语语法的句子的全体 程序设计语言所有该语言的
5、源程序的全体 研究语言 每个句子构成的规律 每个句子的含义 每个句子和使用者的关系 研究程序设计语言 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系 语言研究的三个方面 语法 Syntax 语义 Semantics 语用 Pragmatics 语法 表示构成语言句子的各个记号之间的组合规律。程序语言的语法通常是指这样的一组规则,用它可以形成和产生一系列合式的程序。这组规则称为语法规则。语义 表示各个记号的特定含义。(各个记号和记号所表示的对象之间的关系)。程序语言的语义通常是指这样的一组规则,用它可以定义一个程序的意义。这组规则称为语义规则。语用 表示在各个记号所出现的行为中,它们
6、的来源、使用和影响。每种语言具有两个可识别的特性,即语言的形式和该形式相关联的意义。语言的实例若在语法上是正确的,其相关联的意义可以从两个观点来看:其一是该句子的创立者所想要表示的意义;另一是接收者所检验到的意义。这两个意义并非总是一样的,前者称为语言的语义,后者是其语用意义。幽默、双关语和谜语就是利用这两方面意义间的差异。如果不考虑语义和语用,即只从语法这一侧面来看语言,这种意义下的语言称作形式语言。形式语言抽象地定义为一个数学系统。“形式”是指这样的事实:语言的所有规则只以什么符号串能出现的方式来陈述。形式语言理论是对符号串集合的表示法、结构及其特性的研究。是程序设计语言语法分析研究的基础
7、。2.2 形式语言基础 2.2.1 字母表和符号串(1)字母表:符号的非空有限集合。例:=a,b,c (2)符号:字母表中的元素。例:a,b,c (3)符号串:符号的有穷序列。例:a,aa,ac,abc,空符号串:无任何符号的符号串或长度为零的符号串,记为。符号串的形式定义 有字母表,定义:是上的符号串;若 x 是上的符号串,且 a,则 ax 或 xa 是上的符号串;y 是上的符号串,iff(当且仅当)y 可由(1)和(2)产生。2.2.2 符号串和符号串集合的运算(1)符号串相等:若 x、y 是集合上的两个符号串,则 xy iff(当且仅当)组成 x 的每一个符号和组成 y 的每一个符号依次
8、相等。(2)符号串的长度:x 为符号串,其长度|x|等于组成该符号串的符号个数。例:xSTV,|x|3 (3)符号串的联接:若 x、y 是定义在 是上的符号串,且 xXY,yYX,则 x 和 y的联接 xyXYYX 也是 上的符号串。注意:一般 xyyx,而 xx (4)符号串集合的乘积运算:令 A、B 为符号串集合,定义 AB xy|xA,yB(5)符号串集合的幂运算:有符号串集合 A,定义 A0=,A1=A,A2=AA,A3=AAA,AnAn-1A=AAn-1 ,n0(6)符号串集合的闭包运算:设 A 是符号串集合,定义 A A1 A2 A3 An 称为集合 A 的正闭包。A*A0 A 称
9、为集合 A 的闭包。例:A=x,y Ax,y,xx,xy,yx,yy,xxx,xxy,xyx,xyy,A1 A2 A3 A*,x,y,xx,xy,yx,yy,xxx,xxy,xyx,xyy,A0 A1 A2 A3 为什么对符号、符号串、符号串集合以及它们的运算感兴趣?若 A 为某语言的基本字符集 Aa,b,z,0,1,9,+,/,(,),=B 为单词集 B=begin,end,if,then,else,for,则 B A*。语言的句子是定义在 B 上的符号串。若令 C 为句子集合,则 C B*,程序 C 2.3 文法的直观理解(1)什么是文法:文法是对语言结构的定义与描述。即从形式上用于描述和
10、规定语言结构的称为“文法”(或称为“语法”)。例:有一句子:“我是大学生”。这是一个在语法、语义上都正确定句子,该句子的结构(称为语法结构)是由它的语法决定的。在本例中它为“主谓结构”。如何定义句子的合法性?如何定义有穷语言、无穷语言?(2)语法规则:我们通过建立一组规则(产生式),来描述句子的语法结构。规定用“:”表示“由组成”或“定义为”。如::|:你|我|他:王民|大学生|工人|英语 :是|学习 :|(3)由产生式推导句子:有了一组产生式之后,可以按照一定的方式用它们去推导或产生句子。推导方法:从一个要识别的符号开始推导,即用相应产生式的右部来替代产生式的左部,每次仅用一条产生式去进行推
11、导。如:这种推导一直进行下去,直到所有带的符号都由终结符号替代为止。我 我是 我是 我是大学生 例:有一英语句子:The big elephant ate the peanut.:the:big :elephant:ate:peanut the the big the big elephant the big elephant the big elephant ate the big elephant ate the big elephant ate the the big elephant ate the peanut 上述推导可写成 the big elephant ate the pea
12、nut 说明:(1)有若干语法成分同时存在时,我们总是从最左的语法成分进行推导,这称之为最左推导,类似的有最右推导(一般推导)。(2)从一组产生式可推出不同的句子,如以上产生式还可推出“大象吃象”、“大花生吃象”、“大花生吃花生”等句子,它们 在语法上都正确,但在语义上都不正确。所谓文法是在形式上对句子结构的定义与描述,而未涉及语义问题。(4)语法树:我们用一种树型结构来描述一个句子的语法结构。称之为语法树。如:2.4 文法和语言的形式定义 2.4.1 文法的定义 文法定义:文法是产生式的有穷集合,通常定义为四元组:G=(VN,VT,P,Z)其中:VN:非终结符号集 VT:终结符号集 P:产生
13、式或规则的集合 Z:开始符号(识别符号),ZVN 注意:A.产生式:产生式是一个有序对(U,x),通常写为:U:=x 或 U x;|U|=1|x|0 B.非终结符号:出现在产生式的左部,且能推出符号或符号串的那些符号。其全体构成非终结符号集,记为 VN。C.终结符号:不出现在产生式的左部,且不能推出符号或符号串的那些符号。其全体构成终结符号集,记为 VT。且 VN VT ,VN VT V(V是文法的字母表)。例:无符号整数的文法:G=(VN,VT,P,E)VN,VT =0,1,2,3,9 P=;0;1;9;Z=;几点说明:产生式左边符号构成集合 VN,且 Z VN。有些产生式具有相同的左部,可
14、以合在一起。例:;|;0|1|2|3|9 给定一个文法,实际只需给出产生式集合,并指定识别符号。例:G:;|;0|1|2|3|9 2.4.2 推导与归约 直接推导定义:有文法 G 且有 v xUy,w xuy,其中 x、y V*,U VN,u V*,若 U:=uP,则说 v 直接推导出 w,记为 v w。若 x y ,有 U:=u,则说 U 直接推导出 u,记为 U u。换句话说,设 x 和 y 是 x 和 y 是符号串,若使用一次产生式可以从 x 变换出 y,则称 x直接推导出 y(或者说 y 是 x 的直接推导),记为 x y。例如:GN:N ND|D D 0|1|2|3|4|5|6|7|
15、8|9 N (1)ND(2)NDD(3)ND9(4)N09(5)N09(6)109 当 x 和 y 是符号串已没有非终结符号时,推导就必须终止。因为终结符不可能出现在产生式左部,所以将在产生式左部出现的符号称为非终结符号。推导定义:+推导:x 和 y 是 x 和 y 是符号串,若使用若干次产生式可以从 x 变换出 y,则称 x 推导出 y(或者说 y 是 x 的推导),记为 x y。或者说:若有直接推导序列:x U0 U1 U2 Uny,则 x y。例:N (1)ND (2)NDD (3)ND9 (4)N09 (5)N09 (6)109 则有:N 109。*推导:x 和 y 是 x 和 y 是
16、符号串,若使用零次或若干次产生式可以从 x 变换出 y,则称 x*推导出 y(或者说 y 是 x 的*推导),记为 x y。最右推导:若 x 和 y 是符号串 中有两个以上的非终结符号时,对推导的每一步坚持把 中的最右非终结符号进行替换,称为最右推导。最左推导:若 x 和 y 是符号串 中有两个以上的非终结符号时,对推导的每一步坚持把 中的最左非终结符号进行替换,称为最左推导。直观意义:规范推导最右推导 归约定义:推导的逆过程称之为归约。例:x y,可称为 x 直接推导出 y,也可称为 y 直接归约出 x。x y,可称为 x 推导出 y,也可称为 y 归约出 x。句型定义:给定文法 GZ,x
17、是句型当且仅当 Z x,且 x V*;句子定义:给定文法 GZ,x 是句子当且仅当 Z x,且 x VT*;语言定义:给定文法 GZ,语言 L(GZ)=x|z x,xVT*;例:对给定的语言abna|n1,构造其文法为:G1Z:ZaBa,B b|bB G2Z:ZaBa,B b|Bb 文法等价定义:G 和 G是两个不同的文法,若 L(G)=L(G),则 G 和 G 为等价文法。编译感兴趣的问题是:给定 x,G,求 x L(G)?2.4.3 递归文法 1.递归产生式:产生式右部有与左部相同的符号 对于 U:xUy,若 x ,即 U:Uy,左递归;若 y ,即 U:xU,右递归;2.递归文法:文法
18、G,存在 U Vn,if U U,则 G 为递归文法;if U U,则 G 为左递归文法;if U U,则 G 为右递归文法;3.左递归文法的缺点:不能用自顶向下的方法进行语法分析。4.递归文法的优点:可用有穷条产生式,定义无穷语言。例:对于前面给出的无符号整数的文法是有递归文法,我们用了 13 条产生式就可以定义出所有的无符号整数。若不用递归文法,那将要用多少条产生式呢?2.5 文法分类 形式语言:用文法和自动机所描述的没有语义的语言。语言定义:L(GZ)=x|Z x,xVT*文法定义:乔姆斯基将所有文法都定义为一个四元组:G=(VN,VT,P,Z)VN:非终结符号集 VT:终结符号集 P:
19、产生式或规则的集合 Z:开始符号(识别符号),ZVN 文法和语言分类:0 型、1 型、2 型、3 型 这几类文法的差别在于对产生式施加不同的限制。定义:0 型文法:P:u:v,其中 u V,v V*0 型文法称为短语结构文法。产生式的左部和右部都可以是符号串,一个短语可以产生另一个短语。0 型语言:L0。这种语言可以用图灵机(Turing)接受。1 型文法:P:xUy:=xuy,其中 UVN,x、y、u V*1 型文法也称为上下文敏感或上下文有关。也即只有在 x、y 这样的上下文中才能把 U 改写为 u。1 型语言:L1。这种语言可以由一种线性界限自动机接受。2 型文法:P:U:=u,其中 U
20、VN,uV*2 型文法也称为上下文无关文法。也即把 U 改写为 u 时,不必考虑上下文。注意:2 型文法与 BNF表示相等价。2 型语言:L2。这种语言可以由下推自动机接受。3 型文法:(左线性)P:U:=T 或 U:=T,其中 U、T VN,VT(右线性)P:U:=T 或 U:=T,其中 U、T VN,VT 3型文法也称为正则文法。它是对 2 型文法进行进一步限制。3 型语言:L3。又称正则语言、正则集合。这种语言可以由有穷自动机接受。根据上述讨论,L0 L1 L2 L3。0 型文法可以产生 L0、L1、L2、L3,但 2 型文法只能产生 L2,不能产生 L1。2.6 语法树与二义性文法 2
21、.6.1 推导与语法树(1)语法树:句子结构的图示表示法,它是一种有向图,由结点和有向边组成。如下图:结点:符号 根结点:识别符号 中间结点:非终结符 叶结点:终结符或非终结符 有向边:表示结点间的派生关系。(2)句型的推导及语法树的生成(自顶向下)给定 GZ,句型 w:可建立推导序列,Z w 可建立语法树,以 Z 为树根结点,每步推导生成语法树的一枝,最终可生成句型的语法树。注意一个重要事实:文法所能产生的句子,可以用不同的推导原则(使用产生式顺序不同)将其推导出来。语法树的生成规律不同,但最终生成的语法树形状完全相同。某些文法有此性质,而某些文法不具此性质。句子 10 的语法树:(3)子树
22、与简单子树 子树:语法树中的某个结点(子树的根)连同它向下派生的部分所组成。简单子树:只有单层分枝的子树称为简单子树。(4)树与推导 句型推导过程 句型语法树的生长过程 由推导构造语法树 从识别符号开始,自左向右建立推导序列。由根结点开始,自上而下建立语法树。例:有文法 G,并给定句型 10,其推导过程及语法树的生长过程分别为:1 10 由语法树构造归约:自下而上地修剪子树的末端结点,直至把整棵树剪掉(留根),每剪一次对应一次归约。从句型开始,自右向左地逐步进行归约,可以建立一个归约序列。规范归约定义:对句型中最左简单短语(句柄)进行的归约称为规范归约。规范归约与规范推导互为逆过程。规范句型
23、定义:通过规范推导或规范归约所得到的句型称为规范句型。在上例中,1 就不是规范句型,因为:=1=10 注意:其中符号=表示为归约。2.6.2 文法的二义性 二义性文法定义:若对于一个文法的某一句子存在两棵不同的语法树,则该文法是二义性文法,否则是无二义性文法 或:若一个文法的某句子存在两个不同的规范推导,则该文法是二义性的,否则是无二义性的。或:若一个文法的某规范句型的句柄不唯一,则该文法是二义性的,否则是无二义性的。换而言之,无二义性文法的句子只有一棵语法树,尽管推导过程可以不同。下面举一个二义性文法的例子。例:给定文法 GE:P:E E+E|E*E|(E)|i VN=E VT=+,*,(,
24、),i 对于句子 S i i*iL(GE),存在不同的规范推导:(1)E E+E E+E*E E+E*i E+i*i ii*i(2)E E*E E*i E+E*i E+i*i ii*i 这两种不同的推导对应了两种不同的语法树:以上是自顶向下来看文法的二义性,我们还可以自底向上来看文法的二义性。上例中,规范句型 E+E*i 是由 i i*i 通过两步规范规约得到的,但对于同一个句型 E+E*i,它有两个不同的句柄(对应上述两棵不同的语法树):i 和 EE。因此语法的二义性意味着句型的句柄不唯一。若文法是二义性的,则在编译时就会产生不确定性,遗憾的是在理论上已经证明:文法的二义性是不可判定的,即不
25、可能构造出一个算法,通过有限步骤来判定任一文法是否有二义性。现在的解决办法是:提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。由于无二义性文法比较简单,我们也可以采用另一种解决办法:即不改变二义性文法,而是确定一种编译算法,使该算法满足无二义性充分条件。例:算术表达式的文法 E E+E|E*E|(E)|i E E+T|T T T*F|F F (E)|i 例:Pascal 条件语句的文法:=If then|If then else :=|。2.7 句型的分析 任务:给定 GZ:S VT*,判定是否有 S L(GE)?这是词法分析和语法分析所要做的工作,
26、将在第三、四章中详细介绍。2.7.1句型的短语、简单短语和句柄 短语定义:设 GZ是给定文法,w=xuyV+,为该文法的句型,如果满足下面两个条件:Z xUy;U u;则称句型 xuy 中的子串 u 是句型 xuy的短语。简单短语定义:设 GZ是给定文法,w=xuyV+,为该文法的句型,如果满足下面两个条件:Z xUy;U u;则称句型 xuy 中的子串 u 是句型 xuy的简单短语(或直接短语)。直观理解:短语是前面句型中的某个非终结符所能推出的符号串。句柄定义:任一句型的最左简单短语称为该句型的句柄。2.7.2 确定句柄的步骤 确定句柄的步骤为:短语 简单短语 句柄 注意:短语、简单短语是
27、相对于句型而言,一个句型可能有多个短语、简单短语,句柄只能有一个。例:给定文法 G:ET|E+T|ET TF|T*F|TF Fi|(E)符号串(T+i)*iF 是文法 G 的一个句型,求其短语、简单短语和句柄。解:对于符号串(T+i)*iF 有推导:E E-T E-T T*F-T F*F-T(E)*F-T(T+T)*F-T(T+F)*F-T(T+i)*F-T(T+i)*i-T(T+i)*i-T 对应有语法树见下图:依定义求,短语有 8 个:1.E E,E(T+i)*iF 则有短语:(T+i)*iF 2.E T F,T(T+i)*i 则有短语:(T+i)*i 3.E T*iF,T(T+i)则有短
28、语:(T+i)4.E(E)*iF,E T+i 则有短语:T+i 5.E(E+i)*iF,E T 则有短语:T 6.E(T+F)*iF,F i 则有短语:第一个 i 7.E(T+i)*FF,F i 则有短语:第二个 i 8.E(T+i)*FT,T F 则有短语:F 其简单短语有 4 个:1.E(E+i)*iF,E T 则有:T 2.E(T+F)*iF,F i 则有:第一个 i 3.E(T+i)*FF,F i 则有:第二个 i 4.E(T+i)*FT,T F 则有:F 句柄有 1 个:T 用语法树也可以求短语、简单短语和句柄。对上例经过分析可以得到结论:用语法树求短语、简单短语和句柄的方法是:1)
29、每个句型都有一棵语法树;2)每棵语法树的叶(从左到右)组成一句型;3)每个子树 的叶(从左到右)组成一短语;4)每个简单子树 的叶(从左到右)组成一简单短语;5)最左简单子树 的叶(从左到右)组成一句柄。所以我们只需画出句型的语法树,然后根据子树找短语简单短语句柄。2.8 有关文法的实用限制 2.8.1 有害产生式 若文法中有如 U:=U 的产生式,则这就是有害产生式,它会引起二义性。例如存在 U:=U,U:=a|b,则有两棵不同的语法树:U U|a U|a 2.8.2 多余产生式(1)在推导文法的所有句子中,始终用不到的产生式。即该产生式的左部非终结符不出现在任何句型中。(2)在推导句子的过
30、程中,一旦使用了该产生式,将推不出任何终结符号串。即该产生式中含有推不出任何终结符号串的非终结符。该产生式是多余产生式。例如给定 GZ,若其中关于 U 的产生式只有如下一条:U:xUy 该产生式是多余产生式。在文法中应该去除多余产生式。若某文法中无有害产生式或多余产生式,则称该文法是压缩过的。2.8.3文法的其它表示法(1).扩充的 BNF表示 BNF的元符号:,:=,|扩充的 BNF的元符号:,:=,|,(,)其中:花括号中内容表示重复出现(即循环出现);方括号中内容表示选择出现。(2).语法图 文法另外一种表示法是使用一种称之为语法图的表示法。如 PASCAL语言的标识符和无符号整数的语法图见下图。本章内容总结 通过这一章的学习,我们学习了程序设计语言的定义,高级语言的一般特性,高级语言的语法描述,上下文无关文法,语法分析树和二义性,乔姆斯基文法体系。在下一章中,我们将讨论词法分析程序的构造。