《编译原理与技术》课件-第8章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《编译原理与技术》课件-第8章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理与技术 编译 原理 技术 课件
- 资源描述:
-
1、编译原理与技术编译原理与技术第第8章章属性文法和语义分析属性文法和语义分析 编译原理与技术编译原理与技术2主要内容主要内容u语义分析概况语义分析概况 u属性与属性文法属性与属性文法u属性的计算属性的计算 u数据类型与类型检查数据类型与类型检查 编译原理与技术编译原理与技术38.1 语义分析概况语义分析概况 语义分析在编译程序中的位置语义分析在编译程序中的位置 程序的语义涉及两个方面,即数据结构的语程序的语义涉及两个方面,即数据结构的语义域控制结构的语义。义域控制结构的语义。数据结构的语义主要指域标识符相关联的数数据结构的语义主要指域标识符相关联的数据对象,也即量的含义。控制结构的语义是据对象,
2、也即量的含义。控制结构的语义是语言定义的。语言定义的。语法分析器语义分析器中间代码生成器语法树语法树单词记号中间代码编译原理与技术编译原理与技术48.1 语义分析概况语义分析概况量涉及类型与值,值在程序运行时刻确定,而类型则由程序的量涉及类型与值,值在程序运行时刻确定,而类型则由程序的说明部分来规定。说明部分来规定。例如,例如,int x,y;float z;char array100;把把x、y、z和和array分别与整型、整型、实型和字符数组型关联分别与整型、整型、实型和字符数组型关联起来,它们分别代表相应类型的数据对象。起来,它们分别代表相应类型的数据对象。不同类型的数据对象有不同的机器
3、内部表示,占用不同的存储不同类型的数据对象有不同的机器内部表示,占用不同的存储空间,有不同的取值范围,对它们所能进行的运算也不同。只空间,有不同的取值范围,对它们所能进行的运算也不同。只有相同类型、因而具有相同机内表示的数据对象,或符合特定有相同类型、因而具有相同机内表示的数据对象,或符合特定要求的数据对象才能进行相应的运算。要求的数据对象才能进行相应的运算。当考虑标识符的相关含义时还必须要考虑到作用域的问题。当考虑标识符的相关含义时还必须要考虑到作用域的问题。确定标识符所关联的类型、作用域等属性信息,进行类型正确确定标识符所关联的类型、作用域等属性信息,进行类型正确性的检查成为语义分析的一个
4、基本工作。性的检查成为语义分析的一个基本工作。编译原理与技术编译原理与技术58.1 语义分析概况语义分析概况例如,对于例如,对于C的的while循环语句:循环语句:while();规定了首先计算规定了首先计算的值,如果为真的值,如果为真(或非(或非0)时,就执行)时,就执行;然后再计算然后再计算的值,并重复以上过程,的值,并重复以上过程,直到直到的值为假(或为的值为假(或为0),便结束循),便结束循环语句,执行环语句,执行while语句之后的语句。语句之后的语句。语义分析将分析各个语法结构的含义并做出语义分析将分析各个语法结构的含义并做出相应的语义处理。相应的语义处理。编译原理与技术编译原理与
5、技术68.1 语义分析概况语义分析概况u语义分析的基本功能语义分析的基本功能 确定类型确定类型 确定标识符所关联对象的数据类型。这部分工作有确定标识符所关联对象的数据类型。这部分工作有时由扫描器完成,扫描器将处理源程序的声明部分。时由扫描器完成,扫描器将处理源程序的声明部分。类型检查类型检查 按照语言的类型规则,对参加运算的运算分量进行按照语言的类型规则,对参加运算的运算分量进行类型检查,检查运算的合法性、运算分量类型的一致性(相容类型检查,检查运算的合法性、运算分量类型的一致性(相容性),对于不相容的运算对象,报告错误,必要时进行相应的性),对于不相容的运算对象,报告错误,必要时进行相应的类
6、型转换。类型转换。l例如,对于数组变量个函数变量的加法运算额出现,报告语义错例如,对于数组变量个函数变量的加法运算额出现,报告语义错误;对于整型与实型数据对象的加法,把它们转换成同一类型。误;对于整型与实型数据对象的加法,把它们转换成同一类型。控制流检查控制流检查 对于任何引起控制流离开一个结构的语句,程序对于任何引起控制流离开一个结构的语句,程序中必须由该控制转移可以转到的地方。中必须由该控制转移可以转到的地方。l例如,例如,C的的break语句引起控制离开最小包围的语句引起控制离开最小包围的while、for或或switch语句,如果这样的包围语句不存在,则是一个错误。语句,如果这样的包围
7、语句不存在,则是一个错误。编译原理与技术编译原理与技术78.1 语义分析概况语义分析概况u语义分析的基本功能语义分析的基本功能唯一性检查唯一性检查 有些场合,对象必须正好被定义一次。有些场合,对象必须正好被定义一次。例如,集合中的元素只能出现一次,对象类的名字不例如,集合中的元素只能出现一次,对象类的名字不能重复,分支语句的分情形常量必须区分能重复,分支语句的分情形常量必须区分.l在在Pascal语言中,标识符只能唯一第定义一次。语言中,标识符只能唯一第定义一次。关联名字检查关联名字检查 有时,同样的名字必须出现两次或更有时,同样的名字必须出现两次或更多次。多次。l例如,在例如,在C+语言中,
8、构造函数的名字必须和类型一致;在语言中,构造函数的名字必须和类型一致;在Ada语言中,循环或程序块可以有名字出现在其开始和结束,语言中,循环或程序块可以有名字出现在其开始和结束,编译程序必须检查两个地方的名字是否相同。编译程序必须检查两个地方的名字是否相同。识别含义识别含义 根据程序语言的形式或非形式语义规则,根据程序语言的形式或非形式语义规则,识别程序中各个构造成分组合到一起的含义,并做相识别程序中各个构造成分组合到一起的含义,并做相应的语义处理,应的语义处理,编译原理与技术编译原理与技术88.2 属性与属性文法属性与属性文法 u属性的引入属性的引入为了解释程序的语义、把程序翻译成可执行的代
9、码,需要对为了解释程序的语义、把程序翻译成可执行的代码,需要对文法符号引进一些表示程序语言结构性质的属性。文法符号引进一些表示程序语言结构性质的属性。例如变量数据类型、表达式值、存储地址、过程体代码以及例如变量数据类型、表达式值、存储地址、过程体代码以及数的有效数字个数等数的有效数字个数等.计算属性的值并把它和语言结构联系起来的过程称作属性的计算属性的值并把它和语言结构联系起来的过程称作属性的绑定。属性绑定发生在编译或运行过程的时刻叫做绑定时刻。绑定。属性绑定发生在编译或运行过程的时刻叫做绑定时刻。不同属性的绑定时刻不同,对于不同的语言,甚至同样的属不同属性的绑定时刻不同,对于不同的语言,甚至
10、同样的属性也有不同的绑定时刻。性也有不同的绑定时刻。在程序运行前绑定的属性称为静态的,只能在程序运行期间在程序运行前绑定的属性称为静态的,只能在程序运行期间才能绑定的属性是动态的。才能绑定的属性是动态的。编译原理与技术编译原理与技术98.2 属性与属性文法属性与属性文法u属性的引入属性的引入在静态类型语言诸如在静态类型语言诸如C和和Pascal中,变量或表达式的中,变量或表达式的数据类型是主要的编译时刻的属性,类型检查器就数据类型是主要的编译时刻的属性,类型检查器就是一个语义分析器,它计算语言实体的数据类型属是一个语义分析器,它计算语言实体的数据类型属性并验证这些类型符合语言的类型规则。性并验
11、证这些类型符合语言的类型规则。而而LISP或或Smalltalk中的数据类型是动态的,它们的中的数据类型是动态的,它们的编译必须产生计算类型的代码,然后在程序的运行编译必须产生计算类型的代码,然后在程序的运行过程中进行类型检查。过程中进行类型检查。表达式的值通常是动态的,编译只产生在程序运行表达式的值通常是动态的,编译只产生在程序运行期间计算表达式的值的代码。然而,有些表达式可期间计算表达式的值的代码。然而,有些表达式可能是常数,例如,能是常数,例如,3.12*5+10,语义分析器可以在编,语义分析器可以在编译的时候计算它们的值。译的时候计算它们的值。编译原理与技术编译原理与技术108.2 属
12、性与属性文法属性与属性文法u属性的引入属性的引入对于不同的语言或者变量自身的性质,变量的存储分对于不同的语言或者变量自身的性质,变量的存储分配可以是静态的、也可以是动态的。由于属性的计算配可以是静态的、也可以是动态的。由于属性的计算依赖与程序的运行环境,甚至时目标机的细节,所以依赖与程序的运行环境,甚至时目标机的细节,所以编译通常把属性的计算推迟到代码生成期间。编译通常把属性的计算推迟到代码生成期间。过程的目标码显然是静态属性。编译的代码产生器全过程的目标码显然是静态属性。编译的代码产生器全权负责这类属性的计算。权负责这类属性的计算。数的有效数字个数这个属性一般不在编译期间处理,数的有效数字个
13、数这个属性一般不在编译期间处理,它隐含在编译程序构造期间对这些数值实现的处理,它隐含在编译程序构造期间对这些数值实现的处理,通常是运行环境的一部分。然而,如果要正确地翻译通常是运行环境的一部分。然而,如果要正确地翻译常数,扫描器也需要知道允许的有效数字的个数。常数,扫描器也需要知道允许的有效数字的个数。编译原理与技术编译原理与技术118.2 属性与属性文法属性与属性文法u属性文法的定义属性文法的定义定义定义8.1 如果用如果用X表示一个文法符号,表示一个文法符号,a代表代表X的一的一个属性,那么,个属性,那么,X.a代表代表X的关联属性的关联属性a。定义定义8.2 对于一组属性对于一组属性a1
14、,a2,.,am和文法和文法G的每个产的每个产生式生式X0X1X2.Xn(X0是非终结符,其它的是非终结符,其它的Xi是是任意符号),意味着每个属性任意符号),意味着每个属性Xi.aj的值都和产生的值都和产生式中其它属性有关系,每个关系可以表示成属性等式中其它属性有关系,每个关系可以表示成属性等式或语义规则的形式:式或语义规则的形式:Xi.aj i(a1,a2,.,am)定义定义8.3 属性文法就是对于一组属性属性文法就是对于一组属性a1,a2,.,am和文和文法法G的每个产生式的所有的语义规则,其中文法的每个产生式的所有的语义规则,其中文法G称为基础文法。称为基础文法。编译原理与技术编译原理
15、与技术128.2 属性与属性文法属性与属性文法u属性文法通常写成下列表格形式:属性文法通常写成下列表格形式:语法产生式语法产生式语义规则语义规则X 关联的属性等式关联的属性等式编译原理与技术编译原理与技术138.2 属性与属性文法属性与属性文法数的最重要的属性就是它的值,命名为数的最重要的属性就是它的值,命名为val。每个数字都有一个值,可以直接从它表。每个数字都有一个值,可以直接从它表示的实际数字得到。所以,文法规则示的实际数字得到。所以,文法规则 digit 0意味着在这个情况下意味着在这个情况下digit有有0值,可值,可以表示成属性等式以表示成属性等式digit.val:=0,并把它和
16、文法规则,并把它和文法规则 digit 0关联在一起。关联在一起。如果运用规则如果运用规则number digit得到了数,那么,这个数就值包含一个数字,其值就得到了数,那么,这个数就值包含一个数字,其值就等于这个数字的值,它的属性等式可以表示成等于这个数字的值,它的属性等式可以表示成number.val=digit.val。如果数从文法规则如果数从文法规则number number digit得到,那么我们必须规则左边符号的值得到,那么我们必须规则左边符号的值和文法规则右边符号的值之间的关系。和文法规则右边符号的值之间的关系。注意,文法规则两边出现的注意,文法规则两边出现的number完全不
17、同(用下标表示),这是由于它们具有不完全不同(用下标表示),这是由于它们具有不同的值。同的值。考虑数考虑数83的最右推导:的最右推导:number number digit digit digit digit3 83在第一步使用的文法规则在第一步使用的文法规则number1 number2 digit,其中,其中number2表示数字表示数字8,而而digit对应对应3,它们的值分别是,它们的值分别是8和和3。为了得到。为了得到number1的值的值83,必须使用的下列,必须使用的下列计算:计算:838*10+3。这对应了属性等式:。这对应了属性等式:number1.val:=number2.
18、val 10+digit.val例例8.1 考虑下列无符号数的简单语法G8.1number number digit|digitdigit 0|1|2|3|4|5|6|7|8|9编译原理与技术编译原理与技术148.2 属性与属性文法属性与属性文法表8.2 例8.1的属性文法文法规则语义规则number1 number2 digitnumber1.val:=number2.val 10+digit.valnumber digitnumber.val:=digit.valdigit 0digit.val:=0digit 1digit.val:=1.digit 8digit.val:=8digit
19、9digit.val:=9number(val=81*10+3=813)number(val=8*10+1=81)digit(val=3)digit(val=1)digit(val=8)digit(val=8)83 1 图8.1 数813带属性计算的的语法分析树 编译原理与技术编译原理与技术158.2 属性与属性文法属性与属性文法u例例8.2 考虑的简单算术表达式考虑的简单算术表达式的语法的语法G5.1:E E+T|E-T|TT T F|FF (E)|num文法规则语义规则E1 E2+TE1.val:=E2.val+T.valE1 E2-TE1.val:=E2.val T.valE TE.va
20、l:=T.valT1 T2 FT1.val:=T2.val*F.valT FT.val:=F.valF (E)F.val:=E.valF numF.val:=num.val主要属性就是所有非终结符的数值,记做主要属性就是所有非终结符的数值,记做val。这些属性等式描述了表达式的语法关系以及要执行的算术运算的语义。这些属性等式描述了表达式的语法关系以及要执行的算术运算的语义。注意,这个文法没有把注意,这个文法没有把num当作非终结符,也就没有当作非终结符,也就没有num.val在等号在等号左边的属性等式,所以,使用该属性文法时左边的属性等式,所以,使用该属性文法时num.val的值必须在语义的值
21、必须在语义分析前(通常由词法分析器)得到。分析前(通常由词法分析器)得到。如果想明显地在文法中计算如果想明显地在文法中计算num的属性值,可以增加产生式规则,并的属性值,可以增加产生式规则,并对这个属性文法增加如同例子对这个属性文法增加如同例子8.1一样的属性等式。一样的属性等式。编译原理与技术编译原理与技术168.2 属性与属性文法属性与属性文法 (52 3)30的计算语义的计算语义表示在如图表示在如图8.2的语法的语法分析树中。分析树中。自底向上地遍历树就可以自底向上地遍历树就可以得到表达式的值。得到表达式的值。E(val=1470)E(val=523=49)num(val=30)T(va
22、l=1)E(val=52)E(val=49*30=1470)F(val=30)T(val=49)()F(val=3)num(val=3)F(val=53)num(val=52)T(val=52)编译原理与技术编译原理与技术178.2 属性与属性文法属性与属性文法例例8.3:考虑下面这个表示变量声明的语法G8.2:decl type var-listtype int|floatvar-list id,var-list|id我们希望为声明中标识符代表的每个变量定义一个数据类型的属性,并且构造属性等式来表达数据类型属性与声明类型的关系。定义的dtype表示数据类型属性。属性dtype的取值范围是集合
23、integer,real,对应了符号int和float。非终结符type的属性dtype由其所代表的符号给定。根据语法规则decl type var-list,这个属性dtype对应了变量表var-list的dtype。变量表中的每个标识符id都有相同的属性dtype。注意,非终结符decl没有属性定义。事实上,并非每个文法符号都需要定义属性和属性等式。文法规则语义规则decl type var-listvar-list.dtype:=type.dtypetype inttype.dtype:=integertype floattype.dtype:=realvar-list1 id,var-
24、list2id.type:=var-list1.dtypevar-list2.type:=var-list1.dtypevar-list idid.type:=var-list.dtype编译原理与技术编译原理与技术188.2 属性与属性文法属性与属性文法例例8.4 考虑下面这个对文法G8.1做了改动的文法G8.3:based-num num basecharbasechar o|dnum num digit|digitdigit 0|1|2|3|4|5|6|7|8|9定义的数可以是8进制(末尾是记号o)、也以是10进制(末尾是记号d)。在这中情况下,num和digit需要一个新的表示底数的属
25、性base,用于计算值属性val。文法规则语义规则based-num num basecharbased-num.val:=num.valnum.base:=basechar.basebasechar obasechar.base:=8basechar dbasechar.base:=10num1 num2 digitnum1.val:=if digit.val=error or num2.val=errorthen errorelse num2.val num1.base+digit.valnum2.base:=num1.basedigit.base:=num1.basenum digitn
展开阅读全文