编译原理与技术讲义-第8章

编译原理与技术讲义-第8章

ID:21559991

大小:402.50 KB

页数:71页

时间:2018-10-19

编译原理与技术讲义-第8章_第1页
编译原理与技术讲义-第8章_第2页
编译原理与技术讲义-第8章_第3页
编译原理与技术讲义-第8章_第4页
编译原理与技术讲义-第8章_第5页
资源描述:

《编译原理与技术讲义-第8章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、编译原理与技术第8章属性文法和语义分析青岛大学信息工程学院主要内容语义分析概况属性与属性文法属性的计算数据类型与类型检查编译原理与技术28.1语义分析概况语义分析在编译程序中的位置程序的语义涉及两个方面,即数据结构的语义域控制结构的语义。数据结构的语义主要指域标识符相关联的数据对象,也即量的含义。控制结构的语义是语言定义的。语法 分析器语义 分析器中间代码 生成器语法树语法树单词记号中间代码编译原理与技术38.1语义分析概况量涉及类型与值,值在程序运行时刻确定,而类型则由程序的说明部分来规定。例如,intx,y;floatz;chararray[100];把x、y、z和

2、array分别与整型、整型、实型和字符数组型关联起来,它们分别代表相应类型的数据对象。不同类型的数据对象有不同的机器内部表示,占用不同的存储空间,有不同的取值范围,对它们所能进行的运算也不同。只有相同类型、因而具有相同机内表示的数据对象,或符合特定要求的数据对象才能进行相应的运算。当考虑标识符的相关含义时还必须要考虑到作用域的问题。确定标识符所关联的类型、作用域等属性信息,进行类型正确性的检查成为语义分析的一个基本工作。编译原理与技术48.1语义分析概况例如,对于C的while循环语句:while(<表达式>)<循环语句体>;规定了首先计算<表达式>的值,如果为真(或非

3、0)时,就执行<循环语句体>;然后再计算<表达式>的值,并重复以上过程,直到<表达式>的值为假(或为0),便结束循环语句,执行while语句之后的语句。语义分析将分析各个语法结构的含义并做出相应的语义处理。编译原理与技术58.1语义分析概况语义分析的基本功能确定类型确定标识符所关联对象的数据类型。这部分工作有时由扫描器完成,扫描器将处理源程序的声明部分。类型检查按照语言的类型规则,对参加运算的运算分量进行类型检查,检查运算的合法性、运算分量类型的一致性(相容性),对于不相容的运算对象,报告错误,必要时进行相应的类型转换。例如,对于数组变量个函数变量的加法运算额出现,报告

4、语义错误;对于整型与实型数据对象的加法,把它们转换成同一类型。控制流检查对于任何引起控制流离开一个结构的语句,程序中必须由该控制转移可以转到的地方。例如,C的break语句引起控制离开最小包围的while、for或switch语句,如果这样的包围语句不存在,则是一个错误。编译原理与技术68.1语义分析概况语义分析的基本功能唯一性检查有些场合,对象必须正好被定义一次。例如,集合中的元素只能出现一次,对象类的名字不能重复,分支语句的分情形常量必须区分.在Pascal语言中,标识符只能唯一第定义一次。关联名字检查有时,同样的名字必须出现两次或更多次。例如,在C++语言中,构造

5、函数的名字必须和类型一致;在Ada语言中,循环或程序块可以有名字出现在其开始和结束,编译程序必须检查两个地方的名字是否相同。识别含义根据程序语言的形式或非形式语义规则,识别程序中各个构造成分组合到一起的含义,并做相应的语义处理,编译原理与技术78.2属性与属性文法属性的引入为了解释程序的语义、把程序翻译成可执行的代码,需要对文法符号引进一些表示程序语言结构性质的属性。例如变量数据类型、表达式值、存储地址、过程体代码以及数的有效数字个数等.计算属性的值并把它和语言结构联系起来的过程称作属性的绑定。属性绑定发生在编译或运行过程的时刻叫做绑定时刻。不同属性的绑定时刻不同,对于

6、不同的语言,甚至同样的属性也有不同的绑定时刻。在程序运行前绑定的属性称为静态的,只能在程序运行期间才能绑定的属性是动态的。编译原理与技术88.2属性与属性文法属性的引入在静态类型语言诸如C和Pascal中,变量或表达式的数据类型是主要的编译时刻的属性,类型检查器就是一个语义分析器,它计算语言实体的数据类型属性并验证这些类型符合语言的类型规则。而LISP或Smalltalk中的数据类型是动态的,它们的编译必须产生计算类型的代码,然后在程序的运行过程中进行类型检查。表达式的值通常是动态的,编译只产生在程序运行期间计算表达式的值的代码。然而,有些表达式可能是常数,例如,3.1

7、2*5+10,语义分析器可以在编译的时候计算它们的值。编译原理与技术98.2属性与属性文法属性的引入对于不同的语言或者变量自身的性质,变量的存储分配可以是静态的、也可以是动态的。由于属性的计算依赖与程序的运行环境,甚至时目标机的细节,所以编译通常把属性的计算推迟到代码生成期间。过程的目标码显然是静态属性。编译的代码产生器全权负责这类属性的计算。数的有效数字个数这个属性一般不在编译期间处理,它隐含在编译程序构造期间对这些数值实现的处理,通常是运行环境的一部分。然而,如果要正确地翻译常数,扫描器也需要知道允许的有效数字的个数。编译原理与技术1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。