- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 - Read
类型检查 第六章 类 型 检 查 本章内容 静态检查中最典型的部分 — 类型检查: 类型系统、类型检查、多态函数、重载。 忽略其它的静态检查:控制流检查、唯一性检查 、相关名字检查。 语义分析 类型检查 验证程序中执行的每个操作是否遵守语言的类型系统的过程,编译程序必须报告不符合类型系统的信息。 控制流检查 控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存在包括它的这样的语句,则就报错。 一致性检查 在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。 相关名字检查 有时,同一名字必须出现两次或多次。例如,Ada语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。 名字的作用域分析 C语言对除记录(结构)以外的所有类型使用结构等价,而记录类型用的是名字等价,以避免类型图中的环。 6.2.2 类型检查 类型检查可以分为动态和静态两种。 动态检查在运行时刻完成。功效很低。但是如果语言允许动态确定类型,动态检查是必须的。 静态检查在编译时刻完成。静态检查是高效的。 如果一个语言能够保证经过静态检查之后,程序没有运行时刻的类型错误,则称为强类型的。 类型检查的内容包括: 表达式 语句 函数 ??6.2.2 类型转换 一般的程序设计语言中都规定了某些类型之间的转换关系:比如说整数量可以被当作实数量参与运算,并且不需要程序员显式说明。 不同类型的常数在计算机中有不同的表示。当一个值需要转换成为其它类型使用的时候,需要使用某些代码进行转换。 因此,编译程序要识别需要进行类型转换的地方,并相应地生成代码。 程序设计语言的设计者需要考虑什么情况下需要和可以进行转换。 运算符(函数)的重载 多态函数 重载运算符(overloading operator) 根据上下文可以执行不同的运算。+是重载符号,在A+B中,当A和B为整数、实数、复数或者矩阵时,运算符执行不同类型的运算。当出现重载运算符时,要确定它所表示的唯一的意义,称为运算符识别。检查运算符的操作数。 多态函数 能实现对数据结构进行操作的算法,不管数据结构的元素类型是什么。 多态函数的特点 每次被调用时,传递过来的参数可以具有不同类型。 ??? 考虑表达式x +i,其中x是实型,i是整形,它的 后缀式可能是 ??? ?????x i inttoreal real+ ??? 语言的定义会指出必须要做的类型转换。 例如,当整数赋给实型变量时,应该把赋值号右边对 象转换成左边对象的类型。 ??例6.6 ?考虑把算术运算符op作用于常数和标识符形成的表达式,假设运算对象有整型和实型两个类型?,函数lookup(e)返回符号表中保存在e条目中的类型。 ??6.2.2 类型转换 ? ?E→num {E.type:=integer} ?? ?E→num . num {E.type:=real} ????E→id {E.type:=lookup(id.entry)} ????E→E1 op E2 {E.type:= IF (E1.type=integer)AND(E2.type=integer) ??? ???THEN integer ELSE ????IF (E1.type=integer)AND(E2.type=real) ??? ???THEN real ELSE ??? IF (E1.type=real)AND(E2.type=integer) ??? ???THEN real ?ELSE ??? IF (E1.type=real)AND(E2.type=real) ??? ??????THEN real ?ELSE type_error } ??? ?????图6-9 需要强制类型转换的类型检查 * * 每个程序设计语言都有自己的类型机制,包括类型说明和使用。 ? 类型分析是编译器语义分析的重要组成部分?。编译器首先根据类型说明,确定每一个变量和常量的类型?,计算其使用存储空间的大小,从而建立其到存储空间的映射。进而,编译器要确定每个语言结构的类型,以完成下面的主要任务: (1) 判定重载算符(函数)在程序中代表的是哪一个运算;(2) 进行类型转换;(3) 对语言结构进行类型检查。 6 类型分析? ?6.1.1 类型表达式定义 ??
文档评论(0)