- 1、本文档共52页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
:类型检查
第六章:类型检查 概述 类型系统 一个简单的类型检查器的说明 第六章:类型检查:概述 静态检查 编译器必须检查源程序是否符合源语言规定的语法和语义要求 动态检查:目标程序运行时进行 检测并报告程序中的某些错误 类型检查:操作符应作用于相容的操作数,如数据变量和函数变量不可以相加 控制流检查:控制流跳转语句能够确定目标地址,如C语言中,break语句可以使控制从switch /for /switch等语句确定的最小范围中跳出 唯一性检查:某些对象只能被定义一次,如case语句的标号互不相同 关联名字的检查:有时要求同一个名字在特定位置出现两次或多次,如Ada语言中循环结构(或程序快)的名字可能出现在该结构的开始位置及结束位置 本章重点:类型检查 第六章:类型检查:概述 类型检查器的位置 简单结构 并入其他活动中 将标识符信息填入符号表时,对该名字进行唯一性检查 将静态检查、中间代码生成、语法分析结合在一起 复杂结构 单独的类型检查器 图6-1:语法分析器=〉类型检查器=〉中间代码生成器 函数和运算符的重载 多态函数 第六章:类型检查 概述 类型系统 一个简单的类型检查器的说明 第六章:类型检查:类型系统 类型检查器的设计 语法结构的信息 类型的概念 语法结构的类型指派规则 两种类型 基本类型(原子类型) 布尔型、字符型、整型、实数型 子界类型、枚举类型(PASCAL) 构造类型 数组、记录、集合 指针、函数 第六章:类型检查:类型系统 类型表达式 定义 基本类型是类型表达式 类型名也是类型表达式 作用于类型表达式的类型构造器也是类型表达式,类型构造器包括: 数组、乘积(域无名字)、记录(域有名字) 指针、函数(函数构造符-〉) 类型表达式也可以包含其值为类型表达式的变量 第六章:类型检查:类型系统 类型表达式 表示:图 方法:语法制导为类型表达式构造一颗树或DAG 内节点:类型操作符 叶节点:基本类型、类型名、类型变量 图6-2:表示charXchar-pointer(integer)的树和DAG 第六章:类型检查:类型系统 类型系统 定义 将类型表达式指派到程序各部分的一组规则 采用语法制导定义说明 通过类型检查器实现 第六章:类型检查:类型系统 静态类型检查vs动态类型检查 静态类型检查:由编译器完成 健全的类型系统能静态地确定程序在运行时不发生错误,因此不需要动态检查。 如果某一语言能保证它所接受的程序不会在运行时发生类型错误,则称该语言是强类型语言 动态类型检查:目标程序运行时完成 有些检查只能动态完成 第六章:类型检查:类型系统 错误恢复 报告错误的性质和位置 从错误中恢复,以便检查剩下的输入 通常耗费大 第六章:类型检查 概述 类型系统 一个简单的类型检查器的说明 第六章:类型检查:一个简单的类型检查器的说明 一个简单语言的类型检查器 在此语言中,标识符使用前必须先说明 类型检查器是一个翻译模式 可以从子表达式的类型合成表达式的类型,能够处理数组、指针、语句和函数 第六章:类型检查:一个简单的类型检查器的说明 一种简单语言 源语言文法:图6-3 基本类型:char、integer、type_error(报错用) 类型构造器:数组、指针 翻译模式:图6-4保存标识符类型的部分 第六章:类型检查:一个简单的类型检查器的说明 表达式的类型检查 E-literal {E.type := char} E-num {E.type := integer} E-id {E.type := lookup(id.entry)} E-E1 mod E2 {E.type := if E1.type == integer and E2.type == integer then integer else type_error} E-E1[E2] {E.type := if E2.type == integer and E1.type == array(s,t) then t else type_error E-E1^ {E.type := if E1.type == pointer(t) then t else type_error 第六章:类型检查:一个简单的类型检查器的说明 语句的类型检查 基本类型:void(语句类型通常没有值) 图6-5:检查语句类型的翻译模式 第六章:类型检查:一个简单的类型检查器的说明 函数的类型检查 产生一个函数的产生式 E-〉E(E) 函数类型的定义 T-〉T1 ‘-’ T2 {T.type := T1.type - T2.type} 函数类型的检查 E-〉E1(E2) {E.type := if E2.type==s and E1.type = s-t then t else t
文档评论(0)